【发布时间】:2015-08-10 16:18:06
【问题描述】:
我已经为我们使用的自定义协议编写了几个 Lua Dissectors,它们运行良好。为了发现丢失数据包的问题,我需要根据旧数据包检查自定义协议序列号。 设备 A 到设备 B 的 IP 源地址和目标地址始终相同。 在这个数据包中,我们有一个自定义 ID。 每个 ID 都有一个序列号,因此设备 B 可以确定数据包是否丢失。序列号递增 256 并在达到 65k 时翻转 我尝试过使用全局字典,但是当您向上和向下滚动跟踪时,解码器会重新运行并且值会发生变化。 下面几行显示了信息的存储位置。
ID = buffer(0,6):bitfield(12,12)
SeqNum = buffer(0,6):bitfield(32,16)
理想情况下,如果前一个序列号超过 256,我想在每个解码帧中列出,并生成一个表格,列出所有这些坏帧。
源IP;目标IP; ID;序列
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
【问题讨论】:
标签: lua wireshark wireshark-dissector