Module: kamailio Branch: master Commit: 9ff491a881f326b5ee6eee4fd40c427f8d83ecf0 URL: https://github.com/kamailio/kamailio/commit/9ff491a881f326b5ee6eee4fd40c427f...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2019-08-19T11:37:40+02:00
tm: propagate tcp connection id in outbound branch dst structure
---
Modified: src/modules/tm/t_funcs.c Modified: src/modules/tm/t_fwd.c
---
Diff: https://github.com/kamailio/kamailio/commit/9ff491a881f326b5ee6eee4fd40c427f... Patch: https://github.com/kamailio/kamailio/commit/9ff491a881f326b5ee6eee4fd40c427f...
---
diff --git a/src/modules/tm/t_funcs.c b/src/modules/tm/t_funcs.c index d814e3d5b2..0e484d9ebf 100644 --- a/src/modules/tm/t_funcs.c +++ b/src/modules/tm/t_funcs.c @@ -284,8 +284,9 @@ int t_relay_to( struct sip_msg *p_msg , struct proxy_l *proxy, int proto, e2e ACKs do not establish a transaction and are fwd-ed statelessly */ if ( p_msg->REQ_METHOD==METHOD_ACK) { LM_DBG("forwarding ACK statelessly\n"); + init_dest_info(&dst); + dst.id = p_msg->otcpid; if (proxy==0) { - init_dest_info(&dst); dst.proto=proto; if (get_uri_send_info(GET_NEXT_HOP(p_msg), &host, &port, &dst.proto, &comp)!=0){ @@ -299,7 +300,6 @@ int t_relay_to( struct sip_msg *p_msg , struct proxy_l *proxy, int proto, * of it */ ret=forward_request(p_msg, &host, port, &dst); } else { - init_dest_info(&dst); dst.proto=get_proto(proto, proxy->proto); proxy2su(&dst.to, proxy); /* dst->send_sock not set, but forward_request will take care diff --git a/src/modules/tm/t_fwd.c b/src/modules/tm/t_fwd.c index 213f0df746..33a50d7799 100644 --- a/src/modules/tm/t_fwd.c +++ b/src/modules/tm/t_fwd.c @@ -1596,22 +1596,15 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg, struct proxy_l * proxy, int proto) { int branch_ret, lowest_ret; - str current_uri; branch_bm_t added_branches; int first_branch; - int i, q; + int i; struct cell *t_invite; int success_branch; int try_new; int lock_replies; - str dst_uri, path, instance, ruid, location_ua; - struct socket_info* si; flag_t backup_bflags = 0; - flag_t bflags = 0; - - - /* make -Wall happy */ - current_uri.s=0; + branch_data_t obranch;
getbflagsval(0, &backup_bflags);
@@ -1667,40 +1660,46 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg, */ if (ruri_get_forking_state()) { try_new=1; - branch_ret=add_uac( t, p_msg, GET_RURI(p_msg), GET_NEXT_HOP(p_msg), + branch_ret=add_uac(t, p_msg, GET_RURI(p_msg), GET_NEXT_HOP(p_msg), &p_msg->path_vec, proxy, p_msg->force_send_socket, p_msg->fwd_send_flags, proto, (p_msg->dst_uri.len)?0:UAC_SKIP_BR_DST_F, &p_msg->instance, &p_msg->ruid, &p_msg->location_ua); /* test if cancel was received meanwhile */ if (t->flags & T_CANCELED) goto canceled; - if (branch_ret>=0) + if (branch_ret>=0) { added_branches |= 1<<branch_ret; - else + t->uac[branch_ret].request.dst.id = p_msg->otcpid; + } else { lowest_ret=MIN_int(lowest_ret, branch_ret); - } else try_new=0; + } + } else { + try_new=0; + }
+ memset(&obranch, 0, sizeof(branch_data_t)); init_branch_iterator(); - while((current_uri.s=next_branch( ¤t_uri.len, &q, &dst_uri, &path, - &bflags, &si, &ruid, &instance, &location_ua))) { + while(next_branch_data(&obranch)==1) { try_new++; - setbflagsval(0, bflags); + setbflagsval(0, obranch.flags);
- branch_ret=add_uac( t, p_msg, ¤t_uri, - (dst_uri.len) ? (&dst_uri) : ¤t_uri, - &path, proxy, si, p_msg->fwd_send_flags, - proto, (dst_uri.len)?0:UAC_SKIP_BR_DST_F, &instance, - &ruid, &location_ua); + branch_ret=add_uac(t, p_msg, &obranch.uri, + (obranch.dst_uri.len>0) ? &obranch.dst_uri : &obranch.uri, + &obranch.path, proxy, obranch.force_socket, p_msg->fwd_send_flags, + proto, (obranch.dst_uri.len>0)?0:UAC_SKIP_BR_DST_F, + &obranch.instance, &obranch.ruid, &obranch.location_ua); /* test if cancel was received meanwhile */ if (t->flags & T_CANCELED) goto canceled; /* pick some of the errors in case things go wrong; * note that picking lowest error is just as good as * any other algorithm which picks any other negative * branch result */ - if (branch_ret>=0) + if (branch_ret>=0) { added_branches |= 1<<branch_ret; - else + t->uac[branch_ret].request.dst.id = obranch.otcpid; + } else { lowest_ret=MIN_int(lowest_ret, branch_ret); + } } /* consume processed branches */ clear_branches();