2013-06-28 43 views
0

我需要從直徑數據包中提取所有AVPs詳細信息。目前我使用dpkt lib作爲Python,但我發現它不支持提取所有AVP。無法使用dpkt提取大部分直徑AVP(python)

在頭水平,只有以下是suppported

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() 

還有沒有其他的lib比dpkt更好或者使用這個lib提取AVP的方法?

版本:dpkt 1.8

回答

0

dpkt的直徑解析器有一個錯誤(如第89版)。 根據RFC 3588,第4節: 「一些零值字節被添加到AVP數據字段的末尾,直到達到一個字邊界,填充的長度未反映在AVP長度字段中。

此填充未實現。修改diameter.py如下所示: 在AVP類(線119)的解包()方法中,添加:

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

在AVP類(線140)的__len __()方法中,添加:

length += self.padding 

這些修改爲我解決了這個問題。