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上删除)。

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值