[Asterisk-cvs] asterisk/channels chan_iax2.c,1.333,1.334

kpfleming kpfleming
Tue Aug 23 13:09:45 CDT 2005


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

Modified Files:
	chan_iax2.c 
Log Message:
allow more adjustability in peer qualification system (issue #4192 with mods)


Index: chan_iax2.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v
retrieving revision 1.333
retrieving revision 1.334
diff -u -d -r1.333 -r1.334
--- chan_iax2.c	19 Aug 2005 20:04:58 -0000	1.333
+++ chan_iax2.c	23 Aug 2005 17:11:44 -0000	1.334
@@ -310,6 +310,11 @@
 	int pokeexpire;					/* When to expire poke */
 	int lastms;					/* How long last response took (in ms), or -1 for no response */
 	int maxms;					/* Max ms we will accept for the host to be up, 0 to not monitor */
+
+	int pokefreqok;					/* How often to check if the host is up */
+	int pokefreqnotok;				/* How often to check when the host has been determined to be down */
+	int historicms;					/* How long recent average responses took */
+	int smoothing;					/* Sample over how many units to determine historic ms */
 	
 	struct ast_ha *ha;
 	struct iax2_peer *next;
@@ -1893,12 +1898,13 @@
 		ast_cli(fd, "  Status       : ");
 		if (peer->lastms < 0)
 			ast_copy_string(status, "UNREACHABLE", sizeof(status));
-		else if (peer->lastms > peer->maxms)
-			snprintf(status, sizeof(status), "LAGGED (%d ms)", peer->lastms);
-		else if (peer->lastms)
-			snprintf(status, sizeof(status), "OK (%d ms)", peer->lastms);
+		else if (peer->historicms > peer->maxms)
+			snprintf(status, sizeof(status), "LAGGED (%d ms)", peer->historicms);
+		else if (peer->historicms)
+			snprintf(status, sizeof(status), "OK (%d ms)", peer->historicms);
 		else
 			ast_copy_string(status, "UNKNOWN", sizeof(status));
+		ast_cli(fd, " Qualify        : every %d when OK, every %d when UNREACHABLE (sample smoothing %s)\n", peer->pokefreqok, peer->pokefreqnotok, (peer->smoothing == 1) ? "On" : "Off");
 		ast_cli(fd, "%s\n",status);
 		ast_cli(fd,"\n");
 		if (ast_test_flag(peer, IAX_TEMPONLY))
@@ -4130,12 +4136,12 @@
 				ast_copy_string(status, "UNREACHABLE", sizeof(status));
 				offline_peers++;
 			}
