diff --git a/src/amps/amps.c b/src/amps/amps.c index 5d57d633..798f95ba 100644 --- a/src/amps/amps.c +++ b/src/amps/amps.c @@ -414,8 +414,6 @@ static amps_t *search_pc(void) return NULL; } -static void amps_go_idle(amps_t *amps); - /* Create transceiver instance and link to a list. */ int amps_create(int channel, enum amps_chan_type chan_type, const char *audiodev, int use_sdr, int samplerate, double rx_gain, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, amps_si *si, uint16_t sid, uint8_t sat, int polarity, int tolerant, int loopback) { @@ -555,7 +553,7 @@ void amps_destroy(sender_t *sender) } /* Abort connection towards mobile station by sending FOCC/FVC pattern. */ -static void amps_go_idle(amps_t *amps) +void amps_go_idle(amps_t *amps) { int frame_length; diff --git a/src/amps/amps.h b/src/amps/amps.h index 6243f742..4ba1f4d9 100644 --- a/src/amps/amps.h +++ b/src/amps/amps.h @@ -169,6 +169,7 @@ const char *amps_min2number(uint32_t min1, uint16_t min2); const char *amps_scm(uint8_t scm); int amps_create(int channel, enum amps_chan_type chan_type, const char *audiodev, int use_sdr, int samplerate, double rx_gain, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, amps_si *si, uint16_t sid, uint8_t sat, int polarity, int tolerant, int loopback); void amps_destroy(sender_t *sender); +void amps_go_idle(amps_t *amps); void amps_rx_signaling_tone(amps_t *amps, int tone, double quality); void amps_rx_sat(amps_t *amps, int tone, double quality); void amps_rx_recc(amps_t *amps, uint8_t scm, uint8_t mpci, uint32_t esn, uint32_t min1, uint16_t min2, uint8_t msg_type, uint8_t ordq, uint8_t order, const char *dialing); diff --git a/src/amps/transaction.c b/src/amps/transaction.c index eac29e47..d5e79764 100644 --- a/src/amps/transaction.c +++ b/src/amps/transaction.c @@ -23,6 +23,8 @@ #include "../common/sample.h" #include "../common/debug.h" #include "../common/timer.h" +#include "../common/call.h" +#include "../common/cause.h" #include "amps.h" //#include "database.h" @@ -104,14 +106,28 @@ const char *trans_short_state_name(int state) /* create transaction */ transaction_t *create_transaction(amps_t *amps, enum amps_trans_state state, uint32_t min1, uint16_t min2, uint8_t msg_type, uint8_t ordq, uint8_t order, uint16_t chan) { - transaction_t *trans; + sender_t *sender; + transaction_t *trans = NULL; + amps_t *search_amps; /* search transaction for this subsriber */ - trans = search_transaction_number(amps, min1, min2); + for (sender = sender_head; sender; sender = sender->next) { + search_amps = (amps_t *) sender; + /* search transaction for this callref */ + trans = search_transaction_number(search_amps, min1, min2); + if (trans) + break; + } if (trans) { const char *number = amps_min2number(trans->min1, trans->min2); + int old_callref = trans->callref; + amps_t *old_amps = trans->amps; PDEBUG(DTRANS, DEBUG_NOTICE, "Found alredy pending transaction for subscriber '%s', deleting!\n", number); destroy_transaction(trans); + if (old_amps) /* should be... */ + amps_go_idle(old_amps); + if (old_callref) + call_in_release(old_callref, CAUSE_NORMAL); } trans = calloc(1, sizeof(*trans)); @@ -131,22 +147,16 @@ transaction_t *create_transaction(amps_t *amps, enum amps_trans_state state, uin trans->chan = chan; const char *number = amps_min2number(trans->min1, trans->min2); - PDEBUG(DTRANS, DEBUG_INFO, "Created transaction '%s' for subscriber '%s'\n", number, trans_state_name(state)); + PDEBUG(DTRANS, DEBUG_INFO, "Created transaction for subscriber '%s'\n", number); link_transaction(trans, amps); - /* update database: now busy */ -// update_db(amps, min1, min2, 1, 0); - return trans; } /* destroy transaction */ void destroy_transaction(transaction_t *trans) { - /* update database: now idle */ -// update_db(trans->amps, trans->min1, trans->min2, 0, trans->ma_failed); - unlink_transaction(trans); const char *number = amps_min2number(trans->min1, trans->min2); diff --git a/src/cnetz/cnetz.c b/src/cnetz/cnetz.c index 55638418..c51c5e07 100644 --- a/src/cnetz/cnetz.c +++ b/src/cnetz/cnetz.c @@ -230,8 +230,6 @@ int cnetz_init(void) return 0; } -static void cnetz_go_idle(cnetz_t *cnetz); - /* Create transceiver instance and link to a list. */ int cnetz_create(int kanal, enum cnetz_chan_type chan_type, const char *audiodev, int use_sdr, enum demod_type demod, int samplerate, double rx_gain, int auth, int ms_power, int measure_speed, double clock_speed[2], int polarity, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, int loopback) { @@ -412,7 +410,7 @@ void cnetz_destroy(sender_t *sender) } /* Abort connection, if any and send idle broadcast */ -static void cnetz_go_idle(cnetz_t *cnetz) +void cnetz_go_idle(cnetz_t *cnetz) { if (cnetz->state == CNETZ_IDLE) return; diff --git a/src/cnetz/cnetz.h b/src/cnetz/cnetz.h index 4f0bebe9..ed73831f 100644 --- a/src/cnetz/cnetz.h +++ b/src/cnetz/cnetz.h @@ -129,6 +129,7 @@ const char *chan_type_long_name(enum cnetz_chan_type chan_type); int cnetz_init(void); int cnetz_create(int kanal, enum cnetz_chan_type chan_type, const char *audiodev, int use_sdr, enum demod_type demod, int samplerate, double rx_gain, int auth, int ms_power, int measure_speed, double clock_speed[2], int polarity, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, int loopback); void cnetz_destroy(sender_t *sender); +void cnetz_go_idle(cnetz_t *cnetz); void cnetz_sync_frame(cnetz_t *cnetz, double sync, int ts); int cnetz_meldeaufruf(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest); const struct telegramm *cnetz_transmit_telegramm_rufblock(cnetz_t *cnetz); diff --git a/src/cnetz/transaction.c b/src/cnetz/transaction.c index b37a0147..e63a6bf7 100644 --- a/src/cnetz/transaction.c +++ b/src/cnetz/transaction.c @@ -23,6 +23,8 @@ #include "../common/sample.h" #include "../common/debug.h" #include "../common/timer.h" +#include "../common/call.h" +#include "../common/cause.h" #include "cnetz.h" #include "telegramm.h" #include "database.h" @@ -39,14 +41,28 @@ const char *transaction2rufnummer(transaction_t *trans) /* create transaction */ transaction_t *create_transaction(cnetz_t *cnetz, uint32_t state, uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest, int extended) { - transaction_t *trans; + sender_t *sender; + transaction_t *trans = NULL; + cnetz_t *search_cnetz; /* search transaction for this subsriber */ - trans = search_transaction_number(cnetz, futln_nat, futln_fuvst, futln_rest); + for (sender = sender_head; sender; sender = sender->next) { + search_cnetz = (cnetz_t *) sender; + /* search transaction for this callref */ + trans = search_transaction_number(search_cnetz, futln_nat, futln_fuvst, futln_rest); + if (trans) + break; + } if (trans) { const char *rufnummer = transaction2rufnummer(trans); + int old_callref = trans->callref; + cnetz_t *old_cnetz = trans->cnetz; PDEBUG(DTRANS, DEBUG_NOTICE, "Found alredy pending transaction for subscriber '%s', deleting!\n", rufnummer); destroy_transaction(trans); + if (old_cnetz) /* should be... */ + cnetz_go_idle(old_cnetz); + if (old_callref) + call_in_release(old_callref, CAUSE_NORMAL); } trans = calloc(1, sizeof(*trans));