diff --git a/channel.c b/channel.c index c5afa428d48693e33ec7e06a82a1e38885be38bf..3b79f7c3cd433b95bac459d0214e637b0df4c75f 100644 --- a/channel.c +++ b/channel.c @@ -2097,6 +2097,11 @@ struct ast_frame *ast_read_noaudio(struct ast_channel *chan) } int ast_indicate(struct ast_channel *chan, int condition) +{ + return ast_indicate_data(chan, condition, NULL, 0); +} + +int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, size_t datalen) { int res = -1; @@ -2107,7 +2112,7 @@ int ast_indicate(struct ast_channel *chan, int condition) return -1; } if (chan->tech->indicate) - res = chan->tech->indicate(chan, condition); + res = chan->tech->indicate(chan, condition, data, datalen); ast_channel_unlock(chan); if (!chan->tech->indicate || res) { /* @@ -3334,16 +3339,21 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct other = (who == c0) ? c1 : c0; /* the 'other' channel */ if ((f->frametype == AST_FRAME_CONTROL) && !(config->flags & AST_BRIDGE_IGNORE_SIGS)) { - if ((f->subclass == AST_CONTROL_HOLD) || (f->subclass == AST_CONTROL_UNHOLD) || - (f->subclass == AST_CONTROL_VIDUPDATE)) { - ast_indicate(other, f->subclass); - } else { + switch (f->subclass) { + case AST_CONTROL_HOLD: + case AST_CONTROL_UNHOLD: + case AST_CONTROL_VIDUPDATE: + ast_indicate_data(other, f->subclass, f->data, f->datalen); + break; + default: *fo = f; *rc = who; res = AST_BRIDGE_COMPLETE; ast_log(LOG_DEBUG, "Got a FRAME_CONTROL (%d) frame on channel %s\n", f->subclass, who->name); break; } + if (res == AST_BRIDGE_COMPLETE) + break; } if ((f->frametype == AST_FRAME_VOICE) || (f->frametype == AST_FRAME_DTMF) || diff --git a/channels/chan_agent.c b/channels/chan_agent.c index 171b7dd80418ffde99439c2caa01efa84dcbdff3..8da8b5d9ca143c13b523cacfc56c8dc30df4cc34 100644 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -248,7 +248,7 @@ static struct ast_frame *agent_read(struct ast_channel *ast); static int agent_write(struct ast_channel *ast, struct ast_frame *f); static int agent_sendhtml(struct ast_channel *ast, int subclass, const char *data, int datalen); static int agent_sendtext(struct ast_channel *ast, const char *text); -static int agent_indicate(struct ast_channel *ast, int condition); +static int agent_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen); static int agent_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static struct ast_channel *agent_bridgedchannel(struct ast_channel *chan, struct ast_channel *bridge); static void set_agentbycallerid(const char *callerid, const char *agent); @@ -586,7 +586,7 @@ static int agent_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) return 0; } -static int agent_indicate(struct ast_channel *ast, int condition) +static int agent_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen) { struct agent_pvt *p = ast->tech_pvt; int res = -1; diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c index e8d223a83db487b212100a02697f5706263bf964..e85b051eedb0ced8474541016d82bc4c68c49992 100644 --- a/channels/chan_alsa.c +++ b/channels/chan_alsa.c @@ -183,7 +183,7 @@ static int alsa_answer(struct ast_channel *c); static struct ast_frame *alsa_read(struct ast_channel *chan); static int alsa_call(struct ast_channel *c, char *dest, int timeout); static int alsa_write(struct ast_channel *chan, struct ast_frame *f); -static int alsa_indicate(struct ast_channel *chan, int cond); +static int alsa_indicate(struct ast_channel *chan, int cond, const void *data, size_t datalen); static int alsa_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static const struct ast_channel_tech alsa_tech = { @@ -750,7 +750,7 @@ static int alsa_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) return 0; } -static int alsa_indicate(struct ast_channel *chan, int cond) +static int alsa_indicate(struct ast_channel *chan, int cond, const void *data, size_t datalen) { int res = 0; ast_mutex_lock(&alsalock); diff --git a/channels/chan_features.c b/channels/chan_features.c index 0def48702358fc009269951a49e0838cbaa7acb7..a9b24dc3672530aac50385f3c60986d97234faba 100644 --- a/channels/chan_features.c +++ b/channels/chan_features.c @@ -101,7 +101,7 @@ static int features_hangup(struct ast_channel *ast); static int features_answer(struct ast_channel *ast); static struct ast_frame *features_read(struct ast_channel *ast); static int features_write(struct ast_channel *ast, struct ast_frame *f); -static int features_indicate(struct ast_channel *ast, int condition); +static int features_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen); static int features_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static const struct ast_channel_tech features_tech = { @@ -285,7 +285,7 @@ static int features_fixup(struct ast_channel *oldchan, struct ast_channel *newch return 0; } -static int features_indicate(struct ast_channel *ast, int condition) +static int features_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen) { struct feature_pvt *p = ast->tech_pvt; int res = -1; diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 2f16f55574a837aa5118f0467666ac87b729eb11..8628751851e2b77c1da7e485b400d05b11ecf40b 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -791,7 +791,7 @@ static int iax2_digit(struct ast_channel *c, char digit); static int iax2_do_register(struct iax2_registry *reg); static int iax2_fixup(struct ast_channel *oldchannel, struct ast_channel *newchan); static int iax2_hangup(struct ast_channel *c); -static int iax2_indicate(struct ast_channel *c, int condition); +static int iax2_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen); static int iax2_poke_peer(struct iax2_peer *peer, int heldcall); static int iax2_provision(struct sockaddr_in *end, int sockfd, char *dest, const char *template, int force); static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final); @@ -3493,12 +3493,12 @@ static int iax2_answer(struct ast_channel *c) return send_command_locked(callno, AST_FRAME_CONTROL, AST_CONTROL_ANSWER, 0, NULL, 0, -1); } -static int iax2_indicate(struct ast_channel *c, int condition) +static int iax2_indicate(struct ast_channel *c, int condition, const void *data, size_t datalen) { unsigned short callno = PTR_TO_CALLNO(c->tech_pvt); if (option_debug && iaxdebug) ast_log(LOG_DEBUG, "Indicating condition %d\n", condition); - return send_command_locked(callno, AST_FRAME_CONTROL, condition, 0, NULL, 0, -1); + return send_command_locked(callno, AST_FRAME_CONTROL, condition, 0, data, datalen, -1); } static int iax2_transfer(struct ast_channel *c, const char *dest) diff --git a/channels/chan_local.c b/channels/chan_local.c index f4e0e2b14193f68d65b46b04c860bf51133ef990..02dc32a5e1e7b669ac302a8473bb550fcaab1a4f 100644 --- a/channels/chan_local.c +++ b/channels/chan_local.c @@ -72,7 +72,7 @@ static int local_hangup(struct ast_channel *ast); static int local_answer(struct ast_channel *ast); static struct ast_frame *local_read(struct ast_channel *ast); static int local_write(struct ast_channel *ast, struct ast_frame *f); -static int local_indicate(struct ast_channel *ast, int condition); +static int local_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen); static int local_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static int local_sendhtml(struct ast_channel *ast, int subclass, const char *data, int datalen); @@ -261,7 +261,7 @@ static int local_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) return 0; } -static int local_indicate(struct ast_channel *ast, int condition) +static int local_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen) { struct local_pvt *p = ast->tech_pvt; int res = -1; diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c index 30605fc048455af005e9bbe7300b4505d85ad7d9..9aec2e818c7c0ef85d9e442dece275ae367970d6 100644 --- a/channels/chan_mgcp.c +++ b/channels/chan_mgcp.c @@ -494,7 +494,7 @@ static int mgcp_hangup(struct ast_channel *ast); static int mgcp_answer(struct ast_channel *ast); static struct ast_frame *mgcp_read(struct ast_channel *ast); static int mgcp_write(struct ast_channel *ast, struct ast_frame *frame); -static int mgcp_indicate(struct ast_channel *ast, int ind); +static int mgcp_indicate(struct ast_channel *ast, int ind, const void *data, size_t datalen); static int mgcp_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static int mgcp_senddigit(struct ast_channel *ast, char digit); static int mgcp_devicestate(void *data); @@ -1401,7 +1401,7 @@ static char *control2str(int ind) { return "UNKNOWN"; } -static int mgcp_indicate(struct ast_channel *ast, int ind) +static int mgcp_indicate(struct ast_channel *ast, int ind, const void *data, size_t datalen) { struct mgcp_subchannel *sub = ast->tech_pvt; int res = 0; diff --git a/channels/chan_nbs.c b/channels/chan_nbs.c index 37e290e778b74f47aa988bf3e67c008790ea16e1..fed8ee1ffc3283ffa79829da77f6d21527c5ce16 100644 --- a/channels/chan_nbs.c +++ b/channels/chan_nbs.c @@ -296,12 +296,12 @@ static int __unload_module(void) return 0; } -int unload_module(void) +static int unload_module(void) { return __unload_module(); } -int load_module(void) +static int load_module(void) { /* Make sure we can register our channel type */ if (ast_channel_register(&nbs_tech)) { diff --git a/channels/chan_oss.c b/channels/chan_oss.c index 5d6203e512f189f94d5202197b2a288763bed485..415539a83a1bafc5331daf8ec5c729dc2667da6a 100644 --- a/channels/chan_oss.c +++ b/channels/chan_oss.c @@ -373,7 +373,7 @@ static int oss_answer(struct ast_channel *c); static struct ast_frame *oss_read(struct ast_channel *chan); static int oss_call(struct ast_channel *c, char *dest, int timeout); static int oss_write(struct ast_channel *chan, struct ast_frame *f); -static int oss_indicate(struct ast_channel *chan, int cond); +static int oss_indicate(struct ast_channel *chan, int cond, const void *data, size_t datalen); static int oss_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static char tdesc[] = "OSS Console Channel Driver"; @@ -901,7 +901,7 @@ static int oss_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) return 0; } -static int oss_indicate(struct ast_channel *c, int cond) +static int oss_indicate(struct ast_channel *c, int cond, const void *data, size_t datalen) { struct chan_oss_pvt *o = c->tech_pvt; int res; diff --git a/channels/chan_phone.c b/channels/chan_phone.c index 1c6fff49a5272993abcd935a66d6b832050bc708..242f24461e737496814de18d467a345a8baecf10 100644 --- a/channels/chan_phone.c +++ b/channels/chan_phone.c @@ -169,7 +169,7 @@ static int phone_write(struct ast_channel *ast, struct ast_frame *frame); static struct ast_frame *phone_exception(struct ast_channel *ast); static int phone_send_text(struct ast_channel *ast, const char *text); static int phone_fixup(struct ast_channel *old, struct ast_channel *new); -static int phone_indicate(struct ast_channel *chan, int condition); +static int phone_indicate(struct ast_channel *chan, int condition, const void *data, size_t datalen); static const struct ast_channel_tech phone_tech = { .type = "Phone", @@ -206,7 +206,7 @@ static struct ast_channel_tech phone_tech_fxs = { static struct ast_channel_tech *cur_tech; -static int phone_indicate(struct ast_channel *chan, int condition) +static int phone_indicate(struct ast_channel *chan, int condition, const void *data, size_t datalen) { struct phone_pvt *p = chan->tech_pvt; int res=-1; diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 5881d2d96390723e10c1d4b9b858efd84e89838c..1573a0efbff11b34d84302c13e61fa3457062760 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -1060,7 +1060,7 @@ static int sip_hangup(struct ast_channel *ast); static int sip_answer(struct ast_channel *ast); static struct ast_frame *sip_read(struct ast_channel *ast); static int sip_write(struct ast_channel *ast, struct ast_frame *frame); -static int sip_indicate(struct ast_channel *ast, int condition); +static int sip_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen); static int sip_transfer(struct ast_channel *ast, const char *dest); static int sip_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static int sip_senddigit(struct ast_channel *ast, char digit); @@ -2927,7 +2927,7 @@ static int sip_transfer(struct ast_channel *ast, const char *dest) the indication - busy signal, congestion etc \return -1 to force ast_indicate to send indication in audio, 0 if SIP can handle the indication by sending a message */ -static int sip_indicate(struct ast_channel *ast, int condition) +static int sip_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen) { struct sip_pvt *p = ast->tech_pvt; int res = 0; diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 13d9ca5bf7a1a95c57f1741b15fecfc08e8b520c..e219bd9b7a686c73c7cac0a48ba083bb3f4f63b5 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -901,7 +901,7 @@ static int skinny_hangup(struct ast_channel *ast); static int skinny_answer(struct ast_channel *ast); static struct ast_frame *skinny_read(struct ast_channel *ast); static int skinny_write(struct ast_channel *ast, struct ast_frame *frame); -static int skinny_indicate(struct ast_channel *ast, int ind); +static int skinny_indicate(struct ast_channel *ast, int ind, const void *data, size_t datalen); static int skinny_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static int skinny_senddigit(struct ast_channel *ast, char digit); @@ -2172,7 +2172,7 @@ static char *control2str(int ind) { } -static int skinny_indicate(struct ast_channel *ast, int ind) +static int skinny_indicate(struct ast_channel *ast, int ind, const void *data, size_t datalen) { struct skinny_subchannel *sub = ast->tech_pvt; struct skinny_line *l = sub->parent; diff --git a/channels/chan_vpb.c b/channels/chan_vpb.c index a9dcaceca6c3da965257981891704ede211c4709..c88765b3f5fc47e7487b6c15f01814f91cd08dee 100644 --- a/channels/chan_vpb.c +++ b/channels/chan_vpb.c @@ -349,7 +349,7 @@ static int vpb_answer(struct ast_channel *ast); static struct ast_frame *vpb_read(struct ast_channel *ast); static int vpb_write(struct ast_channel *ast, struct ast_frame *frame); static enum ast_bridge_result ast_vpb_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms); -static int vpb_indicate(struct ast_channel *ast, int condition); +static int vpb_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen); static int vpb_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static struct ast_channel_tech vpb_tech = { @@ -1720,7 +1720,7 @@ static struct vpb_pvt *mkif(int board, int channel, int mode, int gains, float t return tmp; } -static int vpb_indicate(struct ast_channel *ast, int condition) +static int vpb_indicate(struct ast_channel *ast, int condition, const void *data, size_t datalen) { struct vpb_pvt *p = (struct vpb_pvt *)ast->tech_pvt; int res = 0; @@ -1818,7 +1818,7 @@ static int vpb_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) else { if (option_verbose > 3) ast_verbose(VERBOSE_PREFIX_4 "%s: vpb_fixup Calling vpb_indicate\n", p->dev); - vpb_indicate(newchan, AST_CONTROL_RINGING); + vpb_indicate(newchan, AST_CONTROL_RINGING, NULL, 0); } } diff --git a/channels/chan_zap.c b/channels/chan_zap.c index b51292df6ce5d9cb1f8a4e18581349ba8c28c771..c4181d7089bd3e6e083fddb2e3336eb00237b446 100644 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -695,7 +695,7 @@ static int zt_answer(struct ast_channel *ast); struct ast_frame *zt_read(struct ast_channel *ast); static int zt_write(struct ast_channel *ast, struct ast_frame *frame); struct ast_frame *zt_exception(struct ast_channel *ast); -static int zt_indicate(struct ast_channel *chan, int condition); +static int zt_indicate(struct ast_channel *chan, int condition, const void *data, size_t datalen); static int zt_fixup(struct ast_channel *oldchan, struct ast_channel *newchan); static int zt_setoption(struct ast_channel *chan, int option, void *data, int datalen); static int zt_func_read(struct ast_channel *chan, char *function, char *data, char *buf, size_t len); @@ -3341,7 +3341,7 @@ static int zt_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) p->subs[x].owner = newchan; } if (newchan->_state == AST_STATE_RINGING) - zt_indicate(newchan, AST_CONTROL_RINGING); + zt_indicate(newchan, AST_CONTROL_RINGING, NULL, 0); update_conf(p); ast_mutex_unlock(&p->lock); return 0; @@ -4843,7 +4843,7 @@ static int zt_write(struct ast_channel *ast, struct ast_frame *frame) return 0; } -static int zt_indicate(struct ast_channel *chan, int condition) +static int zt_indicate(struct ast_channel *chan, int condition, const void *data, size_t datalen) { struct zt_pvt *p = chan->tech_pvt; int res=-1; diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 00001f059eed108c22ebbd5ef7ccf2c969a22f0f..be2bac4d4dbf495c3dcbc5976bce39827208077a 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -250,7 +250,7 @@ struct ast_channel_tech { struct ast_frame **fo, struct ast_channel **rc, int timeoutms); /*! Indicate a particular condition (e.g. AST_CONTROL_BUSY or AST_CONTROL_RINGING or AST_CONTROL_CONGESTION */ - int (* const indicate)(struct ast_channel *c, int condition); + int (* const indicate)(struct ast_channel *c, int condition, const void *data, size_t datalen); /*! Fix up a channel: If a channel is consumed, this is called. Basically update any ->owner links */ int (* const fixup)(struct ast_channel *oldchan, struct ast_channel *newchan); @@ -764,6 +764,16 @@ int ast_call(struct ast_channel *chan, char *addr, int timeout); */ int ast_indicate(struct ast_channel *chan, int condition); +/*! \brief Indicates condition of channel, with payload + * \note Indicate a condition such as AST_CONTROL_BUSY, AST_CONTROL_RINGING, or AST_CONTROL_CONGESTION on a channel + * \param chan channel to change the indication + * \param condition which condition to indicate on the channel + * \param data pointer to payload data + * \param datalen size of payload data + * \return Returns 0 on success, -1 on failure + */ +int ast_indicate_data(struct ast_channel *chan, int condition, const void *data, size_t datalen); + /* Misc stuff ------------------------------------------------ */ /*! \brief Wait for input on a channel