无法使用dpkt(python)提取大多数直径AVP

无法使用dpkt(python)提取大多数直径AVP,python,pcap,Python,Pcap,我需要从diameter数据包中提取所有avp详细信息。目前我正在为Python使用dpktlib,但我发现它不支持提取所有的avp 在标题级别,仅支持以下内容 class Diameter(dpkt.Packet): __hdr__ = ( ('v', 'B', 1), ('len', '3s', 0), ('flags', 'B', 0), ('cmd', '3s', 0), ('app_id', 'I'

我需要从diameter数据包中提取所有
avp
详细信息。目前我正在为
Python
使用
dpktlib
,但我发现它不支持提取所有的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存储为二进制数据(如果我没有错的话)

有没有比dpkt更好的库,或者使用这个库提取AVP的其他方法


版本:dpkt 1.8

dpkt的Diameter解析器有一个bug(从版本89开始)。 根据RFC 3588第4节: “许多零值字节被添加到AVP数据字段的末尾,直到达到字边界。填充的长度不会反映在AVP长度字段中。”

此填充未实现。修改diameter.py,如下所示: 在AVP类的unpack()方法中(第119行),添加:

在AVP类的_len__()方法中(第140行),添加:

这些修改为我解决了这个问题

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() 
self.padding = ( 4 - self.len % 4 ) % 4
length += self.padding