diff options
author | Harald Welte <laforge@gnumonks.org> | 2015-12-12 21:15:19 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2016-01-16 16:25:52 +0100 |
commit | e9f12acbeb5a369282719f8e0deecc88034a5488 (patch) | |
tree | e5c33c49d4a057aa294ae0f66817451eb522ae4a /src/common/oml.c | |
parent | 7d6860b114e5d7b6f7a6b9e78e5cd879940c89f3 (diff) |
LAPDm: Use T200 settings from OML rather than libosmocore defaults
Diffstat (limited to 'src/common/oml.c')
-rw-r--r-- | src/common/oml.c | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/src/common/oml.c b/src/common/oml.c index 6d778a53..ef1bea3d 100644 --- a/src/common/oml.c +++ b/src/common/oml.c @@ -386,11 +386,69 @@ static const uint8_t abis_nm_t200_mult[] = { [T200_FACCH_F] = 5, [T200_FACCH_H] = 5, [T200_SACCH_TCH_SAPI0] = 10, - [T200_SACCH_SDCCH] = 10, + [T200_SACCH_SDCCH] = 10, [T200_SDCCH_SAPI3] = 5, [T200_SACCH_TCH_SAPI3] = 10 }; +/* the below defaults correpsond to the libocmocore default of 1s for + * DCCH and 2s for ACCH. The BSC should overried this via OML anyway. */ +const uint8_t oml_default_t200_ms[7] = { + [T200_SDCCH] = 1000/5, + [T200_FACCH_F] = 1000/5, + [T200_FACCH_H] = 1000/5, + [T200_SACCH_TCH_SAPI0] = 2000/10, + [T200_SACCH_SDCCH] = 2000/10, + [T200_SDCCH_SAPI3] = 1000/5, + [T200_SACCH_TCH_SAPI3] = 2000/10, +}; + +static void dl_set_t200(struct lapdm_datalink *dl, unsigned int t200_msec) +{ + dl->dl.t200_sec = t200_msec / 1000; + dl->dl.t200_usec = (t200_msec % 1000) * 1000; +} + +/* Configure LAPDm T200 timers for this lchan according to OML */ +int oml_set_lchan_t200(struct gsm_lchan *lchan) +{ + struct gsm_bts *bts = lchan->ts->trx->bts; + struct gsm_bts_role_bts *btsb = bts_role_bts(bts); + struct lapdm_channel *lc = &lchan->lapdm_ch; + unsigned int t200_dcch, t200_dcch_sapi3, t200_acch, t200_acch_sapi3; + + /* set T200 for main and associated channel */ + switch (lchan->type) { + case GSM_LCHAN_SDCCH: + t200_dcch = btsb->t200_ms[T200_SDCCH]; + t200_dcch_sapi3 = btsb->t200_ms[T200_SDCCH_SAPI3]; + t200_acch = btsb->t200_ms[T200_SACCH_SDCCH]; + t200_acch_sapi3 = btsb->t200_ms[T200_SACCH_SDCCH]; + break; + case GSM_LCHAN_TCH_F: + t200_dcch = btsb->t200_ms[T200_FACCH_F]; + t200_dcch_sapi3 = btsb->t200_ms[T200_FACCH_F]; + t200_acch = btsb->t200_ms[T200_SACCH_TCH_SAPI0]; + t200_acch_sapi3 = btsb->t200_ms[T200_SACCH_TCH_SAPI3]; + break; + case GSM_LCHAN_TCH_H: + t200_dcch = btsb->t200_ms[T200_FACCH_H]; + t200_dcch_sapi3 = btsb->t200_ms[T200_FACCH_H]; + t200_acch = btsb->t200_ms[T200_SACCH_TCH_SAPI0]; + t200_acch_sapi3 = btsb->t200_ms[T200_SACCH_TCH_SAPI3]; + break; + default: + return -1; + } + + dl_set_t200(&lc->lapdm_dcch.datalink[DL_SAPI0], t200_dcch); + dl_set_t200(&lc->lapdm_dcch.datalink[DL_SAPI3], t200_dcch_sapi3); + dl_set_t200(&lc->lapdm_acch.datalink[DL_SAPI0], t200_acch); + dl_set_t200(&lc->lapdm_acch.datalink[DL_SAPI3], t200_acch_sapi3); + + return 0; +} + /* 8.6.1 Set BTS Attributes has been received */ static int oml_rx_set_bts_attr(struct gsm_bts *bts, struct msgb *msg) { |