[英]How to know ipv4 or ipv6 from NDIS packet buffer?
我从NDIS筛选器SendnetBufferList例程获取数据包。 在里面,我接受过滤后的缓冲区。
在NdisMedium802_3介质的情况下,获取带有以太网头 (以太网帧)的数据包。 因此,我可以使用以太网标头轻松分析ipv4和ipv6 。
PPF_ETHERNET_HEADER pEthHeader = (PPF_ETHERNET_HEADER) pBuffer;
filter.nEthProto = pEthHeader->nProto;
System::MCopyMemory(&filter.aSrcMac, &pEthHeader->aSrcMac,
sizeof(ETH_MAC_ADDRESS));
System::MCopyMemory(&filter.aDstMac, &pEthHeader->aDstMac,
sizeof(ETH_MAC_ADDRESS));
if (filter.nEthProto == ETH_PROTO_IPV4) {
PPF_IPV4_HEADER pIpHeader = (PPF_IPV4_HEADER) (pBuffer +
sizeof(PF_ETHERNET_HEADER));
/* IPV4 operations */
}
else if (filter.nEthProto == ETH_PROTO_IPV6)
{
PPF_IPV6_HEADER pIpHeader = (PPF_IPV6_HEADER) (pBuffer +
sizeof(PF_ETHERNET_HEADER));
/* IPV6 operations */
}
这工作正常。 接下来,我将附加NdisMediumWirelessWan / NdisMediumIP介质。 这将发送没有以太网头的RAW IP帧 。
我的问题是如何检查没有以太网头的 NDIS缓冲区包含ipv4或ipv6 ? 还有如何设置Mac地址 ?
您可以轻松地从NET_BUFFER_LIST获得协议信息:
filter.nEthProto = (USHORT)NET_BUFFER_LIST_INFO(pNBList, NetBufferListFrameType);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.