diff options
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_gtalk.c | 21 | ||||
-rw-r--r-- | channels/chan_gulp.c | 43 | ||||
-rw-r--r-- | channels/chan_h323.c | 17 | ||||
-rw-r--r-- | channels/chan_jingle.c | 21 | ||||
-rw-r--r-- | channels/chan_mgcp.c | 16 | ||||
-rw-r--r-- | channels/chan_motif.c | 20 | ||||
-rw-r--r-- | channels/chan_multicast_rtp.c | 2 | ||||
-rw-r--r-- | channels/chan_sip.c | 26 | ||||
-rw-r--r-- | channels/chan_skinny.c | 20 | ||||
-rw-r--r-- | channels/chan_unistim.c | 16 |
10 files changed, 161 insertions, 41 deletions
diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c index 8a7083eb2..639de4749 100644 --- a/channels/chan_gtalk.c +++ b/channels/chan_gtalk.c @@ -210,6 +210,7 @@ static char *gtalk_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cl 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 @@ safeout: 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 @@ static struct ast_channel *gtalk_new(struct gtalk *client, struct gtalk_pvt *i, 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 @@ static int gtalk_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) 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 @@ static int gtalk_hangup(struct ast_channel *ast) 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"); diff --git a/channels/chan_gulp.c b/channels/chan_gulp.c index 6a80651cf..144fb6aaa 100644 --- a/channels/chan_gulp.c +++ b/channels/chan_gulp.c @@ -429,7 +429,7 @@ static int direct_media_mitigate_glare(struct ast_sip_session *session) { 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 @@ static struct ast_channel *gulp_new(struct ast_sip_session *session, int state, 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 @@ struct fixup_data { 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 @@ static struct hangup_data *hangup_data_alloc(int cause, struct ast_channel *chan 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 @@ static int hangup(void *data) } } - 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 @@ failure: /* 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 */ - ao2_cleanup(h_data); - session->channel = NULL; - ast_channel_tech_pvt_set(ast, NULL); - + clear_session_and_channel(session, ast, pvt); ao2_cleanup(pvt); + ao2_cleanup(h_data); return -1; } @@ -1859,8 +1882,8 @@ static int gulp_incoming_ack(struct ast_sip_session *session, struct pjsip_rx_da * 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) diff --git a/channels/chan_h323.c b/channels/chan_h323.c index e26bb5fb6..5ed1c8970 100644 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -250,6 +250,8 @@ static void delete_users(void); 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 @@ static int oh323_hangup(struct ast_channel *c) 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 @@ static int oh323_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) 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 @@ static int __oh323_rtp_create(struct oh323_pvt *pvt) 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 @@ static struct ast_channel *__oh323_new(struct oh323_pvt *pvt, int state, const c /* 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); @@ -1189,6 +1192,14 @@ static struct oh323_pvt *oh323_alloc(int callid) 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) { struct oh323_pvt *pvt; diff --git a/channels/chan_jingle.c b/channels/chan_jingle.c index 42dccf666..e5fd02506 100644 --- a/channels/chan_jingle.c +++ b/channels/chan_jingle.c @@ -196,6 +196,7 @@ static int jingle_sendhtml(struct ast_channel *ast, int subclass, const char *da 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 @@ static struct jingle_pvt *jingle_alloc(struct jingle *client, const char *from, 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 @@ static struct ast_channel *jingle_new(struct jingle *client, struct jingle_pvt * 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 @@ static int jingle_fixup(struct ast_channel *oldchan, struct ast_channel *newchan 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 @@ static int jingle_hangup(struct ast_channel *ast) 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); diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c index 5a0b7ad84..da3fefa8a 100644 --- a/channels/chan_mgcp.c +++ b/channels/chan_mgcp.c @@ -431,6 +431,7 @@ static int mgcpsock = -1; 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 @@ static int unalloc_sub(struct mgcp_subchannel *sub) } 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 @@ static int mgcp_hangup(struct ast_channel *ast) } } - sub->owner = NULL; + mgcp_set_owner(sub, NULL); /* for deleting gate */ if (p->pktcgatealloc && sub->gate) { @@ -1225,6 +1226,13 @@ static struct ast_frame *mgcp_rtp_read(struct mgcp_subchannel *sub) 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 @@ static int mgcp_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) 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 @@ static struct ast_channel *mgcp_new(struct mgcp_subchannel *sub, int state, cons 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); diff --git a/channels/chan_motif.c b/channels/chan_motif.c index 22b5eaec8..c77d0c0d2 100644 --- a/channels/chan_motif.c +++ b/channels/chan_motif.c @@ -656,6 +656,18 @@ static struct ast_rtp_glue jingle_rtp_glue = { .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 @@ static void jingle_enable_video(struct jingle_session *session) } 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 @@ static struct ast_channel *jingle_new(struct jingle_endpoint *endpoint, struct j 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 @@ static int jingle_fixup(struct ast_channel *oldchan, struct ast_channel *newchan ao2_lock(session); - session->owner = newchan; + jingle_set_owner(session, newchan); ao2_unlock(session); @@ -1862,7 +1874,7 @@ static int jingle_hangup(struct ast_channel *ast) } 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); diff --git a/channels/chan_multicast_rtp.c b/channels/chan_multicast_rtp.c index dfa068018..462982969 100644 --- a/channels/chan_multicast_rtp.c +++ b/channels/chan_multicast_rtp.c @@ -153,7 +153,7 @@ static struct ast_channel *multicast_rtp_request(const char *type, struct ast_fo 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); diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 9a5f086ad..9373a6435 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -1240,6 +1240,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock 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); @@ -3494,7 +3495,7 @@ void dialog_unlink_all(struct sip_pvt *dialog) 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); @@ -7183,7 +7184,7 @@ static int sip_hangup(struct ast_channel *ast) 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; @@ -7218,7 +7219,7 @@ static int sip_hangup(struct ast_channel *ast) /* 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); @@ -7544,7 +7545,7 @@ static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) 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 @@ -8190,7 +8191,7 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit } 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 @@ static struct ast_channel *sip_pvt_lock_full(struct sip_pvt *pvt) 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. * Connect incoming SIP message to current dialog or create new dialog structure * Returns a reference to the sip_pvt object, remember to give it back once done. diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 647213228..bb0888f26 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -1638,6 +1638,7 @@ static void mwi_event_cb(void *userdata, struct stasis_subscription *sub, struct 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 @@ static void start_rtp(struct skinny_subchannel *sub) } 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 @@ static int skinny_hangup(struct ast_channel *ast) 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 @@ static int skinny_fixup(struct ast_channel *oldchan, struct ast_channel *newchan 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 @@ static int skinny_indicate(struct ast_channel *ast, int ind, const void *data, s 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 @@ static struct ast_channel *skinny_new(struct skinny_line *l, struct skinny_subli } 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; diff --git a/channels/chan_unistim.c b/channels/chan_unistim.c index 5a5674daa..53ffa0044 100644 --- a/channels/chan_unistim.c +++ b/channels/chan_unistim.c @@ -675,6 +675,7 @@ static int load_module(void); 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 @@ static void start_rtp(struct unistim_subchannel *sub) 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_call(struct ast_channel *ast, const char *dest, int timeout) 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 @@ static int unistim_fixup(struct ast_channel *oldchan, struct ast_channel *newcha return -1; } - p->owner = newchan; + unistim_set_owner(p, newchan); ast_mutex_unlock(&p->lock); @@ -5589,7 +5591,7 @@ static struct ast_channel *unistim_new(struct unistim_subchannel *sub, int state 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); @@ -5623,6 +5625,14 @@ static struct ast_channel *unistim_new(struct unistim_subchannel *sub, int state 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) { struct unistimsession *cur = NULL; |