Module: sems Branch: rco/dnscache Commit: a7389521e2530108933d2355a6497fb2226635bb URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=a7389521e2530108933d2355a6497fb2226635bb
Author: Raphael Coeffic <[email protected]> Committer: Raphael Coeffic <[email protected]> Date: Wed Sep 1 15:49:10 2010 +0200 queries SRV records if no port specified in the R-URI (RFC3263) --- core/sip/trans_layer.cpp | 27 ++++++++++++++++++++++----- 1 files changed, 22 insertions(+), 5 deletions(-) diff --git a/core/sip/trans_layer.cpp b/core/sip/trans_layer.cpp index 5fee74e..aedb4ef 100644 --- a/core/sip/trans_layer.cpp +++ b/core/sip/trans_layer.cpp @@ -574,7 +574,8 @@ int _trans_layer::set_next_hop(sip_msg* msg, if (next_hop->len == 0) { *next_hop = na.uri.host; - *next_port = na.uri.port; + if(na.uri.port_str.len) + *next_port = na.uri.port; } if(!is_lr){ @@ -676,7 +677,8 @@ int _trans_layer::set_next_hop(sip_msg* msg, return -1; } *next_hop = parsed_r_uri.host; - *next_port = parsed_r_uri.port; + if(parsed_r_uri.port_str.len) + *next_port = parsed_r_uri.port; } DBG("next_hop:next_port is <%.*s:%u>\n", next_hop->len, next_hop->s, *next_port); @@ -687,12 +689,28 @@ int _trans_layer::set_next_hop(sip_msg* msg, int _trans_layer::set_destination_ip(sip_msg* msg, cstring* next_hop, unsigned short next_port) { + string nh = c2stlstr(*next_hop); + + if(!next_port){ + // no explicit port specified, + // try SRV first + + string srv_name = "_sip._udp." + nh; + if(!resolver::instance()->resolve_name(srv_name.c_str(), + &(msg->h_dns), + &(msg->remote_ip),IPv4)){ + return 0; + } + + DBG("no SRV record for %s",srv_name.c_str()); + } + memset(&(msg->remote_ip),0,sizeof(sockaddr_storage)); - int err = resolver::instance()->resolve_name(c2stlstr(*next_hop).c_str(), + int err = resolver::instance()->resolve_name(nh.c_str(), &(msg->h_dns), &(msg->remote_ip),IPv4); if(err < 0){ - ERROR("Unresolvable Request URI\n"); + ERROR("Unresolvable Request URI domain\n"); return -1; } @@ -1712,7 +1730,6 @@ void _trans_layer::timer_expired(timer* t, trans_bucket* bucket, sip_trans* tr) // copy the new address back memcpy(&tr->msg->remote_ip,&sa,sizeof(sockaddr_storage)); - // create new branch tag compute_branch((char*)(tr->msg->via_p1->branch.s+MAGIC_BRANCH_LEN), tr->msg->callid->value,tr->msg->cseq->value); _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
