[svn-commits] file: branch file/rtp_engine r131167 - /team/file/rtp_engine/channels/chan_sip.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Jul 15 19:54:11 CDT 2008


Author: file
Date: Tue Jul 15 19:54:11 2008
New Revision: 131167

URL: http://svn.digium.com/view/asterisk?view=rev&rev=131167
Log:
Add RTCP stats back into chan_sip.

Modified:
    team/file/rtp_engine/channels/chan_sip.c

Modified: team/file/rtp_engine/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/file/rtp_engine/channels/chan_sip.c?view=diff&rev=131167&r1=131166&r2=131167
==============================================================================
--- team/file/rtp_engine/channels/chan_sip.c (original)
+++ team/file/rtp_engine/channels/chan_sip.c Tue Jul 15 19:54:11 2008
@@ -726,6 +726,7 @@
 static char default_mohsuggest[MAX_MUSICCLASS];	   /*!< Global setting for moh class to suggest when putting 
                                                     *   a bridged channel on hold */
 static char default_parkinglot[AST_MAX_CONTEXT]; /*!< Parkinglot */
+static char default_engine[256];        /*!< Default RTP engine */
 static int default_maxcallbitrate;	/*!< Maximum bitrate for call */
 static struct ast_codec_pref default_prefs;		/*!< Default codec prefs */
 
@@ -1276,6 +1277,7 @@
 		AST_STRING_FIELD(rpid_from);	/*!< Our RPID From header */
 		AST_STRING_FIELD(url);		/*!< URL to be sent with next message to peer */
 		AST_STRING_FIELD(parkinglot);		/*!< Parkinglot */
+		AST_STRING_FIELD(engine);       /*!< RTP engine to use */
 	);
 	struct sip_socket socket;		/*!< The socket used for this dialog */
 	unsigned int ocseq;			/*!< Current outgoing seqno */
@@ -1503,6 +1505,7 @@
 	char mohinterpret[MAX_MUSICCLASS];/*!<  Music on Hold class */
 	char mohsuggest[MAX_MUSICCLASS];/*!<  Music on Hold class */
 	char parkinglot[AST_MAX_CONTEXT];/*!<  Parkinglot */
+	char engine[256];               /*!< RTP Engine to use */
 	char useragent[256];		/*!<  User agent in SIP request (saved from registration) */
 	struct ast_codec_pref prefs;	/*!<  codec prefs */
 	int lastmsgssent;
@@ -2167,6 +2170,9 @@
 static enum st_mode st_get_mode(struct sip_pvt *);
 static struct sip_st_dlg* sip_st_alloc(struct sip_pvt *const p);
 
