[svn-commits] qwell: branch qwell/system_registry r393802 - in /team/qwell/system_registry:...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Jul 8 09:34:32 CDT 2013


Author: qwell
Date: Mon Jul  8 09:34:21 2013
New Revision: 393802

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=393802
Log:
Multiple revisions 393740,393749,393757,393768,393777,393785,393793,393801

........
  r393740 | mjordan | 2013-07-05 12:33:33 -0500 (Fri, 05 Jul 2013) | 44 lines
  
  Refactor RTCP events over to Stasis; associate with channels
  
  This patch does the following:
  
  * It merges Jaco Kroon's patch from ASTERISK-20754, which provides channel
    information in the RTCP events. Because Stasis provides a cache, Jaco's
    patch was modified to pass the channel uniqueid to the RTP layer as
    opposed to a pointer to the channel. This has the following benefits:
    (1) It keeps the RTP engine 'clean' of references back to channels
    (2) It prevents circular dependencies and other potential ref counting issues
  * The RTP engine now allows any RTP implementation to raise RTCP messages.
    Potentially, other implementations (such as res_rtp_multicast) could also
    raise RTCP information. The engine provides structs to represent RTCP headers
    and RTCP SR/RR reports.
  * Some general refactoring in res_rtp_asterisk was done to try and tame the
    RTCP code. It isn't perfect - that's *way* beyond the scope of this work -
    but it does feel marginally better.
  * A few random bugs were fixed in the RTCP statistics. (Example: performing an
    assignment of a = a is probably not correct)
  * We now raise RTCP events for each SR/RR sent/received. Previously we wouldn't
    raise an event when we sent a RR report.
  
  Note that this work will be of use to others who want to monitor call quality
  or build modules that report call quality statistics. Since the events are now
  moving across the Stasis message bus, this is far easier to accomplish. It is
  also a first step (though by no means the last step) towards getting Olle's
  pinefrog work incorporated.
  
  Again: note that the patch by Jaco Kroon was modified slightly for this work;
  however, he did all of the hard work in finding the right places to set the
  channel in the RTP engine across the channel drivers. Much thanks goes to Jaco
  for his hard work here.
  
  Review: https://reviewboard.asterisk.org/r/2603/
  
  (closes issue ASTERISK-20574)
  Reported by: Jaco Kroon
  patches:
    asterisk-rtcp-channel.patch uploaded by jkroon (License 5671)
  
  (closes issue ASTERISK-21471)
  Reported by: Matt Jordan
........
  r393749 | dlee | 2013-07-05 14:15:27 -0500 (Fri, 05 Jul 2013) | 1 line
  
  Document MissingParams error message for /ari/events
........
  r393757 | dlee | 2013-07-05 14:56:50 -0500 (Fri, 05 Jul 2013) | 1 line
  
  Print error details when set nonblock fails
........
  r393768 | dlee | 2013-07-05 17:08:27 -0500 (Fri, 05 Jul 2013) | 1 line
  
  ARI: return a 503 if Asterisk isn't fully booted
........
  r393777 | mjordan | 2013-07-07 15:34:38 -0500 (Sun, 07 Jul 2013) | 21 lines
  
  Handle hangup logic in the Stasis message bus and consumers of Stasis messages
  
  This patch does the following:
  * It adds a new soft hangup flag AST_SOFTHANGUP_HANGUP_EXEC that is set when a
    channel is executing dialplan hangup logic, i.e., the 'h' extension or a
    hangup handler. Stasis messages now also convey the soft hangup flag so
    consumers of the messages can know when a channel is executing said
    hangup logic.
  * It adds a new channel flag, AST_FLAG_DEAD, which is set when a channel is
    well and truly dead. Not just a zombie, but dead, Jim. Manager, CEL, CDRs,
    and other consumers of Stasis have been updated to look for this flag to
    know when the channel should by lying six feet under.
  * The CDR engine has been updated to better handle a channel entering and
    leaving a bridge. Previously, a new CDR was automatically created when a
    channel left a bridge and put into the 'Pending' state; however, this
    way of handling CDRs made it difficult for the 'endbeforehexten' logic to
    work correctly - there was always a new CDR waiting in the hangup logic
    and, even if 'ended', wouldn't be the CDR people wanted to inspect in the
    hangup routine. This patch completely removes the Pending state and instead
    defers creation of the new CDR until it gets a new message that requires
    a new CDR.
........
  r393785 | mjordan | 2013-07-07 16:29:40 -0500 (Sun, 07 Jul 2013) | 11 lines
  
  In a channel destructor dispose of items that raise Stasis message properly
  
  This patch reorders certain actions that may raise Stasis messages in the
  channel destructor such that they occur before the Stasis cache is cleared.
  Once the Stasis cache is cleared, its rather a bad idea to be trying to
  publish information about a channel.
  
  (closes issue ASTERISK-22001)
  Reported by: Jonathan Rose
........
  r393793 | mmichelson | 2013-07-08 08:57:28 -0500 (Mon, 08 Jul 2013) | 8 lines
  
  Fix some broken logic in sending outbound caller ID.
  
  * trust_id_outbound was required even when the caller ID was not marked
  private. This is against intentions and documentation.
  * We now check both name and number privacy instead of checking name privacy
  twice.
