diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-07-25 01:20:16 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-07-25 01:20:16 +0000 |
commit | 26b052792cc41e2a5aaaa40efaa7137d46728663 (patch) | |
tree | 30f2d0c7a4bbe5d862df48579fffe12b4a565577 /channels | |
parent | c6421a8e880b4e82ae64e3bcc377f1f7682429cf (diff) |
Create one generally useful runtime option and one compile time option to work around bugs in the DPH100M phone (bug #2122)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3508 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rwxr-xr-x | channels/chan_mgcp.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c index 67e9081e4..0ce62352e 100755 --- a/channels/chan_mgcp.c +++ b/channels/chan_mgcp.c @@ -93,6 +93,12 @@ #define IPTOS_MINCOST 0x02 #endif +/* + * Define to work around buggy dlink MGCP phone firmware which + * appears not to know that "rt" is part of the "G" package. + */ +/* #define DLINK_BUGGY_FIRMWARE */ + #define MGCPDUMPER #define DEFAULT_EXPIREY 120 #define MAX_EXPIREY 3600 @@ -174,6 +180,8 @@ static int callwaiting = 0; static int callreturn = 0; +static int slowsequence = 0; + static int threewaycalling = 0; /* This is for flashhook transfers */ @@ -363,6 +371,7 @@ struct mgcp_endpoint { int dtmfinband; int amaflags; int type; + int slowsequence; /* MS: Sequence the endpoint as a whole */ int group; int iseq; /* Not used? */ int lastout; /* tracking this on the subchannels. Is it needed here? */ @@ -703,6 +712,12 @@ static int send_request(struct mgcp_endpoint *p, struct mgcp_subchannel *sub, char iabuf[INET_ADDRSTRLEN]; ast_mutex_t *l; + ast_log(LOG_DEBUG, "Slow sequence is %d\n", p->slowsequence); + if (p->slowsequence) { + queue = &p->cmd_queue; + l = &p->cmd_queue_lock; + ast_mutex_lock(l); + } else switch (req->cmd) { case MGCP_CMD_DLCX: queue = &sub->cx_queue; @@ -1181,7 +1196,11 @@ static int mgcp_indicate(struct ast_channel *ast, int ind) } switch(ind) { case AST_CONTROL_RINGING: +#ifdef DLINK_BUGGY_FIRMWARE + transmit_notify_request(sub, "rt"); +#else transmit_notify_request(sub, "G/rt"); +#endif break; case AST_CONTROL_BUSY: transmit_notify_request(sub, "L/bz"); @@ -2209,7 +2228,9 @@ static void handle_response(struct mgcp_endpoint *p, struct mgcp_subchannel *sub return; } - if (sub) + if (p->slowsequence) + req = find_command(p, sub, &p->cmd_queue, &p->cmd_queue_lock, ident); + else if (sub) req = find_command(p, sub, &sub->cx_queue, &sub->cx_queue_lock, ident); else if (!(req = find_command(p, sub, &p->rqnt_queue, &p->rqnt_queue_lock, ident))) req = find_command(p, sub, &p->cmd_queue, &p->cmd_queue_lock, ident); @@ -2746,7 +2767,11 @@ static void handle_hd_hf(struct mgcp_subchannel *sub, char *ev) } if (p->immediate) { /* The channel is immediately up. Start right away */ - transmit_notify_request(sub, "G/rt"); +#ifdef DLINK_BUGGY_FIRMWARE + transmit_notify_request(sub, "rt"); +#else + transmit_notify_request(sub, "G/rt"); +#endif c = mgcp_new(sub, AST_STATE_RING); if (!c) { ast_log(LOG_WARNING, "Unable to start PBX on channel %s@%s\n", p->name, p->parent->name); @@ -3465,6 +3490,8 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v) immediate = ast_true(v->value); } else if (!strcasecmp(v->name, "callwaiting")) { callwaiting = ast_true(v->value); + } else if (!strcasecmp(v->name, "slowsequence")) { + slowsequence = ast_true(v->value); } else if (!strcasecmp(v->name, "transfer")) { transfer = ast_true(v->value); } else if (!strcasecmp(v->name, "threewaycalling")) { @@ -3518,6 +3545,7 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v) e->cancallforward = cancallforward; e->canreinvite = canreinvite; e->callwaiting = callwaiting; + e->slowsequence = slowsequence; e->transfer = transfer; e->threewaycalling = threewaycalling; e->onhooktime = time(NULL); @@ -3615,6 +3643,7 @@ static struct mgcp_gateway *build_gateway(char *cat, struct ast_variable *v) e->cancallforward = cancallforward; e->canreinvite = canreinvite; e->callwaiting = callwaiting; + e->slowsequence = slowsequence; e->transfer = transfer; e->threewaycalling = threewaycalling; if (!ep_reload) { |