[asterisk-commits] oej: branch oej/pinequality-manager-qos-reports-1.4 r226833 - in /team/oej/pi...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Nov 2 11:22:27 CST 2009


Author: oej
Date: Mon Nov  2 11:22:23 2009
New Revision: 226833

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=226833
Log:
Playing around with RTCP reports

Modified:
    team/oej/pinequality-manager-qos-reports-1.4/channels/chan_sip.c
    team/oej/pinequality-manager-qos-reports-1.4/include/asterisk/rtp.h

Modified: team/oej/pinequality-manager-qos-reports-1.4/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinequality-manager-qos-reports-1.4/channels/chan_sip.c?view=diff&rev=226833&r1=226832&r2=226833
==============================================================================
--- team/oej/pinequality-manager-qos-reports-1.4/channels/chan_sip.c (original)
+++ team/oej/pinequality-manager-qos-reports-1.4/channels/chan_sip.c Mon Nov  2 11:22:23 2009
@@ -1458,6 +1458,7 @@
 static int sip_do_reload(enum channelreloadreason reason);
 static int sip_reload(int fd, int argc, char *argv[]);
 static int acf_channel_read(struct ast_channel *chan, char *funcname, char *preparse, char *buf, size_t buflen);
+static int get_rtp_quality(struct sip_pvt *dialog, const char *chantype, const char *qostype, char *buf, size_t buf_len);
 
 /*--- Debugging 
 	Functions for enabling debug per IP or fully, or enabling history logging for
@@ -10945,6 +10946,107 @@
 	}
 }
 #undef FORMAT
+
+/*! \brief Add manager headers for QoS to existing manager reply */
+static int manager_add_qos(struct mansession *s, char *mediatype, struct sip_pvt *dialog)
+{
+	char mybuf[SIPBUFSIZE];
+
+	get_rtp_qos(dialog, mediatype, "local_ssrc", buf, SIPBUFSIZE );
+	astman_append(s, "LocalSSRC(%s): %s\r\n", mediatype, buf);
+	get_rtp_qos(dialog, mediatype, "remote_ssrc", buf, SIPBUFSIZE );
+	astman_append(s, "RemoteSSRC(%s): %s\r\n", mediatype, buf);
+	get_rtp_qos(dialog, mediatype, "local_jitter", buf, SIPBUFSIZE );
+	astman_append(s, "LocalJitter(%s): %s\r\n", mediatype, buf);
+	get_rtp_qos(dialog, mediatype, "local_count", buf, SIPBUFSIZE );
+	astman_append(s, "LocalPacketCount(%s): %s\r\n", mediatype, buf);
+	get_rtp_qos(dialog, mediatype, "remote_count", buf, SIPBUFSIZE );
+	astman_append(s, "RemotePacketCount(%s): %s\r\n", mediatype, buf);
+	get_rtp_qos(dialog, mediatype, "local_lostpackets", buf, SIPBUFSIZE );
+	astman_append(s, "LocalLostPackets(%s): %s\r\n", mediatype, buf);
+	get_rtp_qos(dialog, mediatype, "remote_lostpackets", buf, SIPBUFSIZE );
+	astman_append(s, "RemoteLostPackets(%s): %s\r\n", mediatype, buf);
+	get_rtp_qos(dialog, mediatype, "remote_jitter", buf, SIPBUFSIZE );
+	astman_append(s, "RemoteJitter(%s): %s\r\n", mediatype, buf);
+	get_rtp_qos(dialog, mediatype, "rtt", buf, SIPBUFSIZE );
+	astman_append(s, "MediaRtt(%s): %s\r\n", mediatype, buf);
+}
+		
+static char mandescr_sip_channel[] = 
+"Description: Show one SIP channel with details on current status.\n"
+"Variables: \n"
+"  Channel: <name>        The channel name (AST) you want to check.\n"
+"  ActionID: <id>	  Optional action ID for this AMI transaction."
+"  Datatype: <name>	  Optional parameter name required. If not specified, all data will be sent"
+""
+"  Datatype 	Description"
+"	qos	Current QoS value for this channel (sender and receiver)"
+"\n";
+
+/*! \brief Show SIP channel data in the manager API  */
+static int manager_sip_channel(struct mansession *s, const struct message *m)
+{
+	const char *channel;
+	const char *datatype;
+	const char *actionid;
+	int ret;
+	int all = FALSE;
+	struct ast_channel *chan = NULL;
+	struct sip_pvt *dialog;
+
+	actionid = astman_get_header(m,"ActionID");
+	channel = astman_get_header(m,"Channel");
+
+	/* Do we have a channel name? */
+	if (ast_strlen_zero(channel)) {
+		astman_send_error(s, m, "Channel: <channelname> missing.");
+		return 0;
+	}
+	/* Can we find a channel with that name? */
+	chan = ast_get_channel_by_name_locked(name);
+	if (!chan) {
+		astman_send_error(s, m, "No such channel");
+		return 0;
+	}
+	/* Sanity check  - is this pvt a SIP channel? */
+	if (chan->tech != &sip_tech && chan->tech != &sip_tech_info) {
+		astman_send_error(s, m, "Cannot get SIPchannel-info on a non-SIP channel\n");
+		return 0;
+	}
+	/* Try to grab the channel pvt handle */
+	dialog = chan->tech_pvt;
+	if (!dialog) {
+		astman_send_error(s, m, "No active SIP channel\n");
+		return 0;
+	}
+	/* Ok, we have a channel with a SIP dialog attached,
+	   time to find out what they want
+	   ...and when my plane is about to leave from ARN */
+	datatype = astman_get_header(m,"Datatype");
+	if (ast_strlen_zero(channel) || !strcasecmp(datatype, "all")) {
+		all = TRUE;
+	}
+ 	astman_append(s, "Response: Success\r\n");
+	if (!ast_strlen_zero(id)) {
+                astman_append(s, "ActionID: %s\r\n",id);
+	}
+
+
+	if (all || !strcasecmp(datatype, "qos")) {
+		if (p->rtp) {
+			manager_add_qos(s, "audio", dialog);
+		}
+		if (p->vrtp) {
+			manager_add_qos(s, "video", dialog);
+		}
+	} else if (!all) {
+		astman_send_error(s, m, "Unknown datatype: %s\n", datatype);
+		return 0;
+	}
+	astman_append(s, "\r\n\r\n" );
+	ast_channel_unlock(c);
+	return(0);
+}
 
 static char mandescr_show_peer[] = 
 "Description: Show one SIP peer with details on current status.\n"
