1. 程式人生 > >wireshark lua: Dissector for RTP dynamic payload type(如何編寫RTP Payload解析器)

wireshark lua: Dissector for RTP dynamic payload type(如何編寫RTP Payload解析器)

 本文介紹如何用wireshark lua編寫解析RTP Payload的解析器(dissector)。檢視wireshark RTP解析器原始碼可知,RTP裡有三個解析器table:

1. "rtp.pt" ——用於指定payload type值註冊解析器,一般payload type小於96的標準解析器已經預先註冊到該table;
2. "rtp_dyn_payload_type"——用於註冊解析dynamic payload(type>=96)的解析器,註冊時必須指定動態payload type的字串名稱,該名稱與SDP裡的rtpmap裡的媒體型別(media type)名稱對應,比如a=rtpmap:96 H264/9000中的H264。
3. "rtp_hdr_ext"——應該用於解析自定義rtp擴充套件頭(沒研究過該table怎麼用)。

無論是用C還是lua語言寫解析器,都可以註冊到"rtp.pt"或"rtp_dyn_payload_type"兩個table裡,以解析RTP Payload內容。

通常需要自己寫解析器的一般都是自定義格式的RTP Payload,payload type通常大於等於96。可能第一個想到的是解析器以媒體型別名稱註冊到"rtp_dyn_payload_type" table上就夠了,但實際上動態payload type需要倚仗其它會話協議解析器(如SIP/RTSP)和SDP解析器的正確解析後,才能正確的呼叫"rtp_dyn_payload_type" table里根據名稱註冊的解析器。但實際上現在的wireshark(我用的1.2.7版本)有時會話協議解析結果(比如RTSP)不能正確呼叫我們註冊到"rtp_dyn_payload_type" table裡的解析器,所以有必要把payload解析器也註冊到rtp.pt table上。(wireshark自帶的H264解析協議就是個例子)

以下是一個解析RTP動態payload的lua dissector例子:

 

程式碼預設把解析器以MYRTP為媒體型別名稱,註冊到動態payload type解析器列表"rtp_dyn_payload_type" table上。

然後為該協議設定了一個配置項,允許使用者指定RTP的dynamic payload type值為多少時用本協議解析器解析。該配置預設值為0,表示不指定payload type解析,使用者需要修改時,可到選單Edit->Preferences開啟視窗中,選擇Protocols->MY_RTP_PAYLOAD_TEST協議配置窗口裡修改該配置項(顯示名為:MY_RTP_PAYLOAD_TEST dynamic payload type)。

程式碼中init()函式的作用是,每次啟動wireshark或修改協議配置項時都會呼叫該函式,本處該函式主要的職責是根據配置的payload type,把解析器註冊到"rtp.pt" table的對應payload type上,另外,還要處理使用者修改配置指定新的payload type後,恢復原payload type的解析器(原payload type未指定解析器,則把本解析器從原payload type上刪除)。