aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-09-09 00:57:38 +0700
committerVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-09-23 17:54:05 +0700
commitdaf7b2838721af9713a492fe8c9816dba5ac1244 (patch)
tree4d614ea0199fe1f93d6c0e8c756a6ba6bc779ae6 /src
parentc992bda3cd2d19c4288c03fdfbaf44ebecff8755 (diff)
oml: ipacc: send GPRS Cell attributes based on IPA Object Version
Diffstat (limited to 'src')
-rw-r--r--src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c82
1 files changed, 56 insertions, 26 deletions
diff --git a/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c b/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c
index 83c5a30ec..96c4d50f5 100644
--- a/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c
+++ b/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c
@@ -227,9 +227,8 @@ struct msgb *nanobts_gen_set_nse_attr(struct gsm_bts_sm *bts_sm)
struct msgb *nanobts_gen_set_cell_attr(struct gsm_bts *bts)
{
+ const struct gsm_gprs_cell *cell = &bts->gprs.cell;
struct msgb *msgb;
- struct abis_nm_ipacc_att_rlc_cfg rlc_cfg;
- struct abis_nm_ipacc_att_rlc_cfg_2 rlc_cfg_2;
uint8_t buf[2];
msgb = msgb_alloc(1024, __func__);
@@ -250,7 +249,7 @@ struct msgb *nanobts_gen_set_cell_attr(struct gsm_bts *bts)
msgb_tl16v_put(msgb, NM_ATT_IPACC_BVCI, 2, buf);
/* all timers in seconds, unless otherwise stated */
- rlc_cfg = (struct abis_nm_ipacc_att_rlc_cfg){
+ const struct abis_nm_ipacc_att_rlc_cfg rlc_cfg = {
.t3142 = 20, /* T3142 */
.t3169 = 5, /* T3169 */
.t3191 = 5, /* T3191 */
@@ -263,31 +262,62 @@ struct msgb *nanobts_gen_set_cell_attr(struct gsm_bts *bts)
};
msgb_tl16v_put(msgb, NM_ATT_IPACC_RLC_CFG, sizeof(rlc_cfg), (const uint8_t *)&rlc_cfg);
- if (bts->gprs.mode == BTS_GPRS_EGPRS) {
- buf[0] = 0x8f;
- buf[1] = 0xff;
- } else {
- buf[0] = 0x0f;
- buf[1] = 0x00;
+ switch (bts->type) {
+ case GSM_BTS_TYPE_NANOBTS:
+ if (cell->mo.ipaccess.obj_version < 4)
+ break;
+ /* fall-through */
+ case GSM_BTS_TYPE_OSMOBTS:
+ if (bts->gprs.mode == BTS_GPRS_EGPRS) {
+ buf[0] = 0x8f;
+ buf[1] = 0xff;
+ } else {
+ buf[0] = 0x0f;
+ buf[1] = 0x00;
+ }
+ msgb_tl16v_put(msgb, NM_ATT_IPACC_CODING_SCHEMES, 2, buf);
+ break;
+ default:
+ break;
}
- msgb_tl16v_put(msgb, NM_ATT_IPACC_CODING_SCHEMES, 2, buf);
- rlc_cfg_2 = (struct abis_nm_ipacc_att_rlc_cfg_2){
- .t_dl_tbf_ext_10ms = htons(250), /* 0..500 */
- .t_ul_tbf_ext_10ms = htons(250), /* 0..500 */
- .initial_cs = 2, /* CS2 */
- };
- msgb_tl16v_put(msgb, NM_ATT_IPACC_RLC_CFG_2, sizeof(rlc_cfg_2), (const uint8_t *)&rlc_cfg_2);
-
-#if 0
- /* EDGE model only, breaks older models.
- * Should inquire the BTS capabilities */
- struct abis_nm_ipacc_att_rlc_cfg_3 rlc_cfg_3;
- rlc_cfg_3 = (struct abis_nm_ipacc_att_rlc_cfg_3){
- .initial_mcs = 2, /* MCS2 */
- };
- msgb_tl16v_put(msgb, NM_ATT_IPACC_RLC_CFG_3, sizeof(rlc_cfg_3), (const uint8_t *)&rlc_cfg_3);
-#endif
+ switch (bts->type) {
+ case GSM_BTS_TYPE_NANOBTS:
+ if (cell->mo.ipaccess.obj_version < 20)
+ break;
+ /* fall-through */
+ case GSM_BTS_TYPE_OSMOBTS:
+ {
+ const struct abis_nm_ipacc_att_rlc_cfg_2 rlc_cfg_2 = {
+ .t_dl_tbf_ext_10ms = htons(250), /* 0..500 */
+ .t_ul_tbf_ext_10ms = htons(250), /* 0..500 */
+ .initial_cs = 2, /* CS2 */
+ };
+ msgb_tl16v_put(msgb, NM_ATT_IPACC_RLC_CFG_2,
+ sizeof(rlc_cfg_2), (const uint8_t *)&rlc_cfg_2);
+ break;
+ }
+ default:
+ break;
+ }
+
+ switch (bts->type) {
+ case GSM_BTS_TYPE_NANOBTS:
+ if (cell->mo.ipaccess.obj_version < 30)
+ break;
+ /* fall-through */
+ case GSM_BTS_TYPE_OSMOBTS:
+ {
+ const struct abis_nm_ipacc_att_rlc_cfg_3 rlc_cfg_3 = {
+ .initial_mcs = 2, /* MCS2 */
+ };
+ msgb_tl16v_put(msgb, NM_ATT_IPACC_RLC_CFG_3,
+ sizeof(rlc_cfg_3), (const uint8_t *)&rlc_cfg_3);
+ break;
+ }
+ default:
+ break;
+ }
return msgb;
}