准备用Lua对trace做一些统计操作。每个IP数据包可以有多个TCAP,每个TCAP可以有多个CAP操作,如
IP {[SCTP-M3UA-SCCP-TCAP-CAP,CAP] [SCTP-M3UA-SCCP-TCAP-CAP,CAP,CAP]}
现在我想访问整个树或在 Lua 侦听器 Tap 的 TCAP 层中以某种方式进行迭代。这种迭代的目的是遵循 TCP 流,因为事务 ID 保存在 TCAP 层,而应考虑 Camel (CAP) 层的操作和参数顺序。
如果获取下层数据部分,如何在侦听器点击中访问解剖器树或解剖上层?
例如,节点 ID 出现在最高层 (CAP) 中的 1 个新会话的第一次操作中,以及同一数据包中的另一个会话。然后需要计数的另一个参数出现在另一个操作/数据包中,同时要检查 TCAP 中的相同 TID 以确保其属于同一节点。
这不是对你问题的回复,只是提示。
您应该使用数组作为字段提取器而不是普通值。 例如:
tap_diameter = nil
diaSessionIdExtr = Field.new("diameter.Session-Id")
tap_diameter = Listener.new("frame", "diameter && !tcp.analysis.retransmission && !tcp.analysis.lost_segment")
function tap_diameter.packet(pinfo,tvb,userdata)
local answers = {diaSessionIdExtr()} -- this is how to do it
for i in pairs(answers) do
debug(answers[i])
end
end
我面临着类似的问题(想要计算一些基于 QUIC 帧的统计数据,其中单个数据包可以包含许多这样的帧)。 从 Wireshark 4.2.7 开始,似乎无法从侦听器 Tap 访问完整的解析器树。而且似乎没有办法迭代嵌套框架。
但是,您可以使用“all_field_infos()”迭代由解析器填充的所有字段,请参阅:https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Field.html
计算 QUIC 帧类型的工作示例:
local L = Listener.new(nil, 'quic.frame_type') -- filter needed to pre-fill specific field
local cnt = {}
function L.packet(pinfo, tvb)
local fields = { all_field_infos() }
for i,fi in ipairs(fields) do
-- for single packet same field can be present multiple times
if fi.name == "quic.frame_type" then
local key = fi.display
cnt[key] = (cnt[key] or 0) + 1
end
end
end
retap_packets()
-- show what we got...
for k,v in pairs(cnt) do
print (v, k)
end
L:remove() -- remove the listener