diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2021-10-14 14:55:35 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2021-10-14 14:55:35 +0200 |
commit | fd051b0f5cd4927addef4e87564548ba5f76f2b2 (patch) | |
tree | cf0924066598350b5290943432227539d9e72ab1 | |
parent | 03cb50f809c0b13fc2e8d11a7c1b94b01a0cb4d9 (diff) |
Move lchan related code to lchan.{c,h}
Change-Id: I17ebe6af69e31d1b4dbad7656bbf043f4c9243c1
-rw-r--r-- | include/osmo-bts/bts.h | 2 | ||||
-rw-r--r-- | include/osmo-bts/lchan.h | 3 | ||||
-rw-r--r-- | src/common/bts.c | 60 | ||||
-rw-r--r-- | src/common/lchan.c | 76 | ||||
-rw-r--r-- | src/common/sysinfo.c | 16 |
5 files changed, 79 insertions, 78 deletions
diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h index 4683758b..8832588e 100644 --- a/include/osmo-bts/bts.h +++ b/include/osmo-bts/bts.h @@ -407,8 +407,6 @@ uint8_t *bts_sysinfo_get(struct gsm_bts *bts, const struct gsm_time *g_time); void regenerate_si3_restoctets(struct gsm_bts *bts); void regenerate_si4_restoctets(struct gsm_bts *bts); int get_si4_ro_offset(const uint8_t *si4_buf); -uint8_t *lchan_sacch_get(struct gsm_lchan *lchan); -int lchan_init_lapdm(struct gsm_lchan *lchan); void load_timer_start(struct gsm_bts *bts); void load_timer_stop(struct gsm_bts *bts); diff --git a/include/osmo-bts/lchan.h b/include/osmo-bts/lchan.h index 8fcf36aa..665bb441 100644 --- a/include/osmo-bts/lchan.h +++ b/include/osmo-bts/lchan.h @@ -329,6 +329,7 @@ static inline const char *lchan_ciph_state_name(uint8_t state) void gsm_lchan_init(struct gsm_lchan *lchan, struct gsm_bts_trx_ts *ts, unsigned int lchan_nr); void gsm_lchan_name_update(struct gsm_lchan *lchan); +int lchan_init_lapdm(struct gsm_lchan *lchan); void gsm_lchan_release(struct gsm_lchan *lchan, enum lchan_rel_act_kind rel_kind); const char *gsm_lchans_name(enum gsm_lchan_state s); @@ -337,6 +338,8 @@ static inline char *gsm_lchan_name(const struct gsm_lchan *lchan) return lchan->name; } +uint8_t *lchan_sacch_get(struct gsm_lchan *lchan); + uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan); uint8_t gsm_lchan2chan_nr_rsl(const struct gsm_lchan *lchan); uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan, diff --git a/src/common/bts.c b/src/common/bts.c index b226df20..86140ba0 100644 --- a/src/common/bts.c +++ b/src/common/bts.c @@ -454,66 +454,6 @@ int bts_link_estab(struct gsm_bts *bts) return bts_model_oml_estab(bts); } -/* prepare the per-SAPI T200 arrays for a given lchan */ -static int t200_by_lchan(int *t200_ms_dcch, int *t200_ms_acch, struct gsm_lchan *lchan) -{ - struct gsm_bts *bts = lchan->ts->trx->bts; - - /* we have to compensate for the "RTS advance" due to the asynchronous interface between - * the BTS (LAPDm) and the PHY/L1 (OsmoTRX or DSP in case of osmo-bts-{sysmo,lc15,oc2g,octphy} */ - int32_t fn_advance = bts_get_avg_fn_advance(bts); - int32_t fn_advance_us = fn_advance * 4615; - int fn_advance_ms = fn_advance_us / 1000; - - t200_ms_acch[DL_SAPI0] = bts->t200_ms[T200_SACCH_SDCCH] + fn_advance_ms; - t200_ms_acch[DL_SAPI3] = bts->t200_ms[T200_SACCH_SDCCH] + fn_advance_ms; - - if (lchan->repeated_acch_capability.dl_facch_all && (lchan->type == GSM_LCHAN_TCH_F || lchan->type == GSM_LCHAN_TCH_H)) { - t200_ms_acch[DL_SAPI0] *= 2; - t200_ms_acch[DL_SAPI3] *= 2; - } - - switch (lchan->type) { - case GSM_LCHAN_SDCCH: - t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_SDCCH] + fn_advance_ms; - t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_SDCCH_SAPI3] + fn_advance_ms; - break; - case GSM_LCHAN_TCH_F: - t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_FACCH_F] + fn_advance_ms; - t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_FACCH_F] + fn_advance_ms; - break; - case GSM_LCHAN_TCH_H: - t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_FACCH_H] + fn_advance_ms; - t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_FACCH_H] + fn_advance_ms; - break; - default: - /* Channels such as CCCH don't use lapdm DL, and hence no T200 is needed */ - return -1; - } - return 0; -} - -int lchan_init_lapdm(struct gsm_lchan *lchan) -{ - struct lapdm_channel *lc = &lchan->lapdm_ch; - int t200_ms_dcch[_NR_DL_SAPI], t200_ms_acch[_NR_DL_SAPI]; - - if (t200_by_lchan(t200_ms_dcch, t200_ms_acch, lchan) == 0) { - LOGPLCHAN(lchan, DLLAPD, LOGL_DEBUG, - "Setting T200 D0=%u, D3=%u, S0=%u, S3=%u (all in ms)\n", - t200_ms_dcch[DL_SAPI0], t200_ms_dcch[DL_SAPI3], - t200_ms_acch[DL_SAPI0], t200_ms_acch[DL_SAPI3]); - lapdm_channel_init3(lc, LAPDM_MODE_BTS, t200_ms_dcch, t200_ms_acch, lchan->type, - gsm_lchan_name(lchan)); - lapdm_channel_set_flags(lc, LAPDM_ENT_F_POLLING_ONLY); - lapdm_channel_set_l1(lc, NULL, lchan); - } - /* We still need to set Rx callback to receive RACH requests: */ - lapdm_channel_set_l3(lc, lapdm_rll_tx_cb, lchan); - - return 0; -} - #define CCCH_RACH_RATIO_COMBINED256 (256*1/9) #define CCCH_RACH_RATIO_SEPARATE256 (256*10/55) diff --git a/src/common/lchan.c b/src/common/lchan.c index 747e8b0d..14fa6256 100644 --- a/src/common/lchan.c +++ b/src/common/lchan.c @@ -52,6 +52,45 @@ const struct value_string lchan_ciph_state_names[] = { { 0, NULL } }; +/* prepare the per-SAPI T200 arrays for a given lchan */ +static int t200_by_lchan(int *t200_ms_dcch, int *t200_ms_acch, struct gsm_lchan *lchan) +{ + struct gsm_bts *bts = lchan->ts->trx->bts; + + /* we have to compensate for the "RTS advance" due to the asynchronous interface between + * the BTS (LAPDm) and the PHY/L1 (OsmoTRX or DSP in case of osmo-bts-{sysmo,lc15,oc2g,octphy} */ + int32_t fn_advance = bts_get_avg_fn_advance(bts); + int32_t fn_advance_us = fn_advance * 4615; + int fn_advance_ms = fn_advance_us / 1000; + + t200_ms_acch[DL_SAPI0] = bts->t200_ms[T200_SACCH_SDCCH] + fn_advance_ms; + t200_ms_acch[DL_SAPI3] = bts->t200_ms[T200_SACCH_SDCCH] + fn_advance_ms; + + if (lchan->repeated_acch_capability.dl_facch_all && (lchan->type == GSM_LCHAN_TCH_F || lchan->type == GSM_LCHAN_TCH_H)) { + t200_ms_acch[DL_SAPI0] *= 2; + t200_ms_acch[DL_SAPI3] *= 2; + } + + switch (lchan->type) { + case GSM_LCHAN_SDCCH: + t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_SDCCH] + fn_advance_ms; + t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_SDCCH_SAPI3] + fn_advance_ms; + break; + case GSM_LCHAN_TCH_F: + t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_FACCH_F] + fn_advance_ms; + t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_FACCH_F] + fn_advance_ms; + break; + case GSM_LCHAN_TCH_H: + t200_ms_dcch[DL_SAPI0] = bts->t200_ms[T200_FACCH_H] + fn_advance_ms; + t200_ms_dcch[DL_SAPI3] = bts->t200_ms[T200_FACCH_H] + fn_advance_ms; + break; + default: + /* Channels such as CCCH don't use lapdm DL, and hence no T200 is needed */ + return -1; + } + return 0; +} + static void early_rr_ia_delay_cb(void *data) { struct gsm_lchan *lchan = data; @@ -105,6 +144,27 @@ void gsm_lchan_name_update(struct gsm_lchan *lchan) lchan->name = name; } +int lchan_init_lapdm(struct gsm_lchan *lchan) +{ + struct lapdm_channel *lc = &lchan->lapdm_ch; + int t200_ms_dcch[_NR_DL_SAPI], t200_ms_acch[_NR_DL_SAPI]; + + if (t200_by_lchan(t200_ms_dcch, t200_ms_acch, lchan) == 0) { + LOGPLCHAN(lchan, DLLAPD, LOGL_DEBUG, + "Setting T200 D0=%u, D3=%u, S0=%u, S3=%u (all in ms)\n", + t200_ms_dcch[DL_SAPI0], t200_ms_dcch[DL_SAPI3], + t200_ms_acch[DL_SAPI0], t200_ms_acch[DL_SAPI3]); + lapdm_channel_init3(lc, LAPDM_MODE_BTS, t200_ms_dcch, t200_ms_acch, lchan->type, + gsm_lchan_name(lchan)); + lapdm_channel_set_flags(lc, LAPDM_ENT_F_POLLING_ONLY); + lapdm_channel_set_l1(lc, NULL, lchan); + } + /* We still need to set Rx callback to receive RACH requests: */ + lapdm_channel_set_l3(lc, lapdm_rll_tx_cb, lchan); + + return 0; +} + static int dyn_ts_pdch_release(struct gsm_lchan *lchan) { struct gsm_bts_trx_ts *ts = lchan->ts; @@ -179,6 +239,22 @@ const char *gsm_lchans_name(enum gsm_lchan_state s) return get_value_string(lchan_s_names, s); } +/* obtain the next to-be transmitted dowlink SACCH frame (L2 hdr + L3); returns pointer to lchan->si buffer */ +uint8_t *lchan_sacch_get(struct gsm_lchan *lchan) +{ + uint32_t tmp, i; + + for (i = 0; i < _MAX_SYSINFO_TYPE; i++) { + tmp = (lchan->si.last + 1 + i) % _MAX_SYSINFO_TYPE; + if (!(lchan->si.valid & (1 << tmp))) + continue; + lchan->si.last = tmp; + return GSM_LCHAN_SI(lchan, tmp); + } + LOGPLCHAN(lchan, DL1P, LOGL_NOTICE, "SACCH no SI available\n"); + return NULL; +} + void lchan_set_state(struct gsm_lchan *lchan, enum gsm_lchan_state state) { DEBUGP(DL1C, "%s state %s -> %s\n", diff --git a/src/common/sysinfo.c b/src/common/sysinfo.c index 5c5af253..b0f1ebfd 100644 --- a/src/common/sysinfo.c +++ b/src/common/sysinfo.c @@ -164,22 +164,6 @@ uint8_t num_agch(const struct gsm_bts_trx *trx, const char * arg) return 1; } -/* obtain the next to-be transmitted dowlink SACCH frame (L2 hdr + L3); returns pointer to lchan->si buffer */ -uint8_t *lchan_sacch_get(struct gsm_lchan *lchan) -{ - uint32_t tmp, i; - - for (i = 0; i < _MAX_SYSINFO_TYPE; i++) { - tmp = (lchan->si.last + 1 + i) % _MAX_SYSINFO_TYPE; - if (!(lchan->si.valid & (1 << tmp))) - continue; - lchan->si.last = tmp; - return GSM_LCHAN_SI(lchan, tmp); - } - LOGPLCHAN(lchan, DL1P, LOGL_NOTICE, "SACCH no SI available\n"); - return NULL; -} - /* re-generate SI3 restoctets with GPRS indicator depending on the PCU socket connection state */ void regenerate_si3_restoctets(struct gsm_bts *bts) { |