Lua脚本进行Diameter 3GPP统计

我正在尝试创建一个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

image description

在这个单独的Diameter消息中,它出现了三次,但结果是我只得到了三个2001的数组,而没有明确了解这出现在哪个级别。

当单个包包含多个Diameter消息时,情况变得更加混乱。那么,我甚至无法确定AVP来自哪个_消息。

函数tap.packet(pinfo, tvb, tapdata)不填充tapdata

另一个想法是深入研究tapdata。如果我正确地理解了11.4.1.5. listener.packet,则tadata(即tapinfo)应填充已解析的数据,正确吗?因此,我应该能够解析消息。

但无论我多么努力,tapdata始终未设置(即为零)。在GitHub代码中

       tap = Listener.new("diameter", filter)

但是我还尝试了第3个参数,将其设置为true(希望在牺牲性能的情况下生成所有字段)。没有运气。

[更新2020/03/20]

自我回答函数tap.packet(pinfo,tvb,tapdata)不填充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

点赞