diff --git a/src/pstn/pstn.c b/src/pstn/pstn.c index 66389da..d3ea313 100644 --- a/src/pstn/pstn.c +++ b/src/pstn/pstn.c @@ -1411,17 +1411,34 @@ static void swap_active_hold(pstn_t *pstn) /* process hookflash from various events: short hangup, off-hook-pulse, pulse digit 1 ... */ static void hookflash(pstn_t *pstn) { + /* hookflash: no connected call, no call on hold */ + if (pstn->call[PSTN_CALL_ACTIVE]->state != CALL_STATE_ACTIVE + && !pstn->call[PSTN_CALL_HOLD]->cc_callref) { + PDEBUG(DTEL, DEBUG_INFO, "There is an active call that is not connected, but no call on hold, ignoring hookflash.\n"); + return; + } + + /* stop timer */ + timer_off(pstn); /* stop tone (CW tone) */ tone_off(pstn); /* clear dialing */ pstn->dialing[0] = '\0'; + /* release incomplete call, if any */ + if (pstn->call[PSTN_CALL_ACTIVE]->state != CALL_STATE_ACTIVE) { + PDEBUG(DTEL, DEBUG_INFO, "There is an active call that is not connected, release it.\n"); + /* release active call that is not connectd */ + release_call(pstn, PSTN_CALL_ACTIVE, OSMO_CC_ISDN_CAUSE_NORM_CALL_CLEAR); + } /* if call on hold, swap calls */ if (pstn->call[PSTN_CALL_HOLD]->cc_callref) { PDEBUG(DTEL, DEBUG_INFO, "There is a call on hold, so swap both calls.\n"); /* swap ACTIVE call and call on HOLD */ swap_active_hold(pstn); - /* send notify to call on hold */ - notify_ind(pstn->call[PSTN_CALL_HOLD], OSMO_CC_NOTIFY_REMOTE_HOLD); + if (pstn->call[PSTN_CALL_HOLD]->cc_callref) { + /* send notify to call on hold */ + notify_ind(pstn->call[PSTN_CALL_HOLD], OSMO_CC_NOTIFY_REMOTE_HOLD); + } /* if waiting call, answer it */ if (pstn->call[PSTN_CALL_ACTIVE]->state != CALL_STATE_ACTIVE && pstn->call[PSTN_CALL_ACTIVE]->state != CALL_STATE_HOLD) { @@ -1430,7 +1447,8 @@ static void hookflash(pstn_t *pstn) } /* change state */ pstn_call_state(pstn->call[PSTN_CALL_ACTIVE], CALL_STATE_ACTIVE); - pstn_call_state(pstn->call[PSTN_CALL_HOLD], CALL_STATE_HOLD); + if (pstn->call[PSTN_CALL_HOLD]->cc_callref) + pstn_call_state(pstn->call[PSTN_CALL_HOLD], CALL_STATE_HOLD); /* send notify to active call */ notify_ind(pstn->call[PSTN_CALL_ACTIVE], OSMO_CC_NOTIFY_REMOTE_RETRIEVAL); return;