........
  r393801 | mjordan | 2013-07-08 09:26:40 -0500 (Mon, 08 Jul 2013) | 21 lines
  
  Create Local channel messages on the Stasis message bus and produce AMI events
  
  This patch does the following:
  
  * It adds a virtual table of callbacks to core_unreal. These callbacks can be
    supplied by concrete implementations of "unreal" channel drivers, which lets
    the unreal channel driver call specific functionality when it performs some
    action. Currently, this is done to notify implementations when an
    optimization operation has begun, and when an optimization operation has
    succeeded.
  
  * It adds Stasis-Core messages for Local channel bridging and Local channel
    optimization. Local channel optimization is now two events: a Begin and an
    End. Some consumers of Stasis-Core may want to know when an operation is
    beginning so that they can 'prepare' their information; others will be more
    concerned about when the operation has completed, so that they can 'fix up'
    information. Stasis-Core allows for both, as does AMI.
  
  Review: https://reviewboard.asterisk.org/r/2552
........

Merged revisions 393740,393749,393757,393768,393777,393785,393793,393801 from http://svn.asterisk.org/svn/asterisk/trunk

Modified:
    team/qwell/system_registry/   (props changed)
    team/qwell/system_registry/CHANGES
    team/qwell/system_registry/channels/chan_gtalk.c
    team/qwell/system_registry/channels/chan_gulp.c
    team/qwell/system_registry/channels/chan_h323.c
    team/qwell/system_registry/channels/chan_jingle.c
    team/qwell/system_registry/channels/chan_mgcp.c
    team/qwell/system_registry/channels/chan_motif.c
    team/qwell/system_registry/channels/chan_multicast_rtp.c
    team/qwell/system_registry/channels/chan_sip.c
    team/qwell/system_registry/channels/chan_skinny.c
    team/qwell/system_registry/channels/chan_unistim.c
    team/qwell/system_registry/include/asterisk/bridging.h
    team/qwell/system_registry/include/asterisk/cdr.h
    team/qwell/system_registry/include/asterisk/channel.h
    team/qwell/system_registry/include/asterisk/core_local.h
    team/qwell/system_registry/include/asterisk/core_unreal.h
    team/qwell/system_registry/include/asterisk/json.h
    team/qwell/system_registry/include/asterisk/rtp_engine.h
    team/qwell/system_registry/include/asterisk/stasis_channels.h
    team/qwell/system_registry/main/asterisk.c
    team/qwell/system_registry/main/bridging.c
    team/qwell/system_registry/main/cdr.c
    team/qwell/system_registry/main/cel.c
    team/qwell/system_registry/main/channel.c
    team/qwell/system_registry/main/channel_internal_api.c
    team/qwell/system_registry/main/core_local.c
    team/qwell/system_registry/main/core_unreal.c
    team/qwell/system_registry/main/json.c
    team/qwell/system_registry/main/manager.c
    team/qwell/system_registry/main/manager_channels.c
    team/qwell/system_registry/main/pbx.c
    team/qwell/system_registry/main/rtp_engine.c
    team/qwell/system_registry/main/stasis_channels.c
    team/qwell/system_registry/res/res_rtp_asterisk.c
    team/qwell/system_registry/res/res_sip_caller_id.c
    team/qwell/system_registry/res/res_stasis_http.c
    team/qwell/system_registry/res/res_stasis_http_events.c
    team/qwell/system_registry/res/stasis_http/ari_model_validators.c
    team/qwell/system_registry/res/stasis_http/ari_model_validators.h
    team/qwell/system_registry/res/stasis_http/ari_websockets.c
    team/qwell/system_registry/res/stasis_http/resource_events.c
    team/qwell/system_registry/rest-api/api-docs/events.json

Propchange: team/qwell/system_registry/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Mon Jul  8 09:34:21 2013
@@ -1,1 +1,1 @@
-/trunk:1-393732
+/trunk:1-393801

Modified: team/qwell/system_registry/CHANGES
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/CHANGES?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/CHANGES (original)
+++ team/qwell/system_registry/CHANGES Mon Jul  8 09:34:21 2013
@@ -270,6 +270,17 @@
 
  * AMI events now contain a SystemName field, if available.
 
+ * Local channel optimization is now conveyed in two events:
+   LocalOptimizationBegin and LocalOptimizationEnd. The Begin event is sent
+   when the Local channel driver begins attempting to optimize itself out of
+   the media path; the End event is sent after the channel halves have
+   successfully optimized themselves out of the media path.
+
+ * Local channel information in events is now prefixed with "LocalOne" and
+   "LocalTwo". This replaces the suffix of "1" and "2" for the two halves of
+   the Local channel. This affects the LocalBridge, LocalOptimizationBegin,
+   and LocalOptimizationEnd events.
+
 AGI (Asterisk Gateway Interface)
 ------------------
  * The manager event AGIExec has been split into AGIExecStart and AGIExecEnd.
@@ -286,8 +297,11 @@
  * CDRs will now be created between all participants in a bridge. For each
    pair of channels in a bridge, a CDR is created to represent the path of
    communication between those two endpoints. This lets an end user choose who
-   to bill for what during multi-party bridges or bridge operations during
-   transfer scenarios.
+   to bill for what during bridge operations with multiple parties.
+
+ * The duration, billsec, start, answer, and end times now reflect the times
+   associated with the current CDR for the channel, as opposed to a cumulative
+   measurement of all CDRs for that channel.
 
  * When a CDR is dispatched, user defined CDR variables from both parties are
    included in the resulting CDR. If both parties have the same variable, only

Modified: team/qwell/system_registry/channels/chan_gtalk.c
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/channels/chan_gtalk.c?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/channels/chan_gtalk.c (original)
+++ team/qwell/system_registry/channels/chan_gtalk.c Mon Jul  8 09:34:21 2013
@@ -210,6 +210,7 @@
 static int gtalk_update_externip(void);
 static int gtalk_parser(void *data, ikspak *pak);
 static int gtalk_create_candidates(struct gtalk *client, struct gtalk_pvt *p, char *sid, char *from, char *to);
