我正在尝试创建一个 lua 脚本来通过 Diameter pcap,收集我感兴趣的信息并生成统计信息。
这部分成功,可以在GitHub中找到工作脚本,但我仍然有一些疑问
Field.new() 和多次出现的 AVP
我Field.new()
用来检索 AVP,例如:
local rrField = Field.new("diameter.3GPP-Reporting-Reason")
local toField = Field.new("diameter.CC-Total-Octets")
但是在单个数据包中可能会多次出现 AVP。当然,我可以将它们作为数组从
local rrFields = {rrField()}
local toFields = {toField()}
但是我缺少从AVP 中检索到的参考。一个很好的例子是Result-Code AVP
:
这个单一的直径消息它出现了三次,但结果我只得到了三个 2001 的数组,而没有很好地理解它出现在哪个级别。
当单个包包含多个Diameter 消息时,情况变得更加混乱。然后我什至无法确定AVP来自哪条消息。
函数 tap.packet(pinfo, tvb, tapdata) 不填充 tapdata
另一个想法是深入研究tapdata
。如果我理解正确11.4.1.5。listener.packet,tapdata
(aka tapinfo
)应填充解剖数据,对吗?因此我应该能够解析消息。
但是,无论我多么努力,tapdata
总是未设置(即 nil)。在 GitHub 代码中
tap = Listener.new("diameter", filter)
但我也尝试了第三个参数,将其设置为true
(希望生成所有字段,即使以性能损失为代价)。没运气。
[更新 2020/03/20]
自我回答Function tap.packet(pinfo, tvb, tapdata) does not populate tapdata
检查 Wireshark (tshark) 的源代码后发现,Diameter 没有填充此变量,因为 tapdata 没有引用 Diameter。我试图将它添加到taps
定义中并且变量(表)已被填充,甚至散列的名称也可以。但是哈希中的变量不是......无论如何,这是变化:
MBP:wireshark jhartman$ git diff epan/wslua/taps
diff --git a/epan/wslua/taps b/epan/wslua/taps
index 11b1132171..ea28865109 100644
--- a/epan/wslua/taps
+++ b/epan/wslua/taps
@@ -62,4 +62,5 @@ tcp ../dissectors/packet-tcp.h tcp_info_t
#tls ../dissectors/packet-tls.h ssl_info_t
#tr ../dissectors/packet-tr.h tr_info_t
wlan ../dissectors/packet-ieee80211.h wlan_hdr_t
+diameter ../dissectors/packet-diameter.h diam_sub_dis_t
#wsp ../dissectors/packet-wsp.h wsp_info_t
问题
- 这种方法对吗?或者我应该使用其他方式 - 例如链式解剖器或后解剖器?但我不清楚我是否可以将解剖数据访问到我需要的水平?
任何帮助将不胜感激。
提前谢谢你,最好的问候, Jarek