Some Fritzbox devices don't accept the OPTIONS ping generated by
kamailio with RURI: sip:11.22.3.4:5060. In the location table we have:
received: sip:11.22.3.4:5060
contact: sip:user@11.22.3.4:5060;uniq=6633BC1386F4D4CC4EBD64DC7E967
path: <sip:lb@127.0.0.1;lr;received='sip:11.22.3.4:5060'>
Kamailio version is 3.3.2 and the nathelper config is nothing fancy:
modparam("nathelper", "natping_interval", 15)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
modparam("nathelper", "sipping_from",
"sip:pinger@sipwise.local")
modparam("nathelper", "received_avp", "$avp(s:received)")
What I don't understand is why kamailio sets RURI of the OPTIONS message
to value of "received" instead of the contact. I suspect a bug in the
parser somewhere along these lines:
rval =
ul.get_all_ucontacts(buf,cblen,(ping_nated_only?ul.nat_flag:0),
((unsigned int)(unsigned long)timer_idx)*natping_interval+iteration,
natping_processes*natping_interval);
if (rval != 0) {
pkg_free(buf);
goto done;
}
}
if (buf == NULL)
goto done;
cp = buf;
while (1) {
memcpy(&(c.len), cp, sizeof(c.len));
if (c.len == 0)
break;
c.s = (char*)cp + sizeof(c.len);
cp = (char*)cp + sizeof(c.len) + c.len;
memcpy( &send_sock, cp, sizeof(send_sock));
cp = (char*)cp + sizeof(send_sock);
memcpy( &flags, cp, sizeof(flags));
cp = (char*)cp + sizeof(flags);
memcpy( &(path.len), cp, sizeof(path.len));
path.s = path.len ? ((char*)cp + sizeof(path.len)) : NULL ;
cp = (char*)cp + sizeof(path.len) + path.len;
/* determin the destination */
if ( path.len && (flags&sipping_flag)!=0 ) {
/* send to first URI in path */
if (get_path_dst_uri( &path, &opt) < 0) {
LM_ERR("failed to get dst_uri for Path\n");
continue;
}
/* send to the contact/received */
if (parse_uri(opt.s, opt.len, &curi) < 0) {
LM_ERR("can't parse contact dst_uri\n");
continue;
}
} else {