背景
我尝试使用pyshark
模块剖析包含triple 802.1AD tags
的数据包。当打印包的层时,存在两个IEEE8021AD层。
[<ETH Layer>, <IEEE8021AD Layer>, <IEEE8021AD Layer>, <IP Layer>, <DATA Layer>]
我可以从同一个数据包的Wireshark显示中看到,第一个IEEE8021AD层包含两个VLAN标记,第二个层包含第三个标记:
问题:
我无法弄清楚如何使用pyshark模块访问第二个IEEE802.1AD图层,因为两个图层都有相同的名称。
- 醇>
在第一个IEEE802.1AD层,我可以访问第一个VLAN的DEI和Priority字段,但不能访问第二个VLAN的相同值。 DEI和Priority的解剖器字段名称在共享该层的两个VLAN之间是相同的。
此数据包从Wireshark导出的XML显示两个名称相同的ieee8021ad图层,以及名称相同的dei和优先级解析器字段:
<proto name="ieee8021ad" showname="IEEE 802.1ad, S-VID: 9, C-VID: 8" size="4" pos="14">
<field name="ieee8021ad.priority" showname="101. .... .... .... = Priority: 5" size="1" pos="14" show="5" value="5" unmaskedvalue="a0"/>
<field name="ieee8021ad.dei" showname="...0 .... .... .... = DEI: 0" size="1" pos="14" show="0" value="0" unmaskedvalue="a0"/>
<field name="ieee8021ad.svid" showname=".... 0000 0000 1001 = ID: 9" size="2" pos="14" show="9" value="9" unmaskedvalue="a009"/>
<field name="ieee8021ad.priority" showname="100. .... .... .... = Priority: 4" size="1" pos="18" show="4" value="4" unmaskedvalue="80"/>
<field name="ieee8021ad.dei" showname="...0 .... .... .... = DEI: 0" size="1" pos="18" show="0" value="0" unmaskedvalue="80"/>
<field name="ieee8021ad.cvid" showname=".... 0000 0000 1000 = ID: 8" size="2" pos="18" show="8" value="8" unmaskedvalue="8008"/>
<field name="ieee8021ah.etype" showname="Type: 802.1ad Provider Bridge (Q-in-Q) (0x88a8)" size="2" pos="20" show="0x88a8" value="88a8"/>
</proto>
<proto name="ieee8021ad" showname="IEEE 802.1ad, ID: 7" size="4" pos="22">
<field name="ieee8021ad.priority" showname="011. .... .... .... = Priority: 3" size="1" pos="22" show="3" value="3" unmaskedvalue="60"/>
<field name="ieee8021ad.dei" showname="...0 .... .... .... = DEI: 0" size="1" pos="22" show="0" value="0" unmaskedvalue="60"/>
<field name="ieee8021ad.id" showname=".... 0000 0000 0111 = ID: 7" size="2" pos="22" show="7" value="7" unmaskedvalue="6007"/>
<field name="ieee8021ah.etype" showname="Type: ARP (0x0806)" size="2" pos="24" show="0x0806" value="0806"/>
<field name="ieee8021ah.trailer" showname="Trailer: 000000000000" size="6" pos="54" show="00:00:00:00:00:00" value="000000000000"/>
</proto>
我尝试使用pprint模块查看数据结构,但在尝试打印图层时没有有用的输出。
#!/usr/bin/python
from __future__ import print_function
import pyshark
import pprint
cap = pyshark.FileCapture(filename)
pp = pprint.PrettyPrinter(indent=4)
for i, pkt in enumerate(cap):
print("----------------- Packet %d --------------------" % i)
print(pkt.layers)
print(pkt.ieee8021ad)
print(" dei = %s" % pkt.ieee8021ad.dei)
print(" priority = %s" % pkt.ieee8021ad.priority)
print(" cvid = %s" % pkt.ieee8021ad.cvid)
print(" svid = %s" % pkt.ieee8021ad.svid)
#print(" type = %s" % pkt.ieee8021ad.type) # 'type' doesn't exist>
代码输出:
----------------- Packet 1 --------------------
[<ETH Layer>, <IEEE8021AD Layer>, <IEEE8021AD Layer>, <IP Layer>, <DATA Layer>]
Layer IEEE8021AD:
101. .... .... .... = Priority: 5
...1 .... .... .... = DEI: 1
.... 0000 0000 1000 = ID: 8
Type: 802.1ad Provider Bridge (Q-in-Q) (0x88a8)
.... 0000 0000 1001 = ID: 9
100. .... .... .... = Priority: 4
...0 .... .... .... = DEI: 0
dei = 1 # Drop Eligibility Indicator for VLAN #2
priority = 5 # Priority for VLAN #2
cvid = 8 # ID for VLAN #2
svid = 9 # ID for VLAN #1