-			else if (peer->lastms > peer->maxms)  {
-				snprintf(status, sizeof(status), "LAGGED (%d ms)", peer->lastms);
+			else if (peer->historicms > peer->maxms)  {
+				snprintf(status, sizeof(status), "LAGGED (%d ms)", peer->historicms);
 				offline_peers++;
 			}
-			else if (peer->lastms)  {
-				snprintf(status, sizeof(status), "OK (%d ms)", peer->lastms);
+			else if (peer->historicms)  {
+				snprintf(status, sizeof(status), "OK (%d ms)", peer->historicms);
 				online_peers++;
 			}
 			else  {
@@ -6945,13 +6951,13 @@
 
 				if (iaxs[fr.callno]->peerpoke) {
 					peer = iaxs[fr.callno]->peerpoke;
-					if ((peer->lastms < 0)  || (peer->lastms > peer->maxms)) {
+					if ((peer->lastms < 0)  || (peer->historicms > peer->maxms)) {
 						if (iaxs[fr.callno]->pingtime <= peer->maxms) {
 							ast_log(LOG_NOTICE, "Peer '%s' is now REACHABLE! Time: %d\n", peer->name, iaxs[fr.callno]->pingtime);
 							manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "Peer: IAX2/%s\r\nPeerStatus: Reachable\r\nTime: %d\r\n", peer->name, iaxs[fr.callno]->pingtime); 
 							ast_device_state_changed("IAX2/%s", peer->name); /* Activate notification */
 						}
-					} else if ((peer->lastms > 0) && (peer->lastms <= peer->maxms)) {
+					} else if ((peer->historicms > 0) && (peer->historicms <= peer->maxms)) {
 						if (iaxs[fr.callno]->pingtime > peer->maxms) {
 							ast_log(LOG_NOTICE, "Peer '%s' is now TOO LAGGED (%d ms)!\n", peer->name, iaxs[fr.callno]->pingtime);
 							manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "Peer: IAX2/%s\r\nPeerStatus: Lagged\r\nTime: %d\r\n", peer->name, iaxs[fr.callno]->pingtime); 
@@ -6959,16 +6965,24 @@
 						}
 					}
 					peer->lastms = iaxs[fr.callno]->pingtime;
+					if (peer->smoothing && (peer->lastms > -1))
+						peer->historicms = (iaxs[fr.callno]->pingtime + peer->historicms) / 2;
+					else if (peer->smoothing && peer->lastms < 0)
+						peer->historicms = (0 + peer->historicms) / 2;
+					else					
+						peer->historicms = iaxs[fr.callno]->pingtime;
+
 					if (peer->pokeexpire > -1)
 						ast_sched_del(sched, peer->pokeexpire);
 					send_command_immediate(iaxs[fr.callno], AST_FRAME_IAX, IAX_COMMAND_ACK, fr.ts, NULL, 0,fr.iseqno);
 					iax2_destroy_nolock(fr.callno);
 					peer->callno = 0;
 					/* Try again eventually */
-					if ((peer->lastms < 0)  || (peer->lastms > peer->maxms))
-						peer->pokeexpire = ast_sched_add(sched, DEFAULT_FREQ_NOTOK, iax2_poke_peer_s, peer);
+						ast_log(LOG_DEBUG, "Peer lastms %d, historicms %d, maxms %d\n", peer->lastms, peer->historicms, peer->maxms);
+					if ((peer->lastms < 0)  || (peer->historicms > peer->maxms)) 
+						peer->pokeexpire = ast_sched_add(sched, peer->pokefreqnotok, iax2_poke_peer_s, peer);
 					else
-						peer->pokeexpire = ast_sched_add(sched, DEFAULT_FREQ_OK, iax2_poke_peer_s, peer);
+						peer->pokeexpire = ast_sched_add(sched, peer->pokefreqok, iax2_poke_peer_s, peer);
 				}
 				break;
 			case IAX_COMMAND_LAGRQ:
@@ -7615,7 +7629,7 @@
 	peer->callno = 0;
 	peer->lastms = -1;
 	/* Try again quickly */
-	peer->pokeexpire = ast_sched_add(sched, DEFAULT_FREQ_NOTOK, iax2_poke_peer_s, peer);
+	peer->pokeexpire = ast_sched_add(sched, peer->pokefreqnotok, iax2_poke_peer_s, peer);
 	return 0;
 }
 
@@ -7625,6 +7639,7 @@
 		/* IF we have no IP, or this isn't to be monitored, return
 		  imeediately after clearing things out */
 		peer->lastms = 0;
+		peer->historicms = 0;
 		peer->pokeexpire = -1;
 		peer->callno = 0;
 		return 0;
@@ -7648,7 +7663,13 @@
 	iaxs[peer->callno]->pingtime = peer->maxms / 4 + 1;
 	iaxs[peer->callno]->peerpoke = peer;
 	send_command(iaxs[peer->callno], AST_FRAME_IAX, IAX_COMMAND_POKE, 0, NULL, 0, -1);
-	peer->pokeexpire = ast_sched_add(sched, DEFAULT_MAXMS * 2, iax2_poke_noanswer, peer);
+	
+	/* If the host is already unreachable then use the unreachable interval instead */
+	if (peer->lastms < 0) {
+		peer->pokeexpire = ast_sched_add(sched, peer->pokefreqnotok, iax2_poke_noanswer, peer);
+	} else
+		peer->pokeexpire = ast_sched_add(sched, DEFAULT_MAXMS * 2, iax2_poke_noanswer, peer);
+
 	return 0;
 }
 
