as i reported on sr-users list, i noticed that sometimes rtpengine requests from kamailio set ip header don't fragment flag that causes icmp error message from a router on the path to rtpengine. as result, rtpengine modules things that the rtpengine is dead.
enclosed is an example of such an ip packet.
after i made this kind of patch to rtpengine.c, the flag is not set anymore:
*** /usr/src/orig/kamailio/modules/rtpengine/rtpengine.c 2015-06-16 12:33:56.497242900 +0300 --- rtpengine.c 2015-06-29 09:03:26.959479313 +0300 *************** *** 1059,1064 **** --- 1059,1065 ---- struct addrinfo hints, *res; struct rtpp_set *rtpp_list; struct rtpp_node *pnode; + int ip_mtu_discover = IP_PMTUDISC_DONT;
if(rtpp_set_list==NULL ) return 0; *************** *** 1121,1126 **** --- 1122,1131 ---- return -1; }
+ setsockopt(rtpp_socks[pnode->idx], IPPROTO_IP, + IP_MTU_DISCOVER, &ip_mtu_discover, + sizeof(ip_mtu_discover)); + if (bind_force_send_ip(pnode->idx) == -1) { LM_ERR("can't bind socket\n"); close(rtpp_socks[pnode->idx]);
any comments on this?
-- juha
On 29/06/15 02:11 AM, Juha Heinanen wrote:
as i reported on sr-users list, i noticed that sometimes rtpengine requests from kamailio set ip header don't fragment flag that causes icmp error message from a router on the path to rtpengine. as result, rtpengine modules things that the rtpengine is dead.
enclosed is an example of such an ip packet.
after i made this kind of patch to rtpengine.c, the flag is not set anymore:
*** /usr/src/orig/kamailio/modules/rtpengine/rtpengine.c 2015-06-16 12:33:56.497242900 +0300 --- rtpengine.c 2015-06-29 09:03:26.959479313 +0300
*** 1059,1064 **** --- 1059,1065 ---- struct addrinfo hints, *res; struct rtpp_set *rtpp_list; struct rtpp_node *pnode;
int ip_mtu_discover = IP_PMTUDISC_DONT;
if(rtpp_set_list==NULL ) return 0;
*** 1121,1126 **** --- 1122,1131 ---- return -1; }
setsockopt(rtpp_socks[pnode->idx], IPPROTO_IP,
IP_MTU_DISCOVER, &ip_mtu_discover,
sizeof(ip_mtu_discover));
if (bind_force_send_ip(pnode->idx) == -1) { LM_ERR("can't bind socket\n"); close(rtpp_socks[pnode->idx]);
any comments on this?
Good idea. I'm not sure how well this is supported on other (non-Linux) Unixes, so it might be advisable to enclose this in #ifdefs.
Cheers
On 29/06/15 10:15 AM, Juha Heinanen wrote:
Richard Fuchs writes:
Good idea. I'm not sure how well this is supported on other (non-Linux) Unixes, so it might be advisable to enclose this in #ifdefs.
thanks for your response. i'll can enclose the code within
#ifdef __OS_linux #endif
It's not entirely Linux-specific, at least FreeBSD also supports it. #ifdef IP_MTU_DISCOVER should probably be sufficient.
Cheers