Module: kamailio Branch: master Commit: 5acc7c8a21599fed0b30df18fefaea3a80a02854 URL: https://github.com/kamailio/kamailio/commit/5acc7c8a21599fed0b30df18fefaea3a...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2020-04-02T15:09:36+02:00
rr: try to enforce send socket using name in Route URI params
- done when sockname_mode=1; if param not found or no socket matching found, then it tries the classic socket lookup
---
Modified: src/modules/rr/loose.c
---
Diff: https://github.com/kamailio/kamailio/commit/5acc7c8a21599fed0b30df18fefaea3a... Patch: https://github.com/kamailio/kamailio/commit/5acc7c8a21599fed0b30df18fefaea3a...
---
diff --git a/src/modules/rr/loose.c b/src/modules/rr/loose.c index 28bc700941..4605ba09ad 100644 --- a/src/modules/rr/loose.c +++ b/src/modules/rr/loose.c @@ -36,6 +36,7 @@ #include "../../core/parser/parse_rr.h" #include "../../core/parser/parse_uri.h" #include "../../core/parser/parse_from.h" +#include "../../core/parser/parse_param.h" #include "../../core/mem/mem.h" #include "../../core/dset.h" #include "loose.h" @@ -61,6 +62,7 @@ static msg_ctx_id_t routed_msg_id = {0}; static str routed_params = {0,0};
extern int rr_force_send_socket; +extern int rr_sockname_mode;
/*! * \brief Test whether we are processing pre-loaded route set by looking at the To tag @@ -749,7 +751,44 @@ static inline int after_strict(struct sip_msg* _m) static inline void rr_do_force_send_socket(sip_msg_t *_m, sip_uri_t *puri, rr_t* rt, int rr2on) { - socket_info_t *si; + socket_info_t *si = NULL; + param_hooks_t phooks; + param_t* plist = NULL; + param_t *pit=NULL; + str s; + + + if(rr_sockname_mode!=0 && puri->params.len>0) { + s = puri->params; + if(s.s[s.len-1]==';') { + s.len--; + } + if (parse_params(&s, CLASS_ANY, &phooks, &plist)<0) { + LM_ERR("bad sip uri parameters: %.*s\n", s.len, s.s); + return; + } + for (pit = plist; pit; pit=pit->next) { + if (pit->name.len==SOCKNAME_PARAM_LEN + && strncasecmp(pit->name.s, SOCKNAME_PARAM, + SOCKNAME_PARAM_LEN)==0) { + if(pit->body.len>0) { + si = ksr_get_socket_by_name(&pit->body); + if(si != NULL) { + LM_DBG("found socket with name: %.*s\n", + pit->body.len, pit->body.s); + set_force_socket(_m, si); + free_params(plist); + return; + } else { + LM_DBG("failed to find socket with name: %.*s\n", + pit->body.len, pit->body.s); + } + } + } + } + LM_DBG("use of sockname parameter enabled, but failed to find it\n"); + free_params(plist); + }
if ((si = grep_sock_info(&puri->host, puri->port_no?puri->port_no:proto_default_port(puri->proto),