[sr-dev] git:master: tm: transaction uses number of branches specified by max_branches global parameter

Daniel-Constantin Mierla miconda at gmail.com
Fri Oct 17 11:23:23 CEST 2014


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

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Fri Oct 17 11:06:41 2014 +0200

tm: transaction uses number of branches specified by max_branches global parameter

- the number of UACs per transaction is based on max_branches global
  parameter

---

 modules/tm/h_table.c  |   18 +++++++++++++-----
 modules/tm/h_table.h  |    4 ++--
 modules/tm/t_fwd.c    |    8 ++++----
 modules/tm/t_lookup.c |    2 +-
 modules/tm/timer.c    |    2 +-
 modules/tm/tm.c       |    4 ++--
 6 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/modules/tm/h_table.c b/modules/tm/h_table.c
index 051c326..d0d2d5b 100644
--- a/modules/tm/h_table.c
+++ b/modules/tm/h_table.c
@@ -290,7 +290,7 @@ static void inline init_branches(struct cell *t)
 	unsigned int i;
 	struct ua_client *uac;
 
-	for(i=0;i<MAX_BRANCHES;i++)
+	for(i=0;i<sr_dst_max_branches;i++)
 	{
 		uac=&t->uac[i];
 		uac->request.my_T = t;
@@ -313,21 +313,29 @@ struct cell*  build_cell( struct sip_msg* p_msg )
 #ifdef WITH_XAVP
 	sr_xavp_t** xold;
 #endif
+	unsigned int cell_size;
 
-	/* allocs a new cell, add space for md5 (MD5_LEN - sizeof(struct cell.md5)) */
-	new_cell = (struct cell*)shm_malloc( sizeof( struct cell )+
-			MD5_LEN-sizeof(((struct cell*)0)->md5) );
+	/* allocs a new cell, add space for:
+	 * md5 (MD5_LEN - sizeof(struct cell.md5))
+	 * uac (sr_dst_max_banches * sizeof(struct ua_client) ) */
+	cell_size = sizeof( struct cell ) + MD5_LEN - sizeof(((struct cell*)0)->md5)
+				+ (sr_dst_max_branches * sizeof(struct ua_client));
+
+	new_cell = (struct cell*)shm_malloc( cell_size );
 	if  ( !new_cell ) {
 		ser_error=E_OUT_OF_MEM;
 		return NULL;
 	}
 
 	/* filling with 0 */
-	memset( new_cell, 0, sizeof( struct cell ) );
+	memset( new_cell, 0, cell_size );
 
 	/* UAS */
 	new_cell->uas.response.my_T=new_cell;
 	init_rb_timers(&new_cell->uas.response);
+	/* UAC */
+	new_cell->uac = (struct ua_client*)((char*)new_cell + sizeof(struct cell)
+							+ MD5_LEN - sizeof(((struct cell*)0)->md5));
 	/* timers */
 	init_cell_timers(new_cell);
 
diff --git a/modules/tm/h_table.h b/modules/tm/h_table.h
index 42551bb..23d005f 100644
--- a/modules/tm/h_table.h
+++ b/modules/tm/h_table.h
@@ -427,7 +427,7 @@ typedef struct cell
 	/* UA Server */
 	struct ua_server  uas;
 	/* UA Clients */
-	struct ua_client  uac[ MAX_BRANCHES ];
+	struct ua_client  *uac;
 	
 	/* store transaction state to be used for async transactions */
 	struct async_state async_backup;
@@ -461,7 +461,7 @@ typedef struct cell
 #endif
 	ticks_t end_of_life; /* maximum lifetime */
 
-	/* nr of replied branch; 0..MAX_BRANCHES=branch value,
+	/* nr of replied branch; 0..sr_dst_max_branches=branch value,
 	 * -1 no reply, -2 local reply */
 	short relayed_reply_branch;
 
diff --git a/modules/tm/t_fwd.c b/modules/tm/t_fwd.c
index 61b6e6a..1e61183 100644
--- a/modules/tm/t_fwd.c
+++ b/modules/tm/t_fwd.c
@@ -746,7 +746,7 @@ int add_blind_uac( /*struct cell *t*/ )
 	}
 
 	branch=t->nr_of_outgoings;	
