[sr-dev] git:3.1: registrar(s): support for disabled code, reason and contact AVPs

Andrei Pelinescu-Onciul andrei at iptel.org
Wed Oct 13 08:21:45 CEST 2010


Module: sip-router
Branch: 3.1
Commit: c34fea16c38a2338e27a49c33dc595948128d4d9
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c34fea16c38a2338e27a49c33dc595948128d4d9

Author: Andrei Pelinescu-Onciul <andrei at iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei at iptel.org>
Date:   Wed Oct  6 19:06:42 2010 +0200

registrar(s): support for disabled code, reason and contact AVPs

reply_code_attr, reply_reason_attr and contact_attr modparams can
now be set to "" to disable setting the corresponding AVPs when
a save*_noreply() is used (speed-up if not needed).
(cherry picked from commit fb021d55b09bfbb5503d5879a902f968f1bcabfd)

---

 modules_s/registrar/reg_mod.c |   70 +++++++++++++++++++++++------------------
 modules_s/registrar/reg_mod.h |    1 +
 modules_s/registrar/reply.c   |   48 ++++++++++++++++------------
 3 files changed, 67 insertions(+), 52 deletions(-)

diff --git a/modules_s/registrar/reg_mod.c b/modules_s/registrar/reg_mod.c
index f623d1b..b21039d 100644
--- a/modules_s/registrar/reg_mod.c
+++ b/modules_s/registrar/reg_mod.c
@@ -174,42 +174,50 @@ static int parse_attr_params(void)
 {
 	str tmp;
 
-	tmp = reply_code_attr;
-	trim(&tmp);
-	if (!tmp.len || tmp.s[0] != '$') {
-		ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
-	}
-	tmp.s++; tmp.len--;
-	if (parse_avp_ident(&tmp, &avpid_code) < 0) {
-		ERR("Error while parsing attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
+	if (reply_code_attr.len) {
+		tmp = reply_code_attr;
+		trim(&tmp);
+		if (!tmp.len || tmp.s[0] != '$') {
+			ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
+			return -1;
+		}
+		tmp.s++; tmp.len--;
+		if (parse_avp_ident(&tmp, &avpid_code) < 0) {
+			ERR("Error while parsing attribute name '%.*s'\n",
+					tmp.len, tmp.s);
+			return -1;
+		}
 	}
 
-	tmp = reply_reason_attr;
-	trim(&tmp);
-	if (!tmp.len || tmp.s[0] != '$') {
-		ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
-	}
-	tmp.s++; tmp.len--;
-	if (parse_avp_ident(&tmp, &avpid_reason) < 0) {
-		ERR("Error while parsing attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
+	if (reply_reason_attr.len) {
+		tmp = reply_reason_attr;
+		trim(&tmp);
+		if (!tmp.len || tmp.s[0] != '$') {
+			ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
+			return -1;
+		}
+		tmp.s++; tmp.len--;
+		if (parse_avp_ident(&tmp, &avpid_reason) < 0) {
+			ERR("Error while parsing attribute name '%.*s'\n",
+					tmp.len, tmp.s);
+			return -1;
+		}
 	}
 
-	tmp = contact_attr;
-	trim(&tmp);
-	if (!tmp.len || tmp.s[0] != '$') {
-		ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
-	}
-	tmp.s++; tmp.len--;
-	if (parse_avp_ident(&tmp, &avpid_contact) < 0) {
-		ERR("Error while parsing attribute name '%.*s'\n", tmp.len, tmp.s);
-		return -1;
+	if (contact_attr.len) {
+		tmp = contact_attr;
+		trim(&tmp);
+		if (!tmp.len || tmp.s[0] != '$') {
+			ERR("Invalid attribute name '%.*s'\n", tmp.len, tmp.s);
+			return -1;
+		}
+		tmp.s++; tmp.len--;
+		if (parse_avp_ident(&tmp, &avpid_contact) < 0) {
+			ERR("Error while parsing attribute name '%.*s'\n",
+					tmp.len, tmp.s);
+			return -1;
+		}
 	}
-
 	return 0;
 }
 
diff --git a/modules_s/registrar/reg_mod.h b/modules_s/registrar/reg_mod.h
index 6b61c29..027a571 100644
--- a/modules_s/registrar/reg_mod.h
+++ b/modules_s/registrar/reg_mod.h
@@ -57,6 +57,7 @@ extern usrloc_api_t ul;  /* Structure containing pointers to usrloc functions */
 
 extern sl_api_t slb;
 
+extern str reply_code_attr, reply_reason_attr, contact_attr;
 extern avp_ident_t avpid_code, avpid_reason, avpid_contact;
 
 #endif /* REG_MOD_H */
diff --git a/modules_s/registrar/reply.c b/modules_s/registrar/reply.c
index 9661bdb..7e65596 100644
--- a/modules_s/registrar/reply.c
+++ b/modules_s/registrar/reply.c
@@ -349,40 +349,46 @@ int setup_attrs(struct sip_msg* msg)
 	str reason, c;
 	avp_value_t val;
 
-	reason.s = NULL;
-	reason.len = 0;
 	code = codes[rerrno];
-	switch(code) {
-	case 200: reason.s = MSG_200; reason.len = sizeof(MSG_200) - 1; break;
-	case 400: reason.s = MSG_400; reason.len = sizeof(MSG_400) - 1; break;
-	case 500: reason.s = MSG_500; reason.len = sizeof(MSG_500) - 1; break;
-	case 503: reason.s = MSG_503; reason.len = sizeof(MSG_503) - 1; break;
-	}
 
-	val.n = code;
-	if (add_avp(avpid_code.flags, avpid_code.name, val) < 0) {
-		ERR("Error while creating reply code attribute\n");
-		return -1;
+	if (reply_code_attr.len) {
+		val.n = code;
+		if (add_avp(avpid_code.flags, avpid_code.name, val) < 0) {
+			ERR("Error while creating reply code attribute\n");
+			return -1;
+		}
 	}
 
-	val.s = reason;
-	if (add_avp(avpid_reason.flags | AVP_VAL_STR, avpid_reason.name, val) < 0) {
-		ERR("Error while creating reply reason attribute\n");
-		return -1;
-	}	
+	if (reply_reason_attr.len) {
+		reason.s = NULL;
+		reason.len = 0;
+		switch(code) {
+		case 200: reason.s = MSG_200; reason.len = sizeof(MSG_200) - 1; break;
+		case 400: reason.s = MSG_400; reason.len = sizeof(MSG_400) - 1; break;
+		case 500: reason.s = MSG_500; reason.len = sizeof(MSG_500) - 1; break;
+		case 503: reason.s = MSG_503; reason.len = sizeof(MSG_503) - 1; break;
+		}
+		val.s = reason;
+		if (add_avp(avpid_reason.flags | AVP_VAL_STR, avpid_reason.name, val)
+				< 0) {
+			ERR("Error while creating reply reason attribute\n");
+			return -1;
+		}
+	}
 
-	if (contact.data_len > 0) {
+	if (contact_attr.len && contact.data_len > 0) {
 		c.s = contact.buf;
 		c.len = contact.data_len;
 		val.s = c;
 
-		if (add_avp(avpid_contact.flags | AVP_VAL_STR, avpid_contact.name, val) < 0) {
+		if (add_avp(avpid_contact.flags | AVP_VAL_STR, avpid_contact.name, val)
+				< 0) {
 			ERR("Error while creating contact attribute\n");
 			return -1;
-		}	
+		}
 
 		contact.data_len = 0;
-	}	
+	}
 
 	return 0;
 }




More information about the sr-dev mailing list