NET_BUFFER_LIST结构(ndis/nbl.h)
NET_BUFFER_LIST结构指定 NET_BUFFER 结构的链接列表。
语法
typedef struct _NET_BUFFER_LIST {
union {
struct {
NET_BUFFER_LIST *Next;
NET_BUFFER *FirstNetBuffer;
};
SLIST_HEADER Link;
NET_BUFFER_LIST_HEADER NetBufferListHeader;
};
NET_BUFFER_LIST_CONTEXT *Context;
NET_BUFFER_LIST *ParentNetBufferList;
NDIS_HANDLE NdisPoolHandle;
PVOID NdisReserved[2];
PVOID ProtocolReserved[4];
PVOID MiniportReserved[2];
PVOID Scratch;
NDIS_HANDLE SourceHandle;
ULONG NblFlags;
LONG ChildRefCount;
ULONG Flags;
union {
NDIS_STATUS Status;
ULONG NdisReserved2;
};
PVOID NetBufferListInfo[MaxNetBufferListInfo];
} NET_BUFFER_LIST, *PNET_BUFFER_LIST;
成员
Next
链中的下一个 NET_BUFFER_LIST 结构。
驱动程序不应直接访问此成员。 相反,它们应调用 NET_BUFFER_LIST_NEXT_NBL 宏。
FirstNetBuffer
此 NET_BUFFER_LIST的第一个 NET_BUFFER。
驱动程序不应直接访问此成员。 相反,它们应调用 NET_BUFFER_LIST_FIRST_NB 宏。
Link
保留为 NDIS。
NetBufferListHeader
Context
指向 NET_BUFFER_LIST_CONTEXT 结构的指针。 协议和微型端口驱动程序使用此结构来存储有关NET_BUFFER_LIST结构的信息。 存储在NET_BUFFER_LIST_CONTEXT结构中的信息对 NDIS 和其他驱动程序在堆栈中是不透明的。
使用以下函数和宏访问NET_BUFFER_LIST_CONTEXT结构中的数据:
NdisAllocateNetBufferListContext NdisFreeNetBufferListContext NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZEParentNetBufferList
如果此NET_BUFFER_LIST结构是另一个NET_BUFFER_LIST结构的克隆,则此成员指定指向父NET_BUFFER_LIST结构的指针。 否则,此参数 NULL。 驱动程序使用 NdisAllocateCloneNetBufferList 函数来创建克隆。
NdisPoolHandle
一个池句柄,用于标识从中分配NET_BUFFER_LIST结构的NET_BUFFER_LIST池。
NdisReserved[2]
保留供 NDIS 使用。
ProtocolReserved[4]
保留供协议驱动程序使用。
MiniportReserved[2]
保留供微型端口驱动程序使用。
Scratch
由NET_BUFFER_LIST结构的当前所有者定义的数据。 当前所有者(NDIS 或 NDIS 驱动程序)可以出于自己的目的使用此成员。 最初分配NET_BUFFER_LIST结构时,此成员 NULL。 在当前所有者放弃所有权后,NDIS 或其他驱动程序可以覆盖此成员。
SourceHandle
NDIS 在绑定或附加作中提供给驱动程序的句柄,方法是使用以下驱动程序提供的例程之一:
微型端口驱动程序
协议驱动程序
筛选器驱动程序
NDIS 使用 SourceHandle 将NET_BUFFER_LIST结构返回到发送NET_BUFFER_LIST结构的驱动程序。
NblFlags
此成员包含可与按位 OR作组合的标志。
使用 NdisTestNblFlag、NdisTestNblFlags、NdisSetNblFlag,以及 NdisClearNblFlag 宏访问标志。
如果中间驱动程序和筛选器驱动程序不修改与NET_BUFFER_LIST关联的数据,则可以设置以下标志。 例如,如果数据未更改,NDIS 可能会重复使用创建NET_BUFFER_LIST的原始信息。
NDIS_NBL_FLAGS_SEND_READ_ONLY
如果已设置,则NET_BUFFER_LIST结构及其数据对于发送作是只读的。
NDIS_NBL_FLAGS_RECV_READ_ONLY
如果已设置,则NET_BUFFER_LIST结构及其数据对于接收作是只读的。
即使驱动程序未拆分关联的以太网帧,驱动程序也可以设置以下标志:
NDIS_NBL_FLAGS_IS_IPV4
此NET_BUFFER_LIST结构中的所有以太网帧都是 IPv4 帧。 如果设置了此标志,标头数据拆分提供程序不得设置NDIS_NBL_FLAGS_IS_IPV6标志。
NDIS_NBL_FLAGS_IS_IPV6
此NET_BUFFER_LIST结构中的所有以太网帧都是 IPv6 帧。 如果设置了此标志,标头数据拆分提供程序不得设置NDIS_NBL_FLAGS_IS_IPV4标志。
NDIS_NBL_FLAGS_IS_TCP
此NET_BUFFER_LIST结构中的所有以太网帧都是 TCP 帧。 如果设置了此标志,标头数据拆分提供程序不得设置NDIS_NBL_FLAGS_IS_UDP标志,并且提供程序必须设置NDIS_NBL_FLAGS_IS_IPV4标志或NDIS_NBL_FLAGS_IS_IPV6标志。
NDIS_NBL_FLAGS_IS_UDP
此NET_BUFFER_LIST结构中的所有以太网帧都是 UDP 帧。 如果设置了此标志,标头数据拆分提供程序不得设置NDIS_NBL_FLAGS_IS_TCP标志,并且提供程序必须设置NDIS_NBL_FLAGS_IS_IPV4标志或NDIS_NBL_FLAGS_IS_IPV6标志。
NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET
与此NET_BUFFER_LIST结构关联的所有数据包都是环回数据包。
如果标头数据拆分提供程序未拆分关联的以太网帧,微型端口驱动程序必须指示已清除以下标志的NET_BUFFER_LIST结构:
NDIS_NBL_FLAGS_HD_SPLIT
标头和数据拆分为与此NET_BUFFER_LIST结构关联的所有以太网帧。
NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER
此NET_BUFFER_LIST中的所有以太网帧在上层协议标头的开头拆分。 如果设置了此标志,标头数据拆分提供程序必须设置NDIS_NBL_FLAGS_IS_IPV4标志或NDIS_NBL_FLAGS_IS_IPV6标志。 此外,提供程序可以设置NDIS_NBL_FLAGS_IS_TCP标志或NDIS_NBL_FLAGS_IS_UDP标志,但提供程序不得设置NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD标志。
NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD
此NET_BUFFER_LIST结构中的所有以太网帧在 TCP 或 UDP 有效负载的开头拆分。 如果设置了此标志,标头数据拆分提供程序必须设置NDIS_NBL_FLAGS_IS_IPV4标志或NDIS_NBL_FLAGS_IS_IPV6标志。 此外,提供程序必须设置NDIS_NBL_FLAGS_IS_TCP标志或NDIS_NBL_FLAGS_IS_UDP标志,但提供程序不得设置NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER标志。
ChildRefCount
如果此NET_BUFFER_LIST结构具有克隆(为父级),则此成员指定未完成的克隆数。 否则,此成员为零。
Flags
NET_BUFFER_LIST结构的属性。 以下定义为一组标志指定位掩码:
NBL_FLAGS_PROTOCOL_RESERVED
此集是为协议驱动程序保留的。
NBL_FLAGS_MINIPORT_RESERVED
此集是为微型端口驱动程序保留的。
NBL_FLAGS_SCRATCH
NET_BUFFER_LIST结构的当前所有者(NDIS 或 NDIS 驱动程序)可以使用此设置。 当当前所有者放弃所有权时,NDIS 或其他驱动程序可以覆盖这些标志。
NBL_FLAGS_NDIS_RESERVED
此集是为 NDIS 保留的。
Status
此NET_BUFFER_LIST结构上网络数据作的最终完成状态。
微型端口驱动程序在调用
NDIS_STATUS_SUCCESS
与此NET_BUFFER_LIST结构关联的NET_BUFFER结构描述的所有网络数据都通过网络成功传输。
NDIS_STATUS_INVALID_LENGTH
与此NET_BUFFER_LIST结构关联的某些NET_BUFFER结构中的数据大小对于基础 NIC 来说太大。
NDIS_STATUS_RESOURCES
由于资源不足,此NET_BUFFER_LIST结构的发送请求失败。
NDIS_STATUS_FAILURE
此NET_BUFFER_LIST结构的发送请求由于前面三个值中所述的一些原因而失败。
NDIS_STATUS_SEND_ABORTED
NDIS 调用 MiniportCancelSend 函数以取消此NET_BUFFER_LIST结构的发送作。
NDIS_STATUS_RESET_IN_PROGRESS
微型端口驱动程序由于重置而中止了发送请求。
NDIS_STATUS_PAUSED
如果驱动程序因暂停而必须拒绝发送请求,则会将每个受影响的NET_BUFFER_LIST中的完整状态设置为NDIS_STATUS_PAUSED。
NdisReserved2
保留为 NDIS。
NetBufferListInfo[MaxNetBufferListInfo]
一个值数组,其中包含列表中所有NET_BUFFER结构共有的信息。 此信息通常称为“带外(OOB)数据”。
使用使用 NET_BUFFER_LIST_INFO 宏 NDIS_NET_BUFFER_LIST_INFO 枚举值来设置和获取 NetBufferListInfo 数组中的值。
言论
NDIS 驱动程序可以调用以下任一函数来分配和初始化NET_BUFFER_LIST结构:
NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferList与NET_BUFFER_LIST结构关联的所有NET_BUFFER结构都具有由 NetBufferListInfo 和 Context 成员指定的属性。
当驱动程序调用 NdisSendNetBufferLists 或 NdisFSendNetBufferLists 函数时,它将失去以下项的所有权:
- 指定的NET_BUFFER_LIST结构。
- 附加 NET_BUFFER 结构和 MDL。
- 任何附加NDIS_REQUEST_CONTROLs。
- 与NET_BUFFER_LIST结构关联的所有 NetBufferListInfo 数据。
NET_BUFFER_LIST结构列表是一个简单的单向链接列表和以 NULL 结尾的列表。 要将NET_BUFFER_LIST结构移动到其他列表,请对源列表和目标列表中的 下一 成员进行适当的更新。
若要访问NET_BUFFER_LIST结构的成员,请使用以下宏和函数:
NET_BUFFER_LIST_MINIPORT_RESERVED NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE NET_BUFFER_LIST_PROTOCOL_RESERVED NdisGetPoolFromNetBufferList有关如何使用 net 缓冲区的详细信息,请参阅 NET_BUFFER 体系结构。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | NDIS 6.0 及更高版本中受支持。 |
标头 | ndis/nbl.h (include ndis.h) |