An apparatus, comprising: a storage element configured to maintain a packet buffer data structure configured to store packet data for a set of data packets of a set of data flows, wherein the packet buffer data structure comprises a packet queue configured to store packet data associated with data packets of the set of data flows and a packet aggregation buffer configured to store packet data associated with data packets of the set of data flows on a per-flow basis; and a processor element communicatively connected to the storage element and configured to: receive a first packet header of a first data packet and a second packet header of a second data packet; determine, based on processing of the first packet header, first packet data associated with the first data packet; store the first packet data in the packet queue, as individual packet data for the first data packet, based on a determination that the packet queue does not satisfy a threshold; determine, based on processing of the second packet header, second packet data associated with the second data packet; and store the second packet data in the packet aggregation buffer, as aggregated packet data for one of the data flows with which the second data packet is associated using a per-flow packet data entry associated with the one of the data flows with which the second data packet is associated, based on a determination that the packet queue satisfies the threshold. a storage element configured to maintain a packet buffer data structure configured to store packet data for a set of data packets of a set of data flows, wherein the packet buffer data structure comprises a packet queue configured to store packet data associated with data packets of the set of data flows and a packet aggregation buffer configured to store packet data associated with data packets of the set of data flows on a per-flow basis; and a processor element communicatively connected to the storage element and configured to: receive a first packet header of a first data packet and a second packet header of a second data packet; determine, based on processing of the first packet header, first packet data associated with the first data packet; store the first packet data in the packet queue, as individual packet data for the first data packet, based on a determination that the packet queue does not satisfy a threshold; determine, based on processing of the second packet header, second packet data associated with the second data packet; and store the second packet data in the packet aggregation buffer, as aggregated packet data for one of the data flows with which the second data packet is associated using a per-flow packet data entry associated with the one of the data flows with which the second data packet is associated, based on a determination that the packet queue satisfies the threshold. receive a first packet header of a first data packet and a second packet header of a second data packet; determine, based on processing of the first packet header, first packet data associated with the first data packet; store the first packet data in the packet queue, as individual packet data for the first data packet, based on a determination that the packet queue does not satisfy a threshold; determine, based on processing of the second packet header, second packet data associated with the second data packet; and store the second packet data in the packet aggregation buffer, as aggregated packet data for one of the data flows with which the second data packet is associated using a per-flow packet data entry associated with the one of the data flows with which the second data packet is associated, based on a determination that the packet queue satisfies the threshold.