From 02e3cd6bbb45d51d3267d66149d6576405aa683b Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Wed, 24 Sep 2008 16:52:41 +0000 Subject: Ticket #643: Do not try to re-register with a new Contact when the REGISTER response contains private IP address git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2316 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsua-lib/pjsua_acc.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'pjsip/src') diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index 438b63f0..9014d162 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -537,6 +537,25 @@ PJ_DEF(pj_status_t) pjsua_acc_set_online_status2( pjsua_acc_id acc_id, return PJ_SUCCESS; } +/* Check if IP is private IP address */ +static pj_bool_t is_private_ip(const pj_str_t *addr) +{ + const pj_str_t private_net[] = + { + { "10.", 3 }, + { "127.", 4 }, + { "172.16.", 7 }, + { "192.168.", 8 } + }; + unsigned i; + + for (i=0; irdata->tp_info.transport; @@ -613,9 +633,25 @@ static pj_bool_t acc_check_nat_addr(pjsua_acc *acc, return PJ_FALSE; } + /* Get server IP */ + srv_ip = pj_str(param->rdata->pkt_info.src_name); + /* At this point we've detected that the address as seen by registrar. * has changed. */ + + /* Do not switch if both Contact and server's IP address are + * public but response contains private IP. A NAT in the middle + * might have messed up with the SIP packets. + */ + if (!is_private_ip(&uri->host) && !is_private_ip(&srv_ip) && + is_private_ip(via_addr)) + { + /* Don't switch */ + pj_pool_release(pool); + return PJ_FALSE; + } + PJ_LOG(3,(THIS_FILE, "IP address change detected for account %d " "(%.*s:%d --> %.*s:%d). Updating registration..", acc->index, -- cgit v1.2.3