+static void gtalk_set_owner(struct gtalk_pvt *p, struct ast_channel *chan);
 
 /*! \brief PBX interface structure for channel registration */
 static struct ast_channel_tech gtalk_tech = {
@@ -1007,6 +1008,17 @@
 	return 1;
 }
 
+static void gtalk_set_owner(struct gtalk_pvt *p, struct ast_channel *chan)
+{
+	p->owner = chan;
+	if (p->rtp) {
+		ast_rtp_instance_set_channel_id(p->rtp, chan ? ast_channel_uniqueid(chan) : "");
+	}
+	if (p->vrtp) {
+		ast_rtp_instance_set_channel_id(p->vrtp, chan ? ast_channel_uniqueid(chan) : "");
+	}
+}
+
 static struct gtalk_pvt *gtalk_alloc(struct gtalk *client, const char *us, const char *them, const char *sid)
 {
 	struct gtalk_pvt *tmp = NULL;
@@ -1198,7 +1210,7 @@
 		ast_channel_musicclass_set(tmp, client->musicclass);
 	if (!ast_strlen_zero(client->parkinglot))
 		ast_channel_parkinglot_set(tmp, client->parkinglot);
-	i->owner = tmp;
+	gtalk_set_owner(i, tmp);
 	ast_module_ref(ast_module_info->self);
 	ast_channel_context_set(tmp, client->context);
 	ast_channel_exten_set(tmp, i->exten);
@@ -1712,8 +1724,9 @@
 		ast_mutex_unlock(&p->lock);
 		return -1;
 	}
-	if (p->owner == oldchan)
-		p->owner = newchan;
+	if (p->owner == oldchan) {
+		gtalk_set_owner(p, newchan);
+	}
 	ast_mutex_unlock(&p->lock);
 	return 0;
 }
@@ -1889,7 +1902,7 @@
 
 	ast_mutex_lock(&p->lock);
 	client = p->parent;
-	p->owner = NULL;
+	gtalk_set_owner(p, NULL);
 	ast_channel_tech_pvt_set(ast, NULL);
 	if (!p->alreadygone) {
 		gtalk_action(client, p, "terminate");

Modified: team/qwell/system_registry/channels/chan_gulp.c
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/channels/chan_gulp.c?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/channels/chan_gulp.c (original)
+++ team/qwell/system_registry/channels/chan_gulp.c Mon Jul  8 09:34:21 2013
@@ -429,7 +429,7 @@
 {
 	RAII_VAR(struct ast_datastore *, datastore, NULL, ao2_cleanup);
 
-	if (session->endpoint->direct_media_glare_mitigation == 
+	if (session->endpoint->direct_media_glare_mitigation ==
 			AST_SIP_DIRECT_MEDIA_GLARE_MITIGATION_NONE) {
 		return 0;
 	}
@@ -563,6 +563,13 @@
 	pvt->media[SIP_MEDIA_AUDIO] = ao2_find(session->media, "audio", OBJ_KEY);
 	pvt->media[SIP_MEDIA_VIDEO] = ao2_find(session->media, "video", OBJ_KEY);
 	ast_channel_tech_pvt_set(chan, pvt);
+	if (pvt->media[SIP_MEDIA_AUDIO] && pvt->media[SIP_MEDIA_AUDIO]->rtp) {
+		ast_rtp_instance_set_channel_id(pvt->media[SIP_MEDIA_AUDIO]->rtp, ast_channel_uniqueid(chan));
+	}
+	if (pvt->media[SIP_MEDIA_VIDEO] && pvt->media[SIP_MEDIA_VIDEO]->rtp) {
+		ast_rtp_instance_set_channel_id(pvt->media[SIP_MEDIA_VIDEO]->rtp, ast_channel_uniqueid(chan));
+	}
+
 
 	if (ast_format_cap_is_empty(session->req_caps) || !ast_format_cap_has_joint(session->req_caps, session->endpoint->codecs)) {
 		ast_format_cap_copy(ast_channel_nativeformats(chan), session->endpoint->codecs);
@@ -742,8 +749,15 @@
 static int fixup(void *data)
 {
 	struct fixup_data *fix_data = data;
+	struct gulp_pvt *pvt = ast_channel_tech_pvt(fix_data->chan);
 
 	fix_data->session->channel = fix_data->chan;
+	if (pvt->media[SIP_MEDIA_AUDIO] && pvt->media[SIP_MEDIA_AUDIO]->rtp) {
+		ast_rtp_instance_set_channel_id(pvt->media[SIP_MEDIA_AUDIO]->rtp, ast_channel_uniqueid(fix_data->chan));
+	}
+	if (pvt->media[SIP_MEDIA_VIDEO] && pvt->media[SIP_MEDIA_VIDEO]->rtp) {
+		ast_rtp_instance_set_channel_id(pvt->media[SIP_MEDIA_VIDEO]->rtp, ast_channel_uniqueid(fix_data->chan));
+	}
 
 	return 0;
 }
@@ -1434,6 +1448,19 @@
 	return h_data;
 }
 
+/*! \brief Clear a channel from a session along with its PVT */
+static void clear_session_and_channel(struct ast_sip_session *session, struct ast_channel *ast, struct gulp_pvt *pvt)
+{
+	session->channel = NULL;
+	if (pvt->media[SIP_MEDIA_AUDIO] && pvt->media[SIP_MEDIA_AUDIO]->rtp) {
+		ast_rtp_instance_set_channel_id(pvt->media[SIP_MEDIA_AUDIO]->rtp, "");
+	}
+	if (pvt->media[SIP_MEDIA_VIDEO] && pvt->media[SIP_MEDIA_VIDEO]->rtp) {
+		ast_rtp_instance_set_channel_id(pvt->media[SIP_MEDIA_VIDEO]->rtp, "");
+	}
+	ast_channel_tech_pvt_set(ast, NULL);
+}
+
 static int hangup(void *data)
 {
 	pj_status_t status;
@@ -1453,9 +1480,7 @@
 		}
 	}
 
-	session->channel = NULL;
-	ast_channel_tech_pvt_set(ast, NULL);
-
+	clear_session_and_channel(session, ast, pvt);
 	ao2_cleanup(pvt);
 	ao2_cleanup(h_data);
 
@@ -1485,11 +1510,9 @@
 	/* Go ahead and do our cleanup of the session and channel even if we're not going
 	 * to be able to send our SIP request/response
 	 */
+	clear_session_and_channel(session, ast, pvt);
+	ao2_cleanup(pvt);
 	ao2_cleanup(h_data);
-	session->channel = NULL;
-	ast_channel_tech_pvt_set(ast, NULL);
-
-	ao2_cleanup(pvt);
 
 	return -1;
 }
@@ -1859,8 +1882,8 @@
  * Module loading including tests for configuration or dependencies.
  * This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
  * or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the 
- * configuration file or other non-critical problem return 
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
  * AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
  */
 static int load_module(void)

Modified: team/qwell/system_registry/channels/chan_h323.c
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/channels/chan_h323.c?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/channels/chan_h323.c (original)
+++ team/qwell/system_registry/channels/chan_h323.c Mon Jul  8 09:34:21 2013
@@ -250,6 +250,8 @@
 static void delete_aliases(void);
 static void prune_peers(void);
 
+static void oh323_set_owner(struct oh323_pvt *pvt, struct ast_channel *c);
+
 static struct ast_channel *oh323_request(const char *type, struct ast_format_cap *cap, const struct ast_channel *requestor, const char *dest, int *cause);
 static int oh323_digit_begin(struct ast_channel *c, char digit);
 static int oh323_digit_end(struct ast_channel *c, char digit, unsigned int duration);
@@ -719,7 +721,7 @@
 		return 0;
 	}
 