+/*------- RTP Glue functions -------- */
+static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance *instance, struct ast_rtp_instance *vinstance, struct ast_rtp_instance *tinstance, int codecs, int nat_active);
+
 /*! \brief Definition of this channel for PBX channel registration */
 static const struct ast_channel_tech sip_tech = {
 	.type = "SIP",
@@ -4183,6 +4189,7 @@
 	ast_string_field_set(dialog, fullcontact, peer->fullcontact);
 	ast_string_field_set(dialog, context, peer->context);
 	ast_string_field_set(dialog, parkinglot, peer->parkinglot);
+	ast_string_field_set(dialog, engine, peer->engine);
 	dialog->outboundproxy = obproxy_get(dialog, peer);
 	dialog->callgroup = peer->callgroup;
 	dialog->pickupgroup = peer->pickupgroup;
@@ -4859,7 +4866,7 @@
 	struct sip_pvt *p = ast->tech_pvt;
 	int needcancel = FALSE;
 	int needdestroy = 0;
-//	struct ast_channel *oldowner = ast;
+	struct ast_channel *oldowner = ast;
 
 	if (!p) {
 		ast_debug(1, "Asked to hangup channel that was not connected\n");
@@ -4983,7 +4990,59 @@
 			}
 
 			if (!p->pendinginvite) {
-//				struct ast_channel *bridge = ast_bridged_channel(oldowner);
+				char quality_buf[AST_MAX_USER_FIELD], *quality;
+
+				if (p->rtp && (quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
+					if (p->do_history) {
+						append_history(p, "RTCPaudio", "Quality:%s", quality);
+					}
+					if (oldowner) {
+						struct ast_channel *bridge = ast_bridged_channel(oldowner);
+
+						pbx_builtin_setvar_helper(oldowner, "RTPAUDIOQOS", quality);
+
+						if (bridge) {
+							pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSBRIDGED", quality);
+						}
+
+						if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER, quality_buf, sizeof(quality_buf)))) {
+							pbx_builtin_setvar_helper(oldowner, "RTPAUDIOQOSJITTER", quality);
+							if (bridge) {
+								pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSJITTERBRIDGED", quality);
+							}
+						}
+						if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS, quality_buf, sizeof(quality_buf)))) {
+                                                        pbx_builtin_setvar_helper(oldowner, "RTPAUDIOQOSLOSS", quality);
+                                                        if (bridge) {
+                                                                pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSLOSSBRIDGED", quality);
+                                                        }
+                                                }
+						if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT, quality_buf, sizeof(quality_buf)))) {
+                                                        pbx_builtin_setvar_helper(oldowner, "RTPAUDIOQOSRTT", quality);
+                                                        if (bridge) {
+                                                                pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSRTTBRIDGED", quality);
+                                                        }
+                                                }
+					}
+				}
+				if (p->do_history || oldowner) {
+					if (p->vrtp && (quality = ast_rtp_instance_get_quality(p->vrtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
+						if (p->do_history) {
+							append_history(p, "RTCPvideo", "Quality:%s", quality);
+						}
+						if (oldowner) {
+							pbx_builtin_setvar_helper(oldowner, "RTPVIDEOQOS", quality);
+						}
+					}
+					if (p->trtp && (quality = ast_rtp_instance_get_quality(p->trtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
+						if (p->do_history) {
+							append_history(p, "RTCPtext", "Quality:%s", quality);
+						}
+						if (oldowner) {
+							pbx_builtin_setvar_helper(oldowner, "RTCPTEXTQOS", quality);
+						}
+					}
+				}
 
 				/* Send a hangup */
 				transmit_request_with_auth(p, SIP_BYE, 0, XMIT_RELIABLE, 1);
@@ -5185,7 +5244,7 @@
 		   redirect of both channels). Note that a channel can not be masqueraded *into*
 		   a native bridge. So there is no danger that this breaks a native bridge that
 		   should stay up. */
-//		sip_set_rtp_peer(newchan, NULL, NULL, 0, 0, 0);
+		sip_set_rtp_peer(newchan, NULL, NULL, 0, 0, 0);
 		ret = 0;
 	}
 	ast_debug(3, "SIP Fixup: New owner for dialogue %s: %s (Old parent: %s)\n", p->callid, p->owner->name, oldchan->name);
@@ -6014,7 +6073,7 @@
 	}
 	ast_string_field_set(p, context, default_context);
 	ast_string_field_set(p, parkinglot, default_parkinglot);
-
+	ast_string_field_set(p, engine, default_engine);
 
 	/* Add to active dialog list */
 
@@ -11661,6 +11720,7 @@
 	ast_string_field_set(p, mohinterpret, peer->mohinterpret);
 	ast_string_field_set(p, mohsuggest, peer->mohsuggest);
 	ast_string_field_set(p, parkinglot, peer->parkinglot);
+	ast_string_field_set(p, engine, peer->engine);
 	if (peer->callingpres)	/* Peer calling pres setting will override RPID */
 		p->callingpres = peer->callingpres;
 	if (peer->maxms && peer->lastms)
@@ -13295,12 +13355,11 @@
 #define FORMAT2 "%-15.15s  %-11.11s  %-8.8s %-10.10s  %-10.10s (%-2.2s) %-6.6s %-10.10s  %-10.10s ( %%) %-6.6s\n"
 #define FORMAT  "%-15.15s  %-11.11s  %-8.8s %-10.10u%-1.1s %-10.10u (%-2.2u%%) %-6.6u %-10.10u%-1.1s %-10.10u (%-2.2u%%) %-6.6u\n"
 	struct sip_pvt *cur = __cur;
-//	unsigned int rxcount;
-//	unsigned int txcount;
-//	char durbuf[10];
-	//       int duration;
-	//  int durh, durm, durs;
-	//struct ast_channel *c = cur->owner;
+	struct ast_rtp_instance_stats stats;
+	char durbuf[10];
+	int duration;
+	int durh, durm, durs;
+	struct ast_channel *c = cur->owner;
 	struct __show_chan_arg *arg = __arg;
 	int fd = arg->fd;
 
@@ -13314,9 +13373,7 @@
 		return 0;	/* don't care, we scan all channels */
 	}
 
