diff options
Diffstat (limited to 'src/cnetz')
-rw-r--r-- | src/cnetz/cnetz.c | 4 | ||||
-rw-r--r-- | src/cnetz/cnetz.h | 1 | ||||
-rw-r--r-- | src/cnetz/transaction.c | 20 |
3 files changed, 20 insertions, 5 deletions
diff --git a/src/cnetz/cnetz.c b/src/cnetz/cnetz.c index 5563841..c51c5e0 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 4f0bebe..ed73831 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 b37a014..e63a6bf 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)); |