-	pvt->owner = NULL;
+	oh323_set_owner(pvt, NULL);
 	ast_channel_tech_pvt_set(c, NULL);
 
 	if (ast_channel_hangupcause(c)) {
@@ -974,7 +976,7 @@
 		ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, pvt->owner);
 		return -1;
 	}
-	pvt->owner = newchan;
+	oh323_set_owner(p, newchan);
 	ast_mutex_unlock(&pvt->lock);
 	return 0;
 }
@@ -1007,6 +1009,7 @@
 		ast_debug(1, "Created RTP channel\n");
 
 	ast_rtp_instance_set_qos(pvt->rtp, tos, cos, "H323 RTP");
+	ast_rtp_instance_set_channel_id(pvt->rtp, pvt->owner ? ast_channel_uniqueid(pvt->owner), "");
 
 	if (h323debug)
 		ast_debug(1, "Setting NAT on RTP to %d\n", pvt->options.nat);
@@ -1100,7 +1103,7 @@
 		/* Register channel functions. */
 		ast_channel_tech_pvt_set(ch, pvt);
 		/* Set the owner of this channel */
-		pvt->owner = ch;
+		oh323_set_owner(pvt, ch);
 
 		ast_channel_context_set(ch, pvt->context);
 		ast_channel_exten_set(ch, pvt->exten);
@@ -1187,6 +1190,14 @@
 	iflist = pvt;
 	ast_mutex_unlock(&iflock);
 	return pvt;
+}
+
+static void oh323_set_owner(struct oh323_pvt *pvt, struct ast_channel *chan)
+{
+	pvt->owner = chan;
+	if (pvt->rtp) {
+		ast_rtp_instance_set_channel_id(pvt, chan ? ast_channel_uniqueid(chan) : "");
+	}
 }
 
 static struct oh323_pvt *find_call_locked(int call_reference, const char *token)

Modified: team/qwell/system_registry/channels/chan_jingle.c
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/channels/chan_jingle.c?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/channels/chan_jingle.c (original)
+++ team/qwell/system_registry/channels/chan_jingle.c Mon Jul  8 09:34:21 2013
@@ -196,6 +196,7 @@
 static struct jingle_pvt *jingle_alloc(struct jingle *client, const char *from, const char *sid);
 static char *jingle_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
 static char *jingle_do_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
+static void jingle_set_owner(struct jingle_pvt *pvt, struct ast_channel *chan);
 
 /*! \brief PBX interface structure for channel registration */
 static struct ast_channel_tech jingle_tech = {
@@ -833,6 +834,17 @@
 	return tmp;
 }
 
+static void jingle_set_owner(struct jingle_pvt *pvt, struct ast_channel *chan)
+{
+	pvt->owner = chan;
+	if (pvt->rtp) {
+		ast_rtp_instance_set_channel_id(pvt->rtp, pvt->owner ? ast_channel_uniqueid(pvt->owner) : "");
+	}
+	if (pvt->vrtp) {
+		ast_rtp_instance_set_channel_id(pvt->vrtp, pvt->owner ? ast_channel_uniqueid(pvt->owner) : "");
+	}
+}
+
 /*! \brief Start new jingle channel */
 static struct ast_channel *jingle_new(struct jingle *client, struct jingle_pvt *i, int state, const char *title, const char *linkedid)
 {
@@ -908,7 +920,7 @@
 		ast_channel_language_set(tmp, client->language);
 	if (!ast_strlen_zero(client->musicclass))
 		ast_channel_musicclass_set(tmp, client->musicclass);
-	i->owner = tmp;
+	jingle_set_owner(i, tmp);
 	ast_channel_context_set(tmp, client->context);
 	ast_channel_exten_set(tmp, i->exten);
 	/* Don't use ast_set_callerid() here because it will
@@ -1321,8 +1333,9 @@
 		ast_mutex_unlock(&p->lock);
 		return -1;
 	}
-	if (p->owner == oldchan)
-		p->owner = newchan;
+	if (p->owner == oldchan) {
+		jingle_set_owner(p, newchan);
+	}
 	ast_mutex_unlock(&p->lock);
 	return 0;
 }
@@ -1540,7 +1553,7 @@
 
 	ast_mutex_lock(&p->lock);
 	client = p->parent;
-	p->owner = NULL;
+	jingle_set_owner(p, NULL);
 	ast_channel_tech_pvt_set(ast, NULL);
 	if (!p->alreadygone)
 		jingle_action(client, p, JINGLE_TERMINATE);

Modified: team/qwell/system_registry/channels/chan_mgcp.c
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/channels/chan_mgcp.c?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/channels/chan_mgcp.c (original)
+++ team/qwell/system_registry/channels/chan_mgcp.c Mon Jul  8 09:34:21 2013
@@ -431,6 +431,7 @@
 
 static struct sockaddr_in bindaddr;
 
+static void mgcp_set_owner(struct mgcp_subchannel *sub, struct ast_channel *chan);
 static struct ast_frame  *mgcp_read(struct ast_channel *ast);
 static int transmit_response(struct mgcp_subchannel *sub, char *msg, struct mgcp_request *req, char *msgrest);
 static int transmit_notify_request(struct mgcp_subchannel *sub, char *tone);
@@ -528,7 +529,7 @@
 	}
 	ast_debug(1, "Released sub %d of channel %s@%s\n", sub->id, p->name, p->parent->name);
 
-	sub->owner = NULL;
+	mgcp_set_owner(sub, NULL);
 	if (!ast_strlen_zero(sub->cxident)) {
 		transmit_connection_del(sub);
 	}
@@ -945,7 +946,7 @@
 		}
 	}
 
-	sub->owner = NULL;
+	mgcp_set_owner(sub, NULL);
 
 	/* for deleting gate */
 	if (p->pktcgatealloc && sub->gate) {
@@ -1225,6 +1226,13 @@
 	return f;
 }
 
+static void mgcp_set_owner(struct mgcp_subchannel *sub, struct ast_channel *chan)
+{
+	sub->owner = chan;
+	if (sub->rtp) {
+		ast_rtp_instance_set_channel_id(sub->rtp, sub->owner ? ast_channel_uniqueid(chan) : "");
+	}
+}
 
 static struct ast_frame *mgcp_read(struct ast_channel *ast)
 {
@@ -1288,7 +1296,7 @@
 		ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, sub->owner);
 		return -1;
 	}
-	sub->owner = newchan;
+	mgcp_set_owner(sub, newchan);
 	ast_mutex_unlock(&sub->lock);
 	return 0;
 }
@@ -1529,7 +1537,7 @@
 			ast_channel_accountcode_set(tmp, i->accountcode);
 		if (i->amaflags)
 			ast_channel_amaflags_set(tmp, i->amaflags);
-		sub->owner = tmp;
+		mgcp_set_owner(sub, tmp);
 		ast_module_ref(ast_module_info->self);
 		ast_channel_callgroup_set(tmp, i->callgroup);
 		ast_channel_pickupgroup_set(tmp, i->pickupgroup);

Modified: team/qwell/system_registry/channels/chan_motif.c
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/channels/chan_motif.c?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/channels/chan_motif.c (original)
+++ team/qwell/system_registry/channels/chan_motif.c Mon Jul  8 09:34:21 2013
@@ -656,6 +656,18 @@
 	.update_peer = jingle_set_rtp_peer,
 };
 
+/*! \brief Set the channel owner on the \ref jingle_session object and related objects */
+static void jingle_set_owner(struct jingle_session *session, struct ast_channel *chan)
+{
+	session->owner = chan;
+	if (session->rtp) {
+		ast_rtp_instance_set_channel_id(session->rtp, session->owner ? ast_channel_uniqueid(session->owner) : "");
+	}
+	if (session->vrtp) {
+		ast_rtp_instance_set_channel_id(session->vrtp, session->owner ? ast_channel_uniqueid(session->owner) : "");
+	}
+}
+
 /*! \brief Internal helper function which enables video support on a sesson if possible */
 static void jingle_enable_video(struct jingle_session *session)
 {
@@ -679,7 +691,7 @@
 	}
 
 	ast_rtp_instance_set_prop(session->vrtp, AST_RTP_PROPERTY_RTCP, 1);
-
+	ast_rtp_instance_set_channel_id(session->vrtp, ast_channel_uniqueid(session->owner));
 	ast_channel_set_fd(session->owner, 2, ast_rtp_instance_fd(session->vrtp, 0));
 	ast_channel_set_fd(session->owner, 3, ast_rtp_instance_fd(session->vrtp, 1));
 	ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(session->vrtp), session->vrtp, &session->prefs);
@@ -775,7 +787,7 @@
 
 	ast_channel_tech_set(chan, &jingle_tech);
 	ast_channel_tech_pvt_set(chan, session);
-	session->owner = chan;
+	jingle_set_owner(session, chan);
 
 	ast_channel_callid_set(chan, session->callid);
 
@@ -1712,7 +1724,7 @@
 
 	ao2_lock(session);
 
-	session->owner = newchan;
+	jingle_set_owner(session, newchan);
 
 	ao2_unlock(session);
 
@@ -1862,7 +1874,7 @@
 	}
 
 	ast_channel_tech_pvt_set(ast, NULL);
-	session->owner = NULL;
+	jingle_set_owner(session, NULL);
 
 	ao2_unlink(session->state->sessions, session);
 	ao2_ref(session->state, -1);

Modified: team/qwell/system_registry/channels/chan_multicast_rtp.c
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/channels/chan_multicast_rtp.c?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/channels/chan_multicast_rtp.c (original)
+++ team/qwell/system_registry/channels/chan_multicast_rtp.c Mon Jul  8 09:34:21 2013
@@ -153,7 +153,7 @@
 		ast_rtp_instance_destroy(instance);
 		goto failure;
 	}
-
+	ast_rtp_instance_set_channel_id(instance, ast_channel_uniqueid(chan));
 	ast_rtp_instance_set_remote_address(instance, &destination_address);
 
 	ast_channel_tech_set(chan, &multicast_rtp_tech);

Modified: team/qwell/system_registry/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/channels/chan_sip.c?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/channels/chan_sip.c (original)
+++ team/qwell/system_registry/channels/chan_sip.c Mon Jul  8 09:34:21 2013
@@ -1242,6 +1242,7 @@
 static int get_sip_pvt_from_replaces(const char *callid, const char *totag, const char *fromtag,
 		struct sip_pvt **out_pvt, struct ast_channel **out_chan);
 static void check_pendings(struct sip_pvt *p);
+static void sip_set_owner(struct sip_pvt *p, struct ast_channel *chan);
 
 static void *sip_pickup_thread(void *stuff);
 static int sip_pickup(struct ast_channel *chan);
@@ -3496,7 +3497,7 @@
 		ast_channel_tech_pvt_set(owner, dialog_unref(ast_channel_tech_pvt(owner), "resetting channel dialog ptr in unlink_all"));
 		ast_channel_unlock(owner);
 		ast_channel_unref(owner);
-		dialog->owner = NULL;
+		sip_set_owner(dialog, NULL);
 	}
 	sip_pvt_unlock(dialog);
 
@@ -7185,7 +7186,7 @@
 		ast_clear_flag(&p->flags[0], SIP_DEFER_BYE_ON_TRANSFER);	/* Really hang up next time */
 		ast_channel_tech_pvt_set(p->owner, dialog_unref(ast_channel_tech_pvt(p->owner), "unref p->owner->tech_pvt"));
 		sip_pvt_lock(p);
-		p->owner = NULL;  /* Owner will be gone after we return, so take it away */
+		sip_set_owner(p, NULL); /* Owner will be gone after we return, so take it away */
 		sip_pvt_unlock(p);
 		ast_module_unref(ast_module_info->self);
 		return 0;
@@ -7220,7 +7221,7 @@
 	/* Disconnect */
 	disable_dsp_detect(p);
 
-	p->owner = NULL;
+	sip_set_owner(p, NULL);
 	ast_channel_tech_pvt_set(ast, dialog_unref(ast_channel_tech_pvt(ast), "unref ast->tech_pvt"));
 
 	ast_module_unref(ast_module_info->self);
@@ -7546,7 +7547,7 @@
 	if (p->owner != oldchan)
 		ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
 	else {
-		p->owner = newchan;
+		sip_set_owner(p, newchan);
 		/* Re-invite RTP back to Asterisk. Needed if channel is masqueraded out of a native
 		   RTP bridge (i.e., RTP not going through Asterisk): RTP bridge code might not be
 		   able to do this if the masquerade happens before the bridge breaks (e.g., AMI
@@ -8192,7 +8193,7 @@
 		}
 		ast_channel_zone_set(tmp, zone);
 	}
-	i->owner = tmp;
+	sip_set_owner(i, tmp);
 	ast_module_ref(ast_module_info->self);
 	ast_channel_context_set(tmp, i->context);
 	/*Since it is valid to have extensions in the dialplan that have unescaped characters in them
@@ -9252,6 +9253,21 @@
 
 	/* If owner exists, it is locked and reffed */
 	return pvt->owner;
+}
+
+/*! \brief Set the owning channel on the \ref sip_pvt object */
+static void sip_set_owner(struct sip_pvt *p, struct ast_channel *chan)
+{
+	p->owner = chan;
+	if (p->rtp) {
+		ast_rtp_instance_set_channel_id(p->rtp, p->owner ? ast_channel_uniqueid(p->owner) : "");
+	}
+	if (p->vrtp) {
+		ast_rtp_instance_set_channel_id(p->vrtp, p->owner ? ast_channel_uniqueid(p->owner) : "");
+	}
+	if (p->trtp) {
+		ast_rtp_instance_set_channel_id(p->trtp, p->owner ? ast_channel_uniqueid(p->owner) : "");
+	}
 }
 
 /*! \brief find or create a dialog structure for an incoming SIP message.

Modified: team/qwell/system_registry/channels/chan_skinny.c
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/channels/chan_skinny.c?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/channels/chan_skinny.c (original)
+++ team/qwell/system_registry/channels/chan_skinny.c Mon Jul  8 09:34:21 2013
@@ -1638,6 +1638,7 @@
 static int skinny_dialer_cb(const void *data);
 static int skinny_reload(void);
 
+static void skinny_set_owner(struct skinny_subchannel* sub, struct ast_channel* chan);
 static void setsubstate(struct skinny_subchannel *sub, int state);
 static void dumpsub(struct skinny_subchannel *sub, int forcehangup);
 static void activatesub(struct skinny_subchannel *sub, int state);
@@ -4797,10 +4798,12 @@
 	}
 
 	if (sub->rtp && sub->owner) {
+		ast_rtp_instance_set_channel_id(sub->rtp, ast_channel_uniqueid(sub->owner));
 		ast_channel_set_fd(sub->owner, 0, ast_rtp_instance_fd(sub->rtp, 0));
 		ast_channel_set_fd(sub->owner, 1, ast_rtp_instance_fd(sub->rtp, 1));
 	}
 	if (hasvideo && sub->vrtp && sub->owner) {
+		ast_rtp_instance_set_channel_id(sub->vrtp, ast_channel_uniqueid(sub->owner));
 		ast_channel_set_fd(sub->owner, 2, ast_rtp_instance_fd(sub->vrtp, 0));
 		ast_channel_set_fd(sub->owner, 3, ast_rtp_instance_fd(sub->vrtp, 1));
 	}
@@ -5009,7 +5012,7 @@
 	SKINNY_DEBUG(DEBUG_SUB, 3, "Sub %d - Destroying\n", sub->callid);
 
 	ast_mutex_lock(&sub->lock);
-	sub->owner = NULL;
+	skinny_set_owner(sub, NULL);
 	ast_channel_tech_pvt_set(ast, NULL);
 	destroy_rtp(sub);
 	ast_free(sub->origtonum);
@@ -5133,7 +5136,7 @@
 		ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, sub->owner);
 		return -1;
 	}
-	sub->owner = newchan;
+	skinny_set_owner(sub, newchan);
 	return 0;
 }
 
@@ -5361,6 +5364,17 @@
 	return 0;
 }
 
+static void skinny_set_owner(struct skinny_subchannel* sub, struct ast_channel* chan)
+{
+	sub->owner = chan;
+	if (sub->rtp) {
+		ast_rtp_instance_set_channel_id(sub->rtp, sub->owner ? ast_channel_uniqueid(sub->owner) : "");
+	}
+	if (sub->vrtp) {
+		ast_rtp_instance_set_channel_id(sub->vrtp, sub->owner ? ast_channel_uniqueid(sub->owner) : "");
+	}
+}
+
 static struct ast_channel *skinny_new(struct skinny_line *l, struct skinny_subline *subline, int state, const char *linkedid, int direction)
 {
 	struct ast_channel *tmp;
@@ -5386,7 +5400,7 @@
 		} else {
 			ast_mutex_init(&sub->lock);
 
-			sub->owner = tmp;
+			skinny_set_owner(sub, tmp);
 			sub->callid = callnums++;
 			d->lastlineinstance = l->instance;
 			d->lastcallreference = sub->callid;

Modified: team/qwell/system_registry/channels/chan_unistim.c
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/channels/chan_unistim.c?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/channels/chan_unistim.c (original)
+++ team/qwell/system_registry/channels/chan_unistim.c Mon Jul  8 09:34:21 2013
@@ -675,6 +675,7 @@
 static int reload(void);
 static int unload_module(void);
 static int reload_config(void);
+static void unistim_set_owner(struct unistim_subchannel *sub, struct ast_channel *chan);
 static void show_main_page(struct unistimsession *pte);
 static struct ast_channel *unistim_request(const char *type, struct ast_format_cap *cap, const struct ast_channel *requestor,
 	const char *dest, int *cause);
@@ -2749,6 +2750,7 @@
 		return;
 	}
 	ast_rtp_instance_set_prop(sub->rtp, AST_RTP_PROPERTY_RTCP, 1);
+	ast_rtp_instance_set_channel_id(sub->rtp, ast_channel_uniqueid(sub->owner));
 	ast_channel_internal_fd_set(sub->owner, 0, ast_rtp_instance_fd(sub->rtp, 0));
 	ast_channel_internal_fd_set(sub->owner, 1, ast_rtp_instance_fd(sub->rtp, 1));
 	ast_rtp_instance_set_qos(sub->rtp, qos.tos_audio, qos.cos_audio, "UNISTIM RTP");
@@ -4736,7 +4738,7 @@
 static int unistim_hangup_clean(struct ast_channel *ast, struct unistim_subchannel *sub) {
 	ast_mutex_lock(&sub->lock);
 	ast_channel_tech_pvt_set(ast, NULL);
-	sub->owner = NULL;
+	unistim_set_owner(sub, NULL);
 	sub->alreadygone = 0;
 	ast_mutex_unlock(&sub->lock);
 	if (sub->rtp) {
@@ -5072,7 +5074,7 @@
 		return -1;
 	}
 
-	p->owner = newchan;
+	unistim_set_owner(p, newchan);
 
 	ast_mutex_unlock(&p->lock);
 
@@ -5589,7 +5591,7 @@
 	if (!ast_strlen_zero(l->parent->language)) {
 		ast_channel_language_set(tmp, l->parent->language);
 	}
-	sub->owner = tmp;
+	unistim_set_owner(sub, tmp);
 	ast_update_use_count();
 	ast_channel_callgroup_set(tmp, l->callgroup);
 	ast_channel_pickupgroup_set(tmp, l->pickupgroup);
@@ -5621,6 +5623,14 @@
 	}
 
 	return tmp;
+}
+
+static void unistim_set_owner(struct unistim_subchannel *sub, struct ast_channel *chan)
+{
+	sub->owner = chan;
+	if (sub->rtp) {
+		ast_rtp_instance_set_channel_id(sub->rtp, sub->owner ? ast_channel_uniqueid(sub->owner) : "");
+	}
 }
 
 static void *do_monitor(void *data)

Modified: team/qwell/system_registry/include/asterisk/bridging.h
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/include/asterisk/bridging.h?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/include/asterisk/bridging.h (original)
+++ team/qwell/system_registry/include/asterisk/bridging.h Mon Jul  8 09:34:21 2013
@@ -870,19 +870,23 @@
  */
 int ast_bridge_unsuspend(struct ast_bridge *bridge, struct ast_channel *chan);
 
