ネットの情報をかき集めて、なるほど、簡単にできそうだという事は分かったが、やってみて一つ問題が出た。
とある送信側の電文が、2つのパケットに分割されていて、dissectorに断片しかわたってこない。
(つまり、パケット毎に呼び出されるdissectorで、電文の解析が完了しない)
こんな当たり前の事、google先生に聞けば、すぐに解決するだろうと思ったのだが、情報が全くない。
なぜだ、誰も困っていないのか?
こういう場合、2つのケースが考えられる。
1.本当に誰も困っていない。
レアケースに引っかかると、本当に情報が全くない。
2.誰もが最初に引っかかるが、解決方法はいたって簡単。
マニュアルを読め!
多分、「2」だろう・・・
という事で、マニュアルを漁ってみた所、次のような記述を見つけた。
11.9.5.12. pinfo.can_desegment
Mode: Retrieve or assign.
Set if this segment could be desegmented.
11.9.5.13. pinfo.desegment_len
Mode: Retrieve or assign.
Estimated number of additional bytes required for completing the PDU.
11.9.5.14. pinfo.desegment_offset
Mode: Retrieve or assign.
Offset in the tvbuff at which the dissector will continue processing when next called.
だから何?・・・と言いたくなるほど、不親切なマニュアルだが、試してみる価値はある。
という事で、dessectorの先頭部分に以下のようなコードを実装してみた。
cmd_len = buffer(0,4):le_uint()
if cmd_len > buffer:len() then
pinfo.can_desegment = true
pinfo.desegment_len = cmd_len - buffer:len()
pinfo.desegment_offset = 0
return
end
なんか、うまくいった。
※これを見た方、「やってみたらできた」というモノなので、鵜呑みにしないように。