aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmo-bts/bts.h4
-rw-r--r--include/osmo-bts/gsm_data.h6
-rw-r--r--src/common/bts.c59
-rw-r--r--src/common/rsl.c2
-rw-r--r--src/osmo-bts-octphy/l1_if.c9
-rw-r--r--src/osmo-bts-sysmo/main.c12
-rw-r--r--src/osmo-bts-trx/main.c12
-rw-r--r--tests/misc/misc_test.c30
8 files changed, 54 insertions, 80 deletions
diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h
index 2f63e37f..4d6e3479 100644
--- a/include/osmo-bts/bts.h
+++ b/include/osmo-bts/bts.h
@@ -45,8 +45,8 @@ struct gsm_time *get_time(struct gsm_bts *bts);
int bts_main(int argc, char **argv);
-int bts_supports_cm(struct gsm_bts_role_bts *bts,
- enum gsm_phys_chan_config pchan, enum gsm48_chan_mode cm);
+int bts_supports_cm(struct gsm_bts *bts, enum gsm_phys_chan_config pchan,
+ enum gsm48_chan_mode cm);
#endif /* _BTS_H */
diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h
index 853b4454..4b834b54 100644
--- a/include/osmo-bts/gsm_data.h
+++ b/include/osmo-bts/gsm_data.h
@@ -33,11 +33,6 @@ struct gsm_network {
struct pcu_sock_state *pcu_state;
};
-struct bts_cm {
- enum gsm_phys_chan_config pchan;
- enum gsm48_chan_mode cm;
-};
-
/* data structure for BTS related data specific to the BTS role */
struct gsm_bts_role_bts {
struct {
@@ -94,7 +89,6 @@ struct gsm_bts_role_bts {
bool rtp_jitter_adaptive;
struct {
uint8_t ciphers; /* flags A5/1==0x1, A5/2==0x2, A5/3==0x4 */
- const struct bts_cm *cm; /* Table with supp. ch rate/mode combinations */
} support;
struct {
uint8_t tc4_ctr;
diff --git a/src/common/bts.c b/src/common/bts.c
index 31afba41..7849d616 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -676,32 +676,45 @@ struct gsm_time *get_time(struct gsm_bts *bts)
return &btsb->gsm_time;
}
-int bts_supports_cm(struct gsm_bts_role_bts *bts,
- enum gsm_phys_chan_config pchan, enum gsm48_chan_mode cm)
+int bts_supports_cm(struct gsm_bts *bts, enum gsm_phys_chan_config pchan,
+ enum gsm48_chan_mode cm)
{
- const struct bts_cm *supported;
- int i;
-
- supported = bts->support.cm;
-
- /* Check if we got a list with supported codec, if not, no list has
- * been configured yet for that BTS. In that case we will just skip
- * and accept any combination */
- if (supported == NULL)
- return 1;
-
- for (i = 0;; i++) {
- /* If we manage to find the given combination in the list,
- * we know that the pchan/cm combination is supported */
- if (supported[i].pchan == pchan && supported[i].cm == cm)
- return 1;
-
- /* When we hit the terminator, we know that the given
- * pchan/cm combination is not supported because it
- * is not in the list. */
- if (supported[i].pchan == _GSM_PCHAN_MAX)
+ enum gsm_bts_features feature = _NUM_BTS_FEAT;
+
+ /* Before the requested pchan/cm combination can be checked, we need to
+ * convert it to a feature identifier we can check */
+ if (pchan == GSM_PCHAN_TCH_F) {
+ switch(cm) {
+ case GSM48_CMODE_SPEECH_V1:
+ feature = BTS_FEAT_SPEECH_F_V1;
+ break;
+ case GSM48_CMODE_SPEECH_EFR:
+ feature = BTS_FEAT_SPEECH_F_EFR;
+ break;
+ case GSM48_CMODE_SPEECH_AMR:
+ feature = BTS_FEAT_SPEECH_F_AMR;
+ break;
+ default:
+ /* Invalid speech codec type => Not supported! */
return 0;
+ }
+ } else if (pchan == GSM_PCHAN_TCH_H) {
+ switch(cm) {
+ case GSM48_CMODE_SPEECH_V1:
+ feature = BTS_FEAT_SPEECH_H_V1;
+ break;
+ case GSM48_CMODE_SPEECH_AMR:
+ feature = BTS_FEAT_SPEECH_H_AMR;
+ break;
+ default:
+ /* Invalid speech codec type => Not supported! */
+ return 0;
+ }
}
+ /* Check if the feature is supported by this BTS */
+ if (gsm_bts_has_feature(bts, feature))
+ return 1;
+
return 0;
}
diff --git a/src/common/rsl.c b/src/common/rsl.c
index 001d7e07..5bbd61a1 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -1302,7 +1302,7 @@ static int rsl_rx_mode_modif(struct msgb *msg)
cm = (struct rsl_ie_chan_mode *) TLVP_VAL(&tp, RSL_IE_CHAN_MODE);
lchan_tchmode_from_cmode(lchan, cm);
- if (bts_supports_cm(btsb, lchan->ts->pchan, lchan->tch_mode) != 1) {
+ if (bts_supports_cm(lchan->ts->trx->bts, lchan->ts->pchan, lchan->tch_mode) != 1) {
LOGP(DRSL, LOGL_ERROR, "invalid mode/codec instructed by BSC, check BSC configuration.\n");
return rsl_tx_mode_modif_nack(lchan, RSL_ERR_SERV_OPT_UNAVAIL);
}
diff --git a/src/osmo-bts-octphy/l1_if.c b/src/osmo-bts-octphy/l1_if.c
index e5fcd98a..8dc3e8f1 100644
--- a/src/osmo-bts-octphy/l1_if.c
+++ b/src/osmo-bts-octphy/l1_if.c
@@ -76,14 +76,6 @@
/* timeout until which we expect PHY to respond */
#define CMD_TIMEOUT 5
-/* Table with channel rate / and codec configuration that are supported
- * by the hardware bts_supports_cm() */
-static const struct bts_cm bts_model_supported_cm[] = {
- { GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_V1},
- { GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_V1},
- { _GSM_PCHAN_MAX, 0 }
-};
-
/* allocate a msgb for a Layer1 primitive */
struct msgb *l1p_msgb_alloc(void)
{
@@ -784,7 +776,6 @@ int bts_model_init(struct gsm_bts *bts)
bts->variant = BTS_OSMO_OCTPHY;
btsb = bts_role_bts(bts);
btsb->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
- btsb->support.cm = bts_model_supported_cm;
/* FIXME: what is the nominal transmit power of the PHY/board? */
bts->c0->nominal_power = 15;
diff --git a/src/osmo-bts-sysmo/main.c b/src/osmo-bts-sysmo/main.c
index 6118b605..efcf4a8d 100644
--- a/src/osmo-bts-sysmo/main.c
+++ b/src/osmo-bts-sysmo/main.c
@@ -55,17 +55,6 @@
#include "hw_misc.h"
#include "oml_router.h"
-/* Table with channel rate / and codec configuration that are supported
- * by the hardware bts_supports_cm() */
-static const struct bts_cm bts_model_supported_cm[] = {
- { GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_V1},
- { GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_V1},
- { GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_EFR},
- { GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_AMR},
- { GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_AMR},
- { _GSM_PCHAN_MAX, 0 }
-};
-
int bts_model_init(struct gsm_bts *bts)
{
struct gsm_bts_role_bts *btsb;
@@ -76,7 +65,6 @@ int bts_model_init(struct gsm_bts *bts)
bts->variant = BTS_OSMO_SYSMO;
btsb = bts_role_bts(bts);
btsb->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3);
- btsb->support.cm = bts_model_supported_cm;
rc = oml_router_init(bts, OML_ROUTER_PATH, &accept_fd, &read_fd);
if (rc < 0) {
diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c
index 38bb881c..5a5c97ec 100644
--- a/src/osmo-bts-trx/main.c
+++ b/src/osmo-bts-trx/main.c
@@ -59,17 +59,6 @@
#include "l1_if.h"
#include "trx_if.h"
-/* Table with channel rate / and codec configuration that are supported
- * by the hardware bts_supports_cm() */
-static const struct bts_cm bts_model_supported_cm[] = {
- { GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_V1},
- { GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_V1},
- { GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_EFR},
- { GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_AMR},
- { GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_AMR},
- { _GSM_PCHAN_MAX, 0 }
-};
-
/* dummy, since no direct dsp support */
uint32_t trx_get_hlayer1(struct gsm_bts_trx *trx)
{
@@ -112,7 +101,6 @@ int bts_model_init(struct gsm_bts *bts)
bts->variant = BTS_OSMO_TRX;
btsb->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2);
- btsb->support.cm = bts_model_supported_cm;
/* FIXME: this needs to be overridden with the real hardrware
* value */
diff --git a/tests/misc/misc_test.c b/tests/misc/misc_test.c
index 00744a6b..e4542354 100644
--- a/tests/misc/misc_test.c
+++ b/tests/misc/misc_test.c
@@ -157,29 +157,29 @@ static void test_sacch_get(void)
}
}
-static const struct bts_cm bts_model_supported_cm[] = {
- {GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_V1},
- {GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_V1},
- {GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_AMR},
- {GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_AMR},
- {_GSM_PCHAN_MAX, 0}
-};
-
static void test_bts_supports_cm(void)
{
- struct gsm_bts_role_bts bts;
- bts.support.cm = bts_model_supported_cm;
+ struct gsm_bts *bts;
+
+ bts = gsm_bts_alloc(NULL, 0);
+
+ gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_V1);
+ gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_V1);
+ gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_F_AMR);
+ gsm_bts_set_feature(bts, BTS_FEAT_SPEECH_H_AMR);
OSMO_ASSERT(bts_supports_cm
- (&bts, GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_V1) == 1);
+ (bts, GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_V1) == 1);
OSMO_ASSERT(bts_supports_cm
- (&bts, GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_V1) == 1);
+ (bts, GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_V1) == 1);
OSMO_ASSERT(bts_supports_cm
- (&bts, GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_EFR) == 0);
+ (bts, GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_EFR) == 0);
OSMO_ASSERT(bts_supports_cm
- (&bts, GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_AMR) == 1);
+ (bts, GSM_PCHAN_TCH_F, GSM48_CMODE_SPEECH_AMR) == 1);
OSMO_ASSERT(bts_supports_cm
- (&bts, GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_AMR) == 1);
+ (bts, GSM_PCHAN_TCH_H, GSM48_CMODE_SPEECH_AMR) == 1);
+
+ talloc_free(bts);
}
int main(int argc, char **argv)