[Asterisk-cvs] asterisk/channels chan_sip.c,1.177,1.178

markster at lists.digium.com markster at lists.digium.com
Sat Sep 13 15:25:12 CDT 2003


Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv28270/channels

Modified Files:
	chan_sip.c 
Log Message:
Outgoing limit updates (bug #98)


Index: chan_sip.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_sip.c,v
retrieving revision 1.177
retrieving revision 1.178
diff -u -d -r1.177 -r1.178
--- chan_sip.c	13 Sep 2003 20:20:14 -0000	1.177
+++ chan_sip.c	13 Sep 2003 20:26:20 -0000	1.178
@@ -147,6 +147,11 @@
 #define SIP_MAX_HEADERS		64
 #define SIP_MAX_LINES 		64
 
+#define DEC_IN_USE	0
+#define INC_IN_USE	1
+#define DEC_OUT_USE	2
+#define INC_OUT_USE	3
+
 static struct sip_codec_pref {
 	int codec;
 	struct sip_codec_pref *next;
@@ -279,6 +284,8 @@
 	int dtmfmode;
 	int inUse;
 	int incominglimit;
+	int outUse;
+	int outgoinglimit;
 	int restrictcid;
 	struct ast_ha *ha;
 	struct sip_user *next;
@@ -391,6 +398,7 @@
 static char *getsipuri(char *header);
 static void free_old_route(struct sip_route *route);
 static int build_reply_digest(struct sip_pvt *p, char *orig_header, char *digest, int digest_len);
+static int find_user(struct sip_pvt *fup, int event);
 
 static int __sip_xmit(struct sip_pvt *p, char *data, int len)
 {
@@ -844,6 +852,8 @@
 	
 	res = 0;
 	p->outgoing = 1;
+	ast_log(LOG_DEBUG, "Outgoing Call for %s\n", p->username);
+	res = find_user(p,INC_OUT_USE);
 	p->restrictcid = ast->restrictcid;
 	transmit_invite(p, "INVITE", 1, NULL, vxml_url,distinctive_ring, 1);
 	if (p->maxtime) {
@@ -933,22 +943,44 @@
 		ast_mutex_unlock(&userl.lock);
 		return 0;
 	}
-	if(event == 0) {
-		if ( u->inUse > 0 ) {
-			u->inUse = u->inUse - 1;
-		} else {
-			u->inUse = 0;
-		}
-	} else {
-		if (u->incominglimit > 0 ) {
-			if (u->inUse >= u->incominglimit) {
-				ast_log(LOG_ERROR, "Call from user '%s' rejected due to usage limit of %d\n", u->name, u->incominglimit);
-				ast_mutex_unlock(&userl.lock);
-				return -1; 
+	switch(event) {
+		case DEC_IN_USE:
+			if ( u->inUse > 0 ) {
+				u->inUse--;
+			} else {
+				u->inUse = 0;
 			}
-		}
-		u->inUse++;
-		ast_log(LOG_DEBUG, "Call from user '%s' is %d out of %d\n", u->name, u->inUse, u->incominglimit);
+			break;
+		case INC_IN_USE:
+			if (u->incominglimit > 0 ) {
+				if (u->inUse >= u->incominglimit) {
+					ast_log(LOG_ERROR, "Call from user '%s' rejected due to usage limit of %d\n", u->name, u->incominglimit);
+					ast_mutex_unlock(&userl.lock);
+					return -1; 
+				}
+			}
+			u->inUse++;
+			ast_log(LOG_DEBUG, "Call from user '%s' is %d out of %d\n", u->name, u->inUse, u->incominglimit);
+			break;
+		case DEC_OUT_USE:
+			if ( u->outUse > 0 ) {
+				u->outUse--;
+			} else {
+				u->outUse = 0;
+			}
+			break;
+		case INC_OUT_USE:
+			if ( u->outgoinglimit > 0 ) {
+				if ( u->outUse >= u->outgoinglimit ) {
+					ast_log(LOG_ERROR, "Outgoing call from user '%s' rejected due to usage limit of %d\n", u->name, u->outgoinglimit);
+					ast_mutex_unlock(&userl.lock);
+					return -1;
+				}
+			}
+			u->outUse++;
+			break;
+		default:
+			ast_log(LOG_ERROR, "find_user(%s,%d) called with no event!\n",u->name,event);
 	}
 	ast_mutex_unlock(&userl.lock);
 	return 0;
@@ -976,8 +1008,13 @@
 		return 0;
 	}
 	ast_mutex_lock(&p->lock);
-	ast_log(LOG_DEBUG, "find_user(%s)\n", p->username);
-	find_user(p, 0);
+	if ( p->outgoing ) {
+		ast_log(LOG_DEBUG, "find_user(%s) - decrement outUse counter\n", p->username);
+		find_user(p, DEC_OUT_USE);
+	} else {
+		ast_log(LOG_DEBUG, "find_user(%s) - decrement inUse counter\n", p->username);
+		find_user(p, DEC_IN_USE);
+	}
 	/* Determine how to disconnect */
 	if (p->owner != ast) {
 		ast_log(LOG_WARNING, "Huh?  We aren't the owner?\n");
@@ -3896,23 +3933,30 @@
 }
 
 static int sip_show_inuse(int fd, int argc, char *argv[]) {
-#define FORMAT  "%-15.15s %-15.15s %-15.15s\n"
-#define FORMAT2 "%-15.15s %-15.15s %-15.15s\n"
+#define FORMAT  "%-15.15s %-15.15s %-15.15s %-15.15s %-15.15s\n"
+#define FORMAT2 "%-15.15s %-15.15s %-15.15s %-15.15s %-15.15s\n"
 	struct sip_user *user;
-	char limits[80];
-	char used[80];
+	char ilimits[40];
+	char olimits[40];
+	char iused[40];
+	char oused[40];
 	if (argc != 3) 
 		return RESULT_SHOWUSAGE;
 	ast_mutex_lock(&userl.lock);
 	user = userl.users;
-	ast_cli(fd, FORMAT, "Username", "inUse", "Limit");
+	ast_cli(fd, FORMAT, "Username", "incoming", "Limit","outgoing","Limit");
 	for(user=userl.users;user;user=user->next) {
 		if (user->incominglimit)
-			snprintf(limits, sizeof(limits), "%d", user->incominglimit);
+			snprintf(ilimits, sizeof(ilimits), "%d", user->incominglimit);
 		else
-			strcpy(limits, "N/A");
-		snprintf(used, sizeof(used), "%d", user->inUse);
-		ast_cli(fd, FORMAT2, user->name, used, limits);
+			strcpy(ilimits, "N/A");
+		if (user->outgoinglimit)
+			snprintf(olimits, sizeof(olimits), "%d", user->outgoinglimit);
+		else
+			strcpy(olimits, "N/A");
+		snprintf(iused, sizeof(iused), "%d", user->inUse);
+		snprintf(oused, sizeof(oused), "%d", user->outUse);
+		ast_cli(fd, FORMAT2, user->name, iused, ilimits,oused,olimits);
 	}
 	ast_mutex_unlock(&userl.lock);
 	return RESULT_SUCCESS;
@@ -4296,7 +4340,7 @@
 
 static char show_inuse_usage[] = 
 "Usage: sip show inuse\n"
-"       List all users known to the SIP (Session Initiation Protocol) subsystem inUse counters and their incominglimit.\n";
+"       List all users known to the SIP (Session Initiation Protocol) subsystem usage counters and limits.\n";
 
 static char show_channels_usage[] = 
 "Usage: sip show channels\n"
@@ -4809,8 +4853,8 @@
 			if (!strlen(p->context))
 				strncpy(p->context, context, sizeof(p->context) - 1);
 			/* Check number of concurrent calls -vs- incoming limit HERE */
-			ast_log(LOG_DEBUG, "Check for res\n");
-			res = find_user(p,1);
+			ast_log(LOG_DEBUG, "Check for res for %s\n", p->username);
+			res = find_user(p,INC_IN_USE);
 			if (res) {
 				if (res < 0) {
 					ast_log(LOG_DEBUG, "Failed to place call for user %s, too many calls\n", p->username);
@@ -4827,10 +4871,10 @@
 			if (gotdest) {
 				if (gotdest < 0) {
 					transmit_response(p, "404 Not Found", req);
-					find_user(p,0);
+					find_user(p,DEC_IN_USE);
 				} else {
 					transmit_response(p, "484 Address Incomplete", req);
-					find_user(p,0);
+					find_user(p,DEC_IN_USE);
 				}
 				p->needdestroy = 1;
 			} else {
@@ -5492,6 +5536,7 @@
 
 		/* set the usage flag to a sane staring value*/
 		user->inUse = 0;
+		user->outUse = 0;
 
 		user->canreinvite = REINVITE_INVITE;
 		/* JK02: set default context */
@@ -5537,6 +5582,10 @@
 				user->incominglimit = atoi(v->value);
 				if (user->incominglimit < 0)
 				   user->incominglimit = 0;
+			} else if (!strcasecmp(v->name, "outgoinglimit")) {
+				user->outgoinglimit = atoi(v->value);
+				if (user->outgoinglimit < 0)
+				   user->outgoinglimit = 0;
 			} else if (!strcasecmp(v->name, "amaflags")) {
 				format = ast_cdr_amaflags2int(v->value);
 				if (format < 0) {




More information about the svn-commits mailing list