[asterisk-commits] oej: branch oej/pinetestedition-1.8 r383665 - in /team/oej/pinetestedition-1....
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Mar 25 03:42:02 CDT 2013
Author: oej
Date: Mon Mar 25 03:41:57 2013
New Revision: 383665
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=383665
Log:
Add Earl Grep SIP2CAUSE conversion and some missing files
Added:
team/oej/pinetestedition-1.8/channels/sip/include/rtcp.h (with props)
team/oej/pinetestedition-1.8/channels/sip/include/sip2cause.h (with props)
team/oej/pinetestedition-1.8/channels/sip/rtcp.c (with props)
team/oej/pinetestedition-1.8/channels/sip/sip2cause.c (with props)
team/oej/pinetestedition-1.8/configs/sip2cause.conf.sample (with props)
team/oej/pinetestedition-1.8/patches/README.earl-grey (with props)
team/oej/pinetestedition-1.8/patches/earl-grey-sip2cause-configurable-1.8.diff (with props)
Modified:
team/oej/pinetestedition-1.8/channels/chan_sip.c
team/oej/pinetestedition-1.8/channels/sip/include/sip_utils.h
team/oej/pinetestedition-1.8/patches/README.pinefrog-rtcp
Modified: team/oej/pinetestedition-1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinetestedition-1.8/channels/chan_sip.c?view=diff&rev=383665&r1=383664&r2=383665
==============================================================================
--- team/oej/pinetestedition-1.8/channels/chan_sip.c (original)
+++ team/oej/pinetestedition-1.8/channels/chan_sip.c Mon Mar 25 03:41:57 2013
@@ -272,6 +272,7 @@
#include "sip/include/sip_utils.h"
#include "sip/include/srtp.h"
#include "sip/include/sdp_crypto.h"
+#include "sip/include/sip2cause.h"
#include "asterisk/ccss.h"
#include "asterisk/xml.h"
#include "sip/include/dialog.h"
@@ -580,6 +581,8 @@
static const char config[] = "sip.conf"; /*!< Main configuration file */
static const char notify_config[] = "sip_notify.conf"; /*!< Configuration file for sending Notify with CLI commands to reconfigure or reboot phones */
+static const char sip2cause_config[] = "sip2cause.conf"; /*!< Configuration file for configuration of sip2cause conversions */
+static struct ast_config *sip2cause = NULL; /*!< Configuration file for sip2cause conversions */
/*! \brief Readable descriptions of device states.
* \note Should be aligned to above table as index */
@@ -685,6 +688,7 @@
static char default_notifymime[AST_MAX_EXTENSION]; /*!< Default MIME media type for MWI notify messages */
static char default_vmexten[AST_MAX_EXTENSION]; /*!< Default From Username on MWI updates */
static int default_qualify; /*!< Default Qualify= setting */
+static int private_sip2cause; /*!< Indication of private sip2cause conversion tables */
static char default_mohinterpret[MAX_MUSICCLASS]; /*!< Global setting for moh class to use when put on hold */
static char default_mohsuggest[MAX_MUSICCLASS]; /*!< Global setting for moh class to suggest when putting
* a bridged channel on hold */
@@ -6551,175 +6555,6 @@
return NULL;
}
-/*! \brief Convert SIP hangup causes to Asterisk hangup causes */
-int hangup_sip2cause(int cause)
-{
- /* Possible values taken from causes.h */
-
- switch(cause) {
- case 401: /* Unauthorized */
- return AST_CAUSE_CALL_REJECTED;
- case 403: /* Not found */
- return AST_CAUSE_CALL_REJECTED;
- case 404: /* Not found */
- return AST_CAUSE_UNALLOCATED;
- case 405: /* Method not allowed */
- return AST_CAUSE_INTERWORKING;
- case 407: /* Proxy authentication required */
- return AST_CAUSE_CALL_REJECTED;
- case 408: /* No reaction */
- return AST_CAUSE_NO_USER_RESPONSE;
- case 409: /* Conflict */
- return AST_CAUSE_NORMAL_TEMPORARY_FAILURE;
- case 410: /* Gone */
- return AST_CAUSE_NUMBER_CHANGED;
- case 411: /* Length required */
- return AST_CAUSE_INTERWORKING;
- case 413: /* Request entity too large */
- return AST_CAUSE_INTERWORKING;
- case 414: /* Request URI too large */
- return AST_CAUSE_INTERWORKING;
- case 415: /* Unsupported media type */
- return AST_CAUSE_INTERWORKING;
- case 420: /* Bad extension */
- return AST_CAUSE_NO_ROUTE_DESTINATION;
- case 480: /* No answer */
- return AST_CAUSE_NO_ANSWER;
- case 481: /* No answer */
- return AST_CAUSE_INTERWORKING;
- case 482: /* Loop detected */
- return AST_CAUSE_INTERWORKING;
- case 483: /* Too many hops */
- return AST_CAUSE_NO_ANSWER;
- case 484: /* Address incomplete */
- return AST_CAUSE_INVALID_NUMBER_FORMAT;
- case 485: /* Ambiguous */
- return AST_CAUSE_UNALLOCATED;
- case 486: /* Busy everywhere */
- return AST_CAUSE_BUSY;
- case 487: /* Request terminated */
- return AST_CAUSE_INTERWORKING;
- case 488: /* No codecs approved */
- return AST_CAUSE_BEARERCAPABILITY_NOTAVAIL;
- case 491: /* Request pending */
- return AST_CAUSE_INTERWORKING;
- case 493: /* Undecipherable */
- return AST_CAUSE_INTERWORKING;
- case 500: /* Server internal failure */
- return AST_CAUSE_FAILURE;
- case 501: /* Call rejected */
- return AST_CAUSE_FACILITY_REJECTED;
- case 502:
- return AST_CAUSE_DESTINATION_OUT_OF_ORDER;
- case 503: /* Service unavailable */
- return AST_CAUSE_CONGESTION;
- case 504: /* Gateway timeout */
- return AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE;
- case 505: /* SIP version not supported */
- return AST_CAUSE_INTERWORKING;
- case 600: /* Busy everywhere */
- return AST_CAUSE_USER_BUSY;
- case 603: /* Decline */
- return AST_CAUSE_CALL_REJECTED;
- case 604: /* Does not exist anywhere */
- return AST_CAUSE_UNALLOCATED;
- case 606: /* Not acceptable */
- return AST_CAUSE_BEARERCAPABILITY_NOTAVAIL;
- default:
- if (cause < 500 && cause >= 400) {
- /* 4xx class error that is unknown - someting wrong with our request */
- return AST_CAUSE_INTERWORKING;
- } else if (cause < 600 && cause >= 500) {
- /* 5xx class error - problem in the remote end */
- return AST_CAUSE_CONGESTION;
- } else if (cause < 700 && cause >= 600) {
- /* 6xx - global errors in the 4xx class */
- return AST_CAUSE_INTERWORKING;
- }
- return AST_CAUSE_NORMAL;
- }
- /* Never reached */
- return 0;
-}
-
-/*! \brief Convert Asterisk hangup causes to SIP codes
-\verbatim
- Possible values from causes.h
- AST_CAUSE_NOTDEFINED AST_CAUSE_NORMAL AST_CAUSE_BUSY
- AST_CAUSE_FAILURE AST_CAUSE_CONGESTION AST_CAUSE_UNALLOCATED
-
- In addition to these, a lot of PRI codes is defined in causes.h
- ...should we take care of them too ?
-
- Quote RFC 3398
-
- ISUP Cause value SIP response
- ---------------- ------------
- 1 unallocated number 404 Not Found
- 2 no route to network 404 Not found
- 3 no route to destination 404 Not found
- 16 normal call clearing --- (*)
- 17 user busy 486 Busy here
- 18 no user responding 408 Request Timeout
- 19 no answer from the user 480 Temporarily unavailable
- 20 subscriber absent 480 Temporarily unavailable
- 21 call rejected 403 Forbidden (+)
- 22 number changed (w/o diagnostic) 410 Gone
- 22 number changed (w/ diagnostic) 301 Moved Permanently
- 23 redirection to new destination 410 Gone
- 26 non-selected user clearing 404 Not Found (=)
- 27 destination out of order 502 Bad Gateway
- 28 address incomplete 484 Address incomplete
- 29 facility rejected 501 Not implemented
- 31 normal unspecified 480 Temporarily unavailable
-\endverbatim
-*/
-const char *hangup_cause2sip(int cause)
-{
- switch (cause) {
- case AST_CAUSE_UNALLOCATED: /* 1 */
- case AST_CAUSE_NO_ROUTE_DESTINATION: /* 3 IAX2: Can't find extension in context */
- case AST_CAUSE_NO_ROUTE_TRANSIT_NET: /* 2 */
- return "404 Not Found";
- case AST_CAUSE_CONGESTION: /* 34 */
- case AST_CAUSE_SWITCH_CONGESTION: /* 42 */
- return "503 Service Unavailable";
- case AST_CAUSE_NO_USER_RESPONSE: /* 18 */
- return "408 Request Timeout";
- case AST_CAUSE_NO_ANSWER: /* 19 */
- case AST_CAUSE_UNREGISTERED: /* 20 */
- return "480 Temporarily unavailable";
- case AST_CAUSE_CALL_REJECTED: /* 21 */
- return "403 Forbidden";
- case AST_CAUSE_NUMBER_CHANGED: /* 22 */
- return "410 Gone";
- case AST_CAUSE_NORMAL_UNSPECIFIED: /* 31 */
- return "480 Temporarily unavailable";
- case AST_CAUSE_INVALID_NUMBER_FORMAT:
- return "484 Address incomplete";
- case AST_CAUSE_USER_BUSY:
- return "486 Busy here";
- case AST_CAUSE_FAILURE:
- return "500 Server internal failure";
- case AST_CAUSE_FACILITY_REJECTED: /* 29 */
- return "501 Not Implemented";
- case AST_CAUSE_CHAN_NOT_IMPLEMENTED:
- return "503 Service Unavailable";
- /* Used in chan_iax2 */
- case AST_CAUSE_DESTINATION_OUT_OF_ORDER:
- return "502 Bad Gateway";
- case AST_CAUSE_BEARERCAPABILITY_NOTAVAIL: /* Can't find codec to connect to host */
- return "488 Not Acceptable Here";
-
- case AST_CAUSE_NOTDEFINED:
- default:
- ast_debug(1, "AST hangup cause %d (no match found in SIP)\n", cause);
- return NULL;
- }
-
- /* Never reached */
- return 0;
-}
static int reinvite_timeout(const void *data)
{
@@ -19206,6 +19041,7 @@
ast_cli(a->fd, " MWI NOTIFY mime type: %s\n", default_notifymime);
ast_cli(a->fd, " DNS SRV lookup: %s\n", AST_CLI_YESNO(sip_cfg.srvlookup));
ast_cli(a->fd, " Pedantic SIP support: %s\n", AST_CLI_YESNO(sip_cfg.pedanticsipchecking));
+ ast_cli(a->fd, " Private SIP2cause: %s\n", AST_CLI_YESNO(private_sip2cause));
ast_cli(a->fd, " Reg. min duration %d secs\n", min_expiry);
ast_cli(a->fd, " Reg. max duration: %d secs\n", max_expiry);
ast_cli(a->fd, " Reg. default duration: %d secs\n", default_expiry);
@@ -30304,6 +30140,18 @@
ast_log(LOG_ERROR, "Contents of %s are invalid and cannot be parsed.\n", notify_config);
notify_types = NULL;
}
+ private_sip2cause = 0;
+ if ((sip2cause = ast_config_load(sip2cause_config, config_flags)) == CONFIG_STATUS_FILEINVALID) {
+ ast_log(LOG_ERROR, "Contents of %s are invalid and cannot be parsed.\n", sip2cause_config);
+ sip2cause = NULL;
+ sip2cause_init(); /* Initialize standard settings */
+ } else {
+ sip2cause_free(); /* If it's a reload, free existing settings */
+ sip2cause_init(); /* Initialize standard settings */
+ private_sip2cause = sip2cause_load(sip2cause);
+ /* Now clean up */
+ ast_config_destroy(sip2cause);
+ }
/* Done, tell the manager */
manager_event(EVENT_FLAG_SYSTEM, "ChannelReload", "ChannelType: SIP\r\nReloadReason: %s\r\nRegistry_Count: %d\r\nPeer_Count: %d\r\n", channelreloadreason2txt(reason), registry_count, peer_count);
@@ -32554,6 +32402,7 @@
ast_cc_agent_unregister(&sip_cc_agent_callbacks);
sip_reqresp_parser_exit();
+ sip2cause_free();
sip_unregister_tests();
return 0;
Added: team/oej/pinetestedition-1.8/channels/sip/include/rtcp.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinetestedition-1.8/channels/sip/include/rtcp.h?view=auto&rev=383665
==============================================================================
--- team/oej/pinetestedition-1.8/channels/sip/include/rtcp.h (added)
+++ team/oej/pinetestedition-1.8/channels/sip/include/rtcp.h Mon Mar 25 03:41:57 2013
@@ -1,0 +1,50 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2013 Olle E. Johansson, Edvina AB
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file rtcp.h
+ *
+ * \brief RTCP additional functions
+ *
+ * \author Olle E. Johansson <oej at edvina.net>
+ */
+
+#include "asterisk.h"
+
+#include "asterisk/utils.h"
+#include "asterisk/rtp_engine.h"
+#include "sip.h"
+
+#ifndef _SIP_RTCP_H
+#define _SIP_RTCP_H
+
+/*! \brief Set various data items in the RTP structure, like channel identifier.
+ */
+void sip_rtcp_set_data(struct sip_pvt *dialog, struct ast_rtp_instance *instance, enum media_type type);
+
+int send_rtcp_events(const void *data);
+void start_rtcp_events(struct sip_pvt *dialog, struct sched_context *sched);
+/*
+# For 1.4:
+# static void sip_rtcp_report(struct sip_pvt *p, struct ast_rtp *rtp, enum media_type type, int reporttype);
+*/
+
+void sip_rtcp_report(struct sip_pvt *dialog, struct ast_rtp_instance *instance, enum media_type type, int reporttype);
+//void qos_write_realtime(struct sip_pvt *dialog, struct ast_rtp_quality *qual);
+void qos_write_realtime(struct sip_pvt *dialog, struct ast_rtp_instance_stats *qual);
+
+
+
+#endif /* _SIP_RTCP_H */
Propchange: team/oej/pinetestedition-1.8/channels/sip/include/rtcp.h
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/oej/pinetestedition-1.8/channels/sip/include/rtcp.h
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/oej/pinetestedition-1.8/channels/sip/include/rtcp.h
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: team/oej/pinetestedition-1.8/channels/sip/include/sip2cause.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinetestedition-1.8/channels/sip/include/sip2cause.h?view=auto&rev=383665
==============================================================================
--- team/oej/pinetestedition-1.8/channels/sip/include/sip2cause.h (added)
+++ team/oej/pinetestedition-1.8/channels/sip/include/sip2cause.h Mon Mar 25 03:41:57 2013
@@ -1,0 +1,42 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2010, Digium, Inc.
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*!
+ * \file
+ * \brief sip2cause header file
+ */
+
+#include "sip.h"
+
+#ifndef _SIP_CAUSE_H
+#define _SIP_CAUSE_H
+
+/*! \brief Convert SIP response code to ISDN or Asterisk-specific cause code */
+int hangup_sip2cause(int cause);
+
+/*! \brief Convert ISDN or Asterisk-specific cause code to SIP response code */
+char *hangup_cause2sip(int cause);
+
+/*! \brief Initialized sip2cause tables */
+void sip2cause_init(void);
+
+/*! \brief Free sip2cause tables */
+void sip2cause_free(void);
+
+/*! \brief Load configuration */
+int sip2cause_load(struct ast_config *s2c_config);
+
+#endif /* defined(_SIP_CAUSE_H) */
Propchange: team/oej/pinetestedition-1.8/channels/sip/include/sip2cause.h
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/oej/pinetestedition-1.8/channels/sip/include/sip2cause.h
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/oej/pinetestedition-1.8/channels/sip/include/sip2cause.h
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: team/oej/pinetestedition-1.8/channels/sip/include/sip_utils.h
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinetestedition-1.8/channels/sip/include/sip_utils.h?view=diff&rev=383665&r1=383664&r2=383665
==============================================================================
--- team/oej/pinetestedition-1.8/channels/sip/include/sip_utils.h (original)
+++ team/oej/pinetestedition-1.8/channels/sip/include/sip_utils.h Mon Mar 25 03:41:57 2013
@@ -42,42 +42,4 @@
*/
const char *find_closing_quote(const char *start, const char *lim);
-
-/*! \brief Convert SIP hangup causes to Asterisk hangup causes */
-int hangup_sip2cause(int cause);
-
-/*! \brief Convert Asterisk hangup causes to SIP codes
-\verbatim
- Possible values from causes.h
- AST_CAUSE_NOTDEFINED AST_CAUSE_NORMAL AST_CAUSE_BUSY
- AST_CAUSE_FAILURE AST_CAUSE_CONGESTION AST_CAUSE_UNALLOCATED
-
- In addition to these, a lot of PRI codes is defined in causes.h
- ...should we take care of them too ?
-
- Quote RFC 3398
-
- ISUP Cause value SIP response
- ---------------- ------------
- 1 unallocated number 404 Not Found
- 2 no route to network 404 Not found
- 3 no route to destination 404 Not found
- 16 normal call clearing --- (*)
- 17 user busy 486 Busy here
- 18 no user responding 408 Request Timeout
- 19 no answer from the user 480 Temporarily unavailable
- 20 subscriber absent 480 Temporarily unavailable
- 21 call rejected 403 Forbidden (+)
- 22 number changed (w/o diagnostic) 410 Gone
- 22 number changed (w/ diagnostic) 301 Moved Permanently
- 23 redirection to new destination 410 Gone
- 26 non-selected user clearing 404 Not Found (=)
- 27 destination out of order 502 Bad Gateway
- 28 address incomplete 484 Address incomplete
- 29 facility rejected 501 Not implemented
- 31 normal unspecified 480 Temporarily unavailable
-\endverbatim
-*/
-const char *hangup_cause2sip(int cause);
-
#endif
Added: team/oej/pinetestedition-1.8/channels/sip/rtcp.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinetestedition-1.8/channels/sip/rtcp.c?view=auto&rev=383665
==============================================================================
--- team/oej/pinetestedition-1.8/channels/sip/rtcp.c (added)
+++ team/oej/pinetestedition-1.8/channels/sip/rtcp.c Mon Mar 25 03:41:57 2013
@@ -1,0 +1,384 @@
+/*
+* Asterisk -- An open source telephony toolkit.
+*
+* Copyright (C) 2013 Olle E. Johansson, Edvina AB
+*
+* See http://www.asterisk.org for more information about
+* the Asterisk project. Please do not directly contact
+* any of the maintainers of this project for assistance;
+* the project provides a web site, mailing lists and IRC
+* channels for your use.
+*
+* This program is free software, distributed under the terms of
+* the GNU General Public License Version 2. See the LICENSE file
+* at the top of the source tree.
+*/
+
+/*! \file rtcp.c
+*
+* \brief RTCP additional functions
+*
+* \author Olle E. Johansson <oej at edvina.net>
+*/
+
+/*** MODULEINFO
+ <support_level>core</support_level>
+***/
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/utils.h"
+#include "asterisk/manager.h"
+#include "asterisk/logger.h"
+#include "asterisk/translate.h"
+#include "asterisk/rtp_engine.h"
+#include "include/sip.h"
+#include "include/rtcp.h"
+
+/*! \brief Set various data items in the RTP structure, like channel identifier.
+ */
+void sip_rtcp_set_data(struct sip_pvt *dialog, struct ast_rtp_instance *instance, enum media_type type)
+{
+
+ if (dialog && dialog->owner) {
+ int readtrans = FALSE, writetrans = FALSE;
+ struct ast_channel *bridgepeer = ast_bridged_channel(dialog->owner);
+
+ if (bridgepeer) {
+ /* Store the bridged peer data while we have it */
+ ast_rtp_instance_set_bridged_chan(instance, dialog->owner->name, dialog->owner->uniqueid, S_OR(bridgepeer->name,""), S_OR(bridgepeer->uniqueid,""));
+ ast_debug(1, "---- Setting bridged peer name to %s\n", bridgepeer->name);
+ } else {
+ ast_rtp_instance_set_bridged_chan(instance, dialog->owner->name, dialog->owner->uniqueid, NULL, NULL);
+ }
+ ast_debug(1, "---- Setting channel name to %s\n", dialog->owner->name);
+
+ /* Try to find out if there's active transcoding */
+ /* Currently, the only media stream that has translation is the audio stream. At some point
+ we might have transcoding for other types of media. */
+ if (type == SDP_AUDIO) {
+ struct ast_channel *chan = dialog->owner;
+ const char *rtname = NULL, *wtname = NULL;
+ /* if we have a translator, the bridge delay is increased, which affects the QoS of the call. */
+ readtrans = (chan->readtrans != NULL);
+ writetrans = (chan->writetrans != NULL);
+ if (readtrans) {
+ rtname = chan->readtrans->t->name;
+ }
+ if (writetrans) {
+ wtname = chan->writetrans->t->name;
+ }
+ if (readtrans || writetrans) {
+ ast_rtp_instance_set_translator(instance, rtname, readtrans ? chan->readtrans->t->cost : (const int) 0,
+ wtname, writetrans ? chan->writetrans->t->cost : (const int) 0);
+ }
+
+ if (option_debug > 1) {
+ if (readtrans && dialog->owner->readtrans->t) {
+ ast_debug(1, "--- Audio Read translator: %s Cost %d\n", dialog->owner->readtrans->t->name, dialog->owner->readtrans->t->cost);
+ }
+ if (writetrans && dialog->owner->writetrans->t) {
+ ast_debug(1, "--- Audio Write translator: %s Cost %d\n", dialog->owner->writetrans->t->name, dialog->owner->writetrans->t->cost);
+ }
+ }
+ }
+
+ } else {
+ ast_debug(1, "######## Not setting rtcp media data. Dialog %s Dialog owner %s \n", dialog ? "set" : "unset", dialog->owner ? "set" : "unset");
+ }
+}
+
+/*! \brief send manager report of RTCP
+ reporttype = 0 means report during call (if configured)
+ reporttype = 1 means endof-call (hangup) report
+ reporttype = 10 means report at end of call leg (like transfer)
+*/
+void sip_rtcp_report(struct sip_pvt *dialog, struct ast_rtp_instance *instance, enum media_type media, int reporttype)
+{
+ struct ast_rtp_instance_stats qual;
+ //char *rtpqstring = NULL;
+ //int qosrealtime = ast_check_realtime("rtpcqr");
+ unsigned int duration; /* Duration in secs */
+ memset(&qual, 0, sizeof(qual));
+
+ sip_rtcp_set_data(dialog, instance, media);
+
+ if (ast_rtp_instance_get_stats(instance, &qual, AST_RTP_INSTANCE_STAT_ALL)) {
+ ast_debug(1, "######## Did not get any statistics... bad, bad, RTP instance\n");
+ /* Houston, we got a problem */
+ return;
+ }
+
+ if (dialog->sip_cfg->rtcpevents) {
+ /*
+ If numberofreports == 0 we have no incoming RTCP active, thus we can't
+ get any reliable data to handle packet loss or any RTT timing.
+ */
+
+ duration = (unsigned int)(ast_tvdiff_ms(ast_tvnow(), qual.start) / 1000);
+ manager_event(EVENT_FLAG_CALL, "RTPQuality",
+ "Channel: %s\r\n" /* AST_CHANNEL for this call */
+ "Uniqueid: %s\r\n" /* AST_CHANNEL for this call */
+ "BridgedChannel: %s\r\n"
+ "BridgedUniqueid: %s\r\n"
+ "RTPreporttype: %s\r\n"
+ "RTPrtcpstatus: %s\r\n"
+ "Duration: %u\r\n" /* used in cdr_manager */
+ "PvtCallid: %s\r\n" /* ??? Generic PVT identifier */
+ "RTPipaddress: %s\r\n"
+ "RTPmedia: %s\r\n" /* Audio, video, text */
+ "RTPsendformat: %s\r\n"
+ "RTPrecvformat: %s\r\n"
+ "RTPlocalssrc: %u\r\n"
+ "RTPremotessrc: %u\r\n"
+ "RTPrtt: %f\r\n"
+ "RTPrttMax: %f\r\n"
+ "RTPrttMin: %f\r\n"
+ "RTPLocalJitter: %f\r\n"
+ "RTPRemoteJitter: %f\r\n"
+ "RTPInPacketLoss: %d\r\n"
+ "RTPInLocalPlPercent: %5.2f\r\n"
+ "RTPOutPacketLoss: %d\r\n"
+ "RTPOutPlPercent: %5.2f\r\n"
+ "TranslateRead: %s\r\n"
+ "TranslateReadCost: %d\r\n"
+ "TranslateWrite: %s\r\n"
+ "TranslateWriteCost: %d\r\n"
+ "\r\n",
+ dialog->owner ? dialog->owner->name : "",
+ dialog->owner ? dialog->owner->uniqueid : "",
+ qual.bridgedchannel[0] ? qual.bridgedchannel : "" ,
+ qual.bridgeduniqueid[0] ? qual.bridgeduniqueid : "",
+ reporttype == 1 ? "Final" : "Update",
+ qual.numberofreports == 0 ? "Inactive" : "Active",
+ duration,
+ dialog->callid,
+ ast_inet_ntoa(qual.them.sin_addr),
+ media == SDP_AUDIO ? "audio" : (media == SDP_VIDEO ? "video" : "fax") ,
+ ast_getformatname(qual.lasttxformat),
+ ast_getformatname(qual.lastrxformat),
+ qual.local_ssrc,
+ qual.remote_ssrc,
+ qual.rtt,
+ qual.maxrtt,
+ qual.minrtt,
+ qual.rxjitter,
+ qual.txjitter,
+ qual.rxploss,
+ /* The local counter of lost packets in inbound stream divided with received packets plus lost packets */
+ (qual.remote_txcount + qual.rxploss) > 0 ? (double) qual.rxploss / (qual.remote_txcount + qual.rxploss) * 100 : 0,
+ qual.txploss,
+ /* The remote counter of lost packets (if we got the reports)
+ divided with our counter of sent packets
+ */
+ (qual.rxcount + qual.txploss) > 0 ? (double) qual.txploss / qual.rxcount * 100 : 0,
+ qual.readtranslator, qual.readcost,
+ qual.writetranslator, qual.writecost
+ );
+ }
+
+ /* CDR records are not reliable when it comes to near-death-of-channel events, so we need to store the RTCP
+ report in realtime when we have it.
+ Tests have proven that storing to realtime from the call thread is NOT a good thing. Therefore, we just save
+ the quality report structure in the PVT and let the function that kills the pvt store the stuff in the
+ monitor thread instead.
+ */
+ if (reporttype == 1) {
+ ast_log(LOG_DEBUG, "---- Activation qual structure in dialog \n");
+ qual.end = ast_tvnow();
+ qual.mediatype = media;
+ if (media == SDP_AUDIO) { /* Audio */
+ dialog->audioqual = ast_calloc(1, sizeof(struct ast_rtp_instance_stats));
+ (* dialog->audioqual) = qual;
+ } else if (media == SDP_VIDEO) { /* Video */
+ dialog->videoqual = ast_calloc(1,sizeof(struct ast_rtp_instance_stats));
+ (* dialog->videoqual) = qual;
+ }
+ }
+}
+
+/*! \brief Write quality report to realtime storage */
+void qos_write_realtime(struct sip_pvt *dialog, struct ast_rtp_instance_stats *qual)
+{
+ unsigned int duration; /* Duration in secs */
+ char buf_duration[10], buf_lssrc[30], buf_rssrc[30];
+ char buf_rtt[10], buf_rttmin[10], buf_rttmax[10];
+ char localjitter[10], remotejitter[10];
+ char buf_readcost[5], buf_writecost[5];
+ char buf_mediatype[10];
+ char buf_remoteip[25];
+ char buf_inpacketloss[25], buf_outpacketloss[25];
+ char buf_outpackets[25], buf_inpackets[25];
+ int qosrealtime = ast_check_realtime("rtpcqr");
+
+ ast_log(LOG_DEBUG, "************* QOS END REPORTS: The final countdown!!!!! Yeah. \n");
+
+ if (!qual) {
+ ast_log(LOG_ERROR, "No CQR data provided \n");
+ return;
+ }
+
+ /* Since the CDR is already gone, we need to calculate our own duration.
+ The CDR duration is the definitive resource for billing, this is
+ the RTP stream duration which may include early media (ringing and
+ provider messages). Only useful for measurements.
+ */
+ if (!ast_tvzero(qual->end) && !ast_tvzero(qual->start)) {
+ duration = (unsigned int)(ast_tvdiff_ms(qual->end, qual->start) / 1000);
+ } else {
+ ast_log(LOG_DEBUG, "**** WTF? No duration? What type of call is THAT? \n");
+ duration = 0;
+ }
+
+ /* Realtime is based on strings, so let's make strings */
+ sprintf(localjitter, "%f", qual->rxjitter);
+ sprintf(remotejitter, "%f", qual->txjitter);
+ sprintf(buf_lssrc, "%u", qual->local_ssrc);
+ sprintf(buf_rssrc, "%u", qual->remote_ssrc);
+ sprintf(buf_rtt, "%.0f", qual->rtt);
+ sprintf(buf_rttmax, "%.0f", qual->maxrtt);
+ sprintf(buf_rttmin, "%.0f", qual->minrtt);
+ sprintf(buf_duration, "%u", duration);
+ sprintf(buf_readcost, "%d", qual->readcost);
+ sprintf(buf_writecost, "%d", qual->writecost);
+ sprintf(buf_mediatype,"%s", qual->mediatype == SDP_AUDIO ? "audio" : (qual->mediatype == SDP_VIDEO ? "video" : "fax") );
+ sprintf(buf_remoteip,"%s", ast_inet_ntoa(qual->them.sin_addr));
+ sprintf(buf_inpacketloss, "%d", qual->rxploss);
+ sprintf(buf_outpacketloss, "%d", qual->txploss);
+ sprintf(buf_inpackets, "%d", qual->rxcount); /* Silly value. Need to check this */
+ sprintf(buf_outpackets, "%d", qual->txcount);
+ //sprintf(buf_inpackets, "%d", qual->remote_count); /* Do check again */
+ //sprintf(buf_outpackets, "%d", qual->local_count);
+
+ ast_log(LOG_DEBUG, "************* QOS END REPORTS: Probing new logging channel LOG_CQR!!!!! Yeah. \n");
+ ast_log(LOG_CQR, "CQR Channel: %s Uid %s Bch %s Buid %s Pvt %s Media %s Lssrc %s Rssrc %s Rip %s Rtt %s:%s:%s Ljitter %s Rjitter %s Rtcpstatus %s Dur %s Pout %s Plossout %s Pin %s Plossin %s\n",
+ qual->channel[0] ? qual->channel : "",
+ qual->uniqueid[0] ? qual->uniqueid : "",
+ qual->bridgedchannel[0] ? qual->bridgedchannel : "" ,
+ qual->bridgeduniqueid[0] ? qual->bridgeduniqueid : "",
+ dialog->callid,
+ buf_mediatype,
+ buf_lssrc,
+ buf_rssrc,
+ buf_remoteip,
+ buf_rtt, buf_rttmax, buf_rttmin,
+ localjitter,
+ remotejitter,
+ qual->numberofreports == 0 ? "Inactive" : "Active",
+ buf_duration,
+ buf_outpackets,
+ buf_outpacketloss,
+ buf_inpackets,
+ buf_inpacketloss);
+
+ if (!qosrealtime) {
+ return;
+ }
+/* Example database schema for MySQL:
+CREATE TABLE `astcqr` (
+ `channel` varchar(50) NOT NULL,
+ `uniqueid` varchar(35) NOT NULL,
+ `bridgedchannel` varchar(50) NOT NULL,
+ `bridgeduniqueid` varchar(35) NOT NULL,
+ `pvtcallid` varchar(80) NOT NULL,
+ `rtpmedia` varchar(50) NOT NULL,
+ `localssrc` varchar(50) NOT NULL,
+ `remotessrc` varchar(50) NOT NULL,
+ `rtt` varchar(10) NOT NULL,
+ `localjitter` varchar(10) NOT NULL,
+ `remotejitter` varchar(10) NOT NULL,
+ `sendformat` varchar(10) NOT NULL,
+ `receiveformat` varchar(10) NOT NULL,
+ `rtcpstatus` varchar(10) NOT NULL,
+ `duration` varchar(10) NOT NULL,
+ `packetsent` varchar(30) NOT NULL,
+ `packetreceived` varchar(30) NOT NULL,
+ `packetlossin` varchar(30) NOT NULL,
+ `packetlossout` varchar(30) NOT NULL,
+ `rttmax` varchar(12) NOT NULL,
+ `rttmin` varchar(12) NOT NULL,
+ `writetranslator` varchar(15) NOT NULL,
+ `readtranslator` varchar(15) NOT NULL,
+ `writecost` varchar(10) NOT NULL,
+ `readcost` varchar(10) NOT NULL,
+ `remoteip` varchar(25) NOT NULL,
+ KEY `ChannelUnique` (`channel`,`uniqueid`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='FOr pinefrog stats'
+*/
+
+ ast_store_realtime("rtpcqr",
+ "channel", qual->channel[0] ? qual->channel : "--no channel--",
+ "uniqueid", qual->uniqueid[0] ? qual->uniqueid : "--no uniqueid --",
+ "bridgedchannel", qual->bridgedchannel[0] ? qual->bridgedchannel : "" ,
+ "bridgeduniqueid", qual->bridgeduniqueid[0] ? qual->bridgeduniqueid : "",
+ "pvtcallid", dialog->callid,
+ "rtpmedia", buf_mediatype,
+ "localssrc", buf_lssrc,
+ "remotessrc", buf_rssrc,
+ "remoteip", buf_remoteip,
+ "rtt", buf_rtt,
+ "rttmax", buf_rttmax,
+ "rttmin", buf_rttmin,
+ "localjitter", localjitter,
+ "remotejitter", remotejitter,
+ "sendformat", ast_getformatname(qual->lasttxformat),
+ "receiveformat", ast_getformatname(qual->lastrxformat),
+ "rtcpstatus", qual->numberofreports == 0 ? "Inactive" : "Active",
+ "duration", buf_duration,
+ "writetranslator", qual->writetranslator[0] ? qual->writetranslator : "",
+ "writecost", buf_writecost,
+ "readtranslator", qual->readtranslator[0] ? qual->readtranslator : "",
+ "readcost", buf_readcost,
+ "packetlossin", buf_inpacketloss,
+ "packetlossout", buf_outpacketloss,
+ "packetsent", buf_outpackets,
+ "packetreceived", buf_inpackets,
+ NULL);
+}
+
+/*! \brief Send RTCP manager events */
+int send_rtcp_events(const void *data)
+{
+ struct sip_pvt *dialog = (struct sip_pvt *) data;
+ ast_log(LOG_DEBUG, "***** SENDING RTCP EVENT \n");
+
+ if (dialog->rtp && !ast_rtp_instance_isactive(dialog->rtp)) {
+ ast_debug(1, " ***** Activating RTCP report \n");
+ sip_rtcp_report(dialog, dialog->rtp, SDP_AUDIO, FALSE);
+ } else {
+ ast_debug(1, " ***** NOT Activating RTCP report \n");
+ }
+ if (dialog->vrtp && !ast_rtp_instance_isactive(dialog->vrtp)) {
+ sip_rtcp_report(dialog, dialog->vrtp, SDP_VIDEO, FALSE);
+ }
+ return (dialog->sip_cfg ? dialog->sip_cfg->rtcptimer : 0);
+}
+
+/*! \brief Activate RTCP events at start of call */
+void start_rtcp_events(struct sip_pvt *dialog, struct sched_context *sched)
+{
+ ast_debug(2, "***** STARTING SENDING RTCP EVENT \n");
+ /* Check if it's already active */
+
+ if (dialog->rtp && !ast_rtp_instance_isactive(dialog->rtp)) {
+ sip_rtcp_set_data(dialog, dialog->rtp, SDP_AUDIO);
+ }
+ if (dialog->vrtp && !ast_rtp_instance_isactive(dialog->vrtp)) {
+ sip_rtcp_set_data(dialog, dialog->vrtp, SDP_VIDEO);
+ }
+
+ if (!dialog->sip_cfg->rtcpevents || !dialog->sip_cfg->rtcptimer) {
+ ast_debug(2, "***** NOT SENDING RTCP EVENTS \n");
+ return;
+ }
+
+ if (dialog->rtcpeventid != -1) {
+ return;
+ }
+
+
+ /*! \brief Schedule events */
+ dialog->rtcpeventid = ast_sched_add(sched, dialog->sip_cfg->rtcptimer * 1000, send_rtcp_events, dialog);
+}
Propchange: team/oej/pinetestedition-1.8/channels/sip/rtcp.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/oej/pinetestedition-1.8/channels/sip/rtcp.c
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/oej/pinetestedition-1.8/channels/sip/rtcp.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: team/oej/pinetestedition-1.8/channels/sip/sip2cause.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinetestedition-1.8/channels/sip/sip2cause.c?view=auto&rev=383665
==============================================================================
--- team/oej/pinetestedition-1.8/channels/sip/sip2cause.c (added)
+++ team/oej/pinetestedition-1.8/channels/sip/sip2cause.c Mon Mar 25 03:41:57 2013
@@ -1,0 +1,289 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2012, Digium, inc
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*!
+ * \file
+ * \brief SIP-to-ISDN cause code conversions
+ *
+ * \author Olle E. Johansson <oej at edvina.net>
+ */
+
+/*** MODULEINFO
+ <support_level>core</support_level>
+ ***/
+
+/*
+The sip2causestruct could potentially be used to provide translations of SIP reason codes in the future
+
+*/
+
+#include "asterisk.h"
+#include "asterisk/causes.h"
+#include "asterisk/strings.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+#include "include/sip2cause.h"
+
+/*! \brief structure for conversion between ISDN and SIP codes */
+struct sip2causestruct {
+ int sip; /*!< SIP code (200-699) - no provisional codes */
+ int cause; /*!< ISDN cause code */
+ char reason[64]; /*!< SIP reason text, like "486 Busy", "404 Inte min domän" or "500 Que?" */
+ int private; /*!< If 1 = private extension */
+ struct sip2causestruct *next; /*!< Pointer to next entry */
+};
+
+/*! \brief Main structure for tables, including default values */
+struct sip2causetable {
+ struct sip2causestruct *table;
+ int defaultcode;
+ char *defaultreason;
+};
+
+/*! \brief Actual table for sip => ISDN lookups */
+struct sip2causetable sip2causelookup;
+
+/*! \brief Actual table for ISDN => sip lookups */
+struct sip2causetable cause2siplookup;
+
+/*! \brief Add conversion entry to table */
+static struct sip2causestruct *newsip2cause(int sip, int cause, const char *reason, int private, struct sip2causestruct *next)
+{
+ struct sip2causestruct *s2c = ast_calloc(1, sizeof(struct sip2causestruct));
+
+ if (!s2c) {
+ return NULL;
+ }
+ s2c->sip = sip;
+ s2c->cause = cause;
+ ast_copy_string(s2c->reason, reason, sizeof(s2c->reason));
+ s2c->next = next;
+ s2c->private = private;
+ ast_debug(4, "SIP2CAUSE adding %d %s <=> %d (%s) \n", sip, reason, cause, ast_cause2str(cause));
+ return(s2c);
+ }
+
+/*! \brief Initialize structure with default values */
+void sip2cause_init(void)
+{
+ /* Initialize table for SIP => ISDN codes */
+ sip2causelookup.table = newsip2cause(401, /* Unauthorized */ AST_CAUSE_CALL_REJECTED, "", 0, NULL);
+ sip2causelookup.table = newsip2cause(403, /* Not found */ AST_CAUSE_CALL_REJECTED, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(404, /* Not found */ AST_CAUSE_UNALLOCATED, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(405, /* Method not allowed */ AST_CAUSE_INTERWORKING, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(407, /* Proxy authentication required */ AST_CAUSE_CALL_REJECTED, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(408, /* No reaction */ AST_CAUSE_NO_USER_RESPONSE, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(409, /* Conflict */ AST_CAUSE_NORMAL_TEMPORARY_FAILURE, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(410, /* Gone */ AST_CAUSE_NUMBER_CHANGED, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(411, /* Length required */ AST_CAUSE_INTERWORKING, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(413, /* Request entity too large */ AST_CAUSE_INTERWORKING, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(414, /* Request URI too large */ AST_CAUSE_INTERWORKING, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(415, /* Unsupported media type */ AST_CAUSE_INTERWORKING, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(420, /* Bad extension */ AST_CAUSE_NO_ROUTE_DESTINATION, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(480, /* No answer */ AST_CAUSE_NO_ANSWER, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(481, /* No answer */ AST_CAUSE_INTERWORKING, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(482, /* Loop detected */ AST_CAUSE_INTERWORKING, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(483, /* Too many hops */ AST_CAUSE_NO_ANSWER, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(484, /* Address incomplete */ AST_CAUSE_INVALID_NUMBER_FORMAT, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(485, /* Ambiguous */ AST_CAUSE_UNALLOCATED, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(486, /* Busy everywhere */ AST_CAUSE_BUSY, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(487, /* Request terminated */ AST_CAUSE_INTERWORKING, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(488, /* No codecs approved */ AST_CAUSE_BEARERCAPABILITY_NOTAVAIL, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(491, /* Request pending */ AST_CAUSE_INTERWORKING, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(493, /* Undecipherable */ AST_CAUSE_INTERWORKING, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(500, /* Server internal failure */ AST_CAUSE_FAILURE, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(501, /* Call rejected */ AST_CAUSE_FACILITY_REJECTED, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(502, AST_CAUSE_DESTINATION_OUT_OF_ORDER, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(503, /* Service unavailable */ AST_CAUSE_CONGESTION, "", 0, sip2causelookup.table);
+ sip2causelookup.table = newsip2cause(504, /* Gateway timeout */ AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE, "", 0, sip2causelookup.table);
[... 1146 lines stripped ...]
More information about the asterisk-commits
mailing list