Use Public IP in Via when STUN is enabled

This commit is contained in:
bossiel 2013-04-06 01:11:29 +00:00
parent 039792c825
commit 0d4e8ba4d9
2 changed files with 22 additions and 6 deletions

View File

@ -98,14 +98,26 @@ tsip_transport_t* tsip_transport_create(tsip_stack_t* stack, const char* host, t
return transport; return transport;
} }
/* add Via header using the transport config */ /* add Via header using the transport config
must be called after update_aor()
*/
int tsip_transport_addvia(const tsip_transport_t* self, const char *branch, tsip_message_t *msg) int tsip_transport_addvia(const tsip_transport_t* self, const char *branch, tsip_message_t *msg)
{ {
tnet_ip_t ip; tnet_ip_t ip = { '\0' };
tnet_port_t port; tnet_port_t port;
int ret; int ret;
int32_t transport_idx;
if((ret = tsip_transport_get_ip_n_port(self, &ip, &port))){ if((transport_idx = tsip_transport_get_idx_by_name(self->protocol)) == -1){
transport_idx = self->stack->network.transport_idx_default;
}
/* we always use same port to send() and recv() msg which means Via and Contact headers are identical */
if(self->stack->network.aor.ip[transport_idx] && self->stack->network.aor.port[transport_idx]){
memcpy(ip, self->stack->network.aor.ip[transport_idx], TSK_MIN(tsk_strlen(self->stack->network.aor.ip[transport_idx]), sizeof(ip)));
port = self->stack->network.aor.port[transport_idx];
}
else if((ret = tsip_transport_get_ip_n_port(self, &ip, &port))){
return ret; return ret;
} }
@ -424,8 +436,12 @@ tsk_size_t tsip_transport_send(const tsip_transport_t* self, const char *branch,
const tsk_bool_t update = ( (!TSIP_REQUEST_IS_ACK(msg) || (TSIP_REQUEST_IS_ACK(msg) && !msg->firstVia)) && !TSIP_REQUEST_IS_CANCEL(msg) ) const tsk_bool_t update = ( (!TSIP_REQUEST_IS_ACK(msg) || (TSIP_REQUEST_IS_ACK(msg) && !msg->firstVia)) && !TSIP_REQUEST_IS_CANCEL(msg) )
|| ( TNET_SOCKET_TYPE_IS_WS(msg->src_net_type) || TNET_SOCKET_TYPE_IS_WSS(msg->src_net_type) ); || ( TNET_SOCKET_TYPE_IS_WS(msg->src_net_type) || TNET_SOCKET_TYPE_IS_WSS(msg->src_net_type) );
if(update){ if(update){
tsip_transport_addvia(self, branch, msg); /* should be done before tsip_transport_msg_update() which could use the Via header */ /* AoR: Contact header */
tsip_transport_msg_update_aor((tsip_transport_t*)self, msg); /* AoR */ tsip_transport_msg_update_aor((tsip_transport_t*)self, msg);
/* should be done before tsip_transport_msg_update() which could use the Via header
must be done after update_aor()
*/
tsip_transport_addvia(self, branch, msg);
tsip_transport_msg_update(self, msg); /* IPSec, SigComp, ... */ tsip_transport_msg_update(self, msg); /* IPSec, SigComp, ... */
} }
} }

View File

@ -848,7 +848,7 @@ clean_routes:
{ {
if(msg->firstVia->received) if(msg->firstVia->received)
{ {
if(msg->firstVia->rport>0) if(msg->firstVia->rport > 0)
{ {
/* RFC 3581 - 4. Server Behavior /* RFC 3581 - 4. Server Behavior
When a server attempts to send a response, it examines the topmost When a server attempts to send a response, it examines the topmost