uac: new functionality to force a default socket for register and request sending
authorHenning Westerholt <hw@skalatan.de>
Fri, 9 Aug 2019 08:45:53 +0000 (10:45 +0200)
committerHenning Westerholt <hw@skalatan.de>
Fri, 9 Aug 2019 08:45:53 +0000 (10:45 +0200)
- add new functionality to force a default socket with parameter "default_socket"
- works for uac REGISTER requests and also uac_send_req
- if used with uac_send_req an eventual specified socket takes priority over the
  default socket

src/modules/uac/doc/uac_admin.xml
src/modules/uac/uac.c
src/modules/uac/uac_reg.c
src/modules/uac/uac_reg.h
src/modules/uac/uac_send.c

index c5697d9..91b8787 100644 (file)
@@ -562,6 +562,30 @@ modparam("uac", "reg_gc_interval", 60)
                                </programlisting>
                        </example>
                </section>
+       <section id="uac.p.default_socket">
+               <title><varname>default_socket</varname> (str)</title>
+               <para>
+                       Default socket to be used for generating registration requests and sending
+                       requests with the function uac_req_send(). Useful e.g. when several public
+                       interfaces are available.
+               </para>
+               <para>
+               <emphasis>
+                       By default no default socket is defined, the send socket is choosen from the
+                       <emphasis>tm</emphasis> module when the requests is send out. A send socket
+                       in the $uac_reg variable used together with the uac_req_send() function will
+                       override this parameter.
+               </emphasis>
+               </para>
+               <example>
+               <title>Set the <quote>default_socket</quote> parameter</title>
+ <programlisting format="linespecific">
+ ...
+ modparam("uac", "default_socket", "udp:192.168.0.125:5060")
+ ...
+ </programlisting>
+               </example>
+       </section>
 
        </section>
 
index 217d162..44343bb 100644 (file)
@@ -90,6 +90,8 @@ struct rr_binds uac_rrb;
 pv_spec_t auth_username_spec;
 pv_spec_t auth_realm_spec;
 pv_spec_t auth_password_spec;
+str uac_default_socket = STR_NULL;
+struct socket_info * uac_default_sockinfo = NULL;
 
 static int w_replace_from(struct sip_msg* msg, char* p1, char* p2);
 static int w_restore_from(struct sip_msg* msg, char* p1, char* p2);
@@ -172,6 +174,7 @@ static param_export_t params[] = {
        {"reg_random_delay",    INT_PARAM,                      &reg_random_delay      },
        {"reg_active",  INT_PARAM,                      &reg_active_param      },
        {"reg_gc_interval",             INT_PARAM,      &_uac_reg_gc_interval   },
+       {"default_socket",      PARAM_STR, &uac_default_socket},
        {0, 0, 0}
 };
 
@@ -206,6 +209,8 @@ inline static int parse_auth_avp( char *avp_spec, pv_spec_t *avp, char *txt)
 static int mod_init(void)
 {
        pv_spec_t avp_spec;
+       str host;
+       int port, proto;
 
        if (restore_mode_str && *restore_mode_str) {
                if (strcasecmp(restore_mode_str,"none")==0) {
@@ -349,6 +354,25 @@ static int mod_init(void)
                /* add child to update local config framework structures */
                cfg_register_child(1);
        }
+
+       if(uac_default_socket.s && uac_default_socket.len > 0) {
+               if(parse_phostport(
+                                  uac_default_socket.s, &host.s, &host.len, &port, &proto)
+                               != 0) {
+                       LM_ERR("bad socket <%.*s>\n", uac_default_socket.len,
+                                       uac_default_socket.s);
+                       return -1;
+               }
+               uac_default_sockinfo =
+                               grep_sock_info(&host, (unsigned short)port, proto);
+               if(uac_default_sockinfo == 0) {
+                       LM_ERR("non-local socket <%.*s>\n", uac_default_socket.len,
+                                       uac_default_socket.s);
+                       return -1;
+               }
+               LM_INFO("default uac socket set to <%.*s>\n",
+                               uac_default_socket.len, uac_default_socket.s);
+       }
        init_from_replacer();
 
        uac_req_init();
index dfc595f..f7f62e0 100644 (file)
@@ -1013,6 +1013,10 @@ void uac_reg_tm_callback( struct cell *t, int type, struct tmcb_params *ps)
                uac_r.cb  = uac_reg_tm_callback;
                /* Callback parameter */
                uac_r.cbp = (void*)uuid;
+               /* default socket */
+               if(uac_default_socket.s != NULL && uac_default_socket.len > 0) {
+                       uac_r.ssock = &uac_default_socket;
+               }
 #ifdef UAC_OLD_AUTH
                ret = uac_tmb.t_request(&uac_r,  /* UAC Req */
                                &s_ruri, /* Request-URI */
@@ -1171,6 +1175,10 @@ int uac_reg_update(reg_uac_t *reg, time_t tn)
 
                ret = uac_tmb.t_request_within(&uac_r);
        } else {
+               /* default socket */
+               if(uac_default_socket.s != NULL && uac_default_socket.len > 0) {
+                       uac_r.ssock = &uac_default_socket;
+               }
                ret = uac_tmb.t_request(&uac_r,  /* UAC Req */
                                &s_ruri, /* Request-URI */
                                &s_turi, /* To */
index 55a443b..ea222e3 100644 (file)
@@ -32,6 +32,9 @@ extern int reg_random_delay;
 extern str reg_contact_addr;
 extern str reg_db_url;
 extern str reg_db_table;
+extern str uac_default_socket;
+/* just to check for non-local sockets for now */
+extern struct socket_info * uac_default_sockinfo;
 
 extern str l_uuid_column;
 extern str l_username_column;
index 1d939dc..0a3580b 100644 (file)
@@ -40,6 +40,7 @@
 #include "auth.h"
 #include "auth_hdr.h"
 #include "uac_send.h"
+#include "uac_reg.h"
 
 #define MAX_UACH_SIZE 2048
 #define MAX_UACB_SIZE 32768
@@ -820,7 +821,13 @@ int uac_req_send(void)
        uac_r.method = &_uac_req.s_method;
        uac_r.headers = (_uac_req.s_hdrs.len <= 0) ? NULL : &_uac_req.s_hdrs;
        uac_r.body = (_uac_req.s_body.len <= 0) ? NULL : &_uac_req.s_body;
-       uac_r.ssock = (_uac_req.s_sock.len <= 0) ? NULL : &_uac_req.s_sock;
+
+       if (_uac_req.s_sock.s != NULL && _uac_req.s_sock.len > 0) {
+               uac_r.ssock = &_uac_req.s_sock;
+       } else if(uac_default_socket.s != NULL && uac_default_socket.len > 0) {
+               uac_r.ssock = &uac_default_socket;
+       }
+
        if((_uac_req.s_auser.len > 0 && _uac_req.s_apasswd.len>0)
                        || (_uac_req.evroute > 0))
        {