diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2016-08-21 10:01:37 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2016-10-02 09:06:04 +0200 |
commit | ad3c88e064aa4696affa2e1c69141117a533497e (patch) | |
tree | e2a1048497eb2a9cf551510461528f1f930aa0ce | |
parent | 17930af9203be9b05a3483750fb3fe8c764d81a0 (diff) |
AMPS: Callref is moved completely to transaction object
-rw-r--r-- | src/amps/amps.c | 95 | ||||
-rw-r--r-- | src/amps/amps.h | 1 | ||||
-rw-r--r-- | src/amps/dsp.c | 4 | ||||
-rw-r--r-- | src/amps/transaction.c | 19 | ||||
-rw-r--r-- | src/amps/transaction.h | 3 |
5 files changed, 56 insertions, 66 deletions
diff --git a/src/amps/amps.c b/src/amps/amps.c index cb85856..e427954 100644 --- a/src/amps/amps.c +++ b/src/amps/amps.c @@ -468,16 +468,16 @@ static void amps_go_idle(amps_t *amps) { int frame_length; - if (amps->sender.callref) { - PDEBUG(DAMPS, DEBUG_ERROR, "Releasing but still having callref, please fix!\n"); - call_in_release(amps->sender.callref, CAUSE_NORMAL); - amps->sender.callref = 0; - } - - /* do not touch control channel */ if (amps->state == STATE_IDLE) return; + if (amps->trans_list) { + PDEBUG(DAMPS, DEBUG_ERROR, "Releasing but still having transaction, please fix!\n"); + if (amps->trans_list->callref) + call_in_release(amps->trans_list->callref, CAUSE_NORMAL); + destroy_transaction(amps->trans_list); + } + PDEBUG(DAMPS, DEBUG_INFO, "Entering IDLE state, sending Overhead/Filler frames on %s.\n", chan_type_long_name(amps->chan_type)); if (amps->sender.loopback) frame_length = 441; /* bits after sync (FOCC) */ @@ -500,9 +500,9 @@ static void amps_release(transaction_t *trans, uint8_t cause) trans->ordq = 0; trans->order = 3; /* release towards call control */ - if (amps->sender.callref) { - call_in_release(amps->sender.callref, cause); - amps->sender.callref = 0; + if (trans->callref) { + call_in_release(trans->callref, cause); + trans->callref = 0; } /* change DSP mode to transmit release */ if (amps->dsp_mode == DSP_MODE_AUDIO_RX_AUDIO_TX) @@ -534,16 +534,16 @@ void amps_rx_signaling_tone(amps_t *amps, int tone, double quality) break; timer_stop(&trans->timer); destroy_transaction(trans); - if (amps->sender.callref) { - call_in_release(amps->sender.callref, CAUSE_NORMAL); - amps->sender.callref = 0; + if (trans->callref) { + call_in_release(trans->callref, CAUSE_NORMAL); + trans->callref = 0; } amps_go_idle(amps); break; case TRANS_CALL_MT_ALERT: if (tone) { timer_stop(&trans->timer); - call_in_alerting(amps->sender.callref); + call_in_alerting(trans->callref); amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_AUDIO_TX, 0); trans_new_state(trans, TRANS_CALL_MT_ALERT_SEND); timer_start(&trans->timer, ALERT_TO); @@ -554,7 +554,7 @@ void amps_rx_signaling_tone(amps_t *amps, int tone, double quality) timer_stop(&trans->timer); if (!trans->sat_detected) timer_start(&trans->timer, SAT_TO1); - call_in_answer(amps->sender.callref, amps_min2number(trans->min1, trans->min2)); + call_in_answer(trans->callref, amps_min2number(trans->min1, trans->min2)); trans_new_state(trans, TRANS_CALL); } break; @@ -759,16 +759,13 @@ inval: PDEBUG(DAMPS, DEBUG_INFO, "Call to mobile station, paging station id '%s'\n", dialing); /* 6. trying to page mobile station */ -#warning FIXME: Move callref to transaction, similar to the cnetz base station - amps->sender.callref = callref; - trans = create_transaction(amps, TRANS_PAGE, min1, min2, 0, 0, 0, 0); if (!trans) { PDEBUG(DAMPS, DEBUG_ERROR, "Failed to create transaction\n"); - sender->callref = 0; return -CAUSE_TEMPFAIL; } - amps->page_retry = 1; + trans->callref = callref; + trans->page_retry = 1; return 0; } @@ -787,7 +784,9 @@ void call_out_disconnect(int callref, int cause) for (sender = sender_head; sender; sender = sender->next) { amps = (amps_t *) sender; - if (sender->callref == callref) + /* search transaction for this callref */ + trans = search_transaction_callref(amps, callref); + if (trans) break; } if (!sender) { @@ -796,23 +795,6 @@ void call_out_disconnect(int callref, int cause) return; } -#if 0 - dont use this, because busy state is only entered when channel is actually used for voice - if (amps->state != STATE_BUSY) { - PDEBUG(DAMPS, DEBUG_NOTICE, "Outgoing disconnect, but sender is not in busy state.\n"); - call_in_release(callref, cause); - sender->callref = 0; - return; - } -#endif - - trans = amps->trans_list; - if (!trans) { - call_in_release(callref, cause); - sender->callref = 0; - return; - } - /* Release when not active */ switch (amps->dsp_mode) { @@ -827,7 +809,7 @@ void call_out_disconnect(int callref, int cause) default: PDEBUG(DAMPS, DEBUG_INFO, "Call control disconnects on control channel, removing transaction.\n"); call_in_release(callref, cause); - sender->callref = 0; + trans->callref = 0; destroy_transaction(trans); amps_go_idle(amps); } @@ -844,7 +826,9 @@ void call_out_release(int callref, int cause) for (sender = sender_head; sender; sender = sender->next) { amps = (amps_t *) sender; - if (sender->callref == callref) + /* search transaction for this callref */ + trans = search_transaction_callref(amps, callref); + if (trans) break; } if (!sender) { @@ -853,19 +837,7 @@ void call_out_release(int callref, int cause) return; } - sender->callref = 0; - -#if 0 - dont use this, because busy state is only entered when channel is actually used for voice - if (amps->state != STATE_BUSY) { - PDEBUG(DAMPS, DEBUG_NOTICE, "Outgoing release, but sender is not in busy state.\n"); - return; - } -#endif - - trans = amps->trans_list; - if (!trans) - return; + trans->callref = 0; switch (amps->dsp_mode) { case DSP_MODE_AUDIO_RX_AUDIO_TX: @@ -888,7 +860,7 @@ void call_rx_audio(int callref, int16_t *samples, int count) for (sender = sender_head; sender; sender = sender->next) { amps = (amps_t *) sender; - if (sender->callref == callref) + if (amps->trans_list && amps->trans_list->callref == callref) break; } if (!sender) @@ -926,7 +898,7 @@ void transaction_timeout(struct timer *timer) amps_release(trans, CAUSE_NOANSWER); break; case TRANS_PAGE_REPLY: - if (amps->page_retry++ == PAGE_TRIES) { + if (trans->page_retry++ == PAGE_TRIES) { PDEBUG(DAMPS, DEBUG_NOTICE, "Paging timeout, destroying transaction\n"); amps_release(trans, CAUSE_OUTOFORDER); } else { @@ -954,14 +926,11 @@ static void assign_voice_channel(transaction_t *trans) return; } - if (vc == amps) { + if (vc == amps) PDEBUG(DAMPS, DEBUG_INFO, "Staying on combined control + voice channel %d\n", vc->sender.kanal); - } else { + else PDEBUG(DAMPS, DEBUG_INFO, "Moving to traffic channel %d\n", vc->sender.kanal); - vc->sender.callref = amps->sender.callref; - amps->sender.callref = 0; - } - if (!vc->sender.callref) { + if (!trans->callref) { /* setup call */ PDEBUG(DAMPS, DEBUG_INFO, "Setup call to network.\n"); rc = call_in_setup(callref, callerid, trans->dialing); @@ -970,7 +939,7 @@ static void assign_voice_channel(transaction_t *trans) amps_release(trans, 0); return; } - vc->sender.callref = callref; + trans->callref = callref; } timer_start(&trans->timer, SAT_TO1); /* make channel busy */ @@ -1034,7 +1003,7 @@ again: return trans; case TRANS_PAGE_SEND: trans_new_state(trans, TRANS_PAGE_REPLY); - timer_start(&trans->timer, (amps->page_retry == PAGE_TRIES) ? PAGE_TO2 : PAGE_TO1); + timer_start(&trans->timer, (trans->page_retry == PAGE_TRIES) ? PAGE_TO2 : PAGE_TO1); return NULL; default: return NULL; diff --git a/src/amps/amps.h b/src/amps/amps.h index ec804fe..3509015 100644 --- a/src/amps/amps.h +++ b/src/amps/amps.h @@ -43,7 +43,6 @@ typedef struct amps { /* sender's states */ enum amps_chan_type chan_type; enum amps_state state; - int page_retry; /* current number of paging (re)try */ int channel_busy; /* indicate channel is busy while receiving */ /* system info */ diff --git a/src/amps/dsp.c b/src/amps/dsp.c index 7668ff2..eb15d66 100644 --- a/src/amps/dsp.c +++ b/src/amps/dsp.c @@ -752,7 +752,7 @@ void sender_receive_audio(amps_t *amps, int16_t *samples, int length) /* receive audio, but only if call established and SAT detected */ if ((amps->dsp_mode == DSP_MODE_AUDIO_RX_AUDIO_TX || amps->dsp_mode == DSP_MODE_AUDIO_RX_FRAME_TX) - && amps->sender.callref && trans && trans->sat_detected) { + && trans && trans->callref && trans->sat_detected) { int16_t down[length]; /* more than enough */ int pos, count; int16_t *spl; @@ -769,7 +769,7 @@ void sender_receive_audio(amps_t *amps, int16_t *samples, int length) for (i = 0; i < count; i++) { spl[pos++] = down[i]; if (pos == 160) { - call_tx_audio(amps->sender.callref, spl, 160); + call_tx_audio(trans->callref, spl, 160); pos = 0; } } diff --git a/src/amps/transaction.c b/src/amps/transaction.c index 5dbb1f3..b874f58 100644 --- a/src/amps/transaction.c +++ b/src/amps/transaction.c @@ -175,6 +175,25 @@ transaction_t *search_transaction_number(amps_t *amps, uint32_t min1, uint16_t m return NULL; } +transaction_t *search_transaction_callref(amps_t *amps, int callref) +{ + transaction_t *trans = amps->trans_list; + + /* just in case, this should not happen */ + if (!callref) + return NULL; + while (trans) { + if (trans->callref == callref) { + const char *number = amps_min2number(trans->min1, trans->min2); + PDEBUG(DTRANS, DEBUG_DEBUG, "Found transaction for subscriber '%s'\n", number); + return trans; + } + trans = trans->next; + } + + return NULL; +} + void trans_new_state(transaction_t *trans, int state) { PDEBUG(DTRANS, DEBUG_INFO, "Transaction state %s -> %s\n", trans_state_name(trans->state), trans_state_name(state)); diff --git a/src/amps/transaction.h b/src/amps/transaction.h index cc062b3..5240991 100644 --- a/src/amps/transaction.h +++ b/src/amps/transaction.h @@ -24,6 +24,8 @@ enum amps_trans_state { typedef struct transaction { struct transaction *next; /* pointer to next node in list */ amps_t *amps; /* pointer to amps instance */ + int callref; /* call reference */ + int page_retry; /* current number of paging (re)try */ uint32_t min1; /* current station ID (2 values) */ uint16_t min2; uint8_t msg_type; /* message type (3 values) */ @@ -42,6 +44,7 @@ void link_transaction(transaction_t *trans, amps_t *amps); void unlink_transaction(transaction_t *trans); transaction_t *search_transaction(amps_t *amps, uint32_t state_mask); transaction_t *search_transaction_number(amps_t *amps, uint32_t min1, uint16_t min2); +transaction_t *search_transaction_callref(amps_t *amps, int callref); void trans_new_state(transaction_t *trans, int state); void amps_flush_other_transactions(amps_t *amps, transaction_t *trans); void transaction_timeout(struct timer *timer); |