-	if (branch==MAX_BRANCHES) {
+	if (branch==sr_dst_max_branches) {
 		LOG(L_ERR, "ERROR: add_blind_uac: "
 			"maximum number of branches exceeded\n");
 		return -1;
@@ -811,7 +811,7 @@ int add_uac( struct cell *t, struct sip_msg *request, str *uri,
 #endif /* TM_UAC_FLAGS */
 
 	branch=t->nr_of_outgoings;
-	if (branch==MAX_BRANCHES) {
+	if (branch==sr_dst_max_branches) {
 		LOG(L_ERR, "ERROR: add_uac: maximum number of branches exceeded\n");
 		ret=ser_error=E_TOO_MANY_BRANCHES;
 		goto error;
@@ -898,7 +898,7 @@ static int add_uac_from_buf( struct cell *t, struct sip_msg *request,
 	unsigned int len;
 
 	branch=t->nr_of_outgoings;
-	if (branch==MAX_BRANCHES) {
+	if (branch==sr_dst_max_branches) {
 		LOG(L_ERR, "ERROR: add_uac_from_buf: maximum number of branches"
 					" exceeded\n");
 		ret=ser_error=E_TOO_MANY_BRANCHES;
@@ -1060,7 +1060,7 @@ int add_uac_dns_fallback(struct cell *t, struct sip_msg* msg,
 					return ret;
 				}
 			}
-			if (t->nr_of_outgoings >= MAX_BRANCHES){
+			if (t->nr_of_outgoings >= sr_dst_max_branches){
 				LOG(L_ERR, "ERROR: add_uac_dns_fallback: maximum number of "
 							"branches exceeded\n");
 				if (lock_replies)
diff --git a/modules/tm/t_lookup.c b/modules/tm/t_lookup.c
index cb3a720..79b1083 100644
--- a/modules/tm/t_lookup.c
+++ b/modules/tm/t_lookup.c
@@ -936,7 +936,7 @@ int t_reply_matching( struct sip_msg *p_msg , int *p_branch )
 	if (unlikely(reverse_hex2int(hashi, hashl, &hash_index)<0
 		||hash_index>=TABLE_ENTRIES
 		|| reverse_hex2int(branchi, branchl, &branch_id)<0
-		||branch_id>=MAX_BRANCHES
+		|| branch_id>=sr_dst_max_branches
 		|| loopl!=MD5_LEN)
 	) {
 		DBG("DEBUG: t_reply_matching: poor reply labels %d label %d "
diff --git a/modules/tm/timer.c b/modules/tm/timer.c
index 6f1a597..7856570 100644
--- a/modules/tm/timer.c
+++ b/modules/tm/timer.c
@@ -491,7 +491,7 @@ inline static void final_response_handler(	struct retr_buf* r_buf,
 #ifdef EXTRA_DEBUG
 	DBG("DEBUG: final_response_handler:stop retr. and send CANCEL (%p)\n", t);
 #endif
-	if ((r_buf->branch < MAX_BRANCHES) && /* r_buf->branch is always >=0 */
+	if ((r_buf->branch < sr_dst_max_branches) && /* r_buf->branch is always >=0 */
 			(t->uac[r_buf->branch].last_received==0) &&
 			(t->uac[r_buf->branch].request.buffer!=NULL) /* not a blind UAC */
 	){
diff --git a/modules/tm/tm.c b/modules/tm/tm.c
index 54bcc78..f3568c1 100644
--- a/modules/tm/tm.c
+++ b/modules/tm/tm.c
@@ -801,9 +801,9 @@ static int mod_init(void)
 
 	/* checking if we have sufficient bitmap capacity for given
 	   maximum number of  branches */
-	if (MAX_BRANCHES+1>31) {
+	if (sr_dst_max_branches+1>31) {
 		LOG(L_CRIT, "Too many max UACs for UAC branch_bm_t bitmap: %d\n",
-			MAX_BRANCHES );
+			sr_dst_max_branches );
 		return -1;
 	}
 




More information about the sr-dev mailing list