[Home]

Summary:ASTERISK-22042: Set a cause code on a channel when it is ejected from a bridge
Reporter:Matt Jordan (mjordan)Labels:Asterisk12
Date Opened:2013-07-07 21:15:30Date Closed:2013-08-22 16:19:03
Priority:MajorRegression?
Status:Closed/CompleteComponents:Core/Bridging
Versions:12 Frequency of
Occurrence
Related
Issues:
Environment:Attachments:
Description:This addresses the following issues in {{main/bridging.c}}:


{noformat}
void ast_bridge_change_state_nolock(struct ast_bridge_channel *bridge_channel, enum ast_bridge_channel_state new_state)
{
/* BUGBUG need cause code for the bridge_channel leaving the bridge. */
if (bridge_channel->state != AST_BRIDGE_CHANNEL_STATE_WAIT) {
return;
}

ast_debug(1, "Setting %p(%s) state from:%d to:%d\n",
bridge_channel, ast_channel_name(bridge_channel->chan), bridge_channel->state,
new_state);

/* Change the state on the bridge channel */
bridge_channel->state = new_state;

bridge_channel_poke(bridge_channel);
}
{noformat}

And:

{noformat}
static void bridge_dissolve(struct ast_bridge *bridge)
{
struct ast_bridge_channel *bridge_channel;
struct ast_frame action = {
.frametype = AST_FRAME_BRIDGE_ACTION,
.subclass.integer = AST_BRIDGE_ACTION_DEFERRED_DISSOLVING,
};

if (bridge->dissolved) {
return;
}
bridge->dissolved = 1;

ast_debug(1, "Bridge %s: dissolving bridge\n", bridge->uniqueid);

/* BUGBUG need a cause code on the bridge for the later ejected channels. */
AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
}

/* Must defer dissolving bridge because it is already locked. */
ast_bridge_queue_action(bridge, &action);
}
{noformat}
Comments: