From 0978d1df716d59bc8b22c21bed036616b974f850 Mon Sep 17 00:00:00 2001 From: Vadim Yanitskiy Date: Thu, 7 Sep 2023 00:34:05 +0700 Subject: [PATCH] oml: implement handling of NM_ATT_IPACC_SUPP_FEATURES Change-Id: I88c6c6af18be054bd152832e60c8afbbd16098a3 Depends: libosmocore.git Ia4208e10d61843dd6ae77398f6624c918dc81ea4 Depends: libosmocore.git I85316af9b57e8113077305798cb2d82a24e48e00 --- include/osmo-bts/bts.h | 4 +++ include/osmo-bts/bts_trx.h | 6 ++++ include/osmo-bts/gsm_data.h | 46 ++++++++++++++++++++++++++ src/common/bts.c | 6 +++- src/common/oml.c | 66 +++++++++++++++++++++++++++++++++++++ src/osmo-bts-lc15/l1_if.c | 24 ++++++++++++++ src/osmo-bts-lc15/main.c | 13 ++++++++ src/osmo-bts-oc2g/l1_if.c | 24 ++++++++++++++ src/osmo-bts-oc2g/main.c | 13 ++++++++ src/osmo-bts-octphy/l1_if.c | 24 ++++++++++++++ src/osmo-bts-sysmo/l1_if.c | 22 +++++++++++++ src/osmo-bts-sysmo/main.c | 13 ++++++++ src/osmo-bts-trx/main.c | 24 ++++++++++++++ src/osmo-bts-virtual/main.c | 24 ++++++++++++++ 14 files changed, 308 insertions(+), 1 deletion(-) diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h index d3329355d..985f4edf5 100644 --- a/include/osmo-bts/bts.h +++ b/include/osmo-bts/bts.h @@ -130,6 +130,9 @@ struct gsm_gprs_cell { uint16_t bvci; uint8_t timer[11]; struct gprs_rlc_cfg rlc_cfg; + struct { + uint32_t gprs_codings; /* see NM_IPAC_F_GPRS_CODING_* flags */ + } support; }; /* Struct that holds one OML-Address (Address of the BSC) */ @@ -319,6 +322,7 @@ struct gsm_bts { struct { uint8_t ciphers; /* flags A5/1==0x1, A5/2==0x2, A5/3==0x4 */ + uint8_t max_ta; /* maximum timing advance */ } support; struct { uint8_t tc4_ctr; diff --git a/include/osmo-bts/bts_trx.h b/include/osmo-bts/bts_trx.h index a098c3e5f..9d3a748e9 100644 --- a/include/osmo-bts/bts_trx.h +++ b/include/osmo-bts/bts_trx.h @@ -44,6 +44,12 @@ struct gsm_bts_trx { /* The associated PHY instance */ struct phy_instance *pinst; + struct { + uint32_t freq_bands; /* see NM_IPAC_F_FREQ_BAND_* flags */ + uint32_t chan_types; /* see NM_IPAC_F_CHANT_* flags */ + uint32_t chan_modes; /* see NM_IPAC_F_CHANM_* flags */ + } support; + struct gsm_bts_trx_ts ts[TRX_NR_TS]; }; diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h index b20f3eaa6..164c89fd1 100644 --- a/include/osmo-bts/gsm_data.h +++ b/include/osmo-bts/gsm_data.h @@ -59,6 +59,52 @@ #define MAX_VERSION_LENGTH 64 +/* NM_IPAC_F_CHANT_* mask for NM_IPAC_EIE_CHAN_TYPES (common) */ +#define NM_IPAC_MASK_CHANT_COMMON \ + (NM_IPAC_F_CHANT_TCHF | \ + NM_IPAC_F_CHANT_TCHH | \ + NM_IPAC_F_CHANT_SDCCH8 | \ + NM_IPAC_F_CHANT_BCCH | \ + NM_IPAC_F_CHANT_BCCH_SDCCH4) +/* NM_IPAC_F_CHANM_SPEECH_* mask for NM_IPAC_EIE_CHAN_MODES */ +#define NM_IPAC_MASK_CHANM_SPEECH \ + (NM_IPAC_F_CHANM_SPEECH_FS | \ + NM_IPAC_F_CHANM_SPEECH_EFS | \ + NM_IPAC_F_CHANM_SPEECH_AFS | \ + NM_IPAC_F_CHANM_SPEECH_HS | \ + NM_IPAC_F_CHANM_SPEECH_AHS) +/* NM_IPAC_F_CHANM_CSD_NT_* mask for NM_IPAC_EIE_CHAN_MODES */ +#define NM_IPAC_MASK_CHANM_CSD_NT \ + (NM_IPAC_F_CHANM_CSD_NT_4k8 | \ + NM_IPAC_F_CHANM_CSD_NT_9k6 | \ + NM_IPAC_F_CHANM_CSD_NT_14k4) +/* NM_IPAC_F_CHANM_CSD_T_* mask for NM_IPAC_EIE_CHAN_MODES */ +#define NM_IPAC_MASK_CHANM_CSD_T \ + (NM_IPAC_F_CHANM_CSD_T_1200_75 | \ + NM_IPAC_F_CHANM_CSD_T_600 | \ + NM_IPAC_F_CHANM_CSD_T_1k2 | \ + NM_IPAC_F_CHANM_CSD_T_2k4 | \ + NM_IPAC_F_CHANM_CSD_T_4k8 | \ + NM_IPAC_F_CHANM_CSD_T_9k6 | \ + NM_IPAC_F_CHANM_CSD_T_14k4) +/* NM_IPAC_F_GPRS_CODING_CS[1-4] mask for NM_IPAC_EIE_GPRS_CODING */ +#define NM_IPAC_MASK_GPRS_CODING_CS \ + (NM_IPAC_F_GPRS_CODING_CS1 | \ + NM_IPAC_F_GPRS_CODING_CS2 | \ + NM_IPAC_F_GPRS_CODING_CS3 | \ + NM_IPAC_F_GPRS_CODING_CS4) +/* NM_IPAC_F_GPRS_CODING_MCS[1-9] mask for NM_IPAC_EIE_GPRS_CODING */ +#define NM_IPAC_MASK_GPRS_CODING_MCS \ + (NM_IPAC_F_GPRS_CODING_MCS1 | \ + NM_IPAC_F_GPRS_CODING_MCS2 | \ + NM_IPAC_F_GPRS_CODING_MCS3 | \ + NM_IPAC_F_GPRS_CODING_MCS4 | \ + NM_IPAC_F_GPRS_CODING_MCS5 | \ + NM_IPAC_F_GPRS_CODING_MCS6 | \ + NM_IPAC_F_GPRS_CODING_MCS7 | \ + NM_IPAC_F_GPRS_CODING_MCS8 | \ + NM_IPAC_F_GPRS_CODING_MCS9) + enum gsm_bts_trx_ts_flags { TS_F_PDCH_ACTIVE = 0x1000, TS_F_PDCH_ACT_PENDING = 0x2000, diff --git a/src/common/bts.c b/src/common/bts.c index 3cd91e7eb..7e7d8f0d9 100644 --- a/src/common/bts.c +++ b/src/common/bts.c @@ -59,6 +59,7 @@ #include #include +#define MAX_TA_DEF 63 /* default max Timing Advance value */ #define MIN_QUAL_RACH 50 /* minimum link quality (in centiBels) for Access Bursts */ #define MIN_QUAL_NORM -5 /* minimum link quality (in centiBels) for Normal Bursts */ @@ -344,7 +345,7 @@ int bts_init(struct gsm_bts *bts) bts->bsic_configured = false; bts->load.ccch.load_ind_period = 112; bts->rtp_jitter_buf_ms = 100; - bts->max_ta = 63; + bts->max_ta = MAX_TA_DEF; bts->ny1 = 4; bts->ny2 = 4; bts->t3105_ms = 300; @@ -384,6 +385,9 @@ int bts_init(struct gsm_bts *bts) osmo_bts_set_feature(bts->features, BTS_FEAT_IPV6_NSVC); osmo_bts_set_feature(bts->features, BTS_FEAT_PAGING_COORDINATION); + /* Maximum TA supported by the PHY (can be overridden by PHY specific code) */ + bts->support.max_ta = MAX_TA_DEF; + rc = bts_model_init(bts); if (rc < 0) return rc; diff --git a/src/common/oml.c b/src/common/oml.c index 4565e9a82..701f5f3ea 100644 --- a/src/common/oml.c +++ b/src/common/oml.c @@ -217,6 +217,68 @@ static inline void add_bts_feat(struct msgb *msg, const struct gsm_bts *bts) msgb_tl16v_put(msg, NM_ATT_MANUF_ID, len, bts->features->data); } +/* Add ip.access feature flags for the given MO */ +static int add_att_ipacc_features(struct msgb *msg, const struct gsm_abis_mo *mo) +{ + const struct gsm_bts *bts = mo->bts; + const struct gsm_bts_trx *trx; + uint32_t val; + uint8_t *len; + + msgb_v_put(msg, NM_ATT_IPACC_SUPP_FEATURES); + + /* We don't know the length yet, so we update it later. */ + len = msgb_put(msg, 2); + + switch (mo->obj_class) { + case NM_OC_BTS: + msgb_tv16_put(msg, NM_IPAC_EIE_MAX_TA, 1); /* TL16 */ + msgb_put_u8(msg, (bts->support.max_ta >> 0) & 0xff); + break; + case NM_OC_RADIO_CARRIER: + trx = container_of(mo, struct gsm_bts_trx, mo); + msgb_tv16_put(msg, NM_IPAC_EIE_FREQ_BANDS, 1); /* TL16 */ + msgb_put_u8(msg, (trx->support.freq_bands >> 0) & 0xff); + break; + case NM_OC_BASEB_TRANSC: + trx = container_of(mo, struct gsm_bts_trx, bb_transc.mo); + msgb_tv16_put(msg, NM_IPAC_EIE_CIPH_ALGOS, 1); /* TL16 */ + msgb_put_u8(msg, bts->support.ciphers); /* LSB is A5/1 */ + + msgb_tv16_put(msg, NM_IPAC_EIE_CHAN_TYPES, 2); /* TL16 */ + msgb_put_u8(msg, (trx->support.chan_types >> 0) & 0xff); + msgb_put_u8(msg, (trx->support.chan_types >> 8) & 0xff); + + msgb_tv16_put(msg, NM_IPAC_EIE_CHAN_MODES, 3); /* TL16 */ + msgb_put_u8(msg, (trx->support.chan_modes >> 0) & 0xff); + msgb_put_u8(msg, (trx->support.chan_modes >> 8) & 0xff); + msgb_put_u8(msg, (trx->support.chan_modes >> 16) & 0xff); + + msgb_tv16_put(msg, NM_IPAC_EIE_RTP_FEATURES, 1); /* TL16 */ + val = NM_IPAC_F_RTP_FEAT_IR_64k; + msgb_put_u8(msg, (val >> 0) & 0xff); + + msgb_tv16_put(msg, NM_IPAC_EIE_RSL_FEATURES, 1); /* TL16 */ + val = NM_IPAC_F_RSL_FEAT_DYN_PDCH_ACT + | NM_IPAC_F_RSL_FEAT_RTP_PT2; + msgb_put_u8(msg, (val >> 0) & 0xff); + break; + case NM_OC_GPRS_CELL: + msgb_tv16_put(msg, NM_IPAC_EIE_GPRS_CODING, 2); /* TL16 */ + msgb_put_u8(msg, (bts->gprs.cell.support.gprs_codings >> 0) & 0xff); + msgb_put_u8(msg, (bts->gprs.cell.support.gprs_codings >> 8) & 0xff); + break; + default: + msgb_get(msg, 1 + 2); /* TL16 */ + return -ENOTSUP; + } + + /* Finally, update the length */ + osmo_store16be((uint16_t)(msg->tail - (len + 2)), len); + + return 0; +} + /* send 3GPP TS 52.021 ยง8.11.2 Get Attribute Response */ static int oml_tx_attr_resp(const struct gsm_abis_mo *mo, const uint8_t *attr, uint16_t attr_len) @@ -252,6 +314,10 @@ static int oml_tx_attr_resp(const struct gsm_abis_mo *mo, else goto unsupported; break; + case NM_ATT_IPACC_SUPP_FEATURES: + if (add_att_ipacc_features(nmsg, mo) != 0) + goto unsupported; + break; default: unsupported: LOGP(DOML, LOGL_ERROR, "%s: O&M Get Attributes [%u], %s is unsupported\n", diff --git a/src/osmo-bts-lc15/l1_if.c b/src/osmo-bts-lc15/l1_if.c index e999527f7..bf120a9c5 100644 --- a/src/osmo-bts-lc15/l1_if.c +++ b/src/osmo-bts-lc15/l1_if.c @@ -1426,6 +1426,30 @@ static int info_compl_cb(struct gsm_bts_trx *trx, struct msgb *resp, LOGP(DL1C, LOGL_FATAL, "BTS band %s not supported by hw\n", gsm_band_name(trx->bts->band)); + /* Frequency bands indicated to the BSC */ + switch (fl1h->hw_info.band_support) { + case GSM_BAND_450: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_450; + break; + case GSM_BAND_480: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_480; + break; + case GSM_BAND_850: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_850; + break; + case GSM_BAND_900: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_PGSM; + /* XXX: does GSM_BAND_900 include NM_IPAC_F_FREQ_BAND_EGSM? */ + /* XXX: does GSM_BAND_900 include NM_IPAC_F_FREQ_BAND_RGSM? */ + break; + case GSM_BAND_1800: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_DCS; + break; + case GSM_BAND_1900: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_PCS; + break; + } + /* Request the activation */ l1if_activate_rf(fl1h, 1); diff --git a/src/osmo-bts-lc15/main.c b/src/osmo-bts-lc15/main.c index bcd526a56..59c089a79 100644 --- a/src/osmo-bts-lc15/main.c +++ b/src/osmo-bts-lc15/main.c @@ -89,6 +89,8 @@ int bts_model_init(struct gsm_bts *bts) bts->model_priv = bts_lc15; bts->variant = BTS_OSMO_LITECELL15; bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3); + bts->gprs.cell.support.gprs_codings = NM_IPAC_MASK_GPRS_CODING_CS + | NM_IPAC_MASK_GPRS_CODING_MCS; /* specific default values for LC15 platform */ bts_lc15->led_ctrl_mode = LC15_BTS_LED_CTRL_MODE_DEFAULT; @@ -126,6 +128,17 @@ int bts_model_init(struct gsm_bts *bts) int bts_model_trx_init(struct gsm_bts_trx *trx) { + /* Frequency bands indicated to the BSC */ + trx->support.freq_bands = 0x00; /* updated in info_compl_cb() */ + + /* Channel types and modes indicated to the BSC */ + trx->support.chan_types = NM_IPAC_MASK_CHANT_COMMON + | NM_IPAC_F_CHANT_BCCH_SDCCH4_CBCH + | NM_IPAC_F_CHANT_SDCCH8_CBCH + | NM_IPAC_F_CHANT_PDCHF + | NM_IPAC_F_CHANT_TCHF_PDCHF; + trx->support.chan_modes = NM_IPAC_MASK_CHANM_SPEECH; + trx->nominal_power = 40; trx->power_params.trx_p_max_out_mdBm = to_mdB(trx->bts->c0->nominal_power); return 0; diff --git a/src/osmo-bts-oc2g/l1_if.c b/src/osmo-bts-oc2g/l1_if.c index 4f99097bb..2ad59c9ca 100644 --- a/src/osmo-bts-oc2g/l1_if.c +++ b/src/osmo-bts-oc2g/l1_if.c @@ -1475,6 +1475,30 @@ static int info_compl_cb(struct gsm_bts_trx *trx, struct msgb *resp, LOGP(DL1C, LOGL_FATAL, "BTS band %s not supported by hw\n", gsm_band_name(trx->bts->band)); + /* Frequency bands indicated to the BSC */ + switch (fl1h->hw_info.band_support) { + case GSM_BAND_450: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_450; + break; + case GSM_BAND_480: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_480; + break; + case GSM_BAND_850: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_850; + break; + case GSM_BAND_900: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_PGSM; + /* XXX: does GSM_BAND_900 include NM_IPAC_F_FREQ_BAND_EGSM? */ + /* XXX: does GSM_BAND_900 include NM_IPAC_F_FREQ_BAND_RGSM? */ + break; + case GSM_BAND_1800: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_DCS; + break; + case GSM_BAND_1900: + trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_PCS; + break; + } + /* Request the activation */ l1if_activate_rf(fl1h, 1); diff --git a/src/osmo-bts-oc2g/main.c b/src/osmo-bts-oc2g/main.c index e1848146f..f5f9625c6 100644 --- a/src/osmo-bts-oc2g/main.c +++ b/src/osmo-bts-oc2g/main.c @@ -88,6 +88,8 @@ int bts_model_init(struct gsm_bts *bts) bts->model_priv = bts_oc2g; bts->variant = BTS_OSMO_OC2G; bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3); + bts->gprs.cell.support.gprs_codings = NM_IPAC_MASK_GPRS_CODING_CS + | NM_IPAC_MASK_GPRS_CODING_MCS; /* specific default values for OC2G platform */ /* TODO(oramadan) MERGE @@ -127,6 +129,17 @@ int bts_model_init(struct gsm_bts *bts) int bts_model_trx_init(struct gsm_bts_trx *trx) { + /* Frequency bands indicated to the BSC */ + trx->support.freq_bands = 0x00; /* updated in info_compl_cb() */ + + /* Channel types and modes indicated to the BSC */ + trx->support.chan_types = NM_IPAC_MASK_CHANT_COMMON + | NM_IPAC_F_CHANT_BCCH_SDCCH4_CBCH + | NM_IPAC_F_CHANT_SDCCH8_CBCH + | NM_IPAC_F_CHANT_PDCHF + | NM_IPAC_F_CHANT_TCHF_PDCHF; + trx->support.chan_modes = NM_IPAC_MASK_CHANM_SPEECH; + trx->nominal_power = 25; trx->power_params.trx_p_max_out_mdBm = to_mdB(trx->bts->c0->nominal_power); return 0; diff --git a/src/osmo-bts-octphy/l1_if.c b/src/osmo-bts-octphy/l1_if.c index f132cddc2..c79c11549 100644 --- a/src/osmo-bts-octphy/l1_if.c +++ b/src/osmo-bts-octphy/l1_if.c @@ -768,6 +768,7 @@ int bts_model_init(struct gsm_bts *bts) bts->variant = BTS_OSMO_OCTPHY; bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3); + bts->gprs.cell.support.gprs_codings = NM_IPAC_MASK_GPRS_CODING_CS; /* FIXME: what is the nominal transmit power of the PHY/board? */ bts->c0->nominal_power = 15; @@ -786,6 +787,29 @@ int bts_model_init(struct gsm_bts *bts) int bts_model_trx_init(struct gsm_bts_trx *trx) { + /* Frequency bands indicated to the BSC */ + trx->support.freq_bands = NM_IPAC_F_FREQ_BAND_PGSM + | NM_IPAC_F_FREQ_BAND_EGSM + | NM_IPAC_F_FREQ_BAND_RGSM + | NM_IPAC_F_FREQ_BAND_DCS + | NM_IPAC_F_FREQ_BAND_PCS + | NM_IPAC_F_FREQ_BAND_850 + | NM_IPAC_F_FREQ_BAND_480 + | NM_IPAC_F_FREQ_BAND_450; + + /* Channel types and modes indicated to the BSC */ + trx->support.chan_types = NM_IPAC_MASK_CHANT_COMMON +#if defined(cOCTVC1_GSM_LOGICAL_CHANNEL_COMBINATION_ENUM_FCCH_SCH_BCCH_CCCH_SDCCH4_CBCH_SACCHC4) + | NM_IPAC_F_CHANT_BCCH_SDCCH4_CBCH +#endif +#if defined(cOCTVC1_GSM_LOGICAL_CHANNEL_COMBINATION_ENUM_SDCCH8_CBCH_SACCHC8) + | NM_IPAC_F_CHANT_SDCCH8_CBCH +#endif + | NM_IPAC_F_CHANT_PDCHF + | NM_IPAC_F_CHANT_TCHF_PDCHF; + trx->support.chan_modes = NM_IPAC_F_CHANM_SPEECH_FS + | NM_IPAC_F_CHANM_SPEECH_HS; + return 0; } diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c index 156c4b8d0..4ab2ef64d 100644 --- a/src/osmo-bts-sysmo/l1_if.c +++ b/src/osmo-bts-sysmo/l1_if.c @@ -1938,5 +1938,27 @@ int bts_model_phy_link_open(struct phy_link *plink) hdl = pinst->u.sysmobts.hdl; osmo_strlcpy(bts->sub_model, sysmobts_model(hdl->hw_info.model_nr, hdl->hw_info.trx_nr), sizeof(bts->sub_model)); + /* Frequency bands indicated to the BSC */ + for (unsigned int i = 0; i < sizeof(hdl->hw_info.band_support) * 8; i++) { + if (~hdl->hw_info.band_support & (1 << i)) + continue; + switch (1 << i) { + case GSM_BAND_850: + pinst->trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_850; + break; + case GSM_BAND_900: + pinst->trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_PGSM; + /* XXX: does GSM_BAND_900 include NM_IPAC_F_FREQ_BAND_EGSM? */ + /* XXX: does GSM_BAND_900 include NM_IPAC_F_FREQ_BAND_RGSM? */ + break; + case GSM_BAND_1800: + pinst->trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_DCS; + break; + case GSM_BAND_1900: + pinst->trx->support.freq_bands |= NM_IPAC_F_FREQ_BAND_PCS; + break; + } + } + return 0; } diff --git a/src/osmo-bts-sysmo/main.c b/src/osmo-bts-sysmo/main.c index 68f36df28..04f9c8a66 100644 --- a/src/osmo-bts-sysmo/main.c +++ b/src/osmo-bts-sysmo/main.c @@ -60,6 +60,8 @@ int bts_model_init(struct gsm_bts *bts) bts->variant = BTS_OSMO_SYSMO; bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3); + bts->gprs.cell.support.gprs_codings = NM_IPAC_MASK_GPRS_CODING_CS + | NM_IPAC_MASK_GPRS_CODING_MCS; if (stat(SYSMOBTS_RF_LOCK_PATH, &st) == 0) { LOGP(DL1C, LOGL_NOTICE, "Not starting BTS due to RF_LOCK file present\n"); @@ -95,6 +97,17 @@ int bts_model_init(struct gsm_bts *bts) int bts_model_trx_init(struct gsm_bts_trx *trx) { + /* Frequency bands indicated to the BSC */ + trx->support.freq_bands = 0x00; /* updated in bts_model_phy_link_open() */ + + /* Channel types and modes indicated to the BSC */ + trx->support.chan_types = NM_IPAC_MASK_CHANT_COMMON + | NM_IPAC_F_CHANT_BCCH_SDCCH4_CBCH + | NM_IPAC_F_CHANT_SDCCH8_CBCH + | NM_IPAC_F_CHANT_PDCHF + | NM_IPAC_F_CHANT_TCHF_PDCHF; + trx->support.chan_modes = NM_IPAC_MASK_CHANM_SPEECH; + return 0; } diff --git a/src/osmo-bts-trx/main.c b/src/osmo-bts-trx/main.c index ff71b3af6..c1f571612 100644 --- a/src/osmo-bts-trx/main.c +++ b/src/osmo-bts-trx/main.c @@ -132,6 +132,8 @@ int bts_model_init(struct gsm_bts *bts) bts->model_priv = bts_trx; bts->variant = BTS_OSMO_TRX; bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3) | CIPHER_A5(4); + bts->gprs.cell.support.gprs_codings = NM_IPAC_MASK_GPRS_CODING_CS + | NM_IPAC_MASK_GPRS_CODING_MCS; /* The nominal value for each TRX is later overwritten through VTY cmd * 'nominal-tx-power' if present, otherwise through TRXC cmd NOMTXPOWER. @@ -173,6 +175,28 @@ int bts_model_init(struct gsm_bts *bts) int bts_model_trx_init(struct gsm_bts_trx *trx) { + /* Frequency bands indicated to the BSC */ + trx->support.freq_bands = NM_IPAC_F_FREQ_BAND_PGSM + | NM_IPAC_F_FREQ_BAND_EGSM + | NM_IPAC_F_FREQ_BAND_RGSM + | NM_IPAC_F_FREQ_BAND_DCS + | NM_IPAC_F_FREQ_BAND_PCS + | NM_IPAC_F_FREQ_BAND_850 + | NM_IPAC_F_FREQ_BAND_480 + | NM_IPAC_F_FREQ_BAND_450; + + /* Channel types and modes indicated to the BSC */ + trx->support.chan_types = NM_IPAC_MASK_CHANT_COMMON + | NM_IPAC_F_CHANT_BCCH_SDCCH4_CBCH + | NM_IPAC_F_CHANT_SDCCH8_CBCH + | NM_IPAC_F_CHANT_PDCHF + | NM_IPAC_F_CHANT_TCHF_PDCHF; + trx->support.chan_modes = NM_IPAC_MASK_CHANM_SPEECH + | NM_IPAC_MASK_CHANM_CSD_NT + | NM_IPAC_MASK_CHANM_CSD_T; + /* TODO: NM_IPAC_F_CHANM_CSD_T_14k4 (see OS#6167) */ + trx->support.chan_modes &= ~NM_IPAC_F_CHANM_CSD_T_14k4; + /* The nominal value for each TRX is later overwritten through VTY cmd * 'nominal-tx-power' if present, otherwise through TRXC cmd NOMTXPOWER. */ diff --git a/src/osmo-bts-virtual/main.c b/src/osmo-bts-virtual/main.c index 6efbca5e1..bf5f324b5 100644 --- a/src/osmo-bts-virtual/main.c +++ b/src/osmo-bts-virtual/main.c @@ -61,6 +61,8 @@ int bts_model_init(struct gsm_bts *bts) bts->model_priv = bts_virt; bts->variant = BTS_OSMO_VIRTUAL; bts->support.ciphers = CIPHER_A5(1) | CIPHER_A5(2) | CIPHER_A5(3); + bts->gprs.cell.support.gprs_codings = NM_IPAC_MASK_GPRS_CODING_CS + | NM_IPAC_MASK_GPRS_CODING_MCS; /* order alphabetically */ osmo_bts_set_feature(bts->features, BTS_FEAT_CBCH); @@ -78,6 +80,28 @@ int bts_model_init(struct gsm_bts *bts) int bts_model_trx_init(struct gsm_bts_trx *trx) { + /* Frequency bands indicated to the BSC */ + trx->support.freq_bands = NM_IPAC_F_FREQ_BAND_PGSM + | NM_IPAC_F_FREQ_BAND_EGSM + | NM_IPAC_F_FREQ_BAND_RGSM + | NM_IPAC_F_FREQ_BAND_DCS + | NM_IPAC_F_FREQ_BAND_PCS + | NM_IPAC_F_FREQ_BAND_850 + | NM_IPAC_F_FREQ_BAND_480 + | NM_IPAC_F_FREQ_BAND_450; + + /* Channel types and modes indicated to the BSC */ + trx->support.chan_types = NM_IPAC_MASK_CHANT_COMMON + | NM_IPAC_F_CHANT_BCCH_SDCCH4_CBCH + | NM_IPAC_F_CHANT_SDCCH8_CBCH + | NM_IPAC_F_CHANT_PDCHF + | NM_IPAC_F_CHANT_TCHF_PDCHF; + trx->support.chan_modes = NM_IPAC_MASK_CHANM_SPEECH + | NM_IPAC_MASK_CHANM_CSD_NT + | NM_IPAC_MASK_CHANM_CSD_T; + /* TODO: NM_IPAC_F_CHANM_CSD_T_14k4 (see OS#6167) */ + trx->support.chan_modes &= ~NM_IPAC_F_CHANM_CSD_T_14k4; + return 0; }