<html>
<head>
<base href="https://wiki.asterisk.org/wiki">
<link rel="stylesheet" href="/wiki/s/en/2176/25/9/_/styles/combined.css?spaceKey=AST&forWysiwyg=true" type="text/css">
</head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
<h2><a href="https://wiki.asterisk.org/wiki/display/AST/Asterisk+12+Bridging+Project">Asterisk 12 Bridging Project</a></h2>
<h4>Page <b>edited</b> by <a href="https://wiki.asterisk.org/wiki/display/~mjordan">Matt Jordan</a>
</h4>
<br/>
<h4>Changes (2)</h4>
<div id="page-diffs">
<table class="diff" cellpadding="0" cellspacing="0">
<tr><td class="diff-unchanged" >{note} <br></td></tr>
<tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">This page is still under construction. <br></td></tr>
<tr><td class="diff-added-lines" style="background-color: #dfd;">This page is a living document; expect missing and incomplete information. Still, feel free to discuss on [asterisk-dev|http://lists.digium.com/mailman/listinfo/asterisk-dev]. <br></td></tr>
<tr><td class="diff-unchanged" >{note} <br> <br></td></tr>
<tr><td class="diff-snipped" >...<br></td></tr>
</table>
</div> <h4>Full Content</h4>
<div class="notificationGreySide">
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>This page is a living document; expect missing and incomplete information. Still, feel free to discuss on <a href="http://lists.digium.com/mailman/listinfo/asterisk-dev" class="external-link" rel="nofollow">asterisk-dev</a>.</td></tr></table></div>
<div>
<ul>
<li><a href='#Asterisk12BridgingProject-ProjectOverview'>Project Overview</a></li>
<ul>
<li><a href='#Asterisk12BridgingProject-WhatisaMasquerade'>What is a Masquerade</a></li>
<li><a href='#Asterisk12BridgingProject-WhyBridgingUsesMasqueradesandwhatWecandoaboutit'>Why Bridging Uses Masquerades and what We can do about it</a></li>
<li><a href='#Asterisk12BridgingProject-TheFutureofMasqueradesisGrim'>The Future of Masquerades is Grim</a></li>
</ul>
<li><a href='#Asterisk12BridgingProject-RequirementsandSpecification'>Requirements and Specification</a></li>
<li><a href='#Asterisk12BridgingProject-Design'>Design</a></li>
<li><a href='#Asterisk12BridgingProject-TestPlan'>Test Plan</a></li>
<ul>
<li><a href='#Asterisk12BridgingProject-FeaturesNottoTest'>Features Not to Test</a></li>
<ul>
<li><a href='#Asterisk12BridgingProject-BridgeManagerAction%2FApplication'>Bridge Manager Action/Application</a></li>
<li><a href='#Asterisk12BridgingProject-CallPickup'>Call Pickup</a></li>
<li><a href='#Asterisk12BridgingProject-Invokingbridgesfrommultipleapplications'>Invoking bridges from multiple applications</a></li>
</ul>
<li><a href='#Asterisk12BridgingProject-Commonelementstocheckduringtests'>Common elements to check during tests</a></li>
</ul>
<li><a href='#Asterisk12BridgingProject-ProjectPlanning'>Project Planning</a></li>
<ul>
<li><a href='#Asterisk12BridgingProject-JIRAIssues'>JIRA Issues</a></li>
<li><a href='#Asterisk12BridgingProject-Contributors'>Contributors</a></li>
</ul>
<li><a href='#Asterisk12BridgingProject-ReferenceInformation'>Reference Information</a></li>
<ul>
<li><a href='#Asterisk12BridgingProject-TestReviews'>Test Reviews</a></li>
</ul>
</ul></div>
<h1><a name="Asterisk12BridgingProject-ProjectOverview"></a>Project Overview</h1>
<p>At <a href="/wiki/display/AST/AstriDevCon+2012" title="AstriDevCon 2012">AstriDevCon 2012</a>, one of the focus points of development was determined to be the <a href="/wiki/display/AST/Asterisk+12+API+Improvements" title="Asterisk 12 API Improvements">Asterisk APIs</a>. In particular, some common complaints were:</p>
<ul>
        <li>Asterisk changes the name of a channel during masquerades. As the name is used as the handle to the channel, this requires a lot of state replication by consumers of the APIs.</li>
        <li>Asterisk's APIs tend to expose internal implementation details (such as masquerades), when consumers of the APIs would rather not be aware of these details.</li>
</ul>
<p>Both of these topics often come back to the same problem: masquerades. But why are masquerades such a problem?</p>
<h2><a name="Asterisk12BridgingProject-WhatisaMasquerade"></a>What is a Masquerade</h2>
<p>A channel masquerade is a fundamental yet incredibly confusing concept in Asterisk. It exists as a way for a thread to 'take' control of a channel that happens to be on another thread. This is a critically important operation when you need to, say, move a channel from the VoiceMail application and have it start executing logic at a different place in the dialplan.</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>A comment from ast_do_masquerade</b></div><div class="codeContent panelContent">
<pre class="theme: Confluence; brush: java; gutter: false">/* XXX This operation is a bit odd. We're essentially putting the guts of
         * the clone channel into the original channel. Start by killing off the
         * original channel's backend. While the features are nice, which is the
         * reason we're keeping it, it's still awesomely weird. XXX */</pre>
</div></div>
<p>The way the operation works is to take two channels and 'swap' portions of them. In the diagram below, assume that Thread A has a channel that Thread B wants to take over. Thread B creates a new channel ("Original") and starts a Masquerade operation on the channel owned by Thread A ("Clone"). Both channels are locked, and the state of the Clone channel is moved into the Original channel, while the Clone channel obtains the Original channel's state. In order to denote that the channel is about to die, a special ZOMBIE flag is put on the channel and the name renamed to Clone<ZOMBIE>. The lock is released, and the Original channel - which now has the state associated with Clone channel - executes in Thread B, while the Clone channel (which is now quite dead) see's that its dead and goes off to silently contemplate its demise in an <tt>h</tt> extension.</p>
<table width="100%">
<tr>
<td align="left" >
<table>
<caption align="bottom">
</caption>
<tr>
<td>
<img style="border: none; width: 852px;"
usemap="#gliffy-map-22478880-9879"
src="/wiki/download/attachments/22088024/Asterisk_12_Masquerades.png?version=3&modificationDate=1360596453981"
alt=""/>
</td>
</tr>
</table>
</td>
</tr>
</table>
<p>Except, of course, that this is a dramatic simplification. It's never quite that easy.</p>
<ul>
        <li>What is a channel's state? For the purposes of the operation, we consider it to be the channel's datastores, technology, and other pertinent data - but there's plenty of data that shouldn't be transferred over. That includes things like locking primitives on the channel, file descriptors, and other resources that Thread A is probably using (and depending on). Other information - such as CDR related information - sometimes can be moved, and sometimes shouldn't.</li>
        <li>The locking picture is complicated. Thread B has no idea what Thread A is doing with the channel when it tries to get the channel lock for the Clone channel. If Thread B is holding a lock and tries to get Clone's channel lock, and Thread A is holding Clone's channel lock and needs a lock held by Thread B, a deadlock occurs.</li>
        <li>Lots of things care a lot when the name of a channel is swapped out from underneath the actual channel pointer. Channel technologies care a lot, and so there are masquerade callbacks that go into the channel technologies and notify them when a masquerade occurs. This creates another locking point, complicating the locking picture further (and causing more deadlocks).</li>
</ul>
<p>So, Masquerades are bad. But why are they used everywhere?</p>
<h2><a name="Asterisk12BridgingProject-WhyBridgingUsesMasqueradesandwhatWecandoaboutit"></a>Why Bridging Uses Masquerades and what We can do about it</h2>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Channel Farm</b><br />"All channels are created equal, but some channels are created more equal than others."</td></tr></table></div>
<p>Not all channels get an execution thread (<tt>pbx_thread</tt>) in Asterisk. In general, an inbound channel get's a thread; outbound channels do not. As a result, a two-party bridge that is created between the two channels uses the inbound channel's <tt>pbx_thread</tt> to service frames between the two channels. Regardless of the two-party bridge type in play, this is how it works in Asterisk.</p>
<p>This made sense when most bridges were two-party bridges. They probably still are, but it's very common now to have scenarios that require a lot more than a two-party bridge. Say, for example, we want to blind transfer the outbound channel to a new dialplan extension. The outbound channel has no <tt>pbx_thread</tt> - so how can we get him there?</p>
<p>Simple! We use a Masquerade. The Masquerade creates a new channel (with a <tt>pbx_thread</tt>) and swaps the guts of the outbound channel with the new channel. The new channel (with the guts of the outbound channel) starts to execute, and the old outbound channel dies.</p>
<p>You can see what happened next: everything started to use Masquerades to get around the fact that there were channels without threads. Transfers, Asynchronous Gotos, Parking, Local channel optimization... lots of things ended up needing to use Masquerades to work around the threading model.</p>
<p>Then, along came <a href="/wiki/display/AST/ConfBridge+10" title="ConfBridge 10">ConfBridge</a>.</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>We All Do</b><br />Ignore MeetMe.</td></tr></table></div>
<p>ConfBridge used a brand spiffy "new" (as in Asterisk 1.6 timeframe) Bridging API developed by Joshua Colp. A bridge becomes a first class object, and no longer a state that two channels happen to find themselves in. Channels owned by a bridge object are each given a thread. Even more interesting, the Bridging API provided an abstraction above how the media of the channels in the bridge was mixed. ConfBridge, for example, used the softmix bridging technology, suitable for multiple channels in a bridge. However, there are other bridging technologies - some optimized for managing two channels (or sets of two channels). Others - such as bridging technologies developed for special purpose applications - are possible. The Bridging API itself provides safe mechanisms to move channels between bridges, merge bridges, and generally do things without the need for masquerades.</p>
<p>As a side effect, the view from the outside world of what Asterisk is doing to channels in a bridge becomes sane.</p>
<h2><a name="Asterisk12BridgingProject-TheFutureofMasqueradesisGrim"></a>The Future of Masquerades is Grim</h2>
<p>Unfortunately, there is still one reason to use a Masquerade: when you have to steal it out of an application. This occurs in situations where an attended transfer is performed and the party starting the attended transfer does not transfer the other party into a bridge but rather into an application. So they aren't going to go away completely.</p>
<p>But, a wholesale migration to the Bridging API let's us:</p>
<ul>
        <li>Do away with Masquerades in lots of situations</li>
        <li>Optimize the hell out of two party bridging</li>
        <li>Switch between two and multi-party bridging seamlessly</li>
        <li>Present a sane model of the bridging world to the APIs</li>
</ul>
<div class='panelMacro'><table class='tipMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>A word of advice</b><br />If you're familiar with the bridging code in <tt>features.c</tt>, you probably have a good idea of how big a task this work is. When you do away with the bridging loop, lots of things break, and they aren't all obvious. CDRs break. CEL breaks. Queue Logs probably break. AMI is wonky. DTMF handling has to be tweaked significantly. Lots change.
<p>This is scary, but it's time.</p></td></tr></table></div>
<h1><a name="Asterisk12BridgingProject-RequirementsandSpecification"></a>Requirements and Specification</h1>
<p>Functionally, Bridging should remain as much the same as possible when compared with previous versions. When this is not possible, the difference should be documented.</p>
<p>The following will require specifications for Asterisk 12:</p>
<ul>
        <li>CDRs</li>
        <li>CEL</li>
        <li>Queue Log</li>
        <li>AMI (see <a href="/wiki/display/AST/AMI+1.4+Specification" title="AMI 1.4 Specification">AMI 1.4 Specification</a>)</li>
</ul>
<p>For Use Cases, see <a href="/wiki/display/AST/Asterisk+12+Bridging+Use+Cases" title="Asterisk 12 Bridging Use Cases">Bridging Use Cases</a>.</p>
<h1><a name="Asterisk12BridgingProject-Design"></a>Design</h1>
<p>Note that the diagram below is not meant to contain all functions and attributes for the objects shown, nor does it show all objects. It is meant to convey the relationships between principle objects in the Bridging Framework.</p>
<table width="100%">
<tr>
<td align="left" >
<table>
<caption align="bottom">
</caption>
<tr>
<td>
<img style="border: none; width: 1221px;"
usemap="#gliffy-map-22478886-2826"
src="/wiki/download/attachments/22088024/Bridge+API+Design.png?version=1&modificationDate=1360693588740"
alt=""/>
</td>
</tr>
</table>
</td>
</tr>
</table>
<h4><a name="Asterisk12BridgingProject-astbridge"></a>ast_bridge</h4>
<p>An <tt>ast_bridge</tt> object <b>is</b> the bridge. A bridge may have many channels in it, and the bridge object is responsible for keeping track of the state of the bridge and managing the channels. The <tt>ast_bridge_technology</tt> callbacks provide the way in which operations on the bridge and its channels are implemented for different ways of 'bridging'. For example, in a two-party bridge, the bridge technology may only have to pass frames between two channels and can simply swap the frames between two <tt>ast_bridge_channel</tt> objects. In a multi-party bridge, however, the bridge technology has to decide which <tt>ast_bridge_channel</tt> objects receive frames from what other <tt>ast_bridge_channel</tt> objects, how those frames are mixed, etc.</p>
<h4><a name="Asterisk12BridgingProject-astbridgechannel"></a>ast_bridge_channel</h4>
<p>The <tt>ast_bridge_channel</tt> object manages the thread, state, and actions executing on a channel in a bridge. There is a one to one relationship between the <tt>ast_bridge_channel</tt> object and an <tt>ast_channel</tt> object in a bridge. An <tt>ast_bridge</tt> manages channels through the <tt>ast_bridge_channel</tt> object.</p>
<h4><a name="Asterisk12BridgingProject-astbridgetechnology"></a>ast_bridge_technology</h4>
<p>The <tt>ast_bridge_technology</tt> provides the callbacks that specific bridging implementations implement. It is up to the bridging implementations to determine how frames are passed between the <tt>ast_bridge_channel</tt> objects, what Asterisk control frames are processed and how, etc.</p>
<h4><a name="Asterisk12BridgingProject-astbridgefeatures"></a>ast_bridge_features</h4>
<p>The <tt>ast_bridge_features</tt> object provides hooks that can be passed to <tt>ast_bridge_channel</tt> objects when they join that bridge. The feature hooks implement specific interception callbacks that occur on DTMF key presses, after some period of time has passed, or given some other criteria. These callbacks can affect the channels in a bridge but may also affect the entire bridge.</p>
<p>Detailed information about the Bridging Framework APIs can be seen in <a href="/wiki/display/AST/Asterisk+12+Bridging+API" title="Asterisk 12 Bridging API">Asterisk 12 Bridging API</a>.</p>
<h1><a name="Asterisk12BridgingProject-TestPlan"></a>Test Plan</h1>
<p>Bridging has wide-ranging affects on a call. While each bridging test will have some aspect of bridging as its fundamental focus, each will also have common elements that are checked as well, independent of the primary purpose of the test. For example, even if the focus of the test is a feature such as Auto-Monitor, fundamental attributes such as CDRs should be checked for correctness as well.</p>
<p>Tests need to be crafted not only to test the nominal path for features. For instance, it is not enough to write a transfer test wherein all parties behave as expected. There should be tests where a transfer is made to a non-existent extension, or a test where a transfer is started but an extension is not typed in within the appropriate time limit.</p>
<p>See <a href="/wiki/display/AST/Asterisk+12+Bridging+Test+Plan" title="Asterisk 12 Bridging Test Plan">Asterisk 12 Bridging Test Plan</a> for mappings between the Asterisk tests and the defined Use Cases.</p>
<h2><a name="Asterisk12BridgingProject-FeaturesNottoTest"></a>Features Not to Test</h2>
<p>There are some features and applications in Asterisk that, upon first glance, appear to be in the realm of a bridging test plan. Upon further inspection, however, they do not belong in the test plan.</p>
<h3><a name="Asterisk12BridgingProject-BridgeManagerAction%2FApplication"></a>Bridge Manager Action/Application</h3>
<p>These only represent different ways of erecting bridges between parties. They don't actually affect the operations and machinations of the bridge that gets created.</p>
<h3><a name="Asterisk12BridgingProject-CallPickup"></a>Call Pickup</h3>
<p>Call pickup occurs entirely before a bridge is formed, therefore it does not belong in a suite of bridge tests.</p>
<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/wiki/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Note</b><br />This may actually change, if channels are placed into a new bridge technology that performs early media playback ("Early Bridge"). This would be advantageous as the channel picking up the call would simply join the bridge with the channel in early media, and the bridge technology would swap from the Early Bridge technology to a compatible Two-Party bridge technology.
<p>If that occurs, this test plan will be updated.</p></td></tr></table></div>
<h3><a name="Asterisk12BridgingProject-Invokingbridgesfrommultipleapplications"></a>Invoking bridges from multiple applications</h3>
<p>Since we're concerned with the operation of the actual bridge, it does not matter how the bridge gets invoked. Whether app_dial, app_queue, or app_followme is used to create the bridge, it makes no difference in the way the bridge ends up operating. This also means the various forms of call origination don't need to be tested, either.</p>
<h2><a name="Asterisk12BridgingProject-Commonelementstocheckduringtests"></a>Common elements to check during tests</h2>
<p>During all bridging tests, the bridge should be checked to make sure that media frames are being passed properly. The easiest way to do this is to pass DTMF between the two parties and ensure that they are received properly on the opposite side.</p>
<p>The table below lists the items that should be checked in each test.</p>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Item </th>
<th class='confluenceTh'> Rationale </th>
</tr>
<tr>
<td class='confluenceTd'> CDRs </td>
<td class='confluenceTd'> The content of these will vary from test to test, but for common two-party bridges, these should be remarkably similar </td>
</tr>
<tr>
<td class='confluenceTd'> CELs </td>
<td class='confluenceTd'> Same applies for these as for CDRs </td>
</tr>
<tr>
<td class='confluenceTd'> CallerID </td>
<td class='confluenceTd'> Check that the Caller ID for each channel involved in the bridge is what it is expected to be </td>
</tr>
<tr>
<td class='confluenceTd'> Connected Line </td>
<td class='confluenceTd'> Check that connected line for each channel involved is what is expected </td>
</tr>
<tr>
<td class='confluenceTd'> Common Channel variables </td>
<td class='confluenceTd'> BRIDGEPEER, BRIDGEPVTCALLID should be set appropriately </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="/wiki/display/AST/Asterisk+11+ManagerEvent_Bridge" title="Asterisk 11 ManagerEvent_Bridge">Bridge</a> </td>
<td class='confluenceTd'> Check that the AMI Bridge event occurs when expected </td>
</tr>
</tbody></table>
</div>
<h1><a name="Asterisk12BridgingProject-ProjectPlanning"></a>Project Planning</h1>
<h2><a name="Asterisk12BridgingProject-JIRAIssues"></a>JIRA Issues</h2>
<p>
<table cellspacing="0" class="grid" style="width: 100%">
<tr>
<th colspan="11" style="text-align: left; ">
<a rel="nofollow" href="https://issues.asterisk.org/jira/secure/IssueNavigator.jspa?requestId=12133&tempMax=1000">JIRA Issues</a> (9 issues) </th>
</tr>
<tr>
<th style="text-align: left; text-transform: capitalize;">Type</th>
<th style="text-align: left; text-transform: capitalize;">Key</th>
<th style="text-align: left; text-transform: capitalize;">Summary</th>
<th style="text-align: left; text-transform: capitalize;">Assignee</th>
<th style="text-align: left; text-transform: capitalize;">Reporter</th>
<th style="text-align: left; text-transform: capitalize;">Priority</th>
<th style="text-align: left; text-transform: capitalize;">Status</th>
<th style="text-align: left; text-transform: capitalize;">Resolution</th>
<th style="text-align: left; text-transform: capitalize;">Created</th>
<th style="text-align: left; text-transform: capitalize;">Updated</th>
<th style="text-align: left; text-transform: capitalize;">Due</th>
</tr>
<tr class="rowNormal">
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21059"><img src="https://issues.asterisk.org/jira/images/icons/improvement.gif" alt="Improvement" border="0" /></a>
</td>
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21059">ASTERISK-21059</a>
</td>
<td >
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21059">Bridge API Enhancements - Refactor the Park family of applications</a>
</td>
<td nowrap="true">
Unassigned
</td>
<td nowrap="true">
Matt Jordan
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/priority_major.gif" alt="Major" border="0" />
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/status_open.gif" alt="" border="0" /> Open
</td>
<td nowrap="true">
<font color="990000">Unresolved</font>
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
</td>
</tr>
<tr class="rowAlternate">
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21058"><img src="https://issues.asterisk.org/jira/images/icons/improvement.gif" alt="Improvement" border="0" /></a>
</td>
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21058">ASTERISK-21058</a>
</td>
<td >
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21058">Bridge API Enhancements - rework Local channels/Local channel bridging</a>
</td>
<td nowrap="true">
Unassigned
</td>
<td nowrap="true">
Matt Jordan
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/priority_major.gif" alt="Major" border="0" />
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/status_open.gif" alt="" border="0" /> Open
</td>
<td nowrap="true">
<font color="990000">Unresolved</font>
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
</td>
</tr>
<tr class="rowNormal">
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21057"><img src="https://issues.asterisk.org/jira/images/icons/improvement.gif" alt="Improvement" border="0" /></a>
</td>
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21057">ASTERISK-21057</a>
</td>
<td >
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21057">Bridge API Enhancements - add API extension points</a>
</td>
<td nowrap="true">
Unassigned
</td>
<td nowrap="true">
Matt Jordan
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/priority_major.gif" alt="Major" border="0" />
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/status_open.gif" alt="" border="0" /> Open
</td>
<td nowrap="true">
<font color="990000">Unresolved</font>
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
</td>
</tr>
<tr class="rowAlternate">
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21054"><img src="https://issues.asterisk.org/jira/images/icons/improvement.gif" alt="Improvement" border="0" /></a>
</td>
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21054">ASTERISK-21054</a>
</td>
<td >
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21054">Bridge API Enhancements: Add roles to the bridging model</a>
</td>
<td nowrap="true">
Unassigned
</td>
<td nowrap="true">
Matt Jordan
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/priority_major.gif" alt="Major" border="0" />
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/status_open.gif" alt="" border="0" /> Open
</td>
<td nowrap="true">
<font color="990000">Unresolved</font>
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
</td>
</tr>
<tr class="rowNormal">
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21052"><img src="https://issues.asterisk.org/jira/images/icons/improvement.gif" alt="Improvement" border="0" /></a>
</td>
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21052">ASTERISK-21052</a>
</td>
<td >
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21052">Bridge API Enhancements: Implement threading model for bridge management thread</a>
</td>
<td nowrap="true">
Unassigned
</td>
<td nowrap="true">
Matt Jordan
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/priority_major.gif" alt="Major" border="0" />
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/status_open.gif" alt="" border="0" /> Open
</td>
<td nowrap="true">
<font color="990000">Unresolved</font>
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
</td>
</tr>
<tr class="rowAlternate">
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21051"><img src="https://issues.asterisk.org/jira/images/icons/improvement.gif" alt="Improvement" border="0" /></a>
</td>
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21051">ASTERISK-21051</a>
</td>
<td >
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21051">Bridge API Enhancements: Refactor callers of ast_bridge_call to use Bridging API model</a>
</td>
<td nowrap="true">
Richard Mudgett
</td>
<td nowrap="true">
Matt Jordan
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/priority_major.gif" alt="Major" border="0" />
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/status_open.gif" alt="" border="0" /> Open
</td>
<td nowrap="true">
<font color="990000">Unresolved</font>
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
</td>
</tr>
<tr class="rowNormal">
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20874"><img src="https://issues.asterisk.org/jira/images/icons/improvement.gif" alt="Improvement" border="0" /></a>
</td>
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20874">ASTERISK-20874</a>
</td>
<td >
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20874">Bridge API Enhancements - add control frame support/processing</a>
</td>
<td nowrap="true">
Richard Mudgett
</td>
<td nowrap="true">
Matt Jordan
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/priority_major.gif" alt="Major" border="0" />
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/status_open.gif" alt="" border="0" /> Open
</td>
<td nowrap="true">
<font color="990000">Unresolved</font>
</td>
<td nowrap="true">
Jan 03, 2013
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
</td>
</tr>
<tr class="rowAlternate">
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20872"><img src="https://issues.asterisk.org/jira/images/icons/improvement.gif" alt="Improvement" border="0" /></a>
</td>
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20872">ASTERISK-20872</a>
</td>
<td >
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20872">Bridge API Enhancements - add timed feature for playback of messages</a>
</td>
<td nowrap="true">
Jonathan Rose
</td>
<td nowrap="true">
Matt Jordan
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/priority_major.gif" alt="Major" border="0" />
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/status_open.gif" alt="" border="0" /> Open
</td>
<td nowrap="true">
<font color="990000">Unresolved</font>
</td>
<td nowrap="true">
Jan 03, 2013
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
</td>
</tr>
<tr class="rowNormal">
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20869"><img src="https://issues.asterisk.org/jira/images/icons/improvement.gif" alt="Improvement" border="0" /></a>
</td>
<td nowrap="true">
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20869">ASTERISK-20869</a>
</td>
<td >
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20869">Bridge API Enhancements - add support for native bridging</a>
</td>
<td nowrap="true">
Unassigned
</td>
<td nowrap="true">
Matt Jordan
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/priority_major.gif" alt="Major" border="0" />
</td>
<td nowrap="true">
<img src="https://issues.asterisk.org/jira/images/icons/status_open.gif" alt="" border="0" /> Open
</td>
<td nowrap="true">
<font color="990000">Unresolved</font>
</td>
<td nowrap="true">
Jan 03, 2013
</td>
<td nowrap="true">
Feb 08, 2013
</td>
<td nowrap="true">
</td>
</tr>
</table>
</p>
<h2><a name="Asterisk12BridgingProject-Contributors"></a>Contributors</h2>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Name </th>
<th class='confluenceTh'> E-mail Address </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="/wiki/display/~mjordan" class="confluence-userlink" data-username="mjordan" >Matt Jordan</a> </td>
<td class='confluenceTd'> mjordan@digium.com </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="/wiki/display/~rmudgett" class="confluence-userlink" data-username="rmudgett" >Richard Mudgett</a> </td>
<td class='confluenceTd'> rmudgett@digium.com </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="/wiki/display/~jrose" class="confluence-userlink" data-username="jrose" >Jonathan Rose</a> </td>
<td class='confluenceTd'> jrose@digium.com </td>
</tr>
</tbody></table>
</div>
<h1><a name="Asterisk12BridgingProject-ReferenceInformation"></a>Reference Information</h1>
<h2><a name="Asterisk12BridgingProject-TestReviews"></a>Test Reviews</h2>
<div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Review </th>
<th class='confluenceTh'> Link </th>
</tr>
<tr>
<td class='confluenceTd'> Bridging Test Suite Object </td>
<td class='confluenceTd'> <a href="https://reviewboard.asterisk.org/r/2065/" class="external-link" rel="nofollow">https://reviewboard.asterisk.org/r/2065/</a> </td>
</tr>
<tr>
<td class='confluenceTd'> Timed Features Tests </td>
<td class='confluenceTd'> <a href="https://reviewboard.asterisk.org/r/2247/" class="external-link" rel="nofollow">https://reviewboard.asterisk.org/r/2247/</a> </td>
</tr>
<tr>
<td class='confluenceTd'> Connected Line Tests </td>
<td class='confluenceTd'> <a href="https://reviewboard.asterisk.org/r/2249/" class="external-link" rel="nofollow">https://reviewboard.asterisk.org/r/2249/</a> </td>
</tr>
<tr>
<td class='confluenceTd'> Auto-monitor, -mix-monitor, blind transfer detection; CDR/CEL integration Tests </td>
<td class='confluenceTd'> <a href="https://reviewboard.asterisk.org/r/2067/" class="external-link" rel="nofollow">https://reviewboard.asterisk.org/r/2067/</a> </td>
</tr>
<tr>
<td class='confluenceTd'> Auto-monitor, -mix-monitor basic Tests </td>
<td class='confluenceTd'> <a href="https://reviewboard.asterisk.org/r/2250/" class="external-link" rel="nofollow">https://reviewboard.asterisk.org/r/2250/</a> </td>
</tr>
<tr>
<td class='confluenceTd'> Call Parking (basic) Tests </td>
<td class='confluenceTd'> <a href="https://reviewboard.asterisk.org/r/2273/" class="external-link" rel="nofollow">https://reviewboard.asterisk.org/r/2273/</a> </td>
</tr>
<tr>
<td class='confluenceTd'> Call Parking Timeout (comebacktoorigin=yes) Tests </td>
<td class='confluenceTd'> <a href="https://reviewboard.asterisk.org/r/2306/" class="external-link" rel="nofollow">https://reviewboard.asterisk.org/r/2306/</a> </td>
</tr>
<tr>
<td class='confluenceTd'> Call Parking Timeout (comebacktoorigin=no) Tests </td>
<td class='confluenceTd'> <a href="https://reviewboard.asterisk.org/r/2301/" class="external-link" rel="nofollow">https://reviewboard.asterisk.org/r/2301/</a> </td>
</tr>
<tr>
<td class='confluenceTd'> Transfer Capability Tests </td>
<td class='confluenceTd'> <a href="https://reviewboard.asterisk.org/r/2268/" class="external-link" rel="nofollow">https://reviewboard.asterisk.org/r/2268/</a> </td>
</tr>
</tbody></table>
</div>
</div>
<div id="commentsSection" class="wiki-content pageSection">
<div style="float: right;" class="grey">
<a href="https://wiki.asterisk.org/wiki/users/removespacenotification.action?spaceKey=AST">Stop watching space</a>
<span style="padding: 0px 5px;">|</span>
<a href="https://wiki.asterisk.org/wiki/users/editmyemailsettings.action">Change email notification preferences</a>
</div>
<a href="https://wiki.asterisk.org/wiki/display/AST/Asterisk+12+Bridging+Project">View Online</a>
|
<a href="https://wiki.asterisk.org/wiki/pages/diffpagesbyversion.action?pageId=22088024&revisedVersion=17&originalVersion=16">View Changes</a>
|
<a href="https://wiki.asterisk.org/wiki/display/AST/Asterisk+12+Bridging+Project?showComments=true&showCommentArea=true#addcomment">Add Comment</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>