Explorar o código

pv: $snd(id) broken in $sndto(id) and $sndfrom(id)

- $snd(id) is aliased to $sndto(id)
- $sndto(id) points to next hop address
- $sndfrom(id) points to local socket to be used for sending
Daniel-Constantin Mierla %!s(int64=14) %!d(string=hai) anos
pai
achega
f6e2325aa6
Modificáronse 3 ficheiros con 48 adicións e 4 borrados
  1. 6 2
      modules_k/pv/pv.c
  2. 39 1
      modules_k/pv/pv_branch.c
  3. 3 1
      modules_k/pv/pv_branch.h

+ 6 - 2
modules_k/pv/pv.c

@@ -70,8 +70,12 @@ static pv_export_t mod_pvs[] = {
 	{ {"sel", sizeof("sel")-1}, /* select */
 	{ {"sel", sizeof("sel")-1}, /* select */
 		PVT_OTHER, pv_get_select, 0,
 		PVT_OTHER, pv_get_select, 0,
 		pv_parse_select_name, 0, 0, 0 },
 		pv_parse_select_name, 0, 0, 0 },
-	{{"snd", (sizeof("snd")-1)}, PVT_OTHER, pv_get_snd, 0,
-		pv_parse_snd_name, 0, 0, 0},
+	{ {"snd", (sizeof("snd")-1)}, PVT_OTHER, pv_get_sndto, 0,
+		pv_parse_snd_name, 0, 0, 0 },
+	{ {"sndto", (sizeof("sndto")-1)}, PVT_OTHER, pv_get_sndto, 0,
+		pv_parse_snd_name, 0, 0, 0 },
+	{ {"sndfrom", (sizeof("sndfrom")-1)}, PVT_OTHER, pv_get_sndfrom, 0,
+		pv_parse_snd_name, 0, 0, 0 },
 #ifdef WITH_XAVP
 #ifdef WITH_XAVP
 	{ {"xavp", sizeof("xavp")-1}, /* xavp */
 	{ {"xavp", sizeof("xavp")-1}, /* xavp */
 		PVT_OTHER, pv_get_xavp, pv_set_xavp,
 		PVT_OTHER, pv_get_xavp, pv_set_xavp,

+ 39 - 1
modules_k/pv/pv_branch.c

@@ -328,7 +328,7 @@ error:
 	return -1;
 	return -1;
 }
 }
 
 
-int pv_get_snd(struct sip_msg *msg, pv_param_t *param,
+int pv_get_sndfrom(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res)
 		pv_value_t *res)
 {
 {
 	struct onsend_info* snd_inf;
 	struct onsend_info* snd_inf;
@@ -365,6 +365,44 @@ int pv_get_snd(struct sip_msg *msg, pv_param_t *param,
 	return 0;
 	return 0;
 }
 }
 
 
+int pv_get_sndto(struct sip_msg *msg, pv_param_t *param,
+		pv_value_t *res)
+{
+	struct onsend_info* snd_inf;
+	str s;
+
+	snd_inf=get_onsend_info();
+	if (! likely(snd_inf && snd_inf->send_sock))
+		return pv_get_null(msg, param, res);
+
+	switch(param->pvn.u.isname.name.n)
+	{
+		case 1: /* af */
+			return pv_get_uintval(msg, param, res,
+					(int)snd_inf->send_sock->address.af);
+		case 2: /* port */
+			return pv_get_uintval(msg, param, res,
+					(int)su_getport(snd_inf->to));
+		case 3: /* proto */
+			return pv_get_uintval(msg, param, res,
+					(int)snd_inf->send_sock->proto);
+		case 4: /* buf */
+			s.s   = snd_inf->buf;
+			s.len = snd_inf->len;
+			return pv_get_strval(msg, param, res, &s);
+		case 5: /* len */
+			return pv_get_uintval(msg, param, res,
+					(int)snd_inf->len);
+		default:
+			/* 0 - ip */
+			s.s   = su2a(snd_inf->to, sizeof(*snd_inf->to));
+			s.len = strlen(s.s);
+			return pv_get_strval(msg, param, res, &s);
+	}
+
+	return 0;
+}
+
 int pv_parse_snd_name(pv_spec_p sp, str *in)
 int pv_parse_snd_name(pv_spec_p sp, str *in)
 {
 {
 	if(sp==NULL || in==NULL || in->len<=0)
 	if(sp==NULL || in==NULL || in->len<=0)

+ 3 - 1
modules_k/pv/pv_branch.h

@@ -31,7 +31,9 @@ int pv_set_branchx(struct sip_msg* msg, pv_param_t *param,
 		int op, pv_value_t *val);
 		int op, pv_value_t *val);
 int pv_parse_branchx_name(pv_spec_p sp, str *in);
 int pv_parse_branchx_name(pv_spec_p sp, str *in);
 
 
-int pv_get_snd(struct sip_msg *msg, pv_param_t *param,
+int pv_get_sndto(struct sip_msg *msg, pv_param_t *param,
+		pv_value_t *res);
+int pv_get_sndfrom(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res);
 		pv_value_t *res);
 int pv_parse_snd_name(pv_spec_p sp, str *in);
 int pv_parse_snd_name(pv_spec_p sp, str *in);