diff --git a/src/cnetz/cnetz.c b/src/cnetz/cnetz.c index a769ae6..21572ca 100644 --- a/src/cnetz/cnetz.c +++ b/src/cnetz/cnetz.c @@ -124,14 +124,20 @@ int cnetz_create(int kanal, enum cnetz_chan_type chan_type, const char *sounddev cnetz_t *cnetz; int rc; - if ((kanal & 1) && kanal < 1 && kanal > 947) { + if ((kanal & 1) && kanal < 1 && kanal > 1147) { PDEBUG(DCNETZ, DEBUG_ERROR, "Channel ('Kanal') number %d invalid.\n", kanal); return -EINVAL; } - if (!(kanal & 1) && kanal < 2 && kanal > 758) { + if ((kanal & 1) && kanal > 947) { + PDEBUG(DCNETZ, DEBUG_NOTICE, "You defined an extended frequency %d, only newer phones support this!\n", kanal); + } + if (!(kanal & 1) && kanal < 2 && kanal > 918) { PDEBUG(DCNETZ, DEBUG_ERROR, "Channel ('Kanal') number %d invalid.\n", kanal); return -EINVAL; } + if (!(kanal & 1) && kanal > 758) { + PDEBUG(DCNETZ, DEBUG_NOTICE, "You defined an extended frequency %d, only newer phones support this!\n", kanal); + } if (kanal == 1 || kanal == 2) { PDEBUG(DCNETZ, DEBUG_NOTICE, "Channel ('Kanal') number %d is specified as 'unused', it might not work!\n", kanal); } @@ -232,13 +238,13 @@ int cnetz_create(int kanal, enum cnetz_chan_type chan_type, const char *sounddev cnetz_go_idle(cnetz); #ifdef DEBUG_SPK - transaction_t *trans = create_transaction(cnetz, TRANS_DS, 2, 2, 22002); + transaction_t *trans = create_transaction(cnetz, TRANS_DS, 2, 2, 22002, -1); trans->mo_call = 1; cnetz_set_sched_dsp_mode(cnetz, DSP_MODE_SPK_K, 2); #else /* create transaction for speech channel loopback */ if (loopback && chan_type == CHAN_TYPE_SPK) { - transaction_t *trans = create_transaction(cnetz, TRANS_VHQ, 2, 2, 22002); + transaction_t *trans = create_transaction(cnetz, TRANS_VHQ, 2, 2, 22002, -1); trans->mo_call = 1; cnetz_set_dsp_mode(cnetz, DSP_MODE_SPK_K); cnetz_set_sched_dsp_mode(cnetz, DSP_MODE_SPK_K, 0); @@ -248,16 +254,16 @@ int cnetz_create(int kanal, enum cnetz_chan_type chan_type, const char *sounddev #if 0 /* debug flushing transactions */ transaction_t *trans1, *trans2; - trans1 = create_transaction(cnetz, 99, 6, 2, 15784); + trans1 = create_transaction(cnetz, 99, 6, 2, 15784, -1); destroy_transaction(trans1); - trans1 = create_transaction(cnetz, 99, 6, 2, 15784); + trans1 = create_transaction(cnetz, 99, 6, 2, 15784, -1); destroy_transaction(trans1); - trans1 = create_transaction(cnetz, 99, 6, 2, 15784); - trans2 = create_transaction(cnetz, 99, 2, 2, 22002); + trans1 = create_transaction(cnetz, 99, 6, 2, 15784, -1); + trans2 = create_transaction(cnetz, 99, 2, 2, 22002, -1); unlink_transaction(trans1); link_transaction(trans1, cnetz); cnetz_flush_other_transactions(cnetz, trans1); - trans2 = create_transaction(cnetz, 99, 2, 2, 22002); + trans2 = create_transaction(cnetz, 99, 2, 2, 22002, -1); cnetz_flush_other_transactions(cnetz, trans2); #endif @@ -340,13 +346,20 @@ void call_rx_audio(int callref, int16_t *samples, int count) } } -cnetz_t *search_free_spk(void) +cnetz_t *search_free_spk(int extended) { sender_t *sender; cnetz_t *cnetz, *ogk_spk = NULL; for (sender = sender_head; sender; sender = sender->next) { cnetz = (cnetz_t *) sender; + /* ignore extended frequency, if not supported */ + if (!extended) { + if ((sender->kanal & 1) && sender->kanal > 947) + continue; + if (!(sender->kanal & 1) && sender->kanal > 758) + continue; + } /* ignore busy channel */ if (cnetz->state != CNETZ_IDLE) continue; @@ -431,7 +444,7 @@ inval: } /* 4. check if all senders are busy, return NOCHANNEL */ - if (!search_free_spk()) { + if (!search_free_spk(1)) { // FIXME: maybe lookup database for extended frequency band before calling subscriber PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing call, but no free channel, rejecting!\n"); return -CAUSE_NOCHANNEL; } @@ -446,7 +459,7 @@ inval: PDEBUG(DCNETZ, DEBUG_INFO, "Call to mobile station, paging station id '%s'\n", dialing); /* 6. trying to page mobile station */ - trans = create_transaction(cnetz, TRANS_VAK, dialing[0] - '0', dialing[1] - '0', atoi(dialing + 2)); + trans = create_transaction(cnetz, TRANS_VAK, dialing[0] - '0', dialing[1] - '0', atoi(dialing + 2), -1); if (!trans) { PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n"); sender->callref = 0; @@ -584,7 +597,7 @@ int cnetz_meldeaufruf(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_res PDEBUG(DCNETZ, DEBUG_NOTICE, "'Meldeaufruf', but OgK is currently busy!\n"); return -CAUSE_NOCHANNEL; } - trans = create_transaction(cnetz, TRANS_MA, futln_nat, futln_fuvst, futln_rest); + trans = create_transaction(cnetz, TRANS_MA, futln_nat, futln_fuvst, futln_rest, -1); if (!trans) { PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n"); return -CAUSE_TEMPFAIL; @@ -815,7 +828,7 @@ wbn: cnetz_go_idle(cnetz); break; case TRANS_WBP: - spk = search_free_spk(); + spk = search_free_spk(trans->extended); if (!spk) { PDEBUG(DCNETZ, DEBUG_NOTICE, "No free channel anymore, rejecting call!\n"); goto wbn; @@ -837,7 +850,7 @@ wbn: trans->repeat = 0; timer_start(&trans->timer, 0.150 + 0.0375 * F_BQ); /* two slots + F_BQ frames */ /* select channel */ - spk = search_free_spk(); + spk = search_free_spk(trans->extended); if (!spk) { PDEBUG(DCNETZ, DEBUG_NOTICE, "No free channel anymore, rejecting call!\n"); destroy_transaction(trans); @@ -933,11 +946,13 @@ void cnetz_receive_telegramm_ogk(cnetz_t *cnetz, telegramm_t *telegramm, int blo PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received Attachment 'Einbuchen' message from Subscriber '%s' with chip card's ID %d (vendor id %d, hardware version %d, software version %d)\n", rufnummer, telegramm->kartenkennung, telegramm->herstellerkennung, telegramm->hardware_des_futelg, telegramm->software_des_futelg); else PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received Attachment 'Einbuchen' message from Subscriber '%s' with %s card's security code %d\n", rufnummer, (telegramm->chipkarten_futelg_bit) ? "chip":"magnet", telegramm->sicherungs_code); + if (telegramm->erweitertes_frequenzbandbit) + PDEBUG(DCNETZ, DEBUG_INFO, " -> Phone support extended frequency band\n"); if (cnetz->state != CNETZ_IDLE) { PDEBUG(DCNETZ, DEBUG_NOTICE, "Ignoring Attachment from subscriber '%s', because we are busy becoming SpK.\n", rufnummer); break; } - trans = create_transaction(cnetz, TRANS_EM, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr); + trans = create_transaction(cnetz, TRANS_EM, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr, telegramm->erweitertes_frequenzbandbit); if (!trans) { PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n"); break; @@ -952,11 +967,13 @@ void cnetz_receive_telegramm_ogk(cnetz_t *cnetz, telegramm_t *telegramm, int blo PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received Roaming 'Umbuchen' message from Subscriber '%s' with chip card's ID %d (vendor id %d, hardware version %d, software version %d)\n", rufnummer, telegramm->kartenkennung, telegramm->herstellerkennung, telegramm->hardware_des_futelg, telegramm->software_des_futelg); else PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received Roaming 'Umbuchen' message from Subscriber '%s' with %s card's security code %d\n", rufnummer, (telegramm->chipkarten_futelg_bit) ? "chip":"magnet", telegramm->sicherungs_code); + if (telegramm->erweitertes_frequenzbandbit) + PDEBUG(DCNETZ, DEBUG_INFO, " -> Phone support extended frequency band\n"); if (cnetz->state != CNETZ_IDLE) { PDEBUG(DCNETZ, DEBUG_NOTICE, "Ignoring Roaming from subscriber '%s', because we are busy becoming SpK.\n", rufnummer); break; } - trans = create_transaction(cnetz, TRANS_UM, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr); + trans = create_transaction(cnetz, TRANS_UM, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr, telegramm->erweitertes_frequenzbandbit); if (!trans) { PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n"); break; @@ -973,15 +990,15 @@ void cnetz_receive_telegramm_ogk(cnetz_t *cnetz, telegramm_t *telegramm, int blo PDEBUG(DCNETZ, DEBUG_NOTICE, "Ignoring Call from subscriber '%s', because we are busy becoming SpK.\n", rufnummer); break; } - trans = create_transaction(cnetz, TRANS_VWG, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr); + trans = create_transaction(cnetz, TRANS_VWG, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr, -1); if (!trans) { PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n"); break; } trans->try = 1; - spk = search_free_spk(); + spk = search_free_spk(trans->extended); if (!spk) { - PDEBUG(DCNETZ, DEBUG_NOTICE, "Rejecting call from subscriber '%s', because we have no free channel.\n", rufnummer); + PDEBUG(DCNETZ, DEBUG_NOTICE, "Rejecting call from subscriber '%s', because we have no free channel. (or not supported by phone)\n", rufnummer); trans_new_state(trans, TRANS_WBN); break; } diff --git a/src/cnetz/database.c b/src/cnetz/database.c index b3a4cdb..b6f3325 100644 --- a/src/cnetz/database.c +++ b/src/cnetz/database.c @@ -35,6 +35,7 @@ typedef struct cnetz_database { uint8_t futln_nat; /* who ... */ uint8_t futln_fuvst; uint16_t futln_rest; + int extended; /* mobile supports extended frequencies */ struct timer timer; /* timer for next availability check */ int retry; /* counts number of retries */ } cnetz_db_t; @@ -83,7 +84,7 @@ static void db_timeout(struct timer *timer) } /* create/update db entry */ -void update_db(cnetz_t *cnetz, uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest, int busy, int failed) +int update_db(cnetz_t *cnetz, uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest, int extended, int busy, int failed) { cnetz_db_t *db, **dbp; @@ -100,7 +101,7 @@ void update_db(cnetz_t *cnetz, uint8_t futln_nat, uint8_t futln_fuvst, uint16_t db = calloc(1, sizeof(*db)); if (!db) { PDEBUG(DDB, DEBUG_ERROR, "No memory!\n"); - return; + return 0; } timer_init(&db->timer, db_timeout, db); @@ -117,6 +118,9 @@ void update_db(cnetz_t *cnetz, uint8_t futln_nat, uint8_t futln_fuvst, uint16_t PDEBUG(DDB, DEBUG_INFO, "Adding subscriber '%d,%d,%d' to database.\n", db->futln_nat, db->futln_fuvst, db->futln_rest); } + if (extended >= 0) + db->extended = extended; + if (busy) { PDEBUG(DDB, DEBUG_INFO, "Subscriber '%d,%d,%d' busy now.\n", db->futln_nat, db->futln_fuvst, db->futln_rest); timer_stop(&db->timer); @@ -129,10 +133,12 @@ void update_db(cnetz_t *cnetz, uint8_t futln_nat, uint8_t futln_fuvst, uint16_t PDEBUG(DDB, DEBUG_NOTICE, "Paging subscriber '%d,%d,%d' failed (try %d of %d).\n", db->futln_nat, db->futln_fuvst, db->futln_rest, db->retry, MELDE_MAXIMAL); if (db->retry == MELDE_MAXIMAL) { remove_db(db); - return; + return db->extended; } timer_start(&db->timer, MELDE_WIEDERHOLUNG); /* when to do retry */ } + + return db->extended; } int find_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest) diff --git a/src/cnetz/database.h b/src/cnetz/database.h index 5ee7c02..de0226c 100644 --- a/src/cnetz/database.h +++ b/src/cnetz/database.h @@ -1,5 +1,5 @@ -void update_db(cnetz_t *cnetz, uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest, int busy, int failed); +int update_db(cnetz_t *cnetz, uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest, int extended, int busy, int failed); int find_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest); void flush_db(void); void dump_db(void); diff --git a/src/cnetz/main.c b/src/cnetz/main.c index b962989..d6fed8e 100644 --- a/src/cnetz/main.c +++ b/src/cnetz/main.c @@ -246,7 +246,11 @@ int main(int argc, char *argv[]) scrambler_init(); init_sysinfo(); dsp_init(); - init_telegramm(); + rc = init_telegramm(); + if (rc < 0) { + fprintf(stderr, "Error in Telegramm structure. Quitting!\n"); + goto fail; + } init_coding(); cnetz_init(); rc = call_init(station_id, call_sounddev, samplerate, latency, 7, loopback); diff --git a/src/cnetz/telegramm.c b/src/cnetz/telegramm.c index e165fc3..91e2ec9 100644 --- a/src/cnetz/telegramm.c +++ b/src/cnetz/telegramm.c @@ -52,7 +52,7 @@ static const char *param_gespraechsende[] = { "bevorstehendes Gespraechsende", }; -static const char *param_frequenz[1024]; +static const char *param_frequenz[2048]; static const char *param_anpassen[] = { "Sendeleistung erhoehen", @@ -257,7 +257,7 @@ static struct definition_parameter { { 'H',"OgK-Vorschlag", 10, param_frequenz }, { 'I',"FuZ-Nationalitaet", 3, NULL }, { 'J',"Sendeleistungsanpassung", 1, param_anpassen }, - { 'K',"Frequenz-Nr.", 10, param_frequenz }, + { 'K',"Frequenz-Nr.", 11, param_frequenz }, { 'L',"Art der Signalisierung im OgK", 1, param_signalisierung }, { 'M',"OgK-Verkehrsanteil", 5, param_verkehrsanteil }, { 'N',"FuTln-Nationalitaet", 3, NULL }, @@ -294,9 +294,10 @@ static struct definition_parameter { { 't',"Test-Telefonteilnehmer-Geraet", 1, param_ja }, { 'u',"Grenzwert fuer Umschalten", 4, param_ausloesen }, { 'v',"Vermittlungtechnische Sperren", 2, param_sperren }, + { 'w',"Erweitertes Frequenzbandbit", 1, NULL }, { 'y',"Reduzierungsfaktor", 2, param_reduzierung }, - { '_',"Illegaler Opcode", 64,NULL }, - { 0 ,"", 0,NULL }, + { '_',"Illegaler Opcode", 64, NULL }, + { 0 ,"", 0, NULL }, }; static struct definition_parameter *get_parameter(char digit) @@ -318,19 +319,19 @@ static struct definition_opcode { const char *message_text; } definition_opcode[64] = { /* 8888888877777777666666665555555544444444333333332222222211111111 message block text */ - { "-bRL----VVVVVVVVVVVVVVVVIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", - "-bRL-QQQ-hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", "EM(R)", BLOCK_R,"Erstmeldung" }, - { "-bRL----VVVVVVVVVVVVVVVVIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", - "-bRL-QQQ-hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", "UM(R)", BLOCK_R,"Umbuchantrag" }, - { "SbRL----VVVVVVVVVVVVVVVVIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", - "SbRL-QQQ-hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", "UWG(R)", BLOCK_R,"Umbuchantrag bei Warteschlange (gehende Verbindung)" }, + { "-bRLw---VVVVVVVVVVVVVVVVIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", + "-bRLwQQQ-hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", "EM(R)", BLOCK_R,"Erstmeldung" }, + { "-bRLw---VVVVVVVVVVVVVVVVIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", + "-bRLwQQQ-hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", "UM(R)", BLOCK_R,"Umbuchantrag" }, + { "SbRLw---VVVVVVVVVVVVVVVVIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", + "SbRLwQQQ-hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", "UWG(R)", BLOCK_R,"Umbuchantrag bei Warteschlange (gehende Verbindung)" }, { "--RL-----hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "ATO(R)", BLOCK_R,"Ausloesen des FuTelG im OgK-Betrieb bei WS" }, { "--RL--WW-hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "VWG(R)", BLOCK_R,"Verbindungswunsch gehend" }, { "--RL-----hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "SRG(R)", BLOCK_R,"Sonderruf (Notruf)" }, - { "SbRL----VVVVVVVVVVVVVVVVIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", - "SbRL-QQQ-hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", "NUG(R)", BLOCK_R,"Verbindungswunsch gehend bei Nachbarschaftsunterstuetzung" }, - { "-bRL----VVVVVVVVVVVVVVVVIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", - "-bRL-QQQ-hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", "UWK(R)", BLOCK_R,"Umbuchantrag bei Warteschlange (kommende Verbindung)" }, + { "SbRLw---VVVVVVVVVVVVVVVVIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", + "SbRLwQQQ-hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", "NUG(R)", BLOCK_R,"Verbindungswunsch gehend bei Nachbarschaftsunterstuetzung" }, + { "-bRLw---VVVVVVVVVVVVVVVVIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", + "-bRLwQQQ-hhhhhiiiiijjjjjIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", "UWK(R)", BLOCK_R,"Umbuchantrag bei Warteschlange (kommende Verbindung)" }, { "------------------------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "MFT(M)", BLOCK_M,"Meldung: Funktelefonteilnehmer" }, { "________________________________________________________________", NULL, "opcode 9", BLOCK_I,"Illegaler Opcode" }, { "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", NULL, "WUE(M)", BLOCK_M,"Wahluebertragung" }, @@ -343,12 +344,12 @@ static struct definition_opcode { { "------dJ--------eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "VH(K)", BLOCK_K,"Verbindung halten" }, { "------dJ--------eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "RTAQ(K)", BLOCK_K,"Quittung Rufton anschalten" }, { "------dJBB------eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "AH(K)", BLOCK_K,"Abhebe-Signal" }, - { "------dJBBCt----eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "VH(V)", BLOCK_V,"Verbindung halten" }, + { "-----wdJBBCt----eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "VH(V)", BLOCK_V,"Verbindung halten" }, { "------dJ----------------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "AT(K)", BLOCK_K,"Ausloesen durch Funktelefonteilnehmer" }, { "------dJBBC-------------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "AT(V)", BLOCK_V,"Ausloesen durch Funktelefonteilnehmer" }, { "------dJBB------eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "DSQ(K)", BLOCK_K,"Durchschalten Quittung" }, - { "------dJBBCt----eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "USAI(V)", BLOCK_V,"Umschaltantrag intern" }, - { "------dJBBCt----eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "USAE(V)", BLOCK_V,"Umschaltantrag extern" }, + { "-----wdJBBCt----eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "USAI(V)", BLOCK_V,"Umschaltantrag intern" }, + { "-----wdJBBCt----eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "USAE(V)", BLOCK_V,"Umschaltantrag extern" }, { "------dJBB--------------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "USTLN(K)", BLOCK_K,"Umschalten Funktelefonteilnehmer" }, { "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", NULL, "ZFZQ(K)", BLOCK_K,"Zufallszahlquittung" }, { "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", NULL, "AP(K)", BLOCK_K,"Autorisierungsparameter" }, @@ -356,7 +357,7 @@ static struct definition_opcode { { "________________________________________________________________", NULL, "opcode 30",BLOCK_I,"Illegaler Opcode" }, { "________________________________________________________________", NULL, "opcode 31",BLOCK_I,"Illegaler Opcode" }, { "PP-MMMMMDDDDEEEE------HHHHHHHHHHFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "MA(M)", BLOCK_M,"Meldeaufruf" }, - { "PPdZZZZZ------KKKKKKKKKKIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "VAK(R)", BLOCK_R,"Verbindungsaufbau kommend" }, + { "PPdZZZZZ-----KKKKKKKKKKKIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "VAK(R)", BLOCK_R,"Verbindungsaufbau kommend" }, { "________________________________________________________________", NULL, "opcode 34",BLOCK_I,"Illegaler Opcode" }, { "PPdZZZZZ----------------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "EBQ(R)", BLOCK_R,"Einbuchquittung" }, { "PPdZZZZZ----------------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "UBQ(R)", BLOCK_R,"Umbuchquittung" }, @@ -369,7 +370,7 @@ static struct definition_opcode { { "PPdZZZZZ----------------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "WBP(R)", BLOCK_R,"Wahlbestaetigung positiv" }, { "PPdZZZZZ----------------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "WBN(R)", BLOCK_R,"Wahlbestaetigung negativ" }, { "PPdZZZZZ----------------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "WWBP(R)", BLOCK_R,"Wahlbestaetigung positiv in Warteschlange" }, - { "PPdZZZZZ------KKKKKKKKKKIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "VAG(R)", BLOCK_R,"Verbindungsaufbau gehend" }, + { "PPdZZZZZ-----KKKKKKKKKKKIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "VAG(R)", BLOCK_R,"Verbindungsaufbau gehend" }, { "PPdZZZZZ------cc--------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "VA(R)", BLOCK_R,"Vorzeitiges Ausloesen" }, { "PP----dJ--------eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "BQ(K)", BLOCK_K,"Belegungsquittung" }, { "PP----dJ--------eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "VHQ(K)", BLOCK_K,"Quittung Verbindung halten" }, @@ -380,9 +381,9 @@ static struct definition_opcode { { "PP----dJ------cc--------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "AF(K)", BLOCK_K,"Ausloesen durch FuFSt in konzentr. Signalisierung" }, { "PP----dJ------cc--------IIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "AF(V)", BLOCK_V,"Ausloesen durch FuFSt in verteilter Signalisierung" }, { "PP----dJ--------eeeeeeeeIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "DSB(K)", BLOCK_K,"Durchschaltung" }, - { "PP----dJ------KKKKKKKKKKIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "DSBI(V)", BLOCK_V,"Umschaltbefehl intern (neuer SpK in der gleichen FuZ)" }, - { "PP----dJ------KKKKKKKKKKIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "USF(K)", BLOCK_K,"Umschalten FuFst" }, - { "PP----dJ------KKKKKKKKKKIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "USBE(V)", BLOCK_V,"Umschaltbefehl extern (neuer SpK in einer anderen Funkzelle)" }, + { "PP----dJ-----KKKKKKKKKKKIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "DSBI(V)", BLOCK_V,"Umschaltbefehl intern (neuer SpK in der gleichen FuZ)" }, + { "PP----dJ-----KKKKKKKKKKKIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "USF(K)", BLOCK_K,"Umschalten FuFst" }, + { "PP----dJ-----KKKKKKKKKKKIIIAAAAAFFFFFFFFNNNUUUUUTTTTTTTTTTTTTTTT", NULL, "USBE(V)", BLOCK_V,"Umschaltbefehl extern (neuer SpK in einer anderen Funkzelle)" }, { "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", NULL, "ZFZ(K)", BLOCK_K,"Zufallszahl" }, { "________________________________________________________________", NULL, "opcode 61",BLOCK_I,"Illegaler Opcode" }, { "________________________________________________________________", NULL, "opcode 62",BLOCK_I,"Illegaler Opcode" }, @@ -434,7 +435,7 @@ int init_telegramm(void) } /* generate frequency names */ - for (i = 0; i < 1024; i++) { + for (i = 0; i < 2048; i++) { char *frequenz = calloc(16, 1); if ((i & 1)) sprintf(frequenz, "%.4f MHz", 465.750 - (double)(i+1) / 2.0 * 0.010); @@ -784,6 +785,9 @@ static char *assemble_telegramm(const telegramm_t *telegramm, int debug) case 'v': value = telegramm->vermittlungstechnische_sperren; break; + case 'w': + value = telegramm->erweitertes_frequenzbandbit; + break; case 'y': value = telegramm->reduzierungsfaktor; break; @@ -990,6 +994,9 @@ static void disassemble_telegramm(telegramm_t *telegramm, const char *bits, int case 'v': telegramm->vermittlungstechnische_sperren = value; break; + case 'w': + telegramm->erweitertes_frequenzbandbit = value; + break; case 'y': telegramm->reduzierungsfaktor = value; break; diff --git a/src/cnetz/telegramm.h b/src/cnetz/telegramm.h index 672bbd2..24f0a68 100644 --- a/src/cnetz/telegramm.h +++ b/src/cnetz/telegramm.h @@ -110,6 +110,7 @@ typedef struct telegramm { uint8_t test_telefonteilnehmer_geraet; uint8_t grenzwert_fuer_umschalten; uint8_t vermittlungstechnische_sperren; + uint8_t erweitertes_frequenzbandbit; uint8_t reduzierungsfaktor; uint64_t illegaler_opcode; } telegramm_t; diff --git a/src/cnetz/transaction.c b/src/cnetz/transaction.c index 378d5de..fd2308d 100644 --- a/src/cnetz/transaction.c +++ b/src/cnetz/transaction.c @@ -36,7 +36,7 @@ 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) +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; @@ -72,7 +72,7 @@ transaction_t *create_transaction(cnetz_t *cnetz, uint32_t state, uint8_t futln_ link_transaction(trans, cnetz); /* update database: now busy */ - update_db(cnetz, futln_nat, futln_fuvst, futln_rest, 1, 0); + trans->extended = update_db(cnetz, futln_nat, futln_fuvst, futln_rest, extended, 1, 0); return trans; } @@ -81,7 +81,7 @@ transaction_t *create_transaction(cnetz_t *cnetz, uint32_t state, uint8_t futln_ void destroy_transaction(transaction_t *trans) { /* update database: now idle */ - update_db(trans->cnetz, trans->futln_nat, trans->futln_fuvst, trans->futln_rest, 0, trans->ma_failed); + update_db(trans->cnetz, trans->futln_nat, trans->futln_fuvst, trans->futln_rest, -1, 0, trans->ma_failed); unlink_transaction(trans); diff --git a/src/cnetz/transaction.h b/src/cnetz/transaction.h index 40ace98..7cadf53 100644 --- a/src/cnetz/transaction.h +++ b/src/cnetz/transaction.h @@ -31,6 +31,7 @@ typedef struct transaction { uint8_t futln_nat; /* current station ID (3 values) */ uint8_t futln_fuvst; uint16_t futln_rest; + int extended; /* extended frequency capability */ char dialing[17]; /* number dialed by the phone */ int32_t state; /* state of transaction */ int8_t release_cause; /* reason for release, (c-netz coding) */ @@ -43,7 +44,7 @@ typedef struct transaction { } transaction_t; const char *transaction2rufnummer(transaction_t *trans); -transaction_t *create_transaction(cnetz_t *cnetz, uint32_t state, uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest); +transaction_t *create_transaction(cnetz_t *cnetz, uint32_t state, uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest, int extended); void destroy_transaction(transaction_t *trans); void link_transaction(transaction_t *trans, cnetz_t *cnetz); void unlink_transaction(transaction_t *trans);