Scapy自定义HSR层失败求助:代码实现及报错排查
问题排查与解决方案
1. 层绑定缺少触发条件
你直接执行bind_layer(Ether, HSR)未指定匹配规则,Scapy无法判断何时将Ethernet帧的上层解析为HSR。HSR的标准EtherType为0x892F,必须绑定该条件才能触发正确解析:
# 先解绑可能存在的同类型绑定,避免冲突 unbind_layer(Ether, type=0x892F) # 绑定Ether帧type字段为0x892F时解析为HSR层 bind_layer(Ether, HSR, type=0x892F)
2. 字段定义需匹配实际抓包结构
结合你提到的Wireshark显示,需确认HSR头部的位顺序与长度是否符合定义:
- Scapy的
BitField按字节高位到低位分配位段,你定义的前4个4bit字段会被打包为两个字节:第一个字节是path(4bit) + network_id(4bit),第二个字节是lane_id(4bit) + LSDU_size(4bit),需和Wireshark中实际位顺序完全一致,若不符需调整字段顺序或改用ReverseBitField。 - 检查头部总长度:当前定义的HSR头部为6字节(44bit + 216bit),若Wireshark中显示为8字节,大概率遗漏了标准HSR头部的Reserved字段,需补充:
BitField("reserved", 0, 8)。
3. 构造/解析时的验证方法
构造测试包并查看结构,确认字段打包是否符合预期:
test_pkt = Ether(type=0x892F)/HSR(path=1, network_id=2, lane_id=3, LSDU_size=100, sequence_number=1234, type=0x0800)/IP() test_pkt.show()
若字段值与预期不符,需调整BitField的定义或顺序;若出现数据包长度不足的报错,需检查fields_desc总长度是否匹配实际抓包的HSR头部长度。
修正后的完整代码
from scapy.all import * class HSR(Packet): name = "HSR" fields_desc = [ BitField("path", 0, 4), BitField("network_id", 0, 4), BitField("lane_id", 0, 4), BitField("LSDU_size", 0, 4), ShortField("sequence_number", 0), ShortField("type", 0), # 若Wireshark显示有预留字段,解开下面注释 # BitField("reserved", 0, 8) ] unbind_layer(Ether, type=0x892F) bind_layer(Ether, HSR, type=0x892F)
内容的提问来源于stack exchange,提问作者Donat Treszler
相关产品推荐
相关产品推荐

