Fixed fault in ACTIVE_B3_IND on DISCONNECTING and reordered INFO_IND
elements.
This commit is contained in:
parent
3a5b43c45e
commit
1eb471b00c
113
chan_capi.c
113
chan_capi.c
|
@ -1226,7 +1226,6 @@ static struct ast_channel *capi_new(struct ast_capi_pvt *i, int state)
|
||||||
i->fd = fds[0];
|
i->fd = fds[0];
|
||||||
i->fd2 = fds[1];
|
i->fd2 = fds[1];
|
||||||
|
|
||||||
ast_setstate(tmp, state);
|
|
||||||
tmp->fds[0] = i->fd;
|
tmp->fds[0] = i->fd;
|
||||||
if (i->smoother != NULL) {
|
if (i->smoother != NULL) {
|
||||||
ast_smoother_reset(i->smoother, AST_CAPI_MAX_B3_BLOCK_SIZE);
|
ast_smoother_reset(i->smoother, AST_CAPI_MAX_B3_BLOCK_SIZE);
|
||||||
|
@ -1306,6 +1305,9 @@ static struct ast_channel *capi_new(struct ast_capi_pvt *i, int state)
|
||||||
usecnt++;
|
usecnt++;
|
||||||
ast_mutex_unlock(&usecnt_lock);
|
ast_mutex_unlock(&usecnt_lock);
|
||||||
ast_update_use_count();
|
ast_update_use_count();
|
||||||
|
|
||||||
|
ast_setstate(tmp, state);
|
||||||
|
|
||||||
if (state != AST_STATE_DOWN) {
|
if (state != AST_STATE_DOWN) {
|
||||||
/* we are alerting (phones ringing) */
|
/* we are alerting (phones ringing) */
|
||||||
if (state == AST_STATE_RING)
|
if (state == AST_STATE_RING)
|
||||||
|
@ -1639,7 +1641,7 @@ static void handle_did_digits(_cmsg *CMSG, unsigned int PLCI, unsigned int NCCI,
|
||||||
strncat(p->i->dnid, did, sizeof(p->i->dnid) - 1);
|
strncat(p->i->dnid, did, sizeof(p->i->dnid) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(name, sizeof(name), "CAPI/contr%d/%s/-%d",
|
snprintf(name, sizeof(name), "CAPI/contr%d/%s-%d",
|
||||||
p->i->controller, p->i->dnid, capi_counter++);
|
p->i->controller, p->i->dnid, capi_counter++);
|
||||||
ast_change_name(p->c, name);
|
ast_change_name(p->c, name);
|
||||||
|
|
||||||
|
@ -1746,7 +1748,6 @@ static void capi_handle_info_indication(_cmsg *CMSG, unsigned int PLCI, unsigned
|
||||||
{
|
{
|
||||||
_cmsg CMSG2;
|
_cmsg CMSG2;
|
||||||
struct ast_frame fr;
|
struct ast_frame fr;
|
||||||
int handled = 0;
|
|
||||||
|
|
||||||
memset(&CMSG2,0,sizeof(_cmsg));
|
memset(&CMSG2,0,sizeof(_cmsg));
|
||||||
INFO_RESP_HEADER(&CMSG2, ast_capi_ApplID, CMSG->Messagenumber, PLCI);
|
INFO_RESP_HEADER(&CMSG2, ast_capi_ApplID, CMSG->Messagenumber, PLCI);
|
||||||
|
@ -1755,39 +1756,18 @@ static void capi_handle_info_indication(_cmsg *CMSG, unsigned int PLCI, unsigned
|
||||||
return_on_no_pipe("INFO_IND");
|
return_on_no_pipe("INFO_IND");
|
||||||
|
|
||||||
switch(INFO_IND_INFONUMBER(CMSG)) {
|
switch(INFO_IND_INFONUMBER(CMSG)) {
|
||||||
case 0x8045: /* DISCONNECT */
|
case 0x0008: /* Cause */
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element DISCONNECT\n");
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element CAUSE %02x %02x\n",
|
||||||
handle_info_disconnect(CMSG, PLCI, NCCI, p);
|
INFO_IND_INFOELEMENT(CMSG)[1], INFO_IND_INFOELEMENT(CMSG)[2]);
|
||||||
handled = 1;
|
break;
|
||||||
|
case 0x0018: /* Channel Identifikation */
|
||||||
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element CHANNEL IDENTIFIKATION %02x\n",
|
||||||
|
INFO_IND_INFOELEMENT(CMSG)[1]);
|
||||||
break;
|
break;
|
||||||
case 0x001e: /* Progress Indicator */
|
case 0x001e: /* Progress Indicator */
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element PI %02x %02x\n",
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element PI %02x %02x\n",
|
||||||
INFO_IND_INFOELEMENT(CMSG)[1], INFO_IND_INFOELEMENT(CMSG)[2]);
|
INFO_IND_INFOELEMENT(CMSG)[1], INFO_IND_INFOELEMENT(CMSG)[2]);
|
||||||
handle_progress_indicator(CMSG, PLCI, p);
|
handle_progress_indicator(CMSG, PLCI, p);
|
||||||
handled = 1;
|
|
||||||
break;
|
|
||||||
case 0x0070: /* Called Party Number */
|
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element CALLED PARTY NUMBER\n");
|
|
||||||
handle_did_digits(CMSG, PLCI, NCCI, p);
|
|
||||||
handled = 1;
|
|
||||||
break;
|
|
||||||
case 0x0074: /* Redirecting Number */
|
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element REDIRECTING NUMBER\n");
|
|
||||||
/*
|
|
||||||
strncpy(p->i->owner->exten, capi_number(INFO_IND_INFOELEMENT(CMSG), 3),
|
|
||||||
sizeof(p->i->owner->exten) - 1);
|
|
||||||
*/
|
|
||||||
handled = 1;
|
|
||||||
break;
|
|
||||||
case 0x0008: /* Cause */
|
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element CAUSE %02x %02x\n",
|
|
||||||
INFO_IND_INFOELEMENT(CMSG)[1], INFO_IND_INFOELEMENT(CMSG)[2]);
|
|
||||||
handled = 1;
|
|
||||||
break;
|
|
||||||
case 0x0018: /* Channel Identifikation */
|
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element CHANNEL IDENTIFIKATION %02x\n",
|
|
||||||
INFO_IND_INFOELEMENT(CMSG)[1]);
|
|
||||||
handled = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x0028: /* DSP */
|
case 0x0028: /* DSP */
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element DSP\n");
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element DSP\n");
|
||||||
|
@ -1797,56 +1777,65 @@ static void capi_handle_info_indication(_cmsg *CMSG, unsigned int PLCI, unsigned
|
||||||
ast_queue_frame(p->i->owner, &ft);
|
ast_queue_frame(p->i->owner, &ft);
|
||||||
ast_log(LOG_NOTICE,"%s\n",capi_number(INFO_IND_INFOELEMENT(CMSG),0));
|
ast_log(LOG_NOTICE,"%s\n",capi_number(INFO_IND_INFOELEMENT(CMSG),0));
|
||||||
#endif
|
#endif
|
||||||
handled = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x0029: /* Date/Time */
|
case 0x0029: /* Date/Time */
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element Date/Time %02d/%02d/%02d %02d:%02d\n",
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element Date/Time %02d/%02d/%02d %02d:%02d\n",
|
||||||
INFO_IND_INFOELEMENT(CMSG)[1], INFO_IND_INFOELEMENT(CMSG)[2],
|
INFO_IND_INFOELEMENT(CMSG)[1], INFO_IND_INFOELEMENT(CMSG)[2],
|
||||||
INFO_IND_INFOELEMENT(CMSG)[3], INFO_IND_INFOELEMENT(CMSG)[4],
|
INFO_IND_INFOELEMENT(CMSG)[3], INFO_IND_INFOELEMENT(CMSG)[4],
|
||||||
INFO_IND_INFOELEMENT(CMSG)[5]);
|
INFO_IND_INFOELEMENT(CMSG)[5]);
|
||||||
handled = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x8005: /* SETUP */
|
case 0x0070: /* Called Party Number */
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element SETUP\n");
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element CALLED PARTY NUMBER\n");
|
||||||
handled = 1;
|
handle_did_digits(CMSG, PLCI, NCCI, p);
|
||||||
break;
|
break;
|
||||||
case 0x8007: /* CONNECT */
|
case 0x0074: /* Redirecting Number */
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element CONNECT\n");
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element REDIRECTING NUMBER\n");
|
||||||
handled = 1;
|
/*
|
||||||
break;
|
strncpy(p->i->owner->exten, capi_number(INFO_IND_INFOELEMENT(CMSG), 3),
|
||||||
case 0x800f: /* CONNECT ACK */
|
sizeof(p->i->owner->exten) - 1);
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element CONNECT ACK\n");
|
*/
|
||||||
handled = 1;
|
|
||||||
break;
|
|
||||||
case 0x800d: /* SETUP ACK */
|
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element SETUP ACK\n");
|
|
||||||
fr.frametype = AST_FRAME_CONTROL;
|
|
||||||
fr.subclass = AST_CONTROL_PROGRESS;
|
|
||||||
pipe_frame(p, (struct ast_frame *)&fr);
|
|
||||||
handled = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x8001: /* ALERTING */
|
case 0x8001: /* ALERTING */
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element ALERTING\n");
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element ALERTING\n");
|
||||||
fr.frametype = AST_FRAME_CONTROL;
|
fr.frametype = AST_FRAME_CONTROL;
|
||||||
fr.subclass = AST_CONTROL_RINGING;
|
fr.subclass = AST_CONTROL_RINGING;
|
||||||
pipe_frame(p, (struct ast_frame *)&fr);
|
pipe_frame(p, (struct ast_frame *)&fr);
|
||||||
handled = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x805a: /* RELEASE COMPLETE */
|
case 0x8002: /* CALL PROCEEDING */
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element RELEASE COMPLETE\n");
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element CALL PROCEEDING\n");
|
||||||
handled = 1;
|
break;
|
||||||
|
case 0x8003: /* PROGRESS */
|
||||||
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element PROGRESS\n");
|
||||||
|
break;
|
||||||
|
case 0x8005: /* SETUP */
|
||||||
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element SETUP\n");
|
||||||
|
break;
|
||||||
|
case 0x8007: /* CONNECT */
|
||||||
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element CONNECT\n");
|
||||||
|
break;
|
||||||
|
case 0x800d: /* SETUP ACK */
|
||||||
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element SETUP ACK\n");
|
||||||
|
fr.frametype = AST_FRAME_CONTROL;
|
||||||
|
fr.subclass = AST_CONTROL_PROGRESS;
|
||||||
|
pipe_frame(p, (struct ast_frame *)&fr);
|
||||||
|
break;
|
||||||
|
case 0x800f: /* CONNECT ACK */
|
||||||
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element CONNECT ACK\n");
|
||||||
|
break;
|
||||||
|
case 0x8045: /* DISCONNECT */
|
||||||
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element DISCONNECT\n");
|
||||||
|
handle_info_disconnect(CMSG, PLCI, NCCI, p);
|
||||||
break;
|
break;
|
||||||
case 0x804d: /* RELEASE */
|
case 0x804d: /* RELEASE */
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element RELEASE\n");
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element RELEASE\n");
|
||||||
handled = 1;
|
break;
|
||||||
|
case 0x805a: /* RELEASE COMPLETE */
|
||||||
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "info element RELEASE COMPLETE\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!handled) {
|
|
||||||
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "CAPI: unhandled INFO_IND %#x (PLCI=%#x)\n",
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_2 "CAPI: unhandled INFO_IND %#x (PLCI=%#x)\n",
|
||||||
INFO_IND_INFONUMBER(CMSG), PLCI);
|
INFO_IND_INFONUMBER(CMSG), PLCI);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2106,6 +2095,12 @@ static void capi_handle_connect_b3_active_indication(_cmsg *CMSG, unsigned int P
|
||||||
}
|
}
|
||||||
ast_mutex_unlock(&contrlock);
|
ast_mutex_unlock(&contrlock);
|
||||||
|
|
||||||
|
if (p->i->state == CAPI_STATE_DISCONNECTING) {
|
||||||
|
cc_ast_verbose(3, 1, VERBOSE_PREFIX_3 "CONNECT_B3_ACTIVE_IND during disconnect for NCCI %#x\n",
|
||||||
|
NCCI);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
p->i->state = CAPI_STATE_BCONNECTED;
|
p->i->state = CAPI_STATE_BCONNECTED;
|
||||||
|
|
||||||
if (p->i->FaxState) {
|
if (p->i->FaxState) {
|
||||||
|
|
Loading…
Reference in New Issue