前天还为一下的代码耿耿于怀,因为不明白为什么地址+偏移量,然后再来或、与运算。
if(pEthHeader->EthType == TESTPROV_ETH_TYPE_802_1Q)
{
if(NET_BUFFER_LIST_INFO(pNetBufferList, Ieee8021QNetBufferListInfo) == 0)// no tag info present in OOB
{
// Count of unstripped packets
pFilter->RecdUnStrippedPackets++;
}
else
{
//should only reach here if vlanid > 0
VLanId = ((*(PUSHORT)((PUCHAR)pEthHeader + 14)) & 0x0FFF);
if(VLanId == 0)
pFilter->RecdUnStrippedPackets++;
}
pEthHeader->EthType = (USHORT)*((PUCHAR)pEthHeader + 16);
bytesParsed = ETH_HEADER_SIZE + ETH_802_1Q_TAG_SIZE;
}
else
bytesParsed = ETH_HEADER_SIZE;
pEthHeader是一个缓冲区的,指向Ethernet Header,这是它的定义:
typedef struct _TESTPROV_ETH_HEADER
{
UCHAR DstAddr[TESTPROV_MAC_ADDR_LEN];
UCHAR SrcAddr[TESTPROV_MAC_ADDR_LEN];
USHORT EthType;
} TESTPROV_ETH_HEADER;
这里有一个EthType指明某种协议类型。可以参考:EtherType
这里代码考虑了两种情况,分别是包头中是否包含了IEEE 802.1Q的信息。数据结构如图:
可以看到IEEE 802.1Q Header是4个Byte的。位置在Ethernet Type之前。根据EtherType的值:
0x8100 VLAN-tagged frame (IEEE 802.1Q)
如果包含了IEEE 802.1Q Header,这个type值就定于0x0081(代码中是这样的,跟前面定义倒叙了??)
所以要拿到Vid:VLAN Identifier (VID)
: a 12-bit field specifying the VLAN to which the frame belongs. 所以对于 802.1Q Header中的后两个Byte中的后面前4个bit为:(PCP和CFI)。
所以要拿到vlanID,自然packetBuffer+14bytes,然后再从后面两个bytes中取出后12-bit.
VLanId = ((*(PUSHORT)((PUCHAR)pEthHeader + 14)) & 0x0FFF);
这样的话,要拿到VlanID自然要petherhead+12+4了,才能得到了。这样就全部解释清楚了.
--------------------------------现在看看如何拿到AddressFamily----------------------------------
我一直对前面的pEtherhead->EthType的获得方式没有弄清。现在看看这段代码:
//
// Start parsing the data
//
parserState = ParsingIPHeaders;
switch (parserState)
{
case ParsingIPHeaders:
// Determine the address family (IPv4 / IPv6)
if (bytesCopied < bytesParsed + IP_ADDRESS_FAMILY_LEN)
{
goto Exit;
}
AddressFamily = IP_ADDRESS_FAMILY(packetBuffer + bytesParsed);
if (IP_ADDRESS_FAMILY_IP4 == AddressFamily){..}
跳过前面的bytesParsed = ETH_HEADER_SIZE;的Ethernet Header,就到了IP Header了。
000000: 00 A0 CC 63 08 1B 00 40 : 95 49 03 5F 08 00 45 00
...c...@.I._..E.
000010: 00 3C 82 47 00 00 20 01 : 94 C9 C0 A8 01 20 C0 A8
.<.G.. ...... ..
000020: 01 40
08 00 48 5C 01 00 : 04 00 61 62 63 64 65 66 .@..H\....abcdef
000030: 67 68 69 6A 6B 6C 6D 6E : 6F 70 71 72 73 74 75 76 ghijklmnopqrstuv
000040: 77 61 62 63 64 65 66 67 : 68 69 wabcdefghi......
packetBuffer 指向的是上面的45的位置。至于数据格式参考
Sample Ping Packet Decode
。
其中高位表示IP version, 低位表示IP header 长度=5个32bits的word.其中((PUCHAR)(buffer))=45.
然后右移4为,对于16进制来说就是4为就是除以16,就剩下一个位,ox45就只剩下 ox4,转换为10进制=4.
可以参考论坛
http://topic.csdn.net/u/20091128/18/2b41c174-e24c-4b0d-8b30-55ff6131db01.html?34775
以及
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/9234a3cb-eca5-440c-839e-7d45e54fd38b
参考: IEEE802.1q:
http://en.wikipedia.org/wiki/IEEE_802.1Q
Ethernet header :
http://en.wikipedia.org/wiki/EtherType
IPv4 Header:
http://www.networksorcery.com/enp/protocol/ip.htm
IPv6 header :http://www.networksorcery.com/enp/protocol/ipv6.htm
Mobility Header:
http://www.networksorcery.com/enp/protocol/mobilityheader.htm
- 大小: 101.7 KB
分享到:
相关推荐
在计算机网络领域,IEEE 802.3标准定义了局域网(LAN)中使用的以太网物理层和数据链路层的媒体访问控制(MAC)子层协议。MAC帧是这一层的数据单位,它封装了网络层的IP数据报,并负责在网络介质上传输。本文将深入...
2. IEEE802.1Q:这是一个定义虚拟局域网(Virtual LAN,简称 VLAN)的 IEEE 标准,通过在数据帧上添加 VLAN 标签来区分不同的广播域,使得原本属于同一物理局域网的不同用户可以被隔离到不同的逻辑网络中。...
标题“IEEE Std 802.3-2012(section 4)”指出这是关于IEEE 802.3标准的2012版本的第四个部分。IEEE 802.3标准,也称为以太网标准,是一个由电气和电子工程师协会(IEEE)定义的一系列关于局域网(LAN)通信的技术...
IEEE Std 802.1AEbn-2011修正案是IEEE 802.1AE标准的自然发展,这反映出了在网络安全领域中,随着攻击手段的不断进步,安全协议和算法也需要不断升级以对抗新出现的威胁。对于网络设备制造商、网络运营商以及企业IT...
总之,理解并实现IEEE802.3以太网帧的封装是网络编程中的基本技能。通过C++进行封装操作,不仅可以加深对网络协议的理解,还能提高网络应用的开发效率。在实际项目中,这样的功能可能与其他网络库结合使用,实现更...
CC253X 系列芯片是一款专为 2.4 GHz IEEE 802.15.4 和 ZigBee 应用设计的高度集成系统级芯片(SoC)。本数据手册详细介绍了 CC253X 的各项功能特性及其在实际应用中的使用方法,非常适合于从事 ZigBee 技术研发的...
ZigBee是一种基于IEEE 802.15.4标准的短距离、低功耗无线通信技术,它主要应用于自动控制和远程监控系统,如智能家居、工业自动化等领域。《ZigBee无线网络与收发器》一书深入介绍了ZigBee的基础知识和技术细节,为...
标题中的“用于Linux802.11n信道状态信息(CSI)测量工具的实时数据处理和可视化插件”表明这是一个针对802.11n无线网络的 CSI(Channel State Information)测量和分析的项目。802.11n是IEEE定义的一个Wi-Fi标准,它...
802.1Q是IEEE定义的一个标准,它为VLAN提供了标记数据帧的方法,以便在交换机和路由器之间识别和处理不同VLAN的数据流。本文将深入探讨802.1Q VLAN的概念,并结合"vconfig"工具的源码来解析其工作原理。 首先,802....
通过对不同以太网数据帧格式的分析以及Sniffer工具的应用,我们可以更深入地理解局域网中数据帧的构造和解析过程。了解这些细节对于网络管理员和技术人员来说至关重要,有助于优化网络性能和故障排除。在未来的发展...
IEEE 802.3主要关注数据链路层的MAC子层和物理层规范。 4. **Ethernet II帧格式:**与原始的IEEE 802.3帧格式相比,Ethernet II在目的MAC地址和源MAC地址后面直接跟随类型字段,而不是长度字段。 5. **MAC地址:**...
TSN通过一系列子标准,如IEEE 802.1AS(时间同步)、IEEE 802.1Qbv(流量调度)和IEEE 802.1Qci(优先级和流量控制),确保网络中的数据能在预定的时间内到达目的地,同时保持低延迟和高可靠性。 EtherCAT 和 TSN ...
1. IEEE 802.11 – 1997年无线局域网标准发布,支持1Mbit/s和2Mbit/s速率。 2. IEEE 802.11b – 1999年扩展了物理层规范,增加了5.5Mbit/s和11Mbit/s速率。 3. IEEE 802.11a – 1999年增加了5GHz的规范,增加了6、9...
* IEEE 802.1p优先/ Q标签插入或移除在每个端口的基础上(出口) * 可编程速率在入口和出口上的每个端口上限制性 * 广播风暴保护与防治%(全局和每个端口上) * IEEE 802.1D快速生成树协议支持 * 尾标记模式(FCS前...
DW1000 用户手册翻译文档 v0.2 ...........................................................................................1 修订记录.........................................................................
标题中的“IEEE P8023ae MDC MDIO协议2021最新”指的是一个与网络通信技术相关的规范,具体来说是IEEE 802.3ae标准的一部分,该标准定义了10 Gigabit Ethernet(10GBASE-E)的物理层(PHY)规格。MDC(Management ...
802.11是IEEE定义的一系列无线局域网标准,其中包含了关于如何传输和接收数据的规范。本文将深入探讨RSSI在802.11标准中的应用以及如何通过Radiotap标头在C语言环境中获取RSSI。 RSSI是评估无线连接质量的重要指标...
在本课程设计中,学生被要求实现一个命令行程序,该程序能将给定的原始二进制数据组装成符合IEEE 802.3标准的以太网帧。 以太网帧格式是数据链路层中局域网(LAN)通信的基础,它定义了数据如何在物理介质上传输。...
Zigbee是一种基于IEEE 802.15.4标准的低功耗、短距离无线通信技术,适用于传感器网络和自动化控制。 6. **中断系统**:CC2530的中断系统能高效地处理事件响应,通过设置中断向量,可以快速响应来自硬件和软件的中断...
本课程设计的目标是让学生理解并实践帧封装的过程,特别是针对IEEE802.3标准的帧结构。 2. 以太网帧格式的发展 以太网帧格式经历了多次演变,从早期的Ethernet II到后来的802.3标准。802.3标准是IEEE定义的局域网...