@@ -7958,6 +7979,9 @@
 		}
 		peer->prefs = prefs;
 		peer->capability = iax2_capability;
+		peer->smoothing = 0;
+		peer->pokefreqok = DEFAULT_FREQ_OK;
+		peer->pokefreqnotok = DEFAULT_FREQ_NOTOK;
 		while(v) {
 			if (!strcasecmp(v->name, "secret")) {
 				if (!ast_strlen_zero(peer->secret)) {
@@ -7967,11 +7991,11 @@
 					ast_copy_string(peer->secret, v->value, sizeof(peer->secret));
 			} else if (!strcasecmp(v->name, "mailbox")) {
 				ast_copy_string(peer->mailbox, v->value, sizeof(peer->mailbox));
-			} else if (!strcasecmp(v->name, "dbsecret")) 
+			} else if (!strcasecmp(v->name, "dbsecret")) {
 				ast_copy_string(peer->dbsecret, v->value, sizeof(peer->dbsecret));
-			else if (!strcasecmp(v->name, "mailboxdetail"))
+			} else if (!strcasecmp(v->name, "mailboxdetail")) {
 				ast_set2_flag(peer, ast_true(v->value), IAX_MESSAGEDETAIL);	
-			else if (!strcasecmp(v->name, "trunk")) {
+			} else if (!strcasecmp(v->name, "trunk")) {
 				ast_set2_flag(peer, ast_true(v->value), IAX_TRUNK);	
 				if (ast_test_flag(peer, IAX_TRUNK) && (timingfd < 0)) {
 					ast_log(LOG_WARNING, "Unable to support trunking on peer '%s' without zaptel timing\n", peer->name);
@@ -8065,6 +8089,16 @@
 					ast_log(LOG_WARNING, "Qualification of peer '%s' should be 'yes', 'no', or a number of milliseconds at line %d of iax.conf\n", peer->name, v->lineno);
 					peer->maxms = 0;
 				}
+			} else if (!strcasecmp(v->name, "qualifysmoothing")) {
+				peer->smoothing = ast_true(v->value);
+			} else if (!strcasecmp(v->name, "qualifyfreqok")) {
+				if (sscanf(v->value, "%d", &peer->pokefreqok) != 1) {
+					ast_log(LOG_WARNING, "Qualification testing frequency of peer '%s' when OK should a number of milliseconds at line %d of iax.conf\n", peer->name, v->lineno);
+				}
+			} else if (!strcasecmp(v->name, "qualifyfreqnotok")) {
+				if (sscanf(v->value, "%d", &peer->pokefreqnotok) != 1) {
+					ast_log(LOG_WARNING, "Qualification testing frequency of peer '%s' when NOT OK should be a number of milliseconds at line %d of iax.conf\n", peer->name, v->lineno);
+				} else ast_log(LOG_WARNING, "Set peer->pokefreqnotok to %d", peer->pokefreqnotok);
 			} else if (!strcasecmp(v->name, "timezone")) {
 				ast_copy_string(peer->zonetag, v->value, sizeof(peer->zonetag));
 			}/* else if (strcasecmp(v->name,"type")) */
@@ -9077,12 +9111,11 @@
 		if (option_debug > 2) 
 			ast_log(LOG_DEBUG, "Found peer. Now checking device state for peer %s\n", host);
 
-
 		if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
-			(!p->maxms || ((p->lastms > -1)  && (p->lastms <= p->maxms)))) {
-			/* Peer is registred, or have default IP address
+		    (!p->maxms || ((p->lastms > -1) && (p->historicms <= p->maxms)))) {
+			/* Peer is registered, or have default IP address
 			   and a valid registration */
-			if (p->lastms == 0 || p->lastms <= p->lastms)
+			if (p->historicms == 0 || p->historicms <= p->maxms)
 				res = AST_DEVICE_NOT_INUSE;
 			else
 				res = AST_DEVICE_UNKNOWN;	/* Not reachable */




More information about the svn-commits mailing list