Setting NET_BUFFER_LIST Information

A header-data split provider must set the header-data split flags in the NblFlags member of the NET_BUFFER_LIST structures for receive indications. For split frames, a NIC must also provide the physical address of the data portion of the received frame in the DataPhysicalAddress member of each NET_BUFFER structure.

Note  A miniport driver can set the DataPhysicalAddress member of the NET_BUFFER structure, even if the NET_BUFFER is not associated with a split frame. In this case, DataPhysicalAddress contains the physical address of the header MDL.

The header-data split provider combines the flags in the NblFlags member with a bitwise OR operation.

The header-data split provider can set the following flags even if it does not split a frame:

NDIS_NBL_FLAGS_IS_IPV4
All of the frames in the NET_BUFFER_LIST are IPv4 frames. If this flag is set, the NDIS_NBL_FLAGS_IS_IPV6 flag must not be set.

NDIS_NBL_FLAGS_IS_IPV6
All of the frames in the NET_BUFFER_LIST are IPv6 frames. If this flag is set, the NDIS_NBL_FLAGS_IS_IPV4 flag must not be set.

NDIS_NBL_FLAGS_IS_TCP
All of the frames in the NET_BUFFER_LIST are TCP frames. If this flag is set, NDIS_NBL_FLAGS_IS_UDP must not be set. And either NDIS_NBL_FLAGS_IS_IPV4 or NDIS_NBL_FLAGS_IS_IPV6 must be set.

NDIS_NBL_FLAGS_IS_UDP
All of the frames in the NET_BUFFER_LIST are UDP frames. If this flag is set, NDIS_NBL_FLAGS_IS_TCP must not be set. And either NDIS_NBL_FLAGS_IS_IPV4 or NDIS_NBL_FLAGS_IS_IPV6 must be set.

Any NDIS driver can set the preceding flags for debugging, testing, or other purposes. If a driver sets these flags, the values must accurately describe the contents of the received frame. Setting these flags is recommended.

The header-data split provider can set the following header-data split flags:

NDIS_NBL_FLAGS_HD_SPLIT
The header and data are split in all of the Ethernet frames that are associated with the NET_BUFFER_LIST structure.

NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER
All of the frames in the NET_BUFFER_LIST structure are split at the beginning of the upper-layer-protocol header. If this flag is set, either NDIS_NBL_FLAGS_IS_IPV4 or NDIS_NBL_FLAGS_IS_IPV6 must be set. Also, either NDIS_NBL_FLAGS_IS_TCP or NDIS_NBL_FLAGS_IS_UDP can be set. And NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD must not be set.

NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD
All of the frames in a NET_BUFFER_LIST structure are split at the beginning of the TCP payload or beginning of the UDP payload. If this flag is set, either NDIS_NBL_FLAGS_IS_IPV4 or NDIS_NBL_FLAGS_IS_IPV6 must be set. Either NDIS_NBL_FLAGS_IS_TCP or NDIS_NBL_FLAGS_IS_UDP must be set. Also, NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER must not be set.

If the header-data split provider does not split a frame, the frame must be indicated with the following flags cleared in NblFlags :

  • NDIS_NBL_FLAGS_HD_SPLIT

  • NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER

  • NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD