<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/25697">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Move lchan specific code from gsm_Data.h to lchan.h<br><br>Let's split all lchan specific stuff into its own header, it helps<br>finding out data and operations available related to an lchan.<br><br>We already have similar classification in osmo-bsc.<br><br>Change-Id: I6424dcbd2e329fc1a516f8886359554ed7e9487e<br>---<br>M include/osmo-bts/Makefile.am<br>M include/osmo-bts/gsm_data.h<br>A include/osmo-bts/lchan.h<br>M src/common/lchan.c<br>4 files changed, 432 insertions(+), 415 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/97/25697/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/Makefile.am b/include/osmo-bts/Makefile.am</span><br><span>index d52c9aa..247e43e 100644</span><br><span>--- a/include/osmo-bts/Makefile.am</span><br><span>+++ b/include/osmo-bts/Makefile.am</span><br><span>@@ -22,6 +22,7 @@</span><br><span>  control_if.h \</span><br><span>       cbch.h \</span><br><span>     l1sap.h \</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan.h \</span><br><span>    power_control.h \</span><br><span>    scheduler.h \</span><br><span>        scheduler_backend.h \</span><br><span>diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h</span><br><span>index ce410a8..c2f8984 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -10,15 +10,12 @@</span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/core/tdef.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/codec/ecu.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/lapdm.h></span><br><span> #include <osmocom/gsm/gsm23003.h></span><br><span> #include <osmocom/gsm/gsm0502.h></span><br><span> #include <osmocom/gsm/gsm_utils.h></span><br><span> #include <osmocom/gsm/tlv.h></span><br><span> #include <osmocom/gsm/rxlev_stat.h></span><br><span> #include <osmocom/gsm/sysinfo.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/meas_rep.h></span><br><span> #include <osmocom/gsm/bts_features.h></span><br><span> #include <osmocom/gsm/gsm48_rest_octets.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span>@@ -30,6 +27,7 @@</span><br><span> #include <osmo-bts/paging.h></span><br><span> #include <osmo-bts/tx_power.h></span><br><span> #include <osmo-bts/oml.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/lchan.h></span><br><span> </span><br><span> #define GSM_FR_BITS      260</span><br><span> #define GSM_EFR_BITS     244</span><br><span>@@ -43,8 +41,6 @@</span><br><span> #define GSM_BTS_AGCH_QUEUE_LOW_LEVEL_DEFAULT 41</span><br><span> #define GSM_BTS_AGCH_QUEUE_HIGH_LEVEL_DEFAULT 91</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define LOGPLCHAN(lchan, ss, lvl, fmt, args...) LOGP(ss, lvl, "%s " fmt, gsm_lchan_name(lchan), ## args)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> struct gsm_network {</span><br><span>         struct llist_head bts_list;</span><br><span>  unsigned int num_bts;</span><br><span>@@ -52,15 +48,6 @@</span><br><span>   struct pcu_sock_state *pcu_state;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum lchan_ciph_state {</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_CIPH_NONE,</span><br><span style="color: hsl(0, 100%, 40%);">-        LCHAN_CIPH_RX_REQ,</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_CIPH_RX_CONF,</span><br><span style="color: hsl(0, 100%, 40%);">-     LCHAN_CIPH_RXTX_REQ,</span><br><span style="color: hsl(0, 100%, 40%);">-    LCHAN_CIPH_RX_CONF_TX_REQ,</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_CIPH_RXTX_CONF,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* 16 is the max. number of SI2quater messages according to 3GPP TS 44.018 Table 10.5.2.33b.1:</span><br><span>    4-bit index is used (2#1111 = 10#15) */</span><br><span> #define SI2Q_MAX_NUM 16</span><br><span>@@ -82,373 +69,6 @@</span><br><span> struct pcu_sock_state;</span><br><span> struct smscb_msg;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MAX_A5_KEY_LEN       (128/8)</span><br><span style="color: hsl(0, 100%, 40%);">-#define RSL_ENC_ALG_A5(x)        (x+1)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* state of a logical channel */</span><br><span style="color: hsl(0, 100%, 40%);">-enum gsm_lchan_state {</span><br><span style="color: hsl(0, 100%, 40%);">-     LCHAN_S_NONE,           /* channel is not active */</span><br><span style="color: hsl(0, 100%, 40%);">-     LCHAN_S_ACT_REQ,        /* channel activation requested */</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_S_ACTIVE,         /* channel is active and operational */</span><br><span style="color: hsl(0, 100%, 40%);">- LCHAN_S_REL_REQ,        /* channel release has been requested */</span><br><span style="color: hsl(0, 100%, 40%);">-        LCHAN_S_REL_ERR,        /* channel is in an error state */</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_S_BROKEN,         /* channel is somehow unusable */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define MAX_NUM_UL_MEAS      104</span><br><span style="color: hsl(0, 100%, 40%);">-#define LC_UL_M_F_L1_VALID   (1 << 0)</span><br><span style="color: hsl(0, 100%, 40%);">-#define LC_UL_M_F_RES_VALID       (1 << 1)</span><br><span style="color: hsl(0, 100%, 40%);">-#define LC_UL_M_F_OSMO_EXT_VALID (1 << 2)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct bts_ul_meas {</span><br><span style="color: hsl(0, 100%, 40%);">-       /* BER in units of 0.01%: 10.000 == 100% ber, 0 == 0% ber */</span><br><span style="color: hsl(0, 100%, 40%);">-    uint16_t ber10k;</span><br><span style="color: hsl(0, 100%, 40%);">-        /* timing advance offset (in 1/256 bits) */</span><br><span style="color: hsl(0, 100%, 40%);">-     int16_t ta_offs_256bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        /* C/I ratio in cB */</span><br><span style="color: hsl(0, 100%, 40%);">-   int16_t c_i;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* flags */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t is_sub:1;</span><br><span style="color: hsl(0, 100%, 40%);">-       /* RSSI in dBm * -1 */</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t inv_rssi;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct amr_mode {</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t mode;</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t threshold;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t hysteresis;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct amr_multirate_conf {</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t gsm48_ie[2];</span><br><span style="color: hsl(0, 100%, 40%);">-    struct amr_mode ms_mode[4];</span><br><span style="color: hsl(0, 100%, 40%);">-     struct amr_mode bts_mode[4];</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t num_modes;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum lchan_csd_mode {</span><br><span style="color: hsl(0, 100%, 40%);">-       LCHAN_CSD_M_NT,</span><br><span style="color: hsl(0, 100%, 40%);">- LCHAN_CSD_M_T_1200_75,</span><br><span style="color: hsl(0, 100%, 40%);">-  LCHAN_CSD_M_T_600,</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_CSD_M_T_1200,</span><br><span style="color: hsl(0, 100%, 40%);">-     LCHAN_CSD_M_T_2400,</span><br><span style="color: hsl(0, 100%, 40%);">-     LCHAN_CSD_M_T_9600,</span><br><span style="color: hsl(0, 100%, 40%);">-     LCHAN_CSD_M_T_14400,</span><br><span style="color: hsl(0, 100%, 40%);">-    LCHAN_CSD_M_T_29000,</span><br><span style="color: hsl(0, 100%, 40%);">-    LCHAN_CSD_M_T_32000,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* State of the SAPIs in the lchan */</span><br><span style="color: hsl(0, 100%, 40%);">-enum lchan_sapi_state {</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_SAPI_S_NONE,</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_SAPI_S_REQ,</span><br><span style="color: hsl(0, 100%, 40%);">-       LCHAN_SAPI_S_ASSIGNED,</span><br><span style="color: hsl(0, 100%, 40%);">-  LCHAN_SAPI_S_REL,</span><br><span style="color: hsl(0, 100%, 40%);">-       LCHAN_SAPI_S_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* What kind of release/activation is done? A silent one for</span><br><span style="color: hsl(0, 100%, 40%);">- * the PDCH or one triggered through RSL? */</span><br><span style="color: hsl(0, 100%, 40%);">-enum lchan_rel_act_kind {</span><br><span style="color: hsl(0, 100%, 40%);">-  LCHAN_REL_ACT_RSL,</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_REL_ACT_PCU,</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_REL_ACT_OML,</span><br><span style="color: hsl(0, 100%, 40%);">-      LCHAN_REL_ACT_REACT, /* remove once auto-activation hack is removed from opstart_compl() */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_rep_facch {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t fn;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* MS/BS Power related measurement averaging algo */</span><br><span style="color: hsl(0, 100%, 40%);">-enum gsm_power_ctrl_meas_avg_algo {</span><br><span style="color: hsl(0, 100%, 40%);">-   GSM_PWR_CTRL_MEAS_AVG_ALGO_NONE                 = 0x00,</span><br><span style="color: hsl(0, 100%, 40%);">- GSM_PWR_CTRL_MEAS_AVG_ALGO_UNWEIGHTED           = 0x01,</span><br><span style="color: hsl(0, 100%, 40%);">- GSM_PWR_CTRL_MEAS_AVG_ALGO_WEIGHTED             = 0x02,</span><br><span style="color: hsl(0, 100%, 40%);">- GSM_PWR_CTRL_MEAS_AVG_ALGO_MOD_MEDIAN           = 0x03,</span><br><span style="color: hsl(0, 100%, 40%);">- /* EWMA is an Osmocom specific algo */</span><br><span style="color: hsl(0, 100%, 40%);">-  GSM_PWR_CTRL_MEAS_AVG_ALGO_OSMO_EWMA            = 0x04,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* MS/BS Power related measurement parameters */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_power_ctrl_meas_params {</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Thresholds (see 3GPP TS 45.008, section A.3.2.1) */</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t lower_thresh; /* lower (decreasing) direction */</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t upper_thresh; /* upper (increasing) direction */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Threshold Comparators for lower (decreasing) direction */</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t lower_cmp_p; /* P1 for RxLev, P3 for RxQual */</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t lower_cmp_n; /* N1 for RxLev, N3 for RxQual */</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Threshold Comparators for upper (increasing) direction */</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t upper_cmp_p; /* P2 for RxLev, P4 for RxQual */</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t upper_cmp_n; /* N2 for RxLev, N4 for RxQual */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Hreqave and Hreqt (see 3GPP TS 45.008, Annex A) */</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t h_reqave;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t h_reqt;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* AVG algorithm and its specific parameters */</span><br><span style="color: hsl(0, 100%, 40%);">- enum gsm_power_ctrl_meas_avg_algo algo;</span><br><span style="color: hsl(0, 100%, 40%);">- union {</span><br><span style="color: hsl(0, 100%, 40%);">-         /* Exponentially Weighted Moving Average */</span><br><span style="color: hsl(0, 100%, 40%);">-             struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* Smoothing factor: higher the value - less smoothing */</span><br><span style="color: hsl(0, 100%, 40%);">-                       uint8_t alpha; /* 1 .. 99 (in %) */</span><br><span style="color: hsl(0, 100%, 40%);">-             } ewma;</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* MS/BS Power Control parameters */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_power_ctrl_params {</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Minimum interval between power level changes */</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t ctrl_interval; /* 1 step is 2 SACCH periods */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Power change step size (maximum) */</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t inc_step_size_db; /* increasing direction */</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t red_step_size_db; /* reducing direction */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Measurement averaging parameters for RxLev & RxQual */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_power_ctrl_meas_params rxqual_meas;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_power_ctrl_meas_params rxlev_meas;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Measurement averaging parameters for C/I, per chan type */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_power_ctrl_meas_params ci_fr_meas;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_power_ctrl_meas_params ci_hr_meas;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_power_ctrl_meas_params ci_amr_fr_meas;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm_power_ctrl_meas_params ci_amr_hr_meas;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm_power_ctrl_meas_params ci_sdcch_meas;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm_power_ctrl_meas_params ci_gprs_meas;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Default MS/BS Power Control parameters */</span><br><span style="color: hsl(0, 100%, 40%);">-extern const struct gsm_power_ctrl_params power_ctrl_params_def;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Measurement pre-processing state */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_power_ctrl_meas_proc_state {</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Number of measurements processed */</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned int meas_num;</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Algorithm specific data */</span><br><span style="color: hsl(0, 100%, 40%);">-   union {</span><br><span style="color: hsl(0, 100%, 40%);">-         struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* Scaled up 100 times average value */</span><br><span style="color: hsl(0, 100%, 40%);">-                 int Avg100;</span><br><span style="color: hsl(0, 100%, 40%);">-             } ewma;</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct lchan_power_ctrl_state {</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Dynamic Power Control parameters (NULL in static mode) */</span><br><span style="color: hsl(0, 100%, 40%);">-    const struct gsm_power_ctrl_params *dpc_params;</span><br><span style="color: hsl(0, 100%, 40%);">- /* Measurement pre-processing state (for dynamic mode) */</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm_power_ctrl_meas_proc_state rxlev_meas_proc;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_power_ctrl_meas_proc_state rxqual_meas_proc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_power_ctrl_meas_proc_state ci_meas_proc;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Number of SACCH blocks to skip (for dynamic mode) */</span><br><span style="color: hsl(0, 100%, 40%);">- int skip_block_num;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Depending on the context (MS or BS power control), fields 'current' and 'max'</span><br><span style="color: hsl(0, 100%, 40%);">-         * reflect either the MS power level (magic numbers), or BS Power reduction level</span><br><span style="color: hsl(0, 100%, 40%);">-        * (attenuation, in dB). */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t current;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t max;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct lchan_ta_ctrl_state {</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Number of SACCH blocks to skip */</span><br><span style="color: hsl(0, 100%, 40%);">-    int skip_block_num;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Currently requested TA */</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t current;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_lchan {</span><br><span style="color: hsl(0, 100%, 40%);">-    /* The TS that we're part of */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts_trx_ts *ts;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* The logical subslot number in the TS */</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t nr;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* The logical channel type */</span><br><span style="color: hsl(0, 100%, 40%);">-  enum gsm_chan_t type;</span><br><span style="color: hsl(0, 100%, 40%);">-   /* RSL channel mode */</span><br><span style="color: hsl(0, 100%, 40%);">-  enum rsl_cmod_spd rsl_cmode;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* If TCH, traffic channel mode */</span><br><span style="color: hsl(0, 100%, 40%);">-      enum gsm48_chan_mode tch_mode;</span><br><span style="color: hsl(0, 100%, 40%);">-  enum lchan_csd_mode csd_mode;</span><br><span style="color: hsl(0, 100%, 40%);">-   /* State */</span><br><span style="color: hsl(0, 100%, 40%);">-     enum gsm_lchan_state state;</span><br><span style="color: hsl(0, 100%, 40%);">-     const char *broken_reason;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Encryption information */</span><br><span style="color: hsl(0, 100%, 40%);">-    struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t alg_id;</span><br><span style="color: hsl(0, 100%, 40%);">-         uint8_t key_len;</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t key[MAX_A5_KEY_LEN];</span><br><span style="color: hsl(0, 100%, 40%);">-    } encr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                uint32_t bound_ip;</span><br><span style="color: hsl(0, 100%, 40%);">-              uint32_t connect_ip;</span><br><span style="color: hsl(0, 100%, 40%);">-            uint16_t bound_port;</span><br><span style="color: hsl(0, 100%, 40%);">-            uint16_t connect_port;</span><br><span style="color: hsl(0, 100%, 40%);">-          uint16_t conn_id;</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t rtp_payload;</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t rtp_payload2;</span><br><span style="color: hsl(0, 100%, 40%);">-           uint8_t speech_mode;</span><br><span style="color: hsl(0, 100%, 40%);">-            struct osmo_rtp_socket *rtp_socket;</span><br><span style="color: hsl(0, 100%, 40%);">-     } abis_ip;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      char *name;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* For handover, activation is described in 3GPP TS 48.058 4.1.3 and 4.1.4:</span><br><span style="color: hsl(0, 100%, 40%);">-      *</span><br><span style="color: hsl(0, 100%, 40%);">-       *          |          | Access ||  transmit         |  activate</span><br><span style="color: hsl(0, 100%, 40%);">-         *          | MS Power | Delay  ||  on main channel  |  dl SACCH</span><br><span style="color: hsl(0, 100%, 40%);">-         * ----------------------------------------------------------------------</span><br><span style="color: hsl(0, 100%, 40%);">-        * async ho   no         *     -->  yes                 no</span><br><span style="color: hsl(0, 100%, 40%);">-    * async ho   yes        *     -->  yes                 may be started</span><br><span style="color: hsl(0, 100%, 40%);">-        * sync ho    no         no    -->  yes                 no</span><br><span style="color: hsl(0, 100%, 40%);">-    * sync ho    yes        no    -->  yes                 may be started</span><br><span style="color: hsl(0, 100%, 40%);">-        * sync ho    yes        yes   -->  yes                 shall be started</span><br><span style="color: hsl(0, 100%, 40%);">-      *</span><br><span style="color: hsl(0, 100%, 40%);">-       * Always start the main channel immediately.</span><br><span style="color: hsl(0, 100%, 40%);">-    * want_dl_sacch_active indicates whether dl SACCH should be activated on CHAN ACT.</span><br><span style="color: hsl(0, 100%, 40%);">-      */</span><br><span style="color: hsl(0, 100%, 40%);">-     bool want_dl_sacch_active;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Number of different GsmL1_Sapi_t used in osmo_bts_sysmo is 23.</span><br><span style="color: hsl(0, 100%, 40%);">-        * Currently we don't share these headers so this is a magic number. */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct llist_head sapi_cmds;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t sapis_dl[23];</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t sapis_ul[23];</span><br><span style="color: hsl(0, 100%, 40%);">-   struct lapdm_channel lapdm_ch;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct llist_head dl_tch_queue;</span><br><span style="color: hsl(0, 100%, 40%);">- struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* bitmask of all SI that are present/valid in si_buf */</span><br><span style="color: hsl(0, 100%, 40%);">-                uint32_t valid;</span><br><span style="color: hsl(0, 100%, 40%);">-         /* bitmask of all SI that do not mirror the BTS-global SI values */</span><br><span style="color: hsl(0, 100%, 40%);">-             uint32_t overridden;</span><br><span style="color: hsl(0, 100%, 40%);">-            uint32_t last;</span><br><span style="color: hsl(0, 100%, 40%);">-          /* buffers where we put the pre-computed SI:</span><br><span style="color: hsl(0, 100%, 40%);">-               SI2Q_MAX_NUM is the max number of SI2quater messages (see 3GPP TS 44.018) */</span><br><span style="color: hsl(0, 100%, 40%);">-         sysinfo_buf_t buf[_MAX_SYSINFO_TYPE][SI2Q_MAX_NUM];</span><br><span style="color: hsl(0, 100%, 40%);">-     } si;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t flags;</span><br><span style="color: hsl(0, 100%, 40%);">-          /* RSL measurement result number, 0 at lchan_act */</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t res_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-         /* number of measurements stored in array below */</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t num_ul_meas;</span><br><span style="color: hsl(0, 100%, 40%);">-            struct bts_ul_meas uplink[MAX_NUM_UL_MEAS];</span><br><span style="color: hsl(0, 100%, 40%);">-             /* last L1 header from the MS */</span><br><span style="color: hsl(0, 100%, 40%);">-                struct rsl_l1_info l1_info;</span><br><span style="color: hsl(0, 100%, 40%);">-             struct gsm_meas_rep_unidir ul_res;</span><br><span style="color: hsl(0, 100%, 40%);">-              int16_t ms_toa256;</span><br><span style="color: hsl(0, 100%, 40%);">-              int16_t ul_ci_cb_full;</span><br><span style="color: hsl(0, 100%, 40%);">-          int16_t ul_ci_cb_sub;</span><br><span style="color: hsl(0, 100%, 40%);">-           /* Frame number of the last measurement indication receceived */</span><br><span style="color: hsl(0, 100%, 40%);">-                uint32_t last_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Osmocom extended measurement results, see LC_UL_M_F_EXTD_VALID */</span><br><span style="color: hsl(0, 100%, 40%);">-            struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* minimum value of toa256 during measurement period */</span><br><span style="color: hsl(0, 100%, 40%);">-                 int16_t toa256_min;</span><br><span style="color: hsl(0, 100%, 40%);">-                     /* maximum value of toa256 during measurement period */</span><br><span style="color: hsl(0, 100%, 40%);">-                 int16_t toa256_max;</span><br><span style="color: hsl(0, 100%, 40%);">-                     /* standard deviation of toa256 value during measurement period */</span><br><span style="color: hsl(0, 100%, 40%);">-                      uint16_t toa256_std_dev;</span><br><span style="color: hsl(0, 100%, 40%);">-                } ext;</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Interference levels reported by PHY (in dBm) */</span><br><span style="color: hsl(0, 100%, 40%);">-              int16_t interf_meas_dbm[31]; /* Intave max is 31 */</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t interf_meas_num;</span><br><span style="color: hsl(0, 100%, 40%);">-        } meas;</span><br><span style="color: hsl(0, 100%, 40%);">- struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                struct amr_multirate_conf amr_mr;</span><br><span style="color: hsl(0, 100%, 40%);">-               struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        struct osmo_fsm_inst *dl_amr_fsm;</span><br><span style="color: hsl(0, 100%, 40%);">-                       /* TCH cache */</span><br><span style="color: hsl(0, 100%, 40%);">-                 uint8_t cache[20];</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* FACCH cache */</span><br><span style="color: hsl(0, 100%, 40%);">-                       uint8_t facch[GSM_MACBLOCK_LEN];</span><br><span style="color: hsl(0, 100%, 40%);">-                        uint8_t len;</span><br><span style="color: hsl(0, 100%, 40%);">-                    uint32_t fn;</span><br><span style="color: hsl(0, 100%, 40%);">-                    bool is_update;</span><br><span style="color: hsl(0, 100%, 40%);">-                 /* set for each SID frame to detect talkspurt for codecs</span><br><span style="color: hsl(0, 100%, 40%);">-                           without explicit ONSET event */</span><br><span style="color: hsl(0, 100%, 40%);">-                      bool ul_sid;</span><br><span style="color: hsl(0, 100%, 40%);">-                    /* indicates if DTXd was active during DL measurement</span><br><span style="color: hsl(0, 100%, 40%);">-                      period */</span><br><span style="color: hsl(0, 100%, 40%);">-                    bool dl_active;</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* last UL SPEECH resume flag */</span><br><span style="color: hsl(0, 100%, 40%);">-                        bool is_speech_resume;</span><br><span style="color: hsl(0, 100%, 40%);">-           } dtx;</span><br><span style="color: hsl(0, 100%, 40%);">-          uint8_t last_cmr;</span><br><span style="color: hsl(0, 100%, 40%);">-               uint32_t last_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* SLOT #0 and #1 to store FACCH for repetition */</span><br><span style="color: hsl(0, 100%, 40%);">-              struct gsm_rep_facch rep_facch[2];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      } tch;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* 3GPP TS 48.058 § 9.3.37: [0; 255] ok, -1 means invalid*/</span><br><span style="color: hsl(0, 100%, 40%);">-    int16_t ms_t_offs;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* 3GPP TS 45.010 § 1.2 round trip propagation delay (in symbols) or -1 */</span><br><span style="color: hsl(0, 100%, 40%);">-     int16_t p_offs;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* BTS-side ciphering state (rx only, bi-directional, ...) */</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t ciph_state;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t ciph_ns;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t loopback;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t active;</span><br><span style="color: hsl(0, 100%, 40%);">-         uint8_t ref;</span><br><span style="color: hsl(0, 100%, 40%);">-            /* T3105: PHYS INF retransmission */</span><br><span style="color: hsl(0, 100%, 40%);">-            struct osmo_timer_list t3105;</span><br><span style="color: hsl(0, 100%, 40%);">-           /* counts up to Ny1 */</span><br><span style="color: hsl(0, 100%, 40%);">-          unsigned int phys_info_count;</span><br><span style="color: hsl(0, 100%, 40%);">-   } ho;</span><br><span style="color: hsl(0, 100%, 40%);">-   /* S counter for link loss */</span><br><span style="color: hsl(0, 100%, 40%);">-   int s;</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Kind of the release/activation. E.g. RSL or PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-   enum lchan_rel_act_kind rel_act_kind;</span><br><span style="color: hsl(0, 100%, 40%);">-   /* RTP header Marker bit to indicate beginning of speech after pause  */</span><br><span style="color: hsl(0, 100%, 40%);">-        bool rtp_tx_marker;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* TA Control Loop */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct lchan_ta_ctrl_state ta_ctrl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* MS/BS power control state */</span><br><span style="color: hsl(0, 100%, 40%);">- struct lchan_power_ctrl_state ms_power_ctrl;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct lchan_power_ctrl_state bs_power_ctrl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* MS/BS Dynamic Power Control parameters */</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_power_ctrl_params ms_dpc_params;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_power_ctrl_params bs_dpc_params;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Temporary Overpower for SACCH/FACCH */</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t bs_acch_overpower_db;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   struct msgb *pending_rel_ind_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* ECU (Error Concealment Unit) state */</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_ecu_state *ecu_state;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       struct abis_rsl_osmo_rep_acch_cap repeated_acch_capability;</span><br><span style="color: hsl(0, 100%, 40%);">-     bool repeated_dl_facch_active;</span><br><span style="color: hsl(0, 100%, 40%);">-  bool repeated_ul_sacch_active;</span><br><span style="color: hsl(0, 100%, 40%);">-  bool repeated_dl_sacch_active;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Message buffer to store DL-SACCH repeation candidate */</span><br><span style="color: hsl(0, 100%, 40%);">-      struct msgb *rep_sacch;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Cached early Immediate Assignment message: if the Immediate Assignment arrives before the channel is</span><br><span style="color: hsl(0, 100%, 40%);">-  * confirmed active, then cache it here and send it once the channel is confirmed to be active. This is related</span><br><span style="color: hsl(0, 100%, 40%);">-  * to the Early IA feature, see OsmoBSC config option 'immediate-assignment pre-chan-ack'. */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct msgb *early_rr_ia;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_timer_list early_rr_ia_delay;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern const struct value_string lchan_ciph_state_names[];</span><br><span style="color: hsl(0, 100%, 40%);">-static inline const char *lchan_ciph_state_name(uint8_t state) {</span><br><span style="color: hsl(0, 100%, 40%);">-   return get_value_string(lchan_ciph_state_names, state);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> enum gsm_bts_trx_ts_flags {</span><br><span>      TS_F_PDCH_ACTIVE =              0x1000,</span><br><span>      TS_F_PDCH_ACT_PENDING =         0x2000,</span><br><span>@@ -508,8 +128,6 @@</span><br><span>        struct gsm_lchan lchan[TS_MAX_LCHAN];</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM_LCHAN_SI(lchan, i) (void *)((lchan)->si.buf[i][0])</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> enum gprs_rlc_par {</span><br><span>      RLC_T3142,</span><br><span>   RLC_T3169,</span><br><span>@@ -556,9 +174,6 @@</span><br><span> const char *gsm_lchant_name(enum gsm_chan_t c);</span><br><span> char *gsm_ts_name(const struct gsm_bts_trx_ts *ts);</span><br><span> char *gsm_ts_and_pchan_name(const struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm_lchan_name_init(struct gsm_lchan *lchan, struct gsm_bts_trx_ts *ts, unsigned int lchan_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm_lchan_name_update(struct gsm_lchan *lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-const char *gsm_lchans_name(enum gsm_lchan_state s);</span><br><span> </span><br><span> #define GSM_TS_NAME_FMT \</span><br><span>     "bts=%u,trx=%u,ts=%u" "%s"</span><br><span>@@ -566,19 +181,6 @@</span><br><span>        (ts)->trx->bts->nr, (ts)->trx->nr, (ts)->nr, \</span><br><span>     (ts)->vamos.is_shadow ? ",shadow" : ""</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static inline char *gsm_lchan_name(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return lchan->name;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t gsm_lchan2chan_nr_rsl(const struct gsm_lchan *lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                             enum gsm_phys_chan_config as_pchan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm_lchan_interf_meas_push(struct gsm_lchan *lchan, int dbm);</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm_lchan_interf_meas_calc_band(struct gsm_lchan *lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #define BSIC2BCC(bsic) ((bsic) & 0x07)</span><br><span> #define BTS_TSC(bts) BSIC2BCC((bts)->bsic)</span><br><span> </span><br><span>@@ -589,9 +191,6 @@</span><br><span> uint8_t ts_subslots(const struct gsm_bts_trx_ts *ts);</span><br><span> bool ts_is_tch(const struct gsm_bts_trx_ts *ts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int lchan2ecu_codec(const struct gsm_lchan *lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void lchan_set_state(struct gsm_lchan *lchan, enum gsm_lchan_state state);</span><br><span> int conf_lchans_as_pchan(struct gsm_bts_trx_ts *ts,</span><br><span>                          enum gsm_phys_chan_config pchan);</span><br><span> </span><br><span>@@ -600,16 +199,4 @@</span><br><span> </span><br><span> bool ts_is_pdch(const struct gsm_bts_trx_ts *ts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static inline bool lchan_is_dcch(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      switch (lchan->type) {</span><br><span style="color: hsl(0, 100%, 40%);">-       case GSM_LCHAN_SDCCH:</span><br><span style="color: hsl(0, 100%, 40%);">-   case GSM_LCHAN_TCH_F:</span><br><span style="color: hsl(0, 100%, 40%);">-   case GSM_LCHAN_TCH_H:</span><br><span style="color: hsl(0, 100%, 40%);">-           return true;</span><br><span style="color: hsl(0, 100%, 40%);">-    default:</span><br><span style="color: hsl(0, 100%, 40%);">-                return false;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #endif /* _GSM_DATA_H */</span><br><span>diff --git a/include/osmo-bts/lchan.h b/include/osmo-bts/lchan.h</span><br><span>new file mode 100644</span><br><span>index 0000000..b91fd66</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmo-bts/lchan.h</span><br><span>@@ -0,0 +1,429 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/codec/ecu.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/lapdm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/sysinfo.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_08_58.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm48_rest_octets.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/meas_rep.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define LOGPLCHAN(lchan, ss, lvl, fmt, args...) LOGP(ss, lvl, "%s " fmt, gsm_lchan_name(lchan), ## args)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum lchan_ciph_state {</span><br><span style="color: hsl(120, 100%, 40%);">+    LCHAN_CIPH_NONE,</span><br><span style="color: hsl(120, 100%, 40%);">+      LCHAN_CIPH_RX_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+    LCHAN_CIPH_RX_CONF,</span><br><span style="color: hsl(120, 100%, 40%);">+   LCHAN_CIPH_RXTX_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+  LCHAN_CIPH_RX_CONF_TX_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+    LCHAN_CIPH_RXTX_CONF,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* state of a logical channel */</span><br><span style="color: hsl(120, 100%, 40%);">+enum gsm_lchan_state {</span><br><span style="color: hsl(120, 100%, 40%);">+ LCHAN_S_NONE,           /* channel is not active */</span><br><span style="color: hsl(120, 100%, 40%);">+   LCHAN_S_ACT_REQ,        /* channel activation requested */</span><br><span style="color: hsl(120, 100%, 40%);">+    LCHAN_S_ACTIVE,         /* channel is active and operational */</span><br><span style="color: hsl(120, 100%, 40%);">+       LCHAN_S_REL_REQ,        /* channel release has been requested */</span><br><span style="color: hsl(120, 100%, 40%);">+      LCHAN_S_REL_ERR,        /* channel is in an error state */</span><br><span style="color: hsl(120, 100%, 40%);">+    LCHAN_S_BROKEN,         /* channel is somehow unusable */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MAX_NUM_UL_MEAS        104</span><br><span style="color: hsl(120, 100%, 40%);">+#define LC_UL_M_F_L1_VALID (1 << 0)</span><br><span style="color: hsl(120, 100%, 40%);">+#define LC_UL_M_F_RES_VALID     (1 << 1)</span><br><span style="color: hsl(120, 100%, 40%);">+#define LC_UL_M_F_OSMO_EXT_VALID (1 << 2)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MAX_A5_KEY_LEN       (128/8)</span><br><span style="color: hsl(120, 100%, 40%);">+#define RSL_ENC_ALG_A5(x)      (x+1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct bts_ul_meas {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* BER in units of 0.01%: 10.000 == 100% ber, 0 == 0% ber */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t ber10k;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* timing advance offset (in 1/256 bits) */</span><br><span style="color: hsl(120, 100%, 40%);">+   int16_t ta_offs_256bits;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* C/I ratio in cB */</span><br><span style="color: hsl(120, 100%, 40%);">+ int16_t c_i;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* flags */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t is_sub:1;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* RSSI in dBm * -1 */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t inv_rssi;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct amr_mode {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t mode;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t threshold;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t hysteresis;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct amr_multirate_conf {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t gsm48_ie[2];</span><br><span style="color: hsl(120, 100%, 40%);">+  struct amr_mode ms_mode[4];</span><br><span style="color: hsl(120, 100%, 40%);">+   struct amr_mode bts_mode[4];</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t num_modes;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum lchan_csd_mode {</span><br><span style="color: hsl(120, 100%, 40%);">+       LCHAN_CSD_M_NT,</span><br><span style="color: hsl(120, 100%, 40%);">+       LCHAN_CSD_M_T_1200_75,</span><br><span style="color: hsl(120, 100%, 40%);">+        LCHAN_CSD_M_T_600,</span><br><span style="color: hsl(120, 100%, 40%);">+    LCHAN_CSD_M_T_1200,</span><br><span style="color: hsl(120, 100%, 40%);">+   LCHAN_CSD_M_T_2400,</span><br><span style="color: hsl(120, 100%, 40%);">+   LCHAN_CSD_M_T_9600,</span><br><span style="color: hsl(120, 100%, 40%);">+   LCHAN_CSD_M_T_14400,</span><br><span style="color: hsl(120, 100%, 40%);">+  LCHAN_CSD_M_T_29000,</span><br><span style="color: hsl(120, 100%, 40%);">+  LCHAN_CSD_M_T_32000,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* State of the SAPIs in the lchan */</span><br><span style="color: hsl(120, 100%, 40%);">+enum lchan_sapi_state {</span><br><span style="color: hsl(120, 100%, 40%);">+    LCHAN_SAPI_S_NONE,</span><br><span style="color: hsl(120, 100%, 40%);">+    LCHAN_SAPI_S_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+     LCHAN_SAPI_S_ASSIGNED,</span><br><span style="color: hsl(120, 100%, 40%);">+        LCHAN_SAPI_S_REL,</span><br><span style="color: hsl(120, 100%, 40%);">+     LCHAN_SAPI_S_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* What kind of release/activation is done? A silent one for</span><br><span style="color: hsl(120, 100%, 40%);">+ * the PDCH or one triggered through RSL? */</span><br><span style="color: hsl(120, 100%, 40%);">+enum lchan_rel_act_kind {</span><br><span style="color: hsl(120, 100%, 40%);">+      LCHAN_REL_ACT_RSL,</span><br><span style="color: hsl(120, 100%, 40%);">+    LCHAN_REL_ACT_PCU,</span><br><span style="color: hsl(120, 100%, 40%);">+    LCHAN_REL_ACT_OML,</span><br><span style="color: hsl(120, 100%, 40%);">+    LCHAN_REL_ACT_REACT, /* remove once auto-activation hack is removed from opstart_compl() */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_rep_facch {</span><br><span style="color: hsl(120, 100%, 40%);">+     struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t fn;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* MS/BS Power related measurement averaging algo */</span><br><span style="color: hsl(120, 100%, 40%);">+enum gsm_power_ctrl_meas_avg_algo {</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM_PWR_CTRL_MEAS_AVG_ALGO_NONE                 = 0x00,</span><br><span style="color: hsl(120, 100%, 40%);">+       GSM_PWR_CTRL_MEAS_AVG_ALGO_UNWEIGHTED           = 0x01,</span><br><span style="color: hsl(120, 100%, 40%);">+       GSM_PWR_CTRL_MEAS_AVG_ALGO_WEIGHTED             = 0x02,</span><br><span style="color: hsl(120, 100%, 40%);">+       GSM_PWR_CTRL_MEAS_AVG_ALGO_MOD_MEDIAN           = 0x03,</span><br><span style="color: hsl(120, 100%, 40%);">+       /* EWMA is an Osmocom specific algo */</span><br><span style="color: hsl(120, 100%, 40%);">+        GSM_PWR_CTRL_MEAS_AVG_ALGO_OSMO_EWMA            = 0x04,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* MS/BS Power related measurement parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_power_ctrl_meas_params {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Thresholds (see 3GPP TS 45.008, section A.3.2.1) */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t lower_thresh; /* lower (decreasing) direction */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t upper_thresh; /* upper (increasing) direction */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Threshold Comparators for lower (decreasing) direction */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t lower_cmp_p; /* P1 for RxLev, P3 for RxQual */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t lower_cmp_n; /* N1 for RxLev, N3 for RxQual */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Threshold Comparators for upper (increasing) direction */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t upper_cmp_p; /* P2 for RxLev, P4 for RxQual */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t upper_cmp_n; /* N2 for RxLev, N4 for RxQual */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Hreqave and Hreqt (see 3GPP TS 45.008, Annex A) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t h_reqave;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t h_reqt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* AVG algorithm and its specific parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+       enum gsm_power_ctrl_meas_avg_algo algo;</span><br><span style="color: hsl(120, 100%, 40%);">+       union {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Exponentially Weighted Moving Average */</span><br><span style="color: hsl(120, 100%, 40%);">+           struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* Smoothing factor: higher the value - less smoothing */</span><br><span style="color: hsl(120, 100%, 40%);">+                     uint8_t alpha; /* 1 .. 99 (in %) */</span><br><span style="color: hsl(120, 100%, 40%);">+           } ewma;</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* MS/BS Power Control parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_power_ctrl_params {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Minimum interval between power level changes */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t ctrl_interval; /* 1 step is 2 SACCH periods */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Power change step size (maximum) */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t inc_step_size_db; /* increasing direction */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t red_step_size_db; /* reducing direction */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Measurement averaging parameters for RxLev & RxQual */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_meas_params rxqual_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_power_ctrl_meas_params rxlev_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Measurement averaging parameters for C/I, per chan type */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_meas_params ci_fr_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_meas_params ci_hr_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_meas_params ci_amr_fr_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_power_ctrl_meas_params ci_amr_hr_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_power_ctrl_meas_params ci_sdcch_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_power_ctrl_meas_params ci_gprs_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Default MS/BS Power Control parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct gsm_power_ctrl_params power_ctrl_params_def;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Measurement pre-processing state */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_power_ctrl_meas_proc_state {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Number of measurements processed */</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int meas_num;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Algorithm specific data */</span><br><span style="color: hsl(120, 100%, 40%);">+ union {</span><br><span style="color: hsl(120, 100%, 40%);">+               struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* Scaled up 100 times average value */</span><br><span style="color: hsl(120, 100%, 40%);">+                       int Avg100;</span><br><span style="color: hsl(120, 100%, 40%);">+           } ewma;</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct lchan_power_ctrl_state {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Dynamic Power Control parameters (NULL in static mode) */</span><br><span style="color: hsl(120, 100%, 40%);">+  const struct gsm_power_ctrl_params *dpc_params;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Measurement pre-processing state (for dynamic mode) */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_power_ctrl_meas_proc_state rxlev_meas_proc;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_power_ctrl_meas_proc_state rxqual_meas_proc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_power_ctrl_meas_proc_state ci_meas_proc;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Number of SACCH blocks to skip (for dynamic mode) */</span><br><span style="color: hsl(120, 100%, 40%);">+       int skip_block_num;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Depending on the context (MS or BS power control), fields 'current' and 'max'</span><br><span style="color: hsl(120, 100%, 40%);">+       * reflect either the MS power level (magic numbers), or BS Power reduction level</span><br><span style="color: hsl(120, 100%, 40%);">+      * (attenuation, in dB). */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t current;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t max;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct lchan_ta_ctrl_state {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Number of SACCH blocks to skip */</span><br><span style="color: hsl(120, 100%, 40%);">+  int skip_block_num;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Currently requested TA */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t current;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_lchan {</span><br><span style="color: hsl(120, 100%, 40%);">+    /* The TS that we're part of */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_trx_ts *ts;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* The logical subslot number in the TS */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* The logical channel type */</span><br><span style="color: hsl(120, 100%, 40%);">+        enum gsm_chan_t type;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* RSL channel mode */</span><br><span style="color: hsl(120, 100%, 40%);">+        enum rsl_cmod_spd rsl_cmode;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* If TCH, traffic channel mode */</span><br><span style="color: hsl(120, 100%, 40%);">+    enum gsm48_chan_mode tch_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+        enum lchan_csd_mode csd_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* State */</span><br><span style="color: hsl(120, 100%, 40%);">+   enum gsm_lchan_state state;</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *broken_reason;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Encryption information */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t alg_id;</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t key_len;</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t key[MAX_A5_KEY_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+  } encr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint32_t bound_ip;</span><br><span style="color: hsl(120, 100%, 40%);">+            uint32_t connect_ip;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint16_t bound_port;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint16_t connect_port;</span><br><span style="color: hsl(120, 100%, 40%);">+                uint16_t conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t rtp_payload;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t rtp_payload2;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t speech_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+          struct osmo_rtp_socket *rtp_socket;</span><br><span style="color: hsl(120, 100%, 40%);">+   } abis_ip;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* For handover, activation is described in 3GPP TS 48.058 4.1.3 and 4.1.4:</span><br><span style="color: hsl(120, 100%, 40%);">+    *</span><br><span style="color: hsl(120, 100%, 40%);">+     *          |          | Access ||  transmit         |  activate</span><br><span style="color: hsl(120, 100%, 40%);">+       *          | MS Power | Delay  ||  on main channel  |  dl SACCH</span><br><span style="color: hsl(120, 100%, 40%);">+       * ----------------------------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+      * async ho   no         *     -->  yes                 no</span><br><span style="color: hsl(120, 100%, 40%);">+  * async ho   yes        *     -->  yes                 may be started</span><br><span style="color: hsl(120, 100%, 40%);">+      * sync ho    no         no    -->  yes                 no</span><br><span style="color: hsl(120, 100%, 40%);">+  * sync ho    yes        no    -->  yes                 may be started</span><br><span style="color: hsl(120, 100%, 40%);">+      * sync ho    yes        yes   -->  yes                 shall be started</span><br><span style="color: hsl(120, 100%, 40%);">+    *</span><br><span style="color: hsl(120, 100%, 40%);">+     * Always start the main channel immediately.</span><br><span style="color: hsl(120, 100%, 40%);">+  * want_dl_sacch_active indicates whether dl SACCH should be activated on CHAN ACT.</span><br><span style="color: hsl(120, 100%, 40%);">+    */</span><br><span style="color: hsl(120, 100%, 40%);">+   bool want_dl_sacch_active;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Number of different GsmL1_Sapi_t used in osmo_bts_sysmo is 23.</span><br><span style="color: hsl(120, 100%, 40%);">+      * Currently we don't share these headers so this is a magic number. */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct llist_head sapi_cmds;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t sapis_dl[23];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t sapis_ul[23];</span><br><span style="color: hsl(120, 100%, 40%);">+ struct lapdm_channel lapdm_ch;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct llist_head dl_tch_queue;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* bitmask of all SI that are present/valid in si_buf */</span><br><span style="color: hsl(120, 100%, 40%);">+              uint32_t valid;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* bitmask of all SI that do not mirror the BTS-global SI values */</span><br><span style="color: hsl(120, 100%, 40%);">+           uint32_t overridden;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint32_t last;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* buffers where we put the pre-computed SI:</span><br><span style="color: hsl(120, 100%, 40%);">+             SI2Q_MAX_NUM is the max number of SI2quater messages (see 3GPP TS 44.018) */</span><br><span style="color: hsl(120, 100%, 40%);">+               sysinfo_buf_t buf[_MAX_SYSINFO_TYPE][SI2Q_MAX_NUM];</span><br><span style="color: hsl(120, 100%, 40%);">+   } si;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t flags;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* RSL measurement result number, 0 at lchan_act */</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t res_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* number of measurements stored in array below */</span><br><span style="color: hsl(120, 100%, 40%);">+            uint8_t num_ul_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+          struct bts_ul_meas uplink[MAX_NUM_UL_MEAS];</span><br><span style="color: hsl(120, 100%, 40%);">+           /* last L1 header from the MS */</span><br><span style="color: hsl(120, 100%, 40%);">+              struct rsl_l1_info l1_info;</span><br><span style="color: hsl(120, 100%, 40%);">+           struct gsm_meas_rep_unidir ul_res;</span><br><span style="color: hsl(120, 100%, 40%);">+            int16_t ms_toa256;</span><br><span style="color: hsl(120, 100%, 40%);">+            int16_t ul_ci_cb_full;</span><br><span style="color: hsl(120, 100%, 40%);">+                int16_t ul_ci_cb_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Frame number of the last measurement indication receceived */</span><br><span style="color: hsl(120, 100%, 40%);">+              uint32_t last_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Osmocom extended measurement results, see LC_UL_M_F_EXTD_VALID */</span><br><span style="color: hsl(120, 100%, 40%);">+          struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* minimum value of toa256 during measurement period */</span><br><span style="color: hsl(120, 100%, 40%);">+                       int16_t toa256_min;</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* maximum value of toa256 during measurement period */</span><br><span style="color: hsl(120, 100%, 40%);">+                       int16_t toa256_max;</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* standard deviation of toa256 value during measurement period */</span><br><span style="color: hsl(120, 100%, 40%);">+                    uint16_t toa256_std_dev;</span><br><span style="color: hsl(120, 100%, 40%);">+              } ext;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Interference levels reported by PHY (in dBm) */</span><br><span style="color: hsl(120, 100%, 40%);">+            int16_t interf_meas_dbm[31]; /* Intave max is 31 */</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t interf_meas_num;</span><br><span style="color: hsl(120, 100%, 40%);">+      } meas;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct amr_multirate_conf amr_mr;</span><br><span style="color: hsl(120, 100%, 40%);">+             struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      struct osmo_fsm_inst *dl_amr_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* TCH cache */</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint8_t cache[20];</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* FACCH cache */</span><br><span style="color: hsl(120, 100%, 40%);">+                     uint8_t facch[GSM_MACBLOCK_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+                      uint8_t len;</span><br><span style="color: hsl(120, 100%, 40%);">+                  uint32_t fn;</span><br><span style="color: hsl(120, 100%, 40%);">+                  bool is_update;</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* set for each SID frame to detect talkspurt for codecs</span><br><span style="color: hsl(120, 100%, 40%);">+                         without explicit ONSET event */</span><br><span style="color: hsl(120, 100%, 40%);">+                    bool ul_sid;</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* indicates if DTXd was active during DL measurement</span><br><span style="color: hsl(120, 100%, 40%);">+                    period */</span><br><span style="color: hsl(120, 100%, 40%);">+                  bool dl_active;</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* last UL SPEECH resume flag */</span><br><span style="color: hsl(120, 100%, 40%);">+                      bool is_speech_resume;</span><br><span style="color: hsl(120, 100%, 40%);">+                } dtx;</span><br><span style="color: hsl(120, 100%, 40%);">+                uint8_t last_cmr;</span><br><span style="color: hsl(120, 100%, 40%);">+             uint32_t last_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* SLOT #0 and #1 to store FACCH for repetition */</span><br><span style="color: hsl(120, 100%, 40%);">+            struct gsm_rep_facch rep_facch[2];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  } tch;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* 3GPP TS 48.058 § 9.3.37: [0; 255] ok, -1 means invalid*/</span><br><span style="color: hsl(120, 100%, 40%);">+  int16_t ms_t_offs;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* 3GPP TS 45.010 § 1.2 round trip propagation delay (in symbols) or -1 */</span><br><span style="color: hsl(120, 100%, 40%);">+   int16_t p_offs;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* BTS-side ciphering state (rx only, bi-directional, ...) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ciph_state;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t ciph_ns;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t loopback;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t active;</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t ref;</span><br><span style="color: hsl(120, 100%, 40%);">+          /* T3105: PHYS INF retransmission */</span><br><span style="color: hsl(120, 100%, 40%);">+          struct osmo_timer_list t3105;</span><br><span style="color: hsl(120, 100%, 40%);">+         /* counts up to Ny1 */</span><br><span style="color: hsl(120, 100%, 40%);">+                unsigned int phys_info_count;</span><br><span style="color: hsl(120, 100%, 40%);">+ } ho;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* S counter for link loss */</span><br><span style="color: hsl(120, 100%, 40%);">+ int s;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Kind of the release/activation. E.g. RSL or PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+ enum lchan_rel_act_kind rel_act_kind;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* RTP header Marker bit to indicate beginning of speech after pause  */</span><br><span style="color: hsl(120, 100%, 40%);">+      bool rtp_tx_marker;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TA Control Loop */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct lchan_ta_ctrl_state ta_ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MS/BS power control state */</span><br><span style="color: hsl(120, 100%, 40%);">+       struct lchan_power_ctrl_state ms_power_ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct lchan_power_ctrl_state bs_power_ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* MS/BS Dynamic Power Control parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_power_ctrl_params ms_dpc_params;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_power_ctrl_params bs_dpc_params;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Temporary Overpower for SACCH/FACCH */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t bs_acch_overpower_db;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       struct msgb *pending_rel_ind_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* ECU (Error Concealment Unit) state */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_ecu_state *ecu_state;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   struct abis_rsl_osmo_rep_acch_cap repeated_acch_capability;</span><br><span style="color: hsl(120, 100%, 40%);">+   bool repeated_dl_facch_active;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool repeated_ul_sacch_active;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool repeated_dl_sacch_active;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Message buffer to store DL-SACCH repeation candidate */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct msgb *rep_sacch;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Cached early Immediate Assignment message: if the Immediate Assignment arrives before the channel is</span><br><span style="color: hsl(120, 100%, 40%);">+        * confirmed active, then cache it here and send it once the channel is confirmed to be active. This is related</span><br><span style="color: hsl(120, 100%, 40%);">+        * to the Early IA feature, see OsmoBSC config option 'immediate-assignment pre-chan-ack'. */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *early_rr_ia;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_timer_list early_rr_ia_delay;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string lchan_ciph_state_names[];</span><br><span style="color: hsl(120, 100%, 40%);">+static inline const char *lchan_ciph_state_name(uint8_t state) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return get_value_string(lchan_ciph_state_names, state);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define GSM_LCHAN_SI(lchan, i) (void *)((lchan)->si.buf[i][0])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_lchan_name_init(struct gsm_lchan *lchan, struct gsm_bts_trx_ts *ts, unsigned int lchan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_lchan_name_update(struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+const char *gsm_lchans_name(enum gsm_lchan_state s);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static inline char *gsm_lchan_name(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return lchan->name;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t gsm_lchan2chan_nr_rsl(const struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 enum gsm_phys_chan_config as_pchan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_lchan_interf_meas_push(struct gsm_lchan *lchan, int dbm);</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_lchan_interf_meas_calc_band(struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int lchan2ecu_codec(const struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void lchan_set_state(struct gsm_lchan *lchan, enum gsm_lchan_state state);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static inline bool lchan_is_dcch(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       switch (lchan->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case GSM_LCHAN_SDCCH:</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM_LCHAN_TCH_F:</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM_LCHAN_TCH_H:</span><br><span style="color: hsl(120, 100%, 40%);">+         return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/common/lchan.c b/src/common/lchan.c</span><br><span>index 08ef1b8..fa11331 100644</span><br><span>--- a/src/common/lchan.c</span><br><span>+++ b/src/common/lchan.c</span><br><span>@@ -21,7 +21,7 @@</span><br><span> </span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmo-bts/logging.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmo-bts/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/lchan.h></span><br><span> #include <osmo-bts/bts.h></span><br><span> #include <osmo-bts/rsl.h></span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/25697">change 25697</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bts/+/25697"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6424dcbd2e329fc1a516f8886359554ed7e9487e </div>
<div style="display:none"> Gerrit-Change-Number: 25697 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>