From 938ac5e7223001fb9e3b748262283d323a23c539 Mon Sep 17 00:00:00 2001 From: Richard Good Date: Fri, 2 Dec 2016 16:30:10 +0200 Subject: [PATCH] modules/ims_qos: added patch for flow-description bug when request originates from called party Fix for incorrect IP swap in flow description AVP when called party originates a request that triggers Rx --- modules/ims_qos/rx_aar.c | 61 +++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/modules/ims_qos/rx_aar.c b/modules/ims_qos/rx_aar.c index 8ba6f4e0e70..f23740b39cb 100644 --- a/modules/ims_qos/rx_aar.c +++ b/modules/ims_qos/rx_aar.c @@ -436,8 +436,15 @@ int add_media_components(AAAMessage* aar, struct sip_msg *req, sdp_session_cell_t* req_sdp_session, *rpl_sdp_session; sdp_stream_cell_t* req_sdp_stream, *rpl_sdp_stream; int add_flow = 1; - - if (!req || !rpl) { + str ttag = {0, 0}; + str ftag = {0, 0}; + int request_originated_from_callee = 0; + str ipA, ipB; + + rx_authsessiondata_t* p_session_data = 0; + p_session_data = (rx_authsessiondata_t*) auth->u.auth.generic_data; + + if (!req || !rpl) { goto error; } @@ -497,23 +504,57 @@ int add_media_components(AAAMessage* aar, struct sip_msg *req, if(add_flow) { - str ipA = req_sdp_session->ip_addr; - str ipB = rpl_sdp_session->ip_addr; + + if (cscf_get_to_tag(rpl, &ttag) && cscf_get_from_tag(rpl, &ftag)) { + LM_DBG("Original ftag [%.*s] ttag [%.*s]. Current ftag [%.*s] ttag [%.*s]\n", + p_session_data->ftag.len, p_session_data->ftag.s, p_session_data->ttag.len, p_session_data->ttag.s, + ftag.len, ftag.s, ttag.len, ttag.s); + if (!(strncmp(p_session_data->ttag.s, ttag.s, p_session_data->ttag.len) == 0 && strncmp(p_session_data->ftag.s, ftag.s, p_session_data->ftag.len) == 0)) { + LM_DBG("ftag and ttag of this response do not match initial response so this request came from callee\n"); + request_originated_from_callee = 1; + } + } else { + LM_ERR("Couldn't retrieve ftag so assume this request originated from caller\n"); + } + + if (request_originated_from_callee) { + LM_DBG("Request originated from callee so IPs are reversed\n"); + ipA = rpl_sdp_session->ip_addr; + ipB = req_sdp_session->ip_addr; + } else { + ipA = req_sdp_session->ip_addr; + ipB = rpl_sdp_session->ip_addr; + } + if (ipA.len <= 0) { - LM_DBG("Request SDP connection IP could not be retrieved, so we use SDP 1st stream IP"); - ipA = req_sdp_stream->ip_addr; + LM_DBG("Request SDP connection IP could not be retrieved, so we use SDP 1st stream IP\n"); + if (request_originated_from_callee) { + LM_DBG("Request originated from callee so IPs are reversed\n"); + ipA = rpl_sdp_stream->ip_addr; + } else { + ipA = req_sdp_stream->ip_addr; + } + + if (ipA.len <= 0) { - LM_ERR("Requested SDP IP information could not be retrieved"); + LM_ERR("Requested SDP IP information could not be retrieved\n"); goto error; } } if (ipB.len <= 0) { - LM_DBG("Reply SDP connection IP could not be retrieved, so we use SDP 1st stream IP"); - ipB = rpl_sdp_stream->ip_addr; + LM_DBG("Reply SDP connection IP could not be retrieved, so we use SDP 1st stream IP\n"); + if (request_originated_from_callee) { + LM_DBG("Request originated from callee so IPs are reversed\n"); + ipB = req_sdp_stream->ip_addr; + } else { + ipB = rpl_sdp_stream->ip_addr; + } + + if (ipB.len <= 0) { - LM_ERR("Request SDP IP information could not be retrieved"); + LM_ERR("Request SDP IP information could not be retrieved\n"); goto error; } }