0

我需要AVPs从直径数据包中提取所有细节。目前我正在使用dpkt libPython但我发现它不支持提取所有 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

4

1 回答 1

0

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

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

self.padding = ( 4 - self.len % 4 ) % 4

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

length += self.padding

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

于 2014-02-11T10:48:00.850 回答