-/*
-	rxcount = ast_rtp_get_qosvalue(cur->rtp, AST_RTP_RXCOUNT);
-	txcount = ast_rtp_get_qosvalue(cur->rtp, AST_RTP_TXCOUNT);
+	ast_rtp_instance_get_stats(cur->rtp, &stats, AST_RTP_INSTANCE_STAT_ALL);
 
 	if (c && c->cdr && !ast_tvzero(c->cdr->start)) {
 		duration = (int)(ast_tvdiff_ms(ast_tvnow(), c->cdr->start) / 1000);
@@ -13332,19 +13389,19 @@
 		ast_inet_ntoa(cur->sa.sin_addr), 
 		cur->callid, 
 		durbuf,
-		rxcount > (unsigned int) 100000 ? (unsigned int) (rxcount)/(unsigned int) 1000 : rxcount,
-		rxcount > (unsigned int) 100000 ? "K":" ",
-		ast_rtp_get_qosvalue(cur->rtp, AST_RTP_RXPLOSS),
-		rxcount > ast_rtp_get_qosvalue(cur->rtp, AST_RTP_RXPLOSS) ? (unsigned int) (ast_rtp_get_qosvalue(cur->rtp, AST_RTP_RXPLOSS) / rxcount * 100) : 0,
-		ast_rtp_get_qosvalue(cur->rtp, AST_RTP_RXJITTER),
-		txcount > (unsigned int) 100000 ? (unsigned int) (txcount)/(unsigned int) 1000 : txcount,
-		txcount > (unsigned int) 100000 ? "K":" ",
-		ast_rtp_get_qosvalue(cur->rtp, AST_RTP_TXPLOSS),
-		txcount > ast_rtp_get_qosvalue(cur->rtp, AST_RTP_TXPLOSS) ? (unsigned int) (ast_rtp_get_qosvalue(cur->rtp, AST_RTP_TXPLOSS)/ txcount * 100) : 0,
-		ast_rtp_get_qosvalue(cur->rtp, AST_RTP_TXJITTER)
+		stats.rxcount > (unsigned int) 100000 ? (unsigned int) (stats.rxcount)/(unsigned int) 1000 : stats.rxcount,
+		stats.rxcount > (unsigned int) 100000 ? "K":" ",
+		stats.rxploss,
+		stats.rxcount > stats.rxploss ? (stats.rxploss / stats.rxcount * 100) : 0,
+		stats.rxjitter,
+		stats.txcount > (unsigned int) 100000 ? (unsigned int) (stats.txcount)/(unsigned int) 1000 : stats.txcount,
+		stats.txcount > (unsigned int) 100000 ? "K":" ",
+		stats.txploss,
+		stats.txcount > stats.txploss ? (stats.txploss / stats.txcount * 100) : 0,
+		stats.txjitter
 	);
 	arg->numchans++;
-*/
+
 	return 0;	/* don't care, we scan all channels */
 }
 
