刚吃了一碗还算正宗的潮汕牛筋丸粿条和一颗卤蛋,算是给自己的生日礼物。
这一周工作只围绕了一个主题“mgcp的alg功能实现”。
1. 应用场景:
一台运行mgcp语音协议的终端设备,经过一台路由器到达公网,注册到mgcp的服务器;
2. 问题:
经过路由器的mgcp信令包、rtp/rtcp流需要进行snat,由于snat后的ip及端口不能唯一确定,使得“出去的mgcp信令里面包含的sdp信息(ip和端口)”与“实际rtp/rtcp流的ip和 端口”不匹配,从而出现电话通话时双方听不到对方声音。
3. 解决措施:
a. 在路由器上添加一条pat,与其原本的snat对应,即让其进行双向的nat。同时配置终端设备的sdp的ip为路由器的wan口ip。此方法简单有效,但是需要用户修改配置。
b. 在路由器上添加mgcp的alg功能,使其自动修改mgcp信令中sdp信息里面的ip和端口。此方法需要改动内核模块代码,但是对用户而言无需修改配置。
4. 解决措施b的思路:
参考sip的alg功能对应代码:nf_conntrack_sip.c、nf_nat_sip.c,添加nf_conntrack_mgcp.c、nf_nat_mgcp.c,编译出nf_conntrack_mgcp.ko、nf_nat_mgcp.ko,然后 在路由器跑应用前insmod进去就可以啦。由于mgcp的alg简单许多,所以基本上只要在sip上删减大部分代码,修改小部分代码就ok啦。