|
@@ -36,8 +36,10 @@
|
|
#define PCV_BUF_SIZE 256
|
|
#define PCV_BUF_SIZE 256
|
|
static char pcv_buf[PCV_BUF_SIZE];
|
|
static char pcv_buf[PCV_BUF_SIZE];
|
|
static str pcv = { pcv_buf, 0 };
|
|
static str pcv = { pcv_buf, 0 };
|
|
-static str pcv_host = { NULL, 0 };
|
|
|
|
static str pcv_id = { NULL, 0 };
|
|
static str pcv_id = { NULL, 0 };
|
|
|
|
+static str pcv_host = { NULL, 0 };
|
|
|
|
+static str pcv_orig = { NULL, 0 };
|
|
|
|
+static str pcv_term = { NULL, 0 };
|
|
static uint64_t counter = 0;
|
|
static uint64_t counter = 0;
|
|
|
|
|
|
|
|
|
|
@@ -192,6 +194,34 @@ static int sip_parse_charging_vector(const char * pcv_value, unsigned int len)
|
|
pcv_host.len = 0;
|
|
pcv_host.len = 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ s = strstr(pcv_value, "orig-ioi=");
|
|
|
|
+ if (s != NULL)
|
|
|
|
+ {
|
|
|
|
+ pcv_orig.s = s + strlen("orig-ioi=");
|
|
|
|
+ pcv_orig.len = sip_param_end(pcv_orig.s, len);
|
|
|
|
+ LM_INFO("parsed P-Charging-Vector orig-ioi=%.*s\n",
|
|
|
|
+ pcv_orig.len, pcv_orig.s );
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ pcv_orig.s = NULL;
|
|
|
|
+ pcv_orig.len = 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ s = strstr(pcv_value, "term-ioi=");
|
|
|
|
+ if (s != NULL)
|
|
|
|
+ {
|
|
|
|
+ pcv_term.s = s + strlen("term-ioi=");
|
|
|
|
+ pcv_term.len = sip_param_end(pcv_term.s, len);
|
|
|
|
+ LM_INFO("parsed P-Charging-Vector term-ioi=%.*s\n",
|
|
|
|
+ pcv_term.len, pcv_term.s );
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ pcv_term.s = NULL;
|
|
|
|
+ pcv_term.len = 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
// only icid-value is mandatory, log anyway when missing icid-generated-at
|
|
// only icid-value is mandatory, log anyway when missing icid-generated-at
|
|
if ( pcv_host.s == NULL && pcv_id.s != NULL && len > 0)
|
|
if ( pcv_host.s == NULL && pcv_id.s != NULL && len > 0)
|
|
{
|
|
{
|
|
@@ -436,6 +466,12 @@ int pv_get_charging_vector(struct sip_msg *msg, pv_param_t *param, pv_value_t *r
|
|
LM_DBG("pcv_status==PCV_PARSED\n");
|
|
LM_DBG("pcv_status==PCV_PARSED\n");
|
|
switch( param->pvn.u.isname.name.n )
|
|
switch( param->pvn.u.isname.name.n )
|
|
{
|
|
{
|
|
|
|
+ case 5:
|
|
|
|
+ pcv_pv = pcv_term;
|
|
|
|
+ break;
|
|
|
|
+ case 4:
|
|
|
|
+ pcv_pv = pcv_orig;
|
|
|
|
+ break;
|
|
case 2:
|
|
case 2:
|
|
pcv_pv = pcv_host;
|
|
pcv_pv = pcv_host;
|
|
break;
|
|
break;
|
|
@@ -477,6 +513,13 @@ int pv_parse_charging_vector_name(pv_spec_p sp, str *in)
|
|
sp->pvp.pvn.u.isname.name.n = 1;
|
|
sp->pvp.pvn.u.isname.name.n = 1;
|
|
else goto error;
|
|
else goto error;
|
|
break;
|
|
break;
|
|
|
|
+ case 4:
|
|
|
|
+ if(strncmp(in->s, "orig", 4)==0)
|
|
|
|
+ sp->pvp.pvn.u.isname.name.n = 4;
|
|
|
|
+ else if(strncmp(in->s, "term", 4)==0)
|
|
|
|
+ sp->pvp.pvn.u.isname.name.n = 5;
|
|
|
|
+ else goto error;
|
|
|
|
+ break;
|
|
case 5:
|
|
case 5:
|
|
if(strncmp(in->s, "value", 5)==0)
|
|
if(strncmp(in->s, "value", 5)==0)
|
|
sp->pvp.pvn.u.isname.name.n = 3;
|
|
sp->pvp.pvn.u.isname.name.n = 3;
|