[sr-dev] git:master: avpops: allow xavp semantics on second parameter
Victor Seva
linuxmaniac at torreviejawireless.org
Fri Sep 20 11:09:29 CEST 2013
Module: sip-router
Branch: master
Commit: 0968ce561b3bb8ea2ad2c7c53c03091e8518a6fe
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0968ce561b3bb8ea2ad2c7c53c03091e8518a6fe
Author: Victor Seva <linuxmaniac at torreviejawireless.org>
Committer: Victor Seva <linuxmaniac at torreviejawireless.org>
Date: Fri Sep 20 11:08:52 2013 +0200
avpops: allow xavp semantics on second parameter
---
modules/avpops/avpops_impl.c | 112 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 112 insertions(+), 0 deletions(-)
diff --git a/modules/avpops/avpops_impl.c b/modules/avpops/avpops_impl.c
index 65a5239..4fa2a53 100644
--- a/modules/avpops/avpops_impl.c
+++ b/modules/avpops/avpops_impl.c
@@ -45,6 +45,7 @@
#include "../../parser/parse_from.h"
#include "../../parser/parse_uri.h"
#include "../../mem/mem.h"
+#include "../../xavp.h"
#include "avpops_impl.h"
#include "avpops_db.h"
@@ -1051,6 +1052,86 @@ error:
return -1;
}
+int get_xavp(struct sip_msg *msg, pv_xavp_name_t *xname,
+ sr_xavp_t **avp, int *flag)
+{
+ int idxf = 0;
+ int idx = 0;
+ int count;
+
+ if(xname==NULL)
+ {
+ LM_ERR("bad parameters\n");
+ return -1;
+ }
+
+ if(xname->index.type==PVT_EXTRA)
+ {
+ /* get the index */
+ if(pv_get_spec_index(msg, &xname->index.pvp, &idx, &idxf)!=0)
+ {
+ LM_ERR("invalid index\n");
+ return -1;
+ }
+ LM_DBG("key1 idx:%d idxf:%d\n", idx, idxf);
+ if(idxf==PV_IDX_ALL)
+ LM_ERR("idx:* at first key not implemented. Using idx:0\n");
+ }
+ /* fix the index */
+ if(idx<0)
+ {
+ count = xavp_count(&xname->name, NULL);
+ idx = count + idx;
+ }
+ *avp = xavp_get_by_index(&xname->name, idx, NULL);
+ if(*avp==NULL)
+ return -1;
+ if(xname->next==NULL)
+ return 0;
+
+ idx = 0;
+ idxf = 0;
+ if(xname->next->index.type==PVT_EXTRA)
+ {
+ /* get the index */
+ if(pv_get_spec_index(msg, &xname->next->index.pvp, &idx, &idxf)!=0)
+ {
+ LM_ERR("invalid index\n");
+ return -1;
+ }
+ LM_DBG("key2 idx:%d idxf:%d\n", idx, idxf);
+ *flag=idxf;
+ }
+ /* fix the index */
+ if(idx<0)
+ {
+ count = xavp_count(&xname->next->name, &(*avp)->val.v.xavp);
+ idx = count + idx;
+ }
+ *avp = xavp_get_by_index(&xname->next->name, idx, &(*avp)->val.v.xavp);
+ if(*avp==NULL)
+ return -1;
+ return 1;
+}
+
+int check_xavp_param(struct sip_msg* msg, pv_spec_p spec, sr_xavp_t **xavp,
+ int *flag)
+{
+ int res;
+ pv_xavp_name_t *xname = (pv_xavp_name_t*)spec->pvp.pvn.u.dname;
+ res = get_xavp(msg, xname, xavp, flag);
+ if(res<=0)
+ {
+ if(res==0)
+ LM_ERR("xavp has to have key2\n");
+ LM_DBG("no dst xavp found\n");
+ goto error;
+ }
+ return 1;
+error:
+ return -1;
+}
+
int ops_check_avp( struct sip_msg* msg, struct fis_param* src,
struct fis_param* val)
{
@@ -1071,6 +1152,8 @@ int ops_check_avp( struct sip_msg* msg, struct fis_param* src,
char backup;
regex_t re_temp;
regex_t *re;
+ sr_xavp_t *xavp2 = NULL;
+ int xavp_flags=0;
/* look if the required avp(s) is/are present */
if(src->u.sval->type==PVT_AVP)
@@ -1138,6 +1221,30 @@ cycle1:
goto error;
}
check_flags = avp2->flags;
+ }
+ else if(val->u.sval->type==PVT_XAVP)
+ {
+ avp2 = 0;
+ if(xavp2==NULL)
+ {
+ if(check_xavp_param(msg, val->u.sval, &xavp2, &xavp_flags)<0)
+ {
+ goto error;
+ }
+ }
+ if(xavp2->val.type!=SR_XTYPE_INT&&xavp2->val.type!=SR_XTYPE_STR)
+ {
+ LM_ERR("cannot dst value is not INT or STR\n");
+ goto error;
+ }
+ check_flags = 0;
+ if(xavp2->val.type==SR_XTYPE_INT)
+ {
+ check_val.n = xavp2->val.v.i;
+ } else {
+ check_flags = AVP_VAL_STR;
+ check_val.s = xavp2->val.v.s;
+ }
} else {
avp2 = 0;
if(pv_get_spec_value(msg, val->u.sval, &xvalue)!=0)
@@ -1308,6 +1415,11 @@ next:
{
check_flags = avp2->flags;
goto cycle2;
+ } else if ((xavp2!=NULL) && (xavp_flags&PV_IDX_ALL)
+ && (xavp2=xavp_get_next(xavp2))!=NULL)
+ {
+ LM_DBG("xavp->next\n");
+ goto cycle1;
/* cycle for the first value -> next avp */
} else {
if(avp1 && val->ops&AVPOPS_FLAG_ALL)
More information about the sr-dev
mailing list