Преглед изворни кода

pv: new pv class - $K(key)

- return the value for internal constant keywords
- key can be:
	- IPv4 - returns AF_INET
	- IPv6 - returns AF_INET6
	- UDP - return PROTO_UDP
	- TCP - return PROTO_TCP
	- TLS - return PROTO_TLS
	- SCTP - return PROTO_SCTP
- it can be used to compare the values from other pvs, such as $af(id),
  $snd(af), $snd(proto), ...
Daniel-Constantin Mierla пре 13 година
родитељ
комит
ed5859fcd4
3 измењених фајлова са 75 додато и 0 уклоњено
  1. 2 0
      modules_k/pv/pv.c
  2. 67 0
      modules_k/pv/pv_core.c
  3. 6 0
      modules_k/pv/pv_core.h

+ 2 - 0
modules_k/pv/pv.c

@@ -411,6 +411,8 @@ static pv_export_t mod_pvs[] = {
 		0, pv_parse_nh_name, 0, 0, 0},
 	{ {"version", (sizeof("version")-1)}, PVT_OTHER, pv_get_sr_version,
 		0, pv_parse_sr_version_name, 0, 0, 0},
+	{ {"K", (sizeof("K")-1)}, PVT_OTHER, pv_get_K, 0,
+		pv_parse_K_name, 0, 0, 0 },
 
 	{ {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
 };

+ 67 - 0
modules_k/pv/pv_core.c

@@ -2523,3 +2523,70 @@ error:
 		pkg_free(pv);
 	return -1;
 }
+
+
+/**
+ *
+ */
+int pv_parse_K_name(pv_spec_p sp, str *in)
+{
+	if(sp==NULL || in==NULL || in->len<=0)
+		return -1;
+
+	switch(in->len)
+	{
+		case 3:
+			if(strncmp(in->s, "UDP", 3)==0)
+				sp->pvp.pvn.u.isname.name.n = 2;
+			else if(strncmp(in->s, "TCP", 3)==0)
+				sp->pvp.pvn.u.isname.name.n = 3;
+			else if(strncmp(in->s, "TLS", 3)==0)
+				sp->pvp.pvn.u.isname.name.n = 4;
+			else goto error;
+		break;
+		case 4:
+			if(strncmp(in->s, "IPv4", 4)==0)
+				sp->pvp.pvn.u.isname.name.n = 0;
+			else if(strncmp(in->s, "IPv6", 4)==0)
+				sp->pvp.pvn.u.isname.name.n = 1;
+			else if(strncmp(in->s, "SCTP", 4)==0)
+				sp->pvp.pvn.u.isname.name.n = 5;
+			else goto error;
+		break;
+		default:
+			goto error;
+	}
+	sp->pvp.pvn.type = PV_NAME_INTSTR;
+	sp->pvp.pvn.u.isname.type = 0;
+
+	return 0;
+
+error:
+	LM_ERR("unknown PV af key: %.*s\n", in->len, in->s);
+	return -1;
+}
+
+/**
+ *
+ */
+int pv_get_K(sip_msg_t *msg, pv_param_t *param, pv_value_t *res)
+{
+	if(param==NULL)
+		return -1;
+
+	switch(param->pvn.u.isname.name.n)
+	{
+		case 1:
+			return pv_get_uintval(msg, param, res, AF_INET6);
+		case 2:
+			return pv_get_uintval(msg, param, res, PROTO_UDP);
+		case 3:
+			return pv_get_uintval(msg, param, res, PROTO_TCP);
+		case 4:
+			return pv_get_uintval(msg, param, res, PROTO_TLS);
+		case 5:
+			return pv_get_uintval(msg, param, res, PROTO_SCTP);
+		default:
+			return pv_get_uintval(msg, param, res, AF_INET);
+	}
+}

+ 6 - 0
modules_k/pv/pv_core.h

@@ -280,5 +280,11 @@ int pv_parse_af_name(pv_spec_p sp, str *in);
 
 int pv_get_af(sip_msg_t *msg, pv_param_t *param,
 		pv_value_t *res);
+
+int pv_parse_K_name(pv_spec_p sp, str *in);
+
+int pv_get_K(sip_msg_t *msg, pv_param_t *param,
+		pv_value_t *res);
+
 #endif