+struct ast_unreal_pvt;
+
 /*!
  * \brief Check and optimize out the unreal channels between bridges.
  * \since 12.0.0
  *
  * \param chan Unreal channel writing a frame into the channel driver.
  * \param peer Other unreal channel in the pair.
+ * \param pvt Private data provided by an implementation of the unreal driver that
+ * contains the callbacks that should be called when optimization begins/ends
  *
  * \note It is assumed that chan is already locked.
  *
  * \retval 0 if unreal channels were not optimized out.
  * \retval non-zero if unreal channels were optimized out.
  */
-int ast_bridge_unreal_optimized_out(struct ast_channel *chan, struct ast_channel *peer);
+int ast_bridge_unreal_optimize_out(struct ast_channel *chan, struct ast_channel *peer, struct ast_unreal_pvt *pvt);
 
 /*!
  * \brief Tells, if optimization is allowed, how the optimization would be performed

Modified: team/qwell/system_registry/include/asterisk/cdr.h
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/include/asterisk/cdr.h?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/include/asterisk/cdr.h (original)
+++ team/qwell/system_registry/include/asterisk/cdr.h Mon Jul  8 09:34:21 2013
@@ -178,7 +178,7 @@
  *
  * The following transitions can occur while in the Bridge state:
  * \li If a \ref ast_bridge_blob_type message indicating a leave is received,
- * the state transitions to the Pending state
+ * the state transitions to the Finalized state.
  *
  * \par Parked
  *
@@ -203,27 +203,7 @@
  *
  * The following transitions can occur while in the Parked state:
  * \li If a \ref ast_bridge_blob_type message indicating a leave is received,
- * the state transitions to the Pending state
- *
- * \par Pending
- *
- * After a channel leaves a bridge, we often don't know what's going to happen
- * to it. It can enter another bridge; it can be hung up; it can continue on
- * in the dialplan. It can even enter into limbo! Pending holds the state of the
- * CDR until we get a subsequent Stasis message telling us what should happen.
- *
- * The following transitions can occur while in the Pending state:
- * \li If a \ref ast_bridge_blob_type message is received, a new CDR is created
- * and it is transitioned to the Bridge state
- * \li If a \ref ast_channel_dial_type indicating a Dial Begin is received, a
- * new CDR is created and it is transitioned to the Dial state
- * \li If a \ref ast_channel_cache_update is received indicating a change in
- * Context/Extension/Priority, a new CDR is created and transitioned to the
- * Single state. If the update indicates that the party has been hung up, the
- * CDR is transitioned to the Finalized state.
- * \li If a \ref ast_bridge_blob_type message indicating an entrance to a
- * holding bridge with a subclass type of "parking" is received, the CDR is
- * transitioned to the Parked state.
+ * the state transitions to the Finalized state
  *
  * \par Finalized
  *
@@ -330,11 +310,10 @@
 	char peeraccount[AST_MAX_ACCOUNT_CODE];
 	/*! flags */
 	unsigned int flags;
-	/*! Unique Channel Identifier
-	 * 150 = 127 (max systemname) + "-" + 10 (epoch timestamp) + "." + 10 (monotonically incrementing integer) + NULL */
-	char uniqueid[150];
+	/*! Unique Channel Identifier */
+	char uniqueid[AST_MAX_UNIQUEID];
 	/* Linked group Identifier */
-	char linkedid[32];
+	char linkedid[AST_MAX_UNIQUEID];
 	/*! User field */
 	char userfield[AST_MAX_USER_FIELD];
 	/*! Sequence field */

Modified: team/qwell/system_registry/include/asterisk/channel.h
URL: http://svnview.digium.com/svn/asterisk/team/qwell/system_registry/include/asterisk/channel.h?view=diff&rev=393802&r1=393801&r2=393802
==============================================================================
--- team/qwell/system_registry/include/asterisk/channel.h (original)
+++ team/qwell/system_registry/include/asterisk/channel.h Mon Jul  8 09:34:21 2013
@@ -133,6 +133,12 @@
 
 #define AST_MAX_EXTENSION       80  /*!< Max length of an extension */
 #define AST_MAX_CONTEXT         80  /*!< Max length of a context */
+#define AST_MAX_UNIQUEID       150  /*!< Max length of a channel uniqueid */
+/*                                   150 = 127 (max systemname) + "-" + 10 (epoch
+ *                                   timestamp) + "." + 10 (monotonically incrementing
+ *                                   integer) + NULL. Note that if this value is ever
+ *                                   changed, MAX_CHANNEL_ID should be updated in

[... 5280 lines stripped ...]



More information about the svn-commits mailing list