diff --git a/channels/chan_zap.c b/channels/chan_zap.c index 4a9bf980f0..51edd54edb 100755 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -187,7 +187,6 @@ static int minunused = 2; static int minidle = 0; static char idleext[AST_MAX_EXTENSION]; static char idledial[AST_MAX_EXTENSION]; -static int overlapdial = 0; #endif /* Wait up to 16 seconds for first digit (FXO logic) */ @@ -271,7 +270,6 @@ struct zt_pri { int dialplan; /* Dialing plan */ int dchannel; /* What channel the dchannel is on */ int channels; /* Num of chans in span (31 or 24) */ - int overlapdial; /* In overlap dialing mode */ struct pri *pri; int debug; int fd; @@ -439,7 +437,6 @@ static struct zt_pvt { #ifdef PRI_EVENT_PROCEEDING int proceeding; #endif - int setup_ack; /* wheter we received SETUP_ACKNOWLEDGE or not */ #endif #ifdef ZAPATA_R2 int r2prot; @@ -670,20 +667,12 @@ static int zt_digit(struct ast_channel *ast, char digit) index = zt_get_index(ast, p, 0); if (index == SUB_REAL) { #ifdef ZAPATA_PRI -#ifdef PRI_EVENT_SETUP_ACK - if (p->sig == SIG_PRI && ast->_state == AST_STATE_DIALING && p->setup_ack && !p->proceeding) { -#else #ifdef PRI_EVENT_PROCEEDING if (p->sig == SIG_PRI && ast->_state == AST_STATE_DIALING && !p->proceeding) { #else if (p->sig == SIG_PRI && ast->_state == AST_STATE_DIALING) { #endif -#endif - if (!pri_grab(p, p->pri)) - pri_information(p->pri->pri,p->call,digit); - else - ast_log(LOG_WARNING, "Unable to grab PRI on span %d\n", p->span); - pri_rel(p->pri); + pri_information(p->pri->pri,p->call,digit); } else { #else { @@ -918,12 +907,6 @@ static void zt_enable_ec(struct zt_pvt *p) return; } if (p && p->echocancel) { - if (p->sig == SIG_PRI) { - x = 1; - res = ioctl(p->subs[SUB_REAL].zfd, ZT_AUDIOMODE, &x); - if (res) - ast_log(LOG_WARNING, "Unable to enable echo cancellation on channel %d\n", p->channel); - } x = p->echocancel; res = ioctl(p->subs[SUB_REAL].zfd, ZT_ECHOCANCEL, &x); if (res) @@ -1012,14 +995,8 @@ static inline int zt_set_hook(int fd, int hs) static inline int zt_confmute(struct zt_pvt *p, int muted) { - int x, y, res; + int x, res; x = muted; - if (p->sig == SIG_PRI) { - y = 1; - res = ioctl(p->subs[SUB_REAL].zfd, ZT_AUDIOMODE, &y); - if (res) - ast_log(LOG_WARNING, "Unable to set audio mode on '%d'\n", p->channel); - } res = ioctl(p->subs[SUB_REAL].zfd, ZT_CONFMUTE, &x); if (res < 0) ast_log(LOG_WARNING, "zt confmute(%d) failed on channel %d: %s\n", muted, p->channel, strerror(errno)); @@ -1367,7 +1344,7 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout) c++; else c = dest; - if (ast->callerid && !p->hidecallerid) { + if (ast->callerid) { strncpy(callerid, ast->callerid, sizeof(callerid)-1); ast_callerid_parse(callerid, &n, &l); if (l) { @@ -1478,17 +1455,17 @@ static int zt_hangup(struct ast_channel *ast) index = zt_get_index(ast, p, 1); if (p->sig == SIG_PRI) { - x = 1; + x = 0; ast_channel_setoption(ast,AST_OPTION_AUDIO_MODE,&x,sizeof(char),0); } - x = 0; - zt_confmute(p, 0); restore_gains(p); if (p->dsp) ast_dsp_digitmode(p->dsp,DSP_DIGITMODE_DTMF | p->dtmfrelax); + x = 0; + zt_confmute(p, 0); ast_log(LOG_DEBUG, "Hangup: channel: %d index = %d, normal = %d, callwait = %d, thirdcall = %d\n", p->channel, index, p->subs[SUB_REAL].zfd, p->subs[SUB_CALLWAIT].zfd, p->subs[SUB_THREEWAY].zfd); @@ -1596,15 +1573,11 @@ static int zt_hangup(struct ast_channel *ast) p->onhooktime = time(NULL); #ifdef PRI_EVENT_PROCEEDING p->proceeding = 0; -#endif -#ifdef PRI_EVENT_SETUP_ACK - p->setup_ack = 0; #endif if (p->dsp) { ast_dsp_free(p->dsp); p->dsp = NULL; } - law = ZT_LAW_DEFAULT; res = ioctl(p->subs[SUB_REAL].zfd, ZT_SETLAW, &law); if (res < 0) @@ -1614,10 +1587,8 @@ static int zt_hangup(struct ast_channel *ast) if (p->sig == SIG_PRI) { if (p->call) { if (!pri_grab(p, p->pri)) { - if (!p->alreadyhungup) { - res = pri_disconnect(p->pri->pri, p->call, PRI_CAUSE_NORMAL_CLEARING); - } else { - pri_release(p->pri->pri, p->call, -1); + res = pri_disconnect(p->pri->pri, p->call, PRI_CAUSE_NORMAL_CLEARING); + if (p->alreadyhungup) { p->call = NULL; p->alreadyhungup = 0; } @@ -1683,12 +1654,6 @@ static int zt_hangup(struct ast_channel *ast) p->dialing = 0; strcpy(p->rdnis, ""); update_conf(p); - /* Restore data mode */ - if (p->sig == SIG_PRI) { - x = 0; - ast_channel_setoption(ast,AST_OPTION_AUDIO_MODE,&x,sizeof(char),0); - } - restart_monitor(); } @@ -1879,7 +1844,7 @@ int x; FD_ZERO(&efds); FD_SET(fd,&wfds); FD_SET(fd,&efds); - res = ast_select(fd + 1,NULL,&wfds,&efds,NULL); + res = select(fd + 1,NULL,&wfds,&efds,NULL); if (!res) { ast_log(LOG_DEBUG, "select (for write) ret. 0 on channel %d\n", p->channel); continue; @@ -2029,7 +1994,7 @@ static int zt_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, p1 = c1->pvt->pvt; /* cant do pseudo-channels here */ if ((!p0->sig) || (!p1->sig)) return -2; - + ast_pthread_mutex_lock(&c0->lock); ast_pthread_mutex_lock(&c1->lock); op0 = p0 = c0->pvt->pvt; @@ -2910,15 +2875,15 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast) case SIG_SF: case SIG_SFWINK: case SIG_SF_FEATD: - res = ioctl(p->subs[SUB_REAL].zfd, ZT_DIAL, &p->dop); - if (res < 0) { + if (strlen(p->dop.dialstr)) + res = ioctl(p->subs[SUB_REAL].zfd, ZT_DIAL, &p->dop); + else if (res < 0) { ast_log(LOG_WARNING, "Unable to initiate dialing on trunk channel %d\n", p->channel); p->dop.dialstr[0] = '\0'; return NULL; } else ast_log(LOG_DEBUG, "Sent deferred digit string: %s\n", p->dop.dialstr); p->dop.dialstr[0] = '\0'; - p->dop.op = ZT_DIAL_OP_REPLACE; break; case SIG_FEATDMF: case SIG_FEATB: @@ -2942,9 +2907,6 @@ struct ast_frame *zt_exception(struct ast_channel *ast) int res; int usedindex=-1; int index; - struct ast_frame *f; - - ast_pthread_mutex_lock(&p->lock); index = zt_get_index(ast, p, 1); @@ -3021,21 +2983,15 @@ struct ast_frame *zt_exception(struct ast_channel *ast) default: ast_log(LOG_WARNING, "Don't know how to absorb event %s\n", event2str(res)); } - f = &p->subs[index].f; - ast_pthread_mutex_unlock(&p->lock); - return f; + return &p->subs[index].f; } if (!p->radio) ast_log(LOG_DEBUG, "Exception on %d, channel %d\n", ast->fds[0],p->channel); /* If it's not us, return NULL immediately */ if (ast != p->owner) { ast_log(LOG_WARNING, "We're %s, not %s\n", ast->name, p->owner->name); - f = &p->subs[index].f; - ast_pthread_mutex_unlock(&p->lock); - return f; + return &p->subs[index].f; } - f = zt_handle_event(ast); - ast_pthread_mutex_unlock(&p->lock); - return f; + return zt_handle_event(ast); } struct ast_frame *zt_read(struct ast_channel *ast) @@ -3159,9 +3115,8 @@ struct ast_frame *zt_read(struct ast_channel *ast) } if (res != (p->subs[index].linear ? READ_SIZE * 2 : READ_SIZE)) { ast_log(LOG_DEBUG, "Short read (%d/%d), must be an event...\n", res, p->subs[index].linear ? READ_SIZE * 2 : READ_SIZE); - f = zt_handle_event(ast); pthread_mutex_unlock(&p->lock); - return f; + return zt_handle_event(ast); } if (p->tdd) { /* if in TDD mode, see if we receive that */ int c; @@ -3425,31 +3380,6 @@ static int zt_indicate(struct ast_channel *chan, int condition) (p->sig != SIG_FXSGS))) ast_setstate(chan, AST_STATE_RINGING); } -#if 0 - break; -#endif - /* Fall through */ - case AST_CONTROL_PROGRESS: - ast_log(LOG_DEBUG,"Received AST_CONTROL_PROGRESS on %s\n",chan->name); -#ifdef ZAPATA_PRI -#ifdef PRI_EVENT_PROCEEDING - if (!p->proceeding && p->sig==SIG_PRI && p->pri && p->pri->overlapdial) { - if (p->pri->pri) { - if (!pri_grab(p, p->pri)) { - pri_acknowledge(p->pri->pri,p->call, p->prioffset, 1); - pri_rel(p->pri); - } - else - ast_log(LOG_WARNING, "Unable to grab PRI on span %d\n", p->span); - } - p->proceeding=1; - } -#else - ast_log(LOG_WARNING, "Please update your libpri package if you want to use overlap sending\n"); -#endif -#endif - /* don't continue in ast_indicate */ - res = 0; break; case AST_CONTROL_CONGESTION: res = tone_zone_play_tone(p->subs[index].zfd, ZT_TONE_CONGESTION); @@ -3599,6 +3529,11 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int #ifdef ZAPATA_PRI /* Assume calls are not idle calls unless we're told differently */ i->isidlecall = 0; + if (i->sig == SIG_PRI) { + /* Set to audio mode at this poitn mode */ + x = 1; + ast_channel_setoption(tmp,AST_OPTION_AUDIO_MODE,&x,sizeof(char),0); + } #endif /* Assure there is no confmute on this channel */ zt_confmute(i, 0); @@ -3719,12 +3654,8 @@ static void *ss_thread(void *data) else ast_dsp_digitmode(p->dsp,DSP_DIGITMODE_DTMF | p->dtmfrelax); } - dtmfbuf[0] = 0; - /* Wait for the first digit only if immediate=no */ - if (((p->sig == SIG_EM) || (p->sig == SIG_EMWINK)) && !p->immediate) - /* Wait for the first digit (up to 5 seconds). */ - res = ast_waitfordigit(chan,5000); - else res = 0; + /* Wait for the first digit (up to 5 seconds). */ + res = ast_waitfordigit(chan,5000); if (res > 0) { /* save first char */ dtmfbuf[0] = res; @@ -4060,8 +3991,6 @@ static void *ss_thread(void *data) (!strcmp(nbridge->type,"Zap")) && ISTRUNK(pbridge)) { int func = ZT_FLASH; - /* Clear out the dial buffer */ - p->dop.dialstr[0] = '\0'; /* flash hookswitch */ if ((ioctl(pbridge->subs[SUB_REAL].zfd,ZT_HOOK,&func) == -1) && (errno != EINPROGRESS)) { ast_log(LOG_WARNING, "Unable to flash external trunk on channel %s: %s\n", @@ -4292,11 +4221,7 @@ static int handle_init_event(struct zt_pvt *i, int event) chan = zt_new(i, AST_STATE_DOWN, 0, SUB_REAL, 0); if (chan) { if (has_voicemail(i)) -#ifdef ZT_TONE_STUTTER - res = tone_zone_play_tone(i->subs[SUB_REAL].zfd, ZT_TONE_STUTTER); -#else res = tone_zone_play_tone(i->subs[SUB_REAL].zfd, ZT_TONE_DIALRECALL); -#endif else res = tone_zone_play_tone(i->subs[SUB_REAL].zfd, ZT_TONE_DIALTONE); if (res < 0) @@ -4466,7 +4391,7 @@ static void *do_monitor(void *data) /* Wait at least a second for something to happen */ tv.tv_sec = 1; tv.tv_usec = 0; - res = ast_select(n + 1, &rfds, NULL, &efds, &tv); + res = select(n + 1, &rfds, NULL, &efds, &tv); pthread_testcancel(); /* Okay, select has finished. Let's see what happened. */ if (res < 0) { @@ -4831,7 +4756,6 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio) pris[span].dchannel = dchannel; pris[span].minunused = minunused; pris[span].minidle = minidle; - pris[span].overlapdial = overlapdial; strncpy(pris[span].idledial, idledial, sizeof(pris[span].idledial) - 1); strncpy(pris[span].idleext, idleext, sizeof(pris[span].idleext) - 1); @@ -5352,7 +5276,7 @@ static void *pri_dchannel(void *vpri) fd_set efds; fd_set rfds; int res; - int chan = 0; + int chan; int x; int haveidles; int activeidles; @@ -5497,7 +5421,7 @@ static void *pri_dchannel(void *vpri) pthread_mutex_unlock(&pri->lock); e = NULL; - res = ast_select(pri->fd + 1, &rfds, NULL, &efds, &tv); + res = select(pri->fd + 1, &rfds, NULL, &efds, &tv); ast_pthread_mutex_lock(&pri->lock); if (!res) { @@ -5592,11 +5516,8 @@ static void *pri_dchannel(void *vpri) strcpy(pri->pvt[chan]->callerid, ""); strncpy(pri->pvt[chan]->rdnis, e->ring.redirectingnum, sizeof(pri->pvt[chan]->rdnis)); } - /* If immediate=yes go to s|1 */ - if (pri->pvt[chan]->immediate) - strcpy(pri->pvt[chan]->exten, "s"); /* Get called number */ - else if (strlen(e->ring.callednum)) { + if (strlen(e->ring.callednum)) { strncpy(pri->pvt[chan]->exten, e->ring.callednum, sizeof(pri->pvt[chan]->exten)-1); } #if 0 @@ -5605,25 +5526,10 @@ static void *pri_dchannel(void *vpri) #endif else strcpy(pri->pvt[chan]->exten, ""); - /* queue DTMF frame if the PBX for this call was already started (we're forwarding INFORMATION further on */ - if (pri->overlapdial && pri->pvt[chan]->call==e->ring.call && pri->pvt[chan]->owner) { - /* how to do that */ - char digit = e->ring.callednum[strlen(e->ring.callednum)-1]; - struct ast_frame f = { AST_FRAME_DTMF, digit, }; - /* make sure that we store the right number in CDR */ - if (pri->pvt[chan]->owner->cdr) - strncat(pri->pvt[chan]->owner->cdr->dst,&digit,1); - ast_queue_frame(pri->pvt[chan]->owner, &f, 0); - } /* Make sure extension exists */ - /* If extensions is empty then make sure we send later on SETUP_ACKNOWLEDGE to get digits in overlap mode */ - else if (strlen(pri->pvt[chan]->exten) && ast_exists_extension(NULL, pri->pvt[chan]->context, pri->pvt[chan]->exten, 1, pri->pvt[chan]->callerid)) { + if (strlen(pri->pvt[chan]->exten) && ast_exists_extension(NULL, pri->pvt[chan]->context, pri->pvt[chan]->exten, 1, pri->pvt[chan]->callerid)) { /* Setup law */ int law; - /* Set to audio mode at this poitn mode */ - law = 1; - if (ioctl(pri->pvt[chan]->subs[SUB_REAL].zfd, ZT_AUDIOMODE, &law) == -1) - ast_log(LOG_WARNING, "Unable to set audio mode on channel %d to %d\n", pri->pvt[chan]->channel, law); if (e->ring.layer1 == PRI_LAYER_1_ALAW) law = ZT_LAW_ALAW; else @@ -5641,13 +5547,7 @@ static void *pri_dchannel(void *vpri) if (option_verbose > 2) ast_verbose(VERBOSE_PREFIX_3 "Accepting call from '%s' to '%s' on channel %d, span %d\n", e->ring.callingnum, pri->pvt[chan]->exten, chan, pri->span); - if (!pri->overlapdial) { - pri_acknowledge(pri->pri, e->ring.call, chan, 1); - } - /* If we got here directly and didn't send the SETUP_ACKNOWLEDGE we need to send it otherwise we don't sent anything */ - else if (e->e==PRI_EVENT_RING) { - pri_need_more_info(pri->pri, e->ring.call, chan, 1); - } + pri_acknowledge(pri->pri, e->ring.call, chan, 1); zt_enable_ec(pri->pvt[chan]); } else { ast_log(LOG_WARNING, "Unable to start PBX on channel %d, span %d\n", chan, pri->span); @@ -5657,11 +5557,11 @@ static void *pri_dchannel(void *vpri) } else { if (!strlen(pri->pvt[chan]->exten) || ast_matchmore_extension(NULL, pri->pvt[chan]->context, pri->pvt[chan]->exten, 1, pri->pvt[chan]->callerid)) { - /* Send SETUP_ACKNOWLEDGE only when we receive SETUP, don't send if we got INFORMATION */ if (e->e==PRI_EVENT_RING) pri_need_more_info(pri->pri, e->ring.call, chan, 1); } else { if (option_verbose > 2) - ast_verbose(VERBOSE_PREFIX_3 "Extension '%s' in context '%s' from '%s' does not exist. Rejecting call on channel %d, span %d\n",pri->pvt[chan]->exten, pri->pvt[chan]->context, pri->pvt[chan]->callerid, chan, pri->span); + ast_verbose(VERBOSE_PREFIX_3 "Extension '%s' in context '%s' from '%s' does not exist. Rejecting call on channel %d, span %d\n", + pri->pvt[chan]->exten, pri->pvt[chan]->context, pri->pvt[chan]->callerid, chan, pri->span); pri_release(pri->pri, e->ring.call, PRI_CAUSE_UNALLOCATED); } } @@ -5685,34 +5585,10 @@ static void *pri_dchannel(void *vpri) } else if (!strlen(pri->pvt[chan]->dop.dialstr)) { zt_enable_ec(pri->pvt[chan]); pri->pvt[chan]->subs[SUB_REAL].needringing =1; -#ifdef PRI_EVENT_PROCEEDING - pri->pvt[chan]->proceeding=1; -#endif } else ast_log(LOG_DEBUG, "Deferring ringing notification because of extra digits to dial...\n"); } -#ifndef PRI_EVENT_PROCEEDING break; -#else - /* Fall through */ - if (!chan) break; -#endif -#ifdef PRI_EVENT_PROCEEDING - case PRI_EVENT_PROCEEDING: - /* Get chan value if e->e is not PRI_EVNT_RINGING */ - if (e->e == PRI_EVENT_PROCEEDING) - chan = e->proceeding.channel; - if ((chan >= 1) && (chan <= pri->channels)) - if (pri->pvt[chan] && pri->overlapdial && !pri->pvt[chan]->proceeding) { - struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_PROGRESS, }; - ast_log(LOG_DEBUG, "queling frame from PRI_EVENT_PROCEEDING on channel %d span %d\n",chan,pri->pvt[chan]->span); - ast_queue_frame(pri->pvt[chan]->owner, &f, 0); - - pri->pvt[chan]->proceeding=1; - } - - break; -#endif case PRI_EVENT_FACNAME: chan = e->facname.channel; if ((chan < 1) || (chan > pri->channels)) { @@ -5873,18 +5749,14 @@ static void *pri_dchannel(void *vpri) } } break; -#ifdef PRI_EVENT_SETUP_ACK - case PRI_EVENT_SETUP_ACK: - chan = e->setup_ack.channel; - if ((chan < 1) || (chan > pri->channels)) { - ast_log(LOG_WARNING, "Received SETUP_ACKNOWLEDGE on strange channel %d span %d\n", chan, pri->span); - } else if (!pri->pvt[chan]) { - ast_log(LOG_WARNING, "Received SETUP_ACKNOWLEDGE on unconfigured channel %d span %d\n", chan, pri->span); - } else { - pri->pvt[chan]->setup_ack = 1; - } +#ifdef PRI_EVENT_PROCEEDING + case PRI_EVENT_PROCEEDING: + chan = e->proceeding.channel; + if ((chan >= 1) && (chan <= pri->channels)) + if (pri->pvt[chan]) + pri->pvt[chan]->proceeding=1; break; -#endif +#endif default: ast_log(LOG_DEBUG, "Event: %d\n", e->e); } @@ -5946,9 +5818,6 @@ static int start_pri(struct zt_pri *pri) ast_log(LOG_ERROR, "Unable to create PRI structure\n"); return -1; } -#ifdef PRI_SET_OVERLAPDIAL - pri_set_overlapdial(pri->pri,pri->overlapdial); -#endif pri_set_debug(pri->pri, DEFAULT_PRI_DEBUG); if (pthread_create(&pri->master, NULL, pri_dchannel, pri)) { close(pri->fd); @@ -6251,13 +6120,6 @@ static int zap_show_channel(int fd, int argc, char **argv) } else { ast_cli(fd, "Actual Confinfo: Num/%d, Mode/0x%04x\n", ci.confno, ci.confmode); } -#ifdef ZT_GETCONFMUTE - if (ioctl(tmp->subs[SUB_REAL].zfd, ZT_GETCONFMUTE, &x)) { - ast_log(LOG_WARNING, "Failed to get confmute info on channel %d\n", tmp->channel); - } else { - ast_cli(fd, "Actual Confmute: %s\n", x ? "Yes" : "No"); - } -#endif ast_pthread_mutex_unlock(&iflock); return RESULT_SUCCESS; } @@ -6610,8 +6472,6 @@ int load_module() strncpy(idleext, v->value, sizeof(idleext) - 1); } else if (!strcasecmp(v->name, "idledial")) { strncpy(idledial, v->value, sizeof(idledial) - 1); - } else if (!strcasecmp(v->name, "overlapdial")) { - overlapdial = ast_true(v->value); #endif } else ast_log(LOG_WARNING, "Ignoring %s\n", v->name); @@ -7089,7 +6949,7 @@ static int zt_sendtext(struct ast_channel *c, char *text) FD_ZERO(&efds); FD_SET(fd,&wfds); FD_SET(fd,&efds); - res = ast_select(fd + 1,NULL,&wfds,&efds,NULL); + res = select(fd + 1,NULL,&wfds,&efds,NULL); if (!res) { ast_log(LOG_DEBUG, "select (for write) ret. 0 on channel %d\n", p->channel); continue;