@@ -15723,9 +15825,8 @@
 
 static int acf_channel_read(struct ast_channel *chan, char *funcname, char *preparse, char *buf, size_t buflen)
 {
-	struct ast_rtp_quality qos;
 	struct sip_pvt *p = chan->tech_pvt;
-	char *all = "", *parse = ast_strdupa(preparse);
+	char *parse = ast_strdupa(preparse);
 	AST_DECLARE_APP_ARGS(args,
 		AST_APP_ARG(param);
 		AST_APP_ARG(type);
@@ -15738,6 +15839,10 @@
 		ast_log(LOG_ERROR, "Cannot call %s on a non-SIP channel\n", funcname);
 		return 0;
 	}
+	if (p == NULL) {
+		ast_log(LOG_ERROR, "Cannot call %s on a non-SIP channel\n", funcname);
+		return -1;
+	}
 
 	if (strcasecmp(args.param, "rtpqos"))
 		return 0;
@@ -15749,40 +15854,50 @@
 		args.field = "all";
 
 	memset(buf, 0, buflen);
+	if (get_rtp_quality(p, args.type, args.field, buf, buflen)) {
+		ast_log(LOG_WARNING, "Unrecognized argument '%s' to %s\n", preparse, funcname);
+		return -1;
+	}
+	return 0;
+}
+
+/*! \brief Get RTP quality string */
+static int get_rtp_quality(struct sip_pvt *dialog, const char *chantype, const char *qostype, char *buf, size_t buflen)
+{
+	struct ast_rtp_quality qos;
+	char *all = "";
 	memset(&qos, 0, sizeof(qos));
 
-	if (p == NULL) {
-		return -1;
-	}
-
-	if (strcasecmp(args.type, "AUDIO") == 0) {
-		all = ast_rtp_get_quality(p->rtp, &qos);
-	} else if (strcasecmp(args.type, "VIDEO") == 0) {
-		all = ast_rtp_get_quality(p->vrtp, &qos);
-	}
-
-	if (strcasecmp(args.field, "local_ssrc") == 0)
+	if (strcasecmp(chantype, "AUDIO") == 0) {
+		all = ast_rtp_get_quality(dialog->rtp, &qos);
+	} else if (strcasecmp(chantype, "VIDEO") == 0) {
+		all = ast_rtp_get_quality(dialog->vrtp, &qos);
+	} else {
+		return -1;	/* Unknown media */
+	}
+
+	if (strcasecmp(qostype, "local_ssrc") == 0) {
 		snprintf(buf, buflen, "%u", qos.local_ssrc);
-	else if (strcasecmp(args.field, "local_lostpackets") == 0)
+	} else if (strcasecmp(qostype, "local_lostpackets") == 0) {
 		snprintf(buf, buflen, "%u", qos.local_lostpackets);
-	else if (strcasecmp(args.field, "local_jitter") == 0)
+	} else if (strcasecmp(qostype, "local_jitter") == 0) {
 		snprintf(buf, buflen, "%.0lf", qos.local_jitter * 1000.0);
-	else if (strcasecmp(args.field, "local_count") == 0)
+	} else if (strcasecmp(qostype, "local_count") == 0) {
 		snprintf(buf, buflen, "%u", qos.local_count);
-	else if (strcasecmp(args.field, "remote_ssrc") == 0)
+	} else if (strcasecmp(qostype, "remote_ssrc") == 0) {
 		snprintf(buf, buflen, "%u", qos.remote_ssrc);
-	else if (strcasecmp(args.field, "remote_lostpackets") == 0)
+	} else if (strcasecmp(qostype, "remote_lostpackets") == 0) {
 		snprintf(buf, buflen, "%u", qos.remote_lostpackets);
-	else if (strcasecmp(args.field, "remote_jitter") == 0)
+	} else if (strcasecmp(qostype, "remote_jitter") == 0) {
 		snprintf(buf, buflen, "%.0lf", qos.remote_jitter * 1000.0);
-	else if (strcasecmp(args.field, "remote_count") == 0)
+	} else if (strcasecmp(qostype, "remote_count") == 0) {
 		snprintf(buf, buflen, "%u", qos.remote_count);
-	else if (strcasecmp(args.field, "rtt") == 0)
+	} else if (strcasecmp(qostype, "rtt") == 0) {
 		snprintf(buf, buflen, "%.0lf", qos.rtt * 1000.0);
-	else if (strcasecmp(args.field, "all") == 0)
+	} else if (strcasecmp(qostype, "all") == 0) {
 		ast_copy_string(buf, all, buflen);
-	else {
-		ast_log(LOG_WARNING, "Unrecognized argument '%s' to %s\n", preparse, funcname);
+	} else {
+		/* Unrecognized argument, error! Let the caller print error message */
 		return -1;
 	}
 	return 0;
@@ -19376,6 +19491,8 @@
 			"List SIP peers (text format)", mandescr_show_peers);
 	ast_manager_register2("SIPshowpeer", EVENT_FLAG_SYSTEM, manager_sip_show_peer,
 			"Show SIP peer (text format)", mandescr_show_peer);
+	ast_manager_register2("SIPchannel", EVENT_FLAG_SYSTEM, manager_sip_channel,
+			"Show information about SIP channel", mandescr_sip_channel);
 
 	sip_poke_all_peers();	
 	sip_send_all_registers();
@@ -19414,6 +19531,7 @@
 	ast_udptl_proto_unregister(&sip_udptl);
 
 	/* Unregister AMI actions */
+	ast_manager_unregister("SIPchannel");
 	ast_manager_unregister("SIPpeers");
 	ast_manager_unregister("SIPshowpeer");
 

Modified: team/oej/pinequality-manager-qos-reports-1.4/include/asterisk/rtp.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinequality-manager-qos-reports-1.4/include/asterisk/rtp.h?view=diff&rev=226833&r1=226832&r2=226833
==============================================================================
--- team/oej/pinequality-manager-qos-reports-1.4/include/asterisk/rtp.h (original)
+++ team/oej/pinequality-manager-qos-reports-1.4/include/asterisk/rtp.h Mon Nov  2 11:22:23 2009
@@ -64,6 +64,7 @@
 };
 
 struct ast_rtp;
+struct ast_rtp_quality;
 
 struct ast_rtp_protocol {
 	/*! Get RTP struct, or NULL if unwilling to transfer */
@@ -73,6 +74,8 @@
 	/*! Set RTP peer */
 	int (* const set_rtp_peer)(struct ast_channel *chan, struct ast_rtp *peer, struct ast_rtp *vpeer, int codecs, int nat_active);
 	int (* const get_codec)(struct ast_channel *chan);
+	/*! RTCP callback */
+	int (* const rtcpcallback)(struct ast_rtp_quality *qualityreport);
 	const char * const type;
 	AST_LIST_ENTRY(ast_rtp_protocol) list;
 };




More information about the asterisk-commits mailing list