Browse Source

uac: new functionality to force a default socket for register and request sending

- 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
Henning Westerholt 6 năm trước cách đây
mục cha
commit
27b6f0aba0

+ 24 - 0
src/modules/uac/doc/uac_admin.xml

@@ -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>
 

+ 24 - 0
src/modules/uac/uac.c

@@ -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();

+ 8 - 0
src/modules/uac/uac_reg.c

@@ -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 */

+ 3 - 0
src/modules/uac/uac_reg.h

@@ -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;

+ 8 - 1
src/modules/uac/uac_send.c

@@ -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))
 	{