我已经为我们使用的自定义协议编写了几个Lua Dissector,它们工作正常。为了发现丢失数据包的问题,我需要针对旧数据包检查自定义协议序列号。 设备A到设备B的IP源和目标地址始终相同。 在此数据包中,我们有一个自定义ID。 每个ID都有一个序列号,因此设备B可以确定数据包是否丢失。序列号增加256并在达到65k时翻转 我尝试过使用全局字典但是当您向上和向下滚动跟踪时,重新运行解码器并且值会发生变化。 下面几行显示了信息的存储位置。
ID = buffer(0,6):bitfield(12,12)
SeqNum = buffer(0,6):bitfield(32,16)
理想情况下,我想在每个解码帧中列出前一个序列号是否超过256,并生成一个表列出所有这些坏帧。
Src IP; Dst IP; ID; SEQ
1 10.12.1.2; 10.12.1.3; 10; 0
2 10.12.1.2; 10.12.1.3; 11; 0
3 10.12.1.2; 10.12.1.3; 12; 0
4 10.12.1.2; 10.12.1.3; 11; 255
5 10.12.1.2; 10.12.1.3; 12; 255
6 10.12.1.2; 10.12.1.3; 10; 511缺少seq 255的数据包
我现在设法让解剖器通过使用全局数组来检查当前数据包与先前的数据包,其中我存储有关每个帧的特定信息。在正在解析的当前数据包中,我重新检查最新的数据包,然后回到起点找到合适的数据包。
dict[pinfo.number] = {frame = pinfo.number, dID = ID, dSEQNUM = SeqNum}
local frameCount = 0
local frameFound = false
while frameFound == false do
if pinfo.number > frameCount then
frameCount = frameCount + 1
if dict[(pinfo.number - frameCount)] ~= nil then
if dict[(pinfo.number - frameCount)].dID == dict[pinfo.number].dID then
seq_difference = (dict[(pinfo.number)].dSEQNUM - dict[(pinfo.number - frameCount)].dSEQNUM)
if seq_difference > 256 then
pinfo.cols.info = string.format('ID-%d SeqNum-%d missing packet(s) %d last frame %d ', ID,SeqNum, seq_difference, dict[(pinfo.number - frameCount)].frame)
end
frameFound = true
end
end
else
frameFound = true
end
end
答案 0 :(得分:0)
我不确定我会回答一个问题吗?如果你问“我怎么能避免不得不多次处理被多次调用的解剖器并搞砸了之前的值解码” - 答案就是使用pinfo.visited
布尔值。第一次解析给定数据包时将false
,此后无论用户点击多少都会true
- 直到重新加载文件或加载新文件。
要处理重新加载/新文件的情况,你可以通过定义init()
函数来挂钩你原型的function myproto.init()
函数调用,然后你将清除你的整个数组表
此外,您可能希望在ask.wireshark.org上搜索相关问题/答案,因为该网站更常用于wireshark Lua API问题。例如,this question/answer与您的案例相似且相关。