我需要从diameter数据包中提取所有AVPs详细信息。目前我正在为Python使用dpkt lib,但我发现它并不支持提取所有的AVP。
在标头级别,仅支持以下内容
class Diameter(dpkt.Packet):
__hdr__ = (
('v', 'B', 1),
('len', '3s', 0),
('flags', 'B', 0),
('cmd', '3s', 0),
('app_id', 'I', 0),
('hop_id', 'I', 0),
('end_id', 'I', 0)
)在AVP级别,支持,其余的AVP被存储为二进制数据(如果我没有错的话)
class AVP(dpkt.Packet):
__hdr__ = (
('code', 'I', 0),
('flags', 'B', 0),
('len', '3s', 0),
)
import dpkt
f = open('snoop.pcap','r')
pcap = dpkt.pcap.Reader(f)
for ts, buf in pcap:
eth = dpkt.ethernet.Ethernet(buf)
ip = eth.data
tcp = ip.data
dia = dpkt.diameter.Diameter(tcp.data)
avp = dpkt.diameter.AVP(tcp.data)
if tcp.dport == 3868 and len(tcp.data) > 0:
print (str(dia.cmd) + ' ' + str(dia.hop_id) + ' ' + str(dia.end_id) + ' ' + str(avp.code))
f.close() 有没有其他库比dpkt或任何其他方法更好地使用这个库来提取AVP?
版本: dpkt 1.8
发布于 2014-02-11 18:48:01
dpkt的Diameter解析器有一个错误(从版本89开始)。
此填充未实现。如下所示修改diameter.py :在AVP类的unpack()方法中(第119行),添加:
self.padding = ( 4 - self.len % 4 ) % 4在AVP类的__len__()方法(第140行)中,添加:
length += self.padding这些修改为我解决了问题。
https://stackoverflow.com/questions/17361716
复制相似问题