@@ -17824,7 +17881,7 @@
 static int acf_channel_read(struct ast_channel *chan, const char *funcname, char *preparse, char *buf, size_t buflen)
 {
 	struct sip_pvt *p = chan->tech_pvt;
-	char /**all = "",*/ *parse = ast_strdupa(preparse);
+	char *parse = ast_strdupa(preparse);
 	int res = 0;
 	AST_DECLARE_APP_ARGS(args,
 		AST_APP_ARG(param);
@@ -17876,54 +17933,61 @@
 
 		snprintf(buf, buflen, "%s:%d", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
 	} else if (!strcasecmp(args.param, "rtpqos")) {
-/*
-		struct ast_rtp_quality qos;
-		struct ast_rtp *rtp = p->rtp;
-		
-		memset(&qos, 0, sizeof(qos));
-
-		if (ast_strlen_zero(args.type))
+		struct ast_rtp_instance *rtp = NULL;
+
+		if (ast_strlen_zero(args.type)) {
 			args.type = "audio";
-		if (ast_strlen_zero(args.field))
-			args.field = "all";
-		
-		if (strcasecmp(args.type, "AUDIO") == 0) {
-			all = ast_rtp_get_quality(rtp = p->rtp, &qos, RTPQOS_SUMMARY);
-		} else if (strcasecmp(args.type, "VIDEO") == 0) {
-			all = ast_rtp_get_quality(rtp = p->vrtp, &qos, RTPQOS_SUMMARY);
-		} else if (strcasecmp(args.type, "TEXT") == 0) {
-			all = ast_rtp_get_quality(rtp = p->trtp, &qos, RTPQOS_SUMMARY);
+		}
+
+		if (!strcasecmp(args.type, "audio")) {
+			rtp = p->rtp;
+		} else if (!strcasecmp(args.type, "video")) {
+			rtp = p->vrtp;
+		} else if (!strcasecmp(args.type, "text")) {
+			rtp = p->trtp;
 		} else {
 			return -1;
 		}
-		
-		if (strcasecmp(args.field, "local_ssrc") == 0)
-			snprintf(buf, buflen, "%u", qos.local_ssrc);
-		else if (strcasecmp(args.field, "local_lostpackets") == 0)
-			snprintf(buf, buflen, "%u", qos.local_lostpackets);
-		else if (strcasecmp(args.field, "local_jitter") == 0)
-			snprintf(buf, buflen, "%.0f", qos.local_jitter * 1000.0);
-		else if (strcasecmp(args.field, "local_count") == 0)
-			snprintf(buf, buflen, "%u", qos.local_count);
-		else if (strcasecmp(args.field, "remote_ssrc") == 0)
-			snprintf(buf, buflen, "%u", qos.remote_ssrc);
-		else if (strcasecmp(args.field, "remote_lostpackets") == 0)
-			snprintf(buf, buflen, "%u", qos.remote_lostpackets);
-		else if (strcasecmp(args.field, "remote_jitter") == 0)
-			snprintf(buf, buflen, "%.0f", qos.remote_jitter * 1000.0);
-		else if (strcasecmp(args.field, "remote_count") == 0)
-			snprintf(buf, buflen, "%u", qos.remote_count);
-		else if (strcasecmp(args.field, "rtt") == 0)
-			snprintf(buf, buflen, "%.0f", qos.rtt * 1000.0);
-		else if (strcasecmp(args.field, "all") == 0)
-			ast_copy_string(buf, all, buflen);
-		else if (!ast_rtp_get_qos(rtp, args.field, buf, buflen))
-			 ;
-		else {
-			ast_log(LOG_WARNING, "Unrecognized argument '%s' to %s\n", preparse, funcname);
-			return -1;
-		}
-*/
+
+		if (ast_strlen_zero(args.field) || !strcasecmp(args.field, "all")) {
+			char quality_buf[AST_MAX_USER_FIELD], *quality;
+
+			if (!(quality = ast_rtp_instance_get_quality(rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
+				return -1;
+			}
+
+			ast_copy_string(buf, quality_buf, buflen);
+			return res;
+		} else {
+			struct ast_rtp_instance_stats stats;
+
+			if (ast_rtp_instance_get_stats(rtp, &stats, AST_RTP_INSTANCE_STAT_ALL)) {
+				return -1;
+			}
+
+			if (!strcasecmp(args.field, "local_ssrc")) {
+				snprintf(buf, buflen, "%u", stats.local_ssrc);
+			} else if (!strcasecmp(args.field, "local_lostpackets")) {
+				snprintf(buf, buflen, "%u", stats.rxploss);
+			} else if (!strcasecmp(args.field, "local_jitter")) {
+				snprintf(buf, buflen, "%u", stats.rxjitter);
+			} else if (!strcasecmp(args.field, "local_count")) {
+				snprintf(buf, buflen, "%u", stats.rxcount);
+			} else if (!strcasecmp(args.field, "remote_ssrc")) {
+				snprintf(buf, buflen, "%u", stats.remote_ssrc);
+			} else if (!strcasecmp(args.field, "remote_lostpackets")) {
+				snprintf(buf, buflen, "%u", stats.txploss);
+			} else if (!strcasecmp(args.field, "remote_jitter")) {
+				snprintf(buf, buflen, "%u", stats.txjitter);
+			} else if (!strcasecmp(args.field, "remote_count")) {
+				snprintf(buf, buflen, "%u", stats.txcount);
+			} else if (!strcasecmp(args.field, "rtt")) {
+				snprintf(buf, buflen, "%u", stats.rtt);
+			} else {
+				ast_log(LOG_WARNING, "Unrecognized argument '%s' to %s\n", preparse, funcname);
+				return -1;
+			}
+		}
 	} else {
 		res = -1;
 	}
@@ -17951,56 +18015,59 @@
 	sip_alreadygone(p);
 
 	/* Get RTCP quality before end of call */
-/*
 	if (p->do_history || p->owner) {
-		struct ast_channel *bridge = ast_bridged_channel(p->owner);
-		char *videoqos, *textqos;
-
-		if (p->rtp) {	
+		char quality_buf[AST_MAX_USER_FIELD], *quality;
+
+		if (p->rtp && (quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
+			struct ast_channel *bridge = ast_bridged_channel(p->owner);
+			
 			if (p->do_history) {
-				char *audioqos,
-				     *audioqos_jitter,
-				     *audioqos_loss,
-				     *audioqos_rtt;
-
-				audioqos        = ast_rtp_get_quality(p->rtp, NULL, RTPQOS_SUMMARY);
-				audioqos_jitter = ast_rtp_get_quality(p->rtp, NULL, RTPQOS_JITTER);
-				audioqos_loss   = ast_rtp_get_quality(p->rtp, NULL, RTPQOS_LOSS);
-				audioqos_rtt    = ast_rtp_get_quality(p->rtp, NULL, RTPQOS_RTT);
-
-				append_history(p, "RTCPaudio", "Quality:%s", audioqos);
-				append_history(p, "RTCPaudioJitter", "Quality:%s", audioqos_jitter);
-				append_history(p, "RTCPaudioLoss", "Quality:%s", audioqos_loss);
-				append_history(p, "RTCPaudioRTT", "Quality:%s", audioqos_rtt);
+				append_history(p, "RTCPaudio", "Quality:%s", quality);
+			}
+
+			pbx_builtin_setvar_helper(p->owner, "RTPAUDIOQOS", quality);
+			
+			if (bridge) {
+				pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSBRIDGED", quality);
 			}
 			
-			ast_rtp_set_vars(p->owner, p->rtp);
-		}
-
-		if (bridge) {
-			struct sip_pvt *q = bridge->tech_pvt;
-
-			if (IS_SIP_TECH(bridge->tech) && q->rtp)
-				ast_rtp_set_vars(bridge, q->rtp);
-		}
-
-		if (p->vrtp) {
-			videoqos = ast_rtp_get_quality(p->vrtp, NULL, RTPQOS_SUMMARY);
-			if (p->do_history)
-				append_history(p, "RTCPvideo", "Quality:%s", videoqos);
-			if (p->owner)
-				pbx_builtin_setvar_helper(p->owner, "RTPVIDEOQOS", videoqos);
-		}
-
-		if (p->trtp) {
-			textqos = ast_rtp_get_quality(p->trtp, NULL, RTPQOS_SUMMARY);
-			if (p->do_history)
-				append_history(p, "RTCPtext", "Quality:%s", textqos);
-			if (p->owner)
-				pbx_builtin_setvar_helper(p->owner, "RTPTEXTQOS", textqos);
-		}
-	}
-*/
+			if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_JITTER, quality_buf, sizeof(quality_buf)))) {
+				pbx_builtin_setvar_helper(p->owner, "RTPAUDIOQOSJITTER", quality);
+				if (bridge) {
+					pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSJITTERBRIDGED", quality);
+				}
+			}
+			if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_LOSS, quality_buf, sizeof(quality_buf)))) {
+				pbx_builtin_setvar_helper(p->owner, "RTPAUDIOQOSLOSS", quality);
+				if (bridge) {
+					pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSLOSSBRIDGED", quality);
+				}
+			}
+			if ((quality = ast_rtp_instance_get_quality(p->rtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY_RTT, quality_buf, sizeof(quality_buf)))) {
+				pbx_builtin_setvar_helper(p->owner, "RTPAUDIOQOSRTT", quality);
+				if (bridge) {
+					pbx_builtin_setvar_helper(bridge, "RTPAUDIOQOSRTTBRIDGED", quality);
+				}
+			}
+		}
+		
+		if (p->vrtp && (quality = ast_rtp_instance_get_quality(p->vrtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
+			if (p->do_history) {
+				append_history(p, "RTCPvideo", "Quality:%s", quality);
+			}
+			if (p->owner) {
+				pbx_builtin_setvar_helper(p->owner, "RTPVIDEOQOS", quality);
+			}
+		}
+		if (p->trtp && (quality = ast_rtp_instance_get_quality(p->trtp, AST_RTP_INSTANCE_STAT_FIELD_QUALITY, quality_buf, sizeof(quality_buf)))) {
+			if (p->do_history) {
+				append_history(p, "RTCPtext", "Quality:%s", quality);
+			}
+			if (p->owner) {
+				pbx_builtin_setvar_helper(p->owner, "RTPTEXTQOS", quality);
+			}
+		}
+	}
 
 	stop_media_flows(p); /* Immediately stop RTP, VRTP and UDPTL as applicable */
 	stop_session_timer(p); /* Stop Session-Timer */
@@ -20477,6 +20544,8 @@
 			ast_copy_string(peer->mohsuggest, v->value, sizeof(peer->mohsuggest));
 		} else if (!strcasecmp(v->name, "parkinglot")) {
 			ast_copy_string(peer->parkinglot, v->value, sizeof(peer->parkinglot));
+		} else if (!strcasecmp(v->name, "rtp_engine")) {
+			ast_copy_string(peer->engine, v->value, sizeof(peer->engine));
 		} else if (!strcasecmp(v->name, "mailbox")) {
 			add_peer_mailboxes(peer, v->value);
 		} else if (!strcasecmp(v->name, "hasvoicemail")) {




More information about the svn-commits mailing list