From 25c67bb78fb3f722b40277288d681acb89d2808b Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Fri, 6 Dec 2019 10:02:43 +0100 Subject: [PATCH 1/2] registrar: control what values to add to xavp_rcd via xavp_rcd_mask --- src/modules/registrar/lookup.c | 35 ++++++++++++++--------- src/modules/registrar/lookup.h | 4 +++ src/modules/registrar/registrar.c | 3 +- src/modules/registrar/registrar.h | 8 +++++- src/modules/registrar/reply.c | 47 ++----------------------------- 5 files changed, 36 insertions(+), 61 deletions(-) diff --git a/src/modules/registrar/lookup.c b/src/modules/registrar/lookup.c index eeffaf6e875..97dd635b383 100644 --- a/src/modules/registrar/lookup.c +++ b/src/modules/registrar/lookup.c @@ -169,29 +169,36 @@ int xavp_rcd_helper(ucontact_t* ptr) list = xavp_get(®_xavp_rcd, NULL); xavp = list ? &list->val.v.xavp : &new_xavp; - memset(&xval, 0, sizeof(sr_xval_t)); - xval.type = SR_XTYPE_STR; - xval.v.s = ptr->ruid; - xavp_add_value(&xname_ruid, &xval, xavp); - if(ptr->received.len > 0) { + if(!(reg_xavp_rcd_mask & AVP_RCD_RUID)) { + memset(&xval, 0, sizeof(sr_xval_t)); + xval.type = SR_XTYPE_STR; + xval.v.s = ptr->ruid; + xavp_add_value(&xname_ruid, &xval, xavp); + } + + if(!(reg_xavp_rcd_mask & AVP_RCD_RCV) && (ptr->received.len > 0)) { memset(&xval, 0, sizeof(sr_xval_t)); xval.type = SR_XTYPE_STR; xval.v.s = ptr->received; xavp_add_value(&xname_received, &xval, xavp); } - memset(&xval, 0, sizeof(sr_xval_t)); - xval.type = SR_XTYPE_STR; - xval.v.s = ptr->c; - xavp_add_value(&xname_contact, &xval, xavp); + if(!(reg_xavp_rcd_mask & AVP_RCD_CNT)) { + memset(&xval, 0, sizeof(sr_xval_t)); + xval.type = SR_XTYPE_STR; + xval.v.s = ptr->c; + xavp_add_value(&xname_contact, &xval, xavp); + } - memset(&xval, 0, sizeof(sr_xval_t)); - xval.type = SR_XTYPE_INT; - xval.v.i = (int) (ptr->expires - time(0)); - xavp_add_value(&xname_expires, &xval, xavp); + if(!(reg_xavp_rcd_mask & AVP_RCD_EXP)) { + memset(&xval, 0, sizeof(sr_xval_t)); + xval.type = SR_XTYPE_INT; + xval.v.i = (int) (ptr->expires - time(0)); + xavp_add_value(&xname_expires, &xval, xavp); + } - if(ptr->path.len > 0) { + if(!(reg_xavp_rcd_mask & AVP_RCD_PATH) && (ptr->path.len > 0)) { memset(&xval, 0, sizeof(sr_xval_t)); xval.type = SR_XTYPE_STR; xval.v.s = ptr->path; diff --git a/src/modules/registrar/lookup.h b/src/modules/registrar/lookup.h index 68dfb433daf..df8548720c9 100644 --- a/src/modules/registrar/lookup.h +++ b/src/modules/registrar/lookup.h @@ -60,6 +60,10 @@ int lookup_to_dset(struct sip_msg* _m, udomain_t* _d, str* _uri); */ int lookup_branches(sip_msg_t *msg, udomain_t *d); +/*! \brief + * add xavp with details of the record (ruid, ...) + */ +int xavp_rcd_helper(ucontact_t* ptr); /*! \brief * Return true if the AOR in the Request-URI is registered, diff --git a/src/modules/registrar/registrar.c b/src/modules/registrar/registrar.c index ec374571e98..109df009b17 100644 --- a/src/modules/registrar/registrar.c +++ b/src/modules/registrar/registrar.c @@ -126,7 +126,7 @@ int_str rcv_avp_name; str reg_xavp_cfg = {0}; str reg_xavp_rcd = {0}; - +int reg_xavp_rcd_mask = 0; int reg_use_domain = 0; int sock_flag = -1; @@ -238,6 +238,7 @@ static param_export_t params[] = { {"path_check_local", INT_PARAM, &path_check_local }, {"xavp_cfg", PARAM_STR, ®_xavp_cfg }, {"xavp_rcd", PARAM_STR, ®_xavp_rcd }, + {"xavp_rcd_mask", INT_PARAM, ®_xavp_rcd_mask }, {"gruu_enabled", INT_PARAM, ®_gruu_enabled }, {"outbound_mode", INT_PARAM, ®_outbound_mode }, {"regid_mode", INT_PARAM, ®_regid_mode }, diff --git a/src/modules/registrar/registrar.h b/src/modules/registrar/registrar.h index c71a8ad1689..8c0ce2b5314 100644 --- a/src/modules/registrar/registrar.h +++ b/src/modules/registrar/registrar.h @@ -67,6 +67,12 @@ extern int contact_max_size; /* configurable using module parameter "contact_max * increases! */ #define REG_FLOW_TIMER_MAX 999 +#define AVP_RCD_RUID 1 +#define AVP_RCD_CNT 2 +#define AVP_RCD_EXP 4 +#define AVP_RCD_RCV 8 +#define AVP_RCD_PATH 16 + extern int nat_flag; extern int tcp_persistent_flag; extern int received_avp; @@ -96,7 +102,7 @@ extern int sock_flag; extern str reg_xavp_cfg; extern str reg_xavp_rcd; - +extern int reg_xavp_rcd_mask; extern usrloc_api_t ul;/*!< Structure containing pointers to usrloc functions*/ extern sl_api_t slb; diff --git a/src/modules/registrar/reply.c b/src/modules/registrar/reply.c index c5eb4a32246..687da5e6ef3 100644 --- a/src/modules/registrar/reply.c +++ b/src/modules/registrar/reply.c @@ -40,6 +40,7 @@ #include "regtime.h" #include "reply.h" #include "config.h" +#include "lookup.h" #define MAX_CONTACT_BUFFER 1024 @@ -173,14 +174,6 @@ int build_contact(sip_msg_t *msg, ucontact_t* c, str *host) unsigned int ahash; unsigned short digit; int mode; - sr_xavp_t **xavp=NULL; - sr_xavp_t *list=NULL; - sr_xavp_t *new_xavp=NULL; - str xname = {"ruid", 4}; - str ename = {"expires", 7}; - sr_xval_t xval; - - if(msg!=NULL && parse_supported(msg)==0 && (get_supported(msg) & F_OPTION_TAG_GRUU)) @@ -210,13 +203,6 @@ int build_contact(sip_msg_t *msg, ucontact_t* c, str *host) memcpy(p, CONTACT_BEGIN, CONTACT_BEGIN_LEN); p += CONTACT_BEGIN_LEN; - /* add xavp with details of the record (ruid, ...) */ - if(reg_xavp_rcd.s!=NULL) - { - list = xavp_get(®_xavp_rcd, NULL); - xavp = list ? &list->val.v.xavp : &new_xavp; - } - fl = 0; while(c) { if (VALID_CONTACT(c, act_time)) { @@ -333,42 +319,13 @@ int build_contact(sip_msg_t *msg, ucontact_t* c, str *host) } if(reg_xavp_rcd.s!=NULL) { - memset(&xval, 0, sizeof(sr_xval_t)); - xval.type = SR_XTYPE_STR; - xval.v.s = c->ruid; - - if(xavp_add_value(&xname, &xval, xavp)==NULL) { - LM_ERR("cannot add ruid value to xavp\n"); - } - /* Add contact expiry */ - memset(&xval, 0, sizeof(sr_xval_t)); - xval.type = SR_XTYPE_INT; - xval.v.i = (int)(c->expires - act_time); - - if(xavp_add_value(&ename, &xval, xavp)==NULL) { - LM_ERR("cannot add expires value to xavp\n"); - } + xavp_rcd_helper(c); } } c = c->next; } - /* add xavp with details of the record (ruid, ...) */ - - if(reg_xavp_rcd.s!=NULL) - { - if(list==NULL && *xavp!=NULL) - { - xval.type = SR_XTYPE_XAVP; - xval.v.xavp = *xavp; - if(xavp_add_value(®_xavp_rcd, &xval, NULL)==NULL) { - LM_ERR("cannot add ruid xavp to root list\n"); - xavp_destroy_list(xavp); - } - } - } - memcpy(p, CRLF, CRLF_LEN); p += CRLF_LEN; From e8e51f250df0953288883cb2e899a13e85f9a8bd Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Fri, 6 Dec 2019 09:30:07 +0100 Subject: [PATCH 2/2] registrar: add documentation for xavp_rcd_mask parameter --- src/modules/registrar/doc/registrar_admin.xml | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/modules/registrar/doc/registrar_admin.xml b/src/modules/registrar/doc/registrar_admin.xml index e8b1a757160..eb87035f02e 100644 --- a/src/modules/registrar/doc/registrar_admin.xml +++ b/src/modules/registrar/doc/registrar_admin.xml @@ -809,6 +809,37 @@ modparam("registrar", "xavp_rcd", "ulrcd") +
+ <varname>xavp_rcd_mask</varname> (int) + + Defines what values to skip when xavp_rcd is stored. + + + 1 - ruid + 2 - contact + 4 - expires + 8 - received + 16 - path + + + + Default value is 0 (none). + + + + Set <varname>xavp_rcd_mask</varname> parameter + +... +# skip path value +modparam("registrar", "xavp_rcd_mask", 16) +... +# skip path and expires values +modparam("registrar", "xavp_rcd_mask", 20) +... + + +
+
<varname>gruu_enabled</varname> (integer)