From 0fe3f7d4e53b8857235b3c2871d153df56af902d Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Fri, 13 Jan 2023 17:04:01 +0100 Subject: layer23: Move settings.{c,h} under common/ Some of those can be reused by other apps (like modem). Change-Id: I0a741b2384195d512fdc49eda6762241f385b1f1 --- .../layer23/include/osmocom/bb/common/Makefile.am | 1 + src/host/layer23/include/osmocom/bb/common/ms.h | 3 +- .../layer23/include/osmocom/bb/common/settings.h | 184 +++++++++++++++++ .../layer23/include/osmocom/bb/mobile/Makefile.am | 2 +- .../layer23/include/osmocom/bb/mobile/settings.h | 184 ----------------- src/host/layer23/src/common/Makefile.am | 1 + src/host/layer23/src/common/settings.c | 219 +++++++++++++++++++++ src/host/layer23/src/mobile/Makefile.am | 1 - src/host/layer23/src/mobile/gsm322.c | 2 +- src/host/layer23/src/mobile/gsm48_rr.c | 2 +- src/host/layer23/src/mobile/mnccms.c | 2 +- src/host/layer23/src/mobile/settings.c | 219 --------------------- 12 files changed, 410 insertions(+), 410 deletions(-) create mode 100644 src/host/layer23/include/osmocom/bb/common/settings.h delete mode 100644 src/host/layer23/include/osmocom/bb/mobile/settings.h create mode 100644 src/host/layer23/src/common/settings.c delete mode 100644 src/host/layer23/src/mobile/settings.c diff --git a/src/host/layer23/include/osmocom/bb/common/Makefile.am b/src/host/layer23/include/osmocom/bb/common/Makefile.am index f09353bb..270f079d 100644 --- a/src/host/layer23/include/osmocom/bb/common/Makefile.am +++ b/src/host/layer23/include/osmocom/bb/common/Makefile.am @@ -12,6 +12,7 @@ noinst_HEADERS = \ sap_proto.h \ sap_fsm.h \ sap_interface.h \ + settings.h \ sim.h \ subscriber.h \ support.h \ diff --git a/src/host/layer23/include/osmocom/bb/common/ms.h b/src/host/layer23/include/osmocom/bb/common/ms.h index db6b276a..9fd4c7aa 100644 --- a/src/host/layer23/include/osmocom/bb/common/ms.h +++ b/src/host/layer23/include/osmocom/bb/common/ms.h @@ -5,9 +5,8 @@ #include #include -/* FIXME no 'mobile' specific stuff should be here */ -#include #include +#include #include #include #include diff --git a/src/host/layer23/include/osmocom/bb/common/settings.h b/src/host/layer23/include/osmocom/bb/common/settings.h new file mode 100644 index 00000000..c9a36228 --- /dev/null +++ b/src/host/layer23/include/osmocom/bb/common/settings.h @@ -0,0 +1,184 @@ +#ifndef _settings_h +#define _settings_h + +#include +#include + +struct osmocom_ms; + +#define MOB_C7_DEFLT_ANY_TIMEOUT 30 + +/* CC (Call Control) message handling entity */ +enum mncc_handler_t { + /* Built-in mobile's MNCC */ + MNCC_HANDLER_INTERNAL, + /* External MNCC application via UNIX-socket */ + MNCC_HANDLER_EXTERNAL, + /* No call support */ + MNCC_HANDLER_DUMMY, +}; + +/* TCH frame I/O handler */ +enum audio_io_handler { + /* No handler, drop frames */ + AUDIO_IOH_NONE = 0, + /* libosmo-gapk based handler */ + AUDIO_IOH_GAPK, + /* L1 PHY (e.g. Calypso DSP) */ + AUDIO_IOH_L1PHY, + /* External MNCC app (via MNCC socket) */ + AUDIO_IOH_MNCC_SOCK, + /* Return to sender */ + AUDIO_IOH_LOOPBACK, +}; + +extern const struct value_string audio_io_handler_names[]; +static inline const char *audio_io_handler_name(enum audio_io_handler val) +{ return get_value_string(audio_io_handler_names, val); } + +/* TCH frame I/O format */ +enum audio_io_format { + /* RTP format (RFC3551 for FR/EFR, RFC5993 for HR, RFC4867 for AMR) */ + AUDIO_IOF_RTP, + /* Texas Instruments format, used by Calypso based phones (e.g. Motorola C1xx) */ + AUDIO_IOF_TI, +}; + +extern const struct value_string audio_io_format_names[]; +static inline const char *audio_io_format_name(enum audio_io_format val) +{ return get_value_string(audio_io_format_names, val); } + +struct audio_settings { + enum audio_io_handler io_handler; + enum audio_io_format io_format; + char alsa_output_dev[128]; + char alsa_input_dev[128]; +}; + +struct gsm_settings { + char layer2_socket_path[128]; + char sap_socket_path[128]; + char mncc_socket_path[128]; + + /* MNCC handler */ + enum mncc_handler_t mncc_handler; + + /* Audio settings */ + struct audio_settings audio; + + /* IMEI */ + char imei[16]; + char imeisv[17]; + char imei_random; + + /* network search */ + int plmn_mode; /* PLMN_MODE_* */ + + /* SIM */ + int sim_type; /* selects card on power on */ + char emergency_imsi[16]; + + /* SMS */ + char sms_sca[22]; + bool store_sms; + + /* test card simulator settings */ + char test_imsi[16]; + uint32_t test_tmsi; + uint8_t test_ki_type; + uint8_t test_ki[16]; /* 128 bit max */ + uint8_t test_barr; + uint8_t test_rplmn_valid; + uint16_t test_rplmn_mcc, test_rplmn_mnc; + uint16_t test_lac; + uint8_t test_imsi_attached; + uint8_t test_always; /* ...search hplmn... */ + + /* call related settings */ + uint8_t cw; /* set if call-waiting is allowed */ + uint8_t auto_answer; + uint8_t clip, clir; + uint8_t half, half_prefer; + + /* changing default behavior */ + uint8_t alter_tx_power; + uint8_t alter_tx_power_value; + int8_t alter_delay; + uint8_t stick; + uint16_t stick_arfcn; + uint8_t skip_max_per_band; + uint8_t no_lupd; + uint8_t no_neighbour; + + /* supported by configuration */ + uint8_t cc_dtmf; + uint8_t sms_ptp; + uint8_t a5_1; + uint8_t a5_2; + uint8_t a5_3; + uint8_t a5_4; + uint8_t a5_5; + uint8_t a5_6; + uint8_t a5_7; + uint8_t p_gsm; + uint8_t e_gsm; + uint8_t r_gsm; + uint8_t dcs; + uint8_t gsm_850; + uint8_t pcs; + uint8_t gsm_480; + uint8_t gsm_450; + uint8_t class_900; + uint8_t class_dcs; + uint8_t class_850; + uint8_t class_pcs; + uint8_t class_400; + uint8_t freq_map[128+38]; + uint8_t full_v1; + uint8_t full_v2; + uint8_t full_v3; + uint8_t half_v1; + uint8_t half_v3; + uint8_t ch_cap; /* channel capability */ + int8_t min_rxlev_dbm; /* min dBm to access */ + + /* radio */ + uint16_t dsc_max; + uint8_t force_rekey; + + /* dialing */ + struct llist_head abbrev; + + /* EDGE / UMTS / CDMA */ + uint8_t edge_ms_sup; + uint8_t edge_psk_sup; + uint8_t edge_psk_uplink; + uint8_t class_900_edge; + uint8_t class_dcs_pcs_edge; + uint8_t umts_fdd; + uint8_t umts_tdd; + uint8_t cdma_2000; + uint8_t dtm; + uint8_t class_dtm; + uint8_t dtm_mac; + uint8_t dtm_egprs; + + /* Timeout for GSM 03.22 C7 state */ + uint8_t any_timeout; +}; + +struct gsm_settings_abbrev { + struct llist_head list; + char abbrev[4]; + char number[32]; + char name[32]; +}; + +int gsm_settings_arfcn(struct osmocom_ms *ms); +int gsm_settings_init(struct osmocom_ms *ms); +int gsm_settings_exit(struct osmocom_ms *ms); +char *gsm_check_imei(const char *imei, const char *sv); +int gsm_random_imei(struct gsm_settings *set); + +#endif /* _settings_h */ + diff --git a/src/host/layer23/include/osmocom/bb/mobile/Makefile.am b/src/host/layer23/include/osmocom/bb/mobile/Makefile.am index 6d9950be..14694bb2 100644 --- a/src/host/layer23/include/osmocom/bb/mobile/Makefile.am +++ b/src/host/layer23/include/osmocom/bb/mobile/Makefile.am @@ -1,4 +1,4 @@ noinst_HEADERS = gsm322.h gsm480_ss.h gsm411_sms.h gsm48_cc.h gsm48_mm.h \ - gsm48_rr.h mncc.h settings.h \ + gsm48_rr.h mncc.h \ transaction.h vty.h mncc_sock.h mncc_ms.h primitives.h \ app_mobile.h voice.h gapk_io.h diff --git a/src/host/layer23/include/osmocom/bb/mobile/settings.h b/src/host/layer23/include/osmocom/bb/mobile/settings.h deleted file mode 100644 index c9a36228..00000000 --- a/src/host/layer23/include/osmocom/bb/mobile/settings.h +++ /dev/null @@ -1,184 +0,0 @@ -#ifndef _settings_h -#define _settings_h - -#include -#include - -struct osmocom_ms; - -#define MOB_C7_DEFLT_ANY_TIMEOUT 30 - -/* CC (Call Control) message handling entity */ -enum mncc_handler_t { - /* Built-in mobile's MNCC */ - MNCC_HANDLER_INTERNAL, - /* External MNCC application via UNIX-socket */ - MNCC_HANDLER_EXTERNAL, - /* No call support */ - MNCC_HANDLER_DUMMY, -}; - -/* TCH frame I/O handler */ -enum audio_io_handler { - /* No handler, drop frames */ - AUDIO_IOH_NONE = 0, - /* libosmo-gapk based handler */ - AUDIO_IOH_GAPK, - /* L1 PHY (e.g. Calypso DSP) */ - AUDIO_IOH_L1PHY, - /* External MNCC app (via MNCC socket) */ - AUDIO_IOH_MNCC_SOCK, - /* Return to sender */ - AUDIO_IOH_LOOPBACK, -}; - -extern const struct value_string audio_io_handler_names[]; -static inline const char *audio_io_handler_name(enum audio_io_handler val) -{ return get_value_string(audio_io_handler_names, val); } - -/* TCH frame I/O format */ -enum audio_io_format { - /* RTP format (RFC3551 for FR/EFR, RFC5993 for HR, RFC4867 for AMR) */ - AUDIO_IOF_RTP, - /* Texas Instruments format, used by Calypso based phones (e.g. Motorola C1xx) */ - AUDIO_IOF_TI, -}; - -extern const struct value_string audio_io_format_names[]; -static inline const char *audio_io_format_name(enum audio_io_format val) -{ return get_value_string(audio_io_format_names, val); } - -struct audio_settings { - enum audio_io_handler io_handler; - enum audio_io_format io_format; - char alsa_output_dev[128]; - char alsa_input_dev[128]; -}; - -struct gsm_settings { - char layer2_socket_path[128]; - char sap_socket_path[128]; - char mncc_socket_path[128]; - - /* MNCC handler */ - enum mncc_handler_t mncc_handler; - - /* Audio settings */ - struct audio_settings audio; - - /* IMEI */ - char imei[16]; - char imeisv[17]; - char imei_random; - - /* network search */ - int plmn_mode; /* PLMN_MODE_* */ - - /* SIM */ - int sim_type; /* selects card on power on */ - char emergency_imsi[16]; - - /* SMS */ - char sms_sca[22]; - bool store_sms; - - /* test card simulator settings */ - char test_imsi[16]; - uint32_t test_tmsi; - uint8_t test_ki_type; - uint8_t test_ki[16]; /* 128 bit max */ - uint8_t test_barr; - uint8_t test_rplmn_valid; - uint16_t test_rplmn_mcc, test_rplmn_mnc; - uint16_t test_lac; - uint8_t test_imsi_attached; - uint8_t test_always; /* ...search hplmn... */ - - /* call related settings */ - uint8_t cw; /* set if call-waiting is allowed */ - uint8_t auto_answer; - uint8_t clip, clir; - uint8_t half, half_prefer; - - /* changing default behavior */ - uint8_t alter_tx_power; - uint8_t alter_tx_power_value; - int8_t alter_delay; - uint8_t stick; - uint16_t stick_arfcn; - uint8_t skip_max_per_band; - uint8_t no_lupd; - uint8_t no_neighbour; - - /* supported by configuration */ - uint8_t cc_dtmf; - uint8_t sms_ptp; - uint8_t a5_1; - uint8_t a5_2; - uint8_t a5_3; - uint8_t a5_4; - uint8_t a5_5; - uint8_t a5_6; - uint8_t a5_7; - uint8_t p_gsm; - uint8_t e_gsm; - uint8_t r_gsm; - uint8_t dcs; - uint8_t gsm_850; - uint8_t pcs; - uint8_t gsm_480; - uint8_t gsm_450; - uint8_t class_900; - uint8_t class_dcs; - uint8_t class_850; - uint8_t class_pcs; - uint8_t class_400; - uint8_t freq_map[128+38]; - uint8_t full_v1; - uint8_t full_v2; - uint8_t full_v3; - uint8_t half_v1; - uint8_t half_v3; - uint8_t ch_cap; /* channel capability */ - int8_t min_rxlev_dbm; /* min dBm to access */ - - /* radio */ - uint16_t dsc_max; - uint8_t force_rekey; - - /* dialing */ - struct llist_head abbrev; - - /* EDGE / UMTS / CDMA */ - uint8_t edge_ms_sup; - uint8_t edge_psk_sup; - uint8_t edge_psk_uplink; - uint8_t class_900_edge; - uint8_t class_dcs_pcs_edge; - uint8_t umts_fdd; - uint8_t umts_tdd; - uint8_t cdma_2000; - uint8_t dtm; - uint8_t class_dtm; - uint8_t dtm_mac; - uint8_t dtm_egprs; - - /* Timeout for GSM 03.22 C7 state */ - uint8_t any_timeout; -}; - -struct gsm_settings_abbrev { - struct llist_head list; - char abbrev[4]; - char number[32]; - char name[32]; -}; - -int gsm_settings_arfcn(struct osmocom_ms *ms); -int gsm_settings_init(struct osmocom_ms *ms); -int gsm_settings_exit(struct osmocom_ms *ms); -char *gsm_check_imei(const char *imei, const char *sv); -int gsm_random_imei(struct gsm_settings *set); - -#endif /* _settings_h */ - diff --git a/src/host/layer23/src/common/Makefile.am b/src/host/layer23/src/common/Makefile.am index 4dfa1f35..9abc802c 100644 --- a/src/host/layer23/src/common/Makefile.am +++ b/src/host/layer23/src/common/Makefile.am @@ -23,6 +23,7 @@ liblayer23_a_SOURCES = \ sap_fsm.c \ sap_proto.c \ sap_interface.c \ + settings.c \ sim.c \ subscriber.c \ support.c \ diff --git a/src/host/layer23/src/common/settings.c b/src/host/layer23/src/common/settings.c new file mode 100644 index 00000000..d607aff5 --- /dev/null +++ b/src/host/layer23/src/common/settings.c @@ -0,0 +1,219 @@ +/* + * (C) 2010 by Andreas Eversberg + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +static char *layer2_socket_path = "/tmp/osmocom_l2"; +static char *sap_socket_path = "/tmp/osmocom_sap"; +static char *mncc_socket_path = "/tmp/ms_mncc"; +static char *alsa_dev_default = "default"; + +int gsm_settings_init(struct osmocom_ms *ms) +{ + struct gsm_settings *set = &ms->settings; + struct gsm_support *sup = &ms->support; + + strcpy(set->layer2_socket_path, layer2_socket_path); + strcpy(set->sap_socket_path, sap_socket_path); + + /* Compose MNCC socket path using MS name */ + snprintf(set->mncc_socket_path, sizeof(set->mncc_socket_path) - 1, + "%s_%s", mncc_socket_path, ms->name); + + /* Audio settings: drop TCH frames by default */ + set->audio.io_handler = AUDIO_IOH_NONE; + OSMO_STRLCPY_ARRAY(set->audio.alsa_output_dev, alsa_dev_default); + OSMO_STRLCPY_ARRAY(set->audio.alsa_input_dev, alsa_dev_default); + + /* Built-in MNCC handler */ + set->mncc_handler = MNCC_HANDLER_INTERNAL; + + /* network search */ + set->plmn_mode = PLMN_MODE_AUTO; + + /* IMEI */ + sprintf(set->imei, "000000000000000"); + sprintf(set->imeisv, "0000000000000000"); + + /* SIM type */ + set->sim_type = GSM_SIM_TYPE_L1PHY; + + /* test SIM */ + strcpy(set->test_imsi, "001010000000000"); + set->test_rplmn_mcc = set->test_rplmn_mnc = 1; + set->test_lac = 0x0000; + set->test_tmsi = 0xffffffff; + + /* set all supported features */ + set->sms_ptp = sup->sms_ptp; + set->a5_1 = sup->a5_1; + set->a5_2 = sup->a5_2; + set->a5_3 = sup->a5_3; + set->a5_4 = sup->a5_4; + set->a5_5 = sup->a5_5; + set->a5_6 = sup->a5_6; + set->a5_7 = sup->a5_7; + set->p_gsm = sup->p_gsm; + set->e_gsm = sup->e_gsm; + set->r_gsm = sup->r_gsm; + set->dcs = sup->dcs; + set->class_900 = sup->class_900; + set->class_dcs = sup->class_dcs; + set->class_850 = sup->class_850; + set->class_pcs = sup->class_pcs; + set->class_400 = sup->class_400; + set->full_v1 = sup->full_v1; + set->full_v2 = sup->full_v2; + set->full_v3 = sup->full_v3; + set->half_v1 = sup->half_v1; + set->half_v3 = sup->half_v3; + set->ch_cap = sup->ch_cap; + set->min_rxlev_dbm = sup->min_rxlev_dbm; + set->dsc_max = sup->dsc_max; + + if (sup->half_v1 || sup->half_v3) + set->half = 1; + + + /* software features */ + set->cc_dtmf = 1; + + set->any_timeout = MOB_C7_DEFLT_ANY_TIMEOUT; + + set->store_sms = true; + + INIT_LLIST_HEAD(&set->abbrev); + + return 0; +} + +int gsm_settings_arfcn(struct osmocom_ms *ms) +{ + int i; + struct gsm_settings *set = &ms->settings; + + /* set supported frequencies */ + memset(set->freq_map, 0, sizeof(set->freq_map)); + if (set->p_gsm) + for(i = 1; i <= 124; i++) + set->freq_map[i >> 3] |= (1 << (i & 7)); + if (set->gsm_850) + for(i = 128; i <= 251; i++) + set->freq_map[i >> 3] |= (1 << (i & 7)); + if (set->gsm_450) + for(i = 259; i <= 293; i++) + set->freq_map[i >> 3] |= (1 << (i & 7)); + if (set->gsm_480) + for(i = 306; i <= 340; i++) + set->freq_map[i >> 3] |= (1 << (i & 7)); + if (set->dcs) + for(i = 512; i <= 885; i++) + set->freq_map[i >> 3] |= (1 << (i & 7)); + if (set->pcs) + for(i = 1024; i <= 1024-512+810; i++) + set->freq_map[i >> 3] |= (1 << (i & 7)); + if (set->e_gsm) { + for(i = 975; i <= 1023; i++) + set->freq_map[i >> 3] |= (1 << (i & 7)); + set->freq_map[0] |= 1; + } + if (set->r_gsm) + for(i = 955; i <= 974; i++) + set->freq_map[i >> 3] |= (1 << (i & 7)); + + return 0; +} + +int gsm_settings_exit(struct osmocom_ms *ms) +{ + struct gsm_settings *set = &ms->settings; + struct gsm_settings_abbrev *abbrev; + + while (!llist_empty(&set->abbrev)) { + abbrev = llist_entry(set->abbrev.next, + struct gsm_settings_abbrev, list); + llist_del(&abbrev->list); + talloc_free(abbrev); + } + return 0; +} + +char *gsm_check_imei(const char *imei, const char *sv) +{ + int i; + + if (!imei || strlen(imei) != 15) + return "IMEI must have 15 digits!"; + + for (i = 0; i < strlen(imei); i++) { + if (imei[i] < '0' || imei[i] > '9') + return "IMEI must have digits 0 to 9 only!"; + } + + if (!sv || strlen(sv) != 1) + return "Software version must have 1 digit!"; + + if (sv[0] < '0' || sv[0] > '9') + return "Software version must have digits 0 to 9 only!"; + + return NULL; +} + +int gsm_random_imei(struct gsm_settings *set) +{ + int digits = set->imei_random; + char rand[16+1]; + + if (digits <= 0) + return 0; + if (digits > 15) + digits = 15; + + sprintf(rand, "%08d", layer23_random() % 100000000); + sprintf(rand + 8, "%07d", layer23_random() % 10000000); + + strcpy(set->imei + 15 - digits, rand + 15 - digits); + osmo_strlcpy(set->imeisv, set->imei, 15); + + return 0; +} + +const struct value_string audio_io_handler_names[] = { + { AUDIO_IOH_NONE, "none" }, + { AUDIO_IOH_GAPK, "gapk" }, + { AUDIO_IOH_L1PHY, "l1phy" }, + { AUDIO_IOH_MNCC_SOCK, "mncc-sock" }, + { AUDIO_IOH_LOOPBACK, "loopback" }, + { 0x00, NULL} +}; + +const struct value_string audio_io_format_names[] = { + { AUDIO_IOF_RTP, "rtp" }, + { AUDIO_IOF_TI, "ti" }, + { 0x00, NULL} +}; diff --git a/src/host/layer23/src/mobile/Makefile.am b/src/host/layer23/src/mobile/Makefile.am index dedee5f3..b87063b5 100644 --- a/src/host/layer23/src/mobile/Makefile.am +++ b/src/host/layer23/src/mobile/Makefile.am @@ -27,7 +27,6 @@ libmobile_a_SOURCES = \ mnccms.c \ mncc_sock.c \ primitives.c \ - settings.c \ transaction.c \ vty_interface.c \ voice.c \ diff --git a/src/host/layer23/src/mobile/gsm322.c b/src/host/layer23/src/mobile/gsm322.c index 4b735947..df26e829 100644 --- a/src/host/layer23/src/mobile/gsm322.c +++ b/src/host/layer23/src/mobile/gsm322.c @@ -35,11 +35,11 @@ #include #include #include +#include #include #include #include #include -#include #include diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c index 87a0dcd6..5d5e003b 100644 --- a/src/host/layer23/src/mobile/gsm48_rr.c +++ b/src/host/layer23/src/mobile/gsm48_rr.c @@ -76,11 +76,11 @@ #include #include #include +#include #include #include #include -#include #include diff --git a/src/host/layer23/src/mobile/mnccms.c b/src/host/layer23/src/mobile/mnccms.c index 16cabc14..bfc95e42 100644 --- a/src/host/layer23/src/mobile/mnccms.c +++ b/src/host/layer23/src/mobile/mnccms.c @@ -26,10 +26,10 @@ #include #include #include +#include #include #include #include -#include static uint32_t new_callref = 1; static LLIST_HEAD(call_list); diff --git a/src/host/layer23/src/mobile/settings.c b/src/host/layer23/src/mobile/settings.c deleted file mode 100644 index 3d4d7125..00000000 --- a/src/host/layer23/src/mobile/settings.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * (C) 2010 by Andreas Eversberg - * - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -static char *layer2_socket_path = "/tmp/osmocom_l2"; -static char *sap_socket_path = "/tmp/osmocom_sap"; -static char *mncc_socket_path = "/tmp/ms_mncc"; -static char *alsa_dev_default = "default"; - -int gsm_settings_init(struct osmocom_ms *ms) -{ - struct gsm_settings *set = &ms->settings; - struct gsm_support *sup = &ms->support; - - strcpy(set->layer2_socket_path, layer2_socket_path); - strcpy(set->sap_socket_path, sap_socket_path); - - /* Compose MNCC socket path using MS name */ - snprintf(set->mncc_socket_path, sizeof(set->mncc_socket_path) - 1, - "%s_%s", mncc_socket_path, ms->name); - - /* Audio settings: drop TCH frames by default */ - set->audio.io_handler = AUDIO_IOH_NONE; - OSMO_STRLCPY_ARRAY(set->audio.alsa_output_dev, alsa_dev_default); - OSMO_STRLCPY_ARRAY(set->audio.alsa_input_dev, alsa_dev_default); - - /* Built-in MNCC handler */ - set->mncc_handler = MNCC_HANDLER_INTERNAL; - - /* network search */ - set->plmn_mode = PLMN_MODE_AUTO; - - /* IMEI */ - sprintf(set->imei, "000000000000000"); - sprintf(set->imeisv, "0000000000000000"); - - /* SIM type */ - set->sim_type = GSM_SIM_TYPE_L1PHY; - - /* test SIM */ - strcpy(set->test_imsi, "001010000000000"); - set->test_rplmn_mcc = set->test_rplmn_mnc = 1; - set->test_lac = 0x0000; - set->test_tmsi = 0xffffffff; - - /* set all supported features */ - set->sms_ptp = sup->sms_ptp; - set->a5_1 = sup->a5_1; - set->a5_2 = sup->a5_2; - set->a5_3 = sup->a5_3; - set->a5_4 = sup->a5_4; - set->a5_5 = sup->a5_5; - set->a5_6 = sup->a5_6; - set->a5_7 = sup->a5_7; - set->p_gsm = sup->p_gsm; - set->e_gsm = sup->e_gsm; - set->r_gsm = sup->r_gsm; - set->dcs = sup->dcs; - set->class_900 = sup->class_900; - set->class_dcs = sup->class_dcs; - set->class_850 = sup->class_850; - set->class_pcs = sup->class_pcs; - set->class_400 = sup->class_400; - set->full_v1 = sup->full_v1; - set->full_v2 = sup->full_v2; - set->full_v3 = sup->full_v3; - set->half_v1 = sup->half_v1; - set->half_v3 = sup->half_v3; - set->ch_cap = sup->ch_cap; - set->min_rxlev_dbm = sup->min_rxlev_dbm; - set->dsc_max = sup->dsc_max; - - if (sup->half_v1 || sup->half_v3) - set->half = 1; - - - /* software features */ - set->cc_dtmf = 1; - - set->any_timeout = MOB_C7_DEFLT_ANY_TIMEOUT; - - set->store_sms = true; - - INIT_LLIST_HEAD(&set->abbrev); - - return 0; -} - -int gsm_settings_arfcn(struct osmocom_ms *ms) -{ - int i; - struct gsm_settings *set = &ms->settings; - - /* set supported frequencies */ - memset(set->freq_map, 0, sizeof(set->freq_map)); - if (set->p_gsm) - for(i = 1; i <= 124; i++) - set->freq_map[i >> 3] |= (1 << (i & 7)); - if (set->gsm_850) - for(i = 128; i <= 251; i++) - set->freq_map[i >> 3] |= (1 << (i & 7)); - if (set->gsm_450) - for(i = 259; i <= 293; i++) - set->freq_map[i >> 3] |= (1 << (i & 7)); - if (set->gsm_480) - for(i = 306; i <= 340; i++) - set->freq_map[i >> 3] |= (1 << (i & 7)); - if (set->dcs) - for(i = 512; i <= 885; i++) - set->freq_map[i >> 3] |= (1 << (i & 7)); - if (set->pcs) - for(i = 1024; i <= 1024-512+810; i++) - set->freq_map[i >> 3] |= (1 << (i & 7)); - if (set->e_gsm) { - for(i = 975; i <= 1023; i++) - set->freq_map[i >> 3] |= (1 << (i & 7)); - set->freq_map[0] |= 1; - } - if (set->r_gsm) - for(i = 955; i <= 974; i++) - set->freq_map[i >> 3] |= (1 << (i & 7)); - - return 0; -} - -int gsm_settings_exit(struct osmocom_ms *ms) -{ - struct gsm_settings *set = &ms->settings; - struct gsm_settings_abbrev *abbrev; - - while (!llist_empty(&set->abbrev)) { - abbrev = llist_entry(set->abbrev.next, - struct gsm_settings_abbrev, list); - llist_del(&abbrev->list); - talloc_free(abbrev); - } - return 0; -} - -char *gsm_check_imei(const char *imei, const char *sv) -{ - int i; - - if (!imei || strlen(imei) != 15) - return "IMEI must have 15 digits!"; - - for (i = 0; i < strlen(imei); i++) { - if (imei[i] < '0' || imei[i] > '9') - return "IMEI must have digits 0 to 9 only!"; - } - - if (!sv || strlen(sv) != 1) - return "Software version must have 1 digit!"; - - if (sv[0] < '0' || sv[0] > '9') - return "Software version must have digits 0 to 9 only!"; - - return NULL; -} - -int gsm_random_imei(struct gsm_settings *set) -{ - int digits = set->imei_random; - char rand[16+1]; - - if (digits <= 0) - return 0; - if (digits > 15) - digits = 15; - - sprintf(rand, "%08d", layer23_random() % 100000000); - sprintf(rand + 8, "%07d", layer23_random() % 10000000); - - strcpy(set->imei + 15 - digits, rand + 15 - digits); - osmo_strlcpy(set->imeisv, set->imei, 15); - - return 0; -} - -const struct value_string audio_io_handler_names[] = { - { AUDIO_IOH_NONE, "none" }, - { AUDIO_IOH_GAPK, "gapk" }, - { AUDIO_IOH_L1PHY, "l1phy" }, - { AUDIO_IOH_MNCC_SOCK, "mncc-sock" }, - { AUDIO_IOH_LOOPBACK, "loopback" }, - { 0x00, NULL} -}; - -const struct value_string audio_io_format_names[] = { - { AUDIO_IOF_RTP, "rtp" }, - { AUDIO_IOF_TI, "ti" }, - { 0x00, NULL} -}; -- cgit v1.2.3