Hi serusers, another NAT issue from mine...
when I have two parts calling each other inside the same NAT (behind a router
with public IP different from ser's) I directly relay the call between the
two, without use of rtpproxy. The good thing is that audio works perfectly
both ways, the bad one is that SIP messages from caller reach ser but aren't
relayed to the callee. So ACKs and BYEs reach too many hops and if the caller
hangs up, the callee remains connected until he hangs up too.
On the other side (BYE from callee to caller) everything works fine.
By "ngrepping" on ser port I noticed this difference on the header of SIP BYE,
which from callee to caller is
BYE sip:caller@CALLER_PUBLIC_IP (=CALLEE_PUBLIC_IP)
and from caller to callee is
BYE sip:callee@SER_PUBLIC_IP
and ser keeps relaying to himself...
INVITE routing logic is something like this
if (loose_route()) {
if (has_totag() && method=="INVITE") {
if (nat_uac_test("19")) {
setflag(6);
force_rport();
fix_nated_contact();
};
force_rtp_proxy("l");
t_on_reply("1");
};
t_relay();
break;
}
if (method=="INVITE") {
record_route();
if (nat_uac_test(19)) {
fix_nated_contact();
force_rport();
setflag(6);
}
if ( !isflagset(6) || SAME_NAT) {
t_relay();
} else {
force_rtp_proxy();
t_on_reply("1");
t_relay();
}
}
If I ignore same NAT test and force the call thru rtpproxy, all works as it
should. I thought the problem was in fix_nated_contact and force_rport, but
removing the two lines does nothing.
any ideas? thanks in advance
--
Giovanni Balasso
giaso(a)yahoo.it