<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/18884">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Merge gsm_data_shared.h into gsm_data.h<br><br>Old _shared one comes from time where we shared header with other<br>componenets. It's no longer the case sine a logn time ago.<br>The gsm_data_shared.h is only being included by gsm_data.h nowadays, so<br>let's simply merge it to simplify header dependency and struct<br>definitions.<br><br>Similarly, gsm_data_shared.c is renamed to gsm_data.c<br><br>Change-Id: Id60e7582e3a32dbc5e3531b87b2b49f07aee734d<br>---<br>M include/osmo-bts/Makefile.am<br>M include/osmo-bts/gsm_data.h<br>D include/osmo-bts/gsm_data_shared.h<br>M src/common/Makefile.am<br>R src/common/gsm_data.c<br>5 files changed, 762 insertions(+), 772 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/84/18884/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 d5e989a..4999ab4 100644</span><br><span>--- a/include/osmo-bts/Makefile.am</span><br><span>+++ b/include/osmo-bts/Makefile.am</span><br><span>@@ -3,7 +3,6 @@</span><br><span>         bts.h \</span><br><span>      bts_model.h \</span><br><span>        gsm_data.h \</span><br><span style="color: hsl(0, 100%, 40%);">-    gsm_data_shared.h \</span><br><span>  logging.h \</span><br><span>  measurement.h \</span><br><span>      oml.h \</span><br><span>diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h</span><br><span>index 1de5edd..80cc0be 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -1,10 +1,29 @@</span><br><span> #ifndef _GSM_DATA_H</span><br><span> #define _GSM_DATA_H</span><br><span> </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> #include <osmocom/core/timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/bitvec.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/statistics.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span> #include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/codec/ecu.h></span><br><span> #include <osmocom/gsm/lapdm.h></span><br><span> #include <osmocom/gsm/gsm23003.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/gsm/tlv.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/rxlev_stat.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/meas_rep.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/bts_features.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/protocol/gsm_08_58.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_12_21.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/abis/e1_input.h></span><br><span> </span><br><span> #include <osmo-bts/paging.h></span><br><span> #include <osmo-bts/tx_power.h></span><br><span>@@ -42,7 +61,748 @@</span><br><span>      LCHAN_CIPH_RXTX_CONF,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmo-bts/gsm_data_shared.h></span><br><span style="color: hsl(120, 100%, 40%);">+/* 16 is the max. number of SI2quater messages according to 3GPP TS 44.018 Table 10.5.2.33b.1:</span><br><span style="color: hsl(120, 100%, 40%);">+   4-bit index is used (2#1111 = 10#15) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define SI2Q_MAX_NUM 16</span><br><span style="color: hsl(120, 100%, 40%);">+/* length in bits (for single SI2quater message) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define SI2Q_MAX_LEN 160</span><br><span style="color: hsl(120, 100%, 40%);">+#define SI2Q_MIN_LEN 18</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* lchans 0..3 are SDCCH in combined channel configuration,</span><br><span style="color: hsl(120, 100%, 40%);">+   use 4 as magic number for BCCH hack - see osmo-bts-../oml.c:opstart_compl() */</span><br><span style="color: hsl(120, 100%, 40%);">+#define CCCH_LCHAN 4</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRX_NR_TS    8</span><br><span style="color: hsl(120, 100%, 40%);">+#define TS_MAX_LCHAN 8</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MAX_VERSION_LENGTH 64</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%);">+struct osmo_rtp_socket;</span><br><span style="color: hsl(120, 100%, 40%);">+struct pcu_sock_state;</span><br><span style="color: hsl(120, 100%, 40%);">+struct smscb_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Network Management State */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_nm_state {</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t operational;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t administrative;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t availability;</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_abis_mo {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* A-bis OML Object Class */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t obj_class;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* is there still some procedure pending? */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t procedure_pending;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* A-bis OML Object Instance */</span><br><span style="color: hsl(120, 100%, 40%);">+       struct abis_om_obj_inst obj_inst;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* human-readable name */</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* NM State */</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_nm_state nm_state;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Attributes configured in this MO */</span><br><span style="color: hsl(120, 100%, 40%);">+        struct tlv_parsed *nm_attr;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* BTS to which this MO belongs */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts *bts;</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_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%);">+/* 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%);">+     LCHAN_S_INACTIVE,       /* channel is set inactive */</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%);">+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 dB */</span><br><span style="color: hsl(120, 100%, 40%);">+ float 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%);">+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%);">+  uint8_t rqd_ta;</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%);">+ /* 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%);">+              uint8_t l1_info[2];</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%);">+            /* 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%);">+        } 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%);">+     } 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%);">+ int 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%);">+   /* power handling */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct {</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%);">+          bool fixed;</span><br><span style="color: hsl(120, 100%, 40%);">+   } ms_power_ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* BTS power reduction (in dB) */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t bs_power_red;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static inline uint8_t lchan_get_ta(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->meas.l1_info[1];</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%);">+enum gsm_bts_trx_ts_flags {</span><br><span style="color: hsl(120, 100%, 40%);">+     TS_F_PDCH_ACTIVE =              0x1000,</span><br><span style="color: hsl(120, 100%, 40%);">+       TS_F_PDCH_ACT_PENDING =         0x2000,</span><br><span style="color: hsl(120, 100%, 40%);">+       TS_F_PDCH_DEACT_PENDING =       0x4000,</span><br><span style="color: hsl(120, 100%, 40%);">+       TS_F_PDCH_PENDING_MASK =        0x6000 /*<</span><br><span style="color: hsl(120, 100%, 40%);">+                 TS_F_PDCH_ACT_PENDING | TS_F_PDCH_DEACT_PENDING */</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%);">+/* One Timeslot in a TRX */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx_ts {</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* number of this timeslot at the TRX */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ enum gsm_phys_chan_config pchan;</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%);">+              enum gsm_phys_chan_config pchan_is;</span><br><span style="color: hsl(120, 100%, 40%);">+           enum gsm_phys_chan_config pchan_want;</span><br><span style="color: hsl(120, 100%, 40%);">+         struct msgb *pending_chan_activ;</span><br><span style="color: hsl(120, 100%, 40%);">+      } dyn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int flags;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct tlv_parsed nm_attr;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t nm_chan_comb;</span><br><span style="color: hsl(120, 100%, 40%);">+ int tsc;                /* -1 == use BTS TSC */</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%);">+              /* Parameters below are configured by VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+          int enabled;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t maio;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t hsn;</span><br><span style="color: hsl(120, 100%, 40%);">+          struct bitvec arfcns;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t arfcns_data[1024/8];</span><br><span style="color: hsl(120, 100%, 40%);">+          /* This is the pre-computed MA for channel assignments */</span><br><span style="color: hsl(120, 100%, 40%);">+             struct bitvec ma;</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t ma_len; /* part of ma_data that is used */</span><br><span style="color: hsl(120, 100%, 40%);">+            uint8_t ma_data[8];     /* 10.5.2.21: max 8 bytes value part */</span><br><span style="color: hsl(120, 100%, 40%);">+       } hopping;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_lchan lchan[TS_MAX_LCHAN];</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%);">+/* One TRX in a BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* list header in bts->trx_list */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct llist_head list;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* number of this TRX in the BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* human readable name / description */</span><br><span style="color: hsl(120, 100%, 40%);">+       char *description;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* how do we talk RSL with this TRX? */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t rsl_tei;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct e1inp_sign_link *rsl_link;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Some BTS (specifically Ericsson RBS) have a per-TRX OML Link */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct e1inp_sign_link *oml_link;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct tlv_parsed nm_attr;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+        } bb_transc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+       int nominal_power;              /* in dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int max_power_red;     /* in actual dB */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t max_power_backoff_8psk; /* in actual dB OC-2G only */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t c0_idle_power_red;      /* in actual dB OC-2G only */</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 trx_power_params power_params;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool ms_pwr_ctl_soft; /* is power control loop done by osmocom software? */</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%);">+              void *l1h;</span><br><span style="color: hsl(120, 100%, 40%);">+    } role_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+                      unsigned int test_state;</span><br><span style="color: hsl(120, 100%, 40%);">+                      uint8_t test_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+                      struct rxlev_stats rxlev_stat;</span><br><span style="color: hsl(120, 100%, 40%);">+                } ipaccess;</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts_trx_ts ts[TRX_NR_TS];</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_BTS_SI2Q(bts, i)   (struct gsm48_system_information_type_2quater *)((bts)->si_buf[SYSINFO_TYPE_2quater][i])</span><br><span style="color: hsl(120, 100%, 40%);">+#define GSM_BTS_HAS_SI(bts, i) ((bts)->si_valid & (1 << i))</span><br><span style="color: hsl(120, 100%, 40%);">+#define GSM_BTS_SI(bts, i)     (void *)((bts)->si_buf[i][0])</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%);">+enum gsm_bts_type_variant {</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS_UNKNOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+  BTS_OSMO_LITECELL15,</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS_OSMO_OC2G,</span><br><span style="color: hsl(120, 100%, 40%);">+  BTS_OSMO_OCTPHY,</span><br><span style="color: hsl(120, 100%, 40%);">+      BTS_OSMO_SYSMO,</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_OSMO_TRX,</span><br><span style="color: hsl(120, 100%, 40%);">+ BTS_OSMO_VIRTUAL,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_OSMO_OMLDUMMY,</span><br><span style="color: hsl(120, 100%, 40%);">+    _NUM_BTS_VARIANT</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%);">+/* Used by OML layer for BTS Attribute reporting */</span><br><span style="color: hsl(120, 100%, 40%);">+enum bts_attribute {</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_TYPE_VARIANT,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_SUB_MODEL,</span><br><span style="color: hsl(120, 100%, 40%);">+        TRX_PHY_VERSION,</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%);">+/* BTS implementation flags (internal use, not exposed via OML) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define bts_internal_flag_get(bts, flag) \</span><br><span style="color: hsl(120, 100%, 40%);">+        ((bts->flags & (typeof(bts->flags)) flag) != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+#define bts_internal_flag_set(bts, flag) \</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->flags |= (typeof(bts->flags)) flag</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* TODO: add a brief description of this flag */</span><br><span style="color: hsl(120, 100%, 40%);">+#define BTS_INTERNAL_FLAG_MS_PWR_CTRL_DSP            (1 << 0)</span><br><span style="color: hsl(120, 100%, 40%);">+/* When this flag is set then the measurement data is included in</span><br><span style="color: hsl(120, 100%, 40%);">+ * (PRIM_PH_DATA) and struct ph_tch_param (PRIM_TCH). Otherwise the</span><br><span style="color: hsl(120, 100%, 40%);">+ * measurement data is passed using a separate MPH INFO MEAS IND.</span><br><span style="color: hsl(120, 100%, 40%);">+ * (See also ticket: OS#2977) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define BTS_INTERNAL_FLAG_MEAS_PAYLOAD_COMB                (1 << 1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string bts_impl_flag_desc[];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_gprs_nsvc {</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* data read via VTY config file, to configure the BTS</span><br><span style="color: hsl(120, 100%, 40%);">+         * via OML from BSC */</span><br><span style="color: hsl(120, 100%, 40%);">+        int id;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t nsvci;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t local_port;    /* on the BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint16_t remote_port;   /* on the SGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t remote_ip;     /* on the SGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_abis_mo mo;</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 gprs_rlc_par {</span><br><span style="color: hsl(120, 100%, 40%);">+     RLC_T3142,</span><br><span style="color: hsl(120, 100%, 40%);">+    RLC_T3169,</span><br><span style="color: hsl(120, 100%, 40%);">+    RLC_T3191,</span><br><span style="color: hsl(120, 100%, 40%);">+    RLC_T3193,</span><br><span style="color: hsl(120, 100%, 40%);">+    RLC_T3195,</span><br><span style="color: hsl(120, 100%, 40%);">+    RLC_N3101,</span><br><span style="color: hsl(120, 100%, 40%);">+    RLC_N3103,</span><br><span style="color: hsl(120, 100%, 40%);">+    RLC_N3105,</span><br><span style="color: hsl(120, 100%, 40%);">+    CV_COUNTDOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+ T_DL_TBF_EXT,   /* ms */</span><br><span style="color: hsl(120, 100%, 40%);">+      T_UL_TBF_EXT,   /* ms */</span><br><span style="color: hsl(120, 100%, 40%);">+      _NUM_RLC_PAR</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 gprs_cs {</span><br><span style="color: hsl(120, 100%, 40%);">+    GPRS_CS1,</span><br><span style="color: hsl(120, 100%, 40%);">+     GPRS_CS2,</span><br><span style="color: hsl(120, 100%, 40%);">+     GPRS_CS3,</span><br><span style="color: hsl(120, 100%, 40%);">+     GPRS_CS4,</span><br><span style="color: hsl(120, 100%, 40%);">+     GPRS_MCS1,</span><br><span style="color: hsl(120, 100%, 40%);">+    GPRS_MCS2,</span><br><span style="color: hsl(120, 100%, 40%);">+    GPRS_MCS3,</span><br><span style="color: hsl(120, 100%, 40%);">+    GPRS_MCS4,</span><br><span style="color: hsl(120, 100%, 40%);">+    GPRS_MCS5,</span><br><span style="color: hsl(120, 100%, 40%);">+    GPRS_MCS6,</span><br><span style="color: hsl(120, 100%, 40%);">+    GPRS_MCS7,</span><br><span style="color: hsl(120, 100%, 40%);">+    GPRS_MCS8,</span><br><span style="color: hsl(120, 100%, 40%);">+    GPRS_MCS9,</span><br><span style="color: hsl(120, 100%, 40%);">+    _NUM_GRPS_CS</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 gprs_rlc_cfg {</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t parameter[_NUM_RLC_PAR];</span><br><span style="color: hsl(120, 100%, 40%);">+     struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint16_t repeat_time; /* ms */</span><br><span style="color: hsl(120, 100%, 40%);">+                uint8_t repeat_count;</span><br><span style="color: hsl(120, 100%, 40%);">+ } paging;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t cs_mask; /* bitmask of gprs_cs */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t initial_cs;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t initial_mcs;</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 bts_smscb_state {</span><br><span style="color: hsl(120, 100%, 40%);">+  struct llist_head queue; /* list of struct smscb_msg */</span><br><span style="color: hsl(120, 100%, 40%);">+       int queue_len;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct rate_ctr_group *ctrs;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct smscb_msg *cur_msg; /* current SMS-CB */</span><br><span style="color: hsl(120, 100%, 40%);">+       struct smscb_msg *default_msg; /* default broadcast message; NULL if none */</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%);">+/* The amount of time within which a sudden disconnect of a newly established</span><br><span style="color: hsl(120, 100%, 40%);">+ * OML connection will cause a special warning to be logged. */</span><br><span style="color: hsl(120, 100%, 40%);">+#define OSMO_BTS_OML_CONN_EARLY_DISCONNECT 10        /* in seconds */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* One BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* list header in net->bts_list */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct llist_head list;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* number of the BTS in network */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* human readable name / description */</span><br><span style="color: hsl(120, 100%, 40%);">+       char *description;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Cell Identity */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint16_t cell_identity;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* location area code of this BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t location_area_code;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Base Station Identification Code (BSIC), lower 3 bits is BCC,</span><br><span style="color: hsl(120, 100%, 40%);">+       * which is used as TSC for the CCCH */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t bsic;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* type of BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+     enum gsm_bts_type_variant variant;</span><br><span style="color: hsl(120, 100%, 40%);">+    enum gsm_band band;</span><br><span style="color: hsl(120, 100%, 40%);">+   char version[MAX_VERSION_LENGTH];</span><br><span style="color: hsl(120, 100%, 40%);">+     char sub_model[MAX_VERSION_LENGTH];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* public features of a given BTS (set/reported via OML) */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct bitvec *features;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* implementation flags of a given BTS (not exposed via OML) */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t flags;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Connected PCU version (if any) */</span><br><span style="color: hsl(120, 100%, 40%);">+  char pcu_version[MAX_VERSION_LENGTH];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* maximum Tx power that the MS is permitted to use in this cell */</span><br><span style="color: hsl(120, 100%, 40%);">+   int ms_max_power;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* how do we talk OML with this TRX? */</span><br><span style="color: hsl(120, 100%, 40%);">+       struct e1inp_sign_link *oml_link;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct timespec oml_conn_established_timestamp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Abis network management O&M handle */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* number of this BTS on given E1 link */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t bts_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* DTX features of this BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+        bool dtxd;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* CCCH is on C0 */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_trx *c0;</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%);">+              struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+        } site_mgr;</span><br><span style="color: hsl(120, 100%, 40%);">+</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 si_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* 3GPP TS 44.018 Table 10.5.2.33b.1 INDEX and COUNT for SI2quater */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t si2q_index; /* distinguish individual SI2quater messages */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t si2q_count; /* si2q_index for the last (highest indexed) individual SI2quater message */</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%);">+        sysinfo_buf_t si_buf[_MAX_SYSINFO_TYPE][SI2Q_MAX_NUM];</span><br><span style="color: hsl(120, 100%, 40%);">+        /* offsets used while generating SI2quater */</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t e_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+      size_t u_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* decoded SI3 rest octets - *unmodified* as received from BSC */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_gsm48_si_ro_info si3_ro_decoded;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* is SI3 GPRS Indicator currently disabled due to lack of PCU connection? */</span><br><span style="color: hsl(120, 100%, 40%);">+ bool si3_gprs_ind_disabled;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ip.access Unit ID's have Site/BTS/TRX layout */</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%);">+                      uint16_t site_id;</span><br><span style="color: hsl(120, 100%, 40%);">+                     uint16_t bts_id;</span><br><span style="color: hsl(120, 100%, 40%);">+                      uint32_t flags;</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint32_t rsl_ip;</span><br><span style="color: hsl(120, 100%, 40%);">+              } ip_access;</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%);">+  /* Not entirely sure how ip.access specific this is */</span><br><span style="color: hsl(120, 100%, 40%);">+        struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+                        uint16_t nsei;</span><br><span style="color: hsl(120, 100%, 40%);">+                        uint8_t timer[7];</span><br><span style="color: hsl(120, 100%, 40%);">+             } nse;</span><br><span style="color: hsl(120, 100%, 40%);">+                struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+                        uint16_t bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+                        uint8_t timer[11];</span><br><span style="color: hsl(120, 100%, 40%);">+                    struct gprs_rlc_cfg rlc_cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+          } cell;</span><br><span style="color: hsl(120, 100%, 40%);">+               struct gsm_bts_gprs_nsvc nsvc[2];</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t rac;</span><br><span style="color: hsl(120, 100%, 40%);">+  } gprs;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* transceivers */</span><br><span style="color: hsl(120, 100%, 40%);">+    int num_trx;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct llist_head trx_list;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ struct rate_ctr_group *ctrs;</span><br><span style="color: hsl(120, 100%, 40%);">+  bool supp_meas_toa256;</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%);">+              /* Interference Boundaries for OML */</span><br><span style="color: hsl(120, 100%, 40%);">+         int16_t boundary[6];</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t intave;</span><br><span style="color: hsl(120, 100%, 40%);">+       } interference;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int t200_ms[7];</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int t3105_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t overload_period;</span><br><span style="color: hsl(120, 100%, 40%);">+              struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* Input parameters from OML */</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint8_t load_ind_thresh;        /* percent */</span><br><span style="color: hsl(120, 100%, 40%);">+                 uint8_t load_ind_period;        /* seconds */</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* Internal data */</span><br><span style="color: hsl(120, 100%, 40%);">+                   struct osmo_timer_list timer;</span><br><span style="color: hsl(120, 100%, 40%);">+                 unsigned int pch_total;</span><br><span style="color: hsl(120, 100%, 40%);">+                       unsigned int pch_used;</span><br><span style="color: hsl(120, 100%, 40%);">+                } ccch;</span><br><span style="color: hsl(120, 100%, 40%);">+               struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* Input parameters from OML */</span><br><span style="color: hsl(120, 100%, 40%);">+                       int16_t busy_thresh;            /* in dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+                  uint16_t averaging_slots;</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* Internal data */</span><br><span style="color: hsl(120, 100%, 40%);">+                   unsigned int total;     /* total nr */</span><br><span style="color: hsl(120, 100%, 40%);">+                        unsigned int busy;      /* above busy_thresh */</span><br><span style="color: hsl(120, 100%, 40%);">+                       unsigned int access;    /* access bursts */</span><br><span style="color: hsl(120, 100%, 40%);">+           } rach;</span><br><span style="color: hsl(120, 100%, 40%);">+       } load;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t ny1;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t max_ta;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* AGCH queuing */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct llist_head queue;</span><br><span style="color: hsl(120, 100%, 40%);">+              int length;</span><br><span style="color: hsl(120, 100%, 40%);">+           int max_length;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             int thresh_level;       /* Cleanup threshold in percent of max len */</span><br><span style="color: hsl(120, 100%, 40%);">+         int low_level;          /* Low water mark in percent of max len */</span><br><span style="color: hsl(120, 100%, 40%);">+            int high_level;         /* High water mark in percent of max len */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* TODO: Use a rate counter group instead */</span><br><span style="color: hsl(120, 100%, 40%);">+          uint64_t dropped_msgs;</span><br><span style="color: hsl(120, 100%, 40%);">+                uint64_t merged_msgs;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint64_t rejected_msgs;</span><br><span style="color: hsl(120, 100%, 40%);">+               uint64_t agch_msgs;</span><br><span style="color: hsl(120, 100%, 40%);">+           uint64_t pch_msgs;</span><br><span style="color: hsl(120, 100%, 40%);">+    } agch_queue;</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%);">+              uint8_t *prim_notif;    /* ETWS primary notification (NULL if none) */</span><br><span style="color: hsl(120, 100%, 40%);">+                ssize_t prim_notif_len; /* Length of prim_notif; expected 56 bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t page_size;</span><br><span style="color: hsl(120, 100%, 40%);">+            uint8_t num_pages;      /* total number of pages */</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t next_page;      /* next page number to be sent */</span><br><span style="color: hsl(120, 100%, 40%);">+             bool pni;               /* Primary Notification Identifier */</span><br><span style="color: hsl(120, 100%, 40%);">+ } etws;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     struct paging_state *paging_state;</span><br><span style="color: hsl(120, 100%, 40%);">+    char *bsc_oml_host;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct llist_head oml_queue;</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int rtp_jitter_buf_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+       bool rtp_jitter_adaptive;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   uint16_t rtp_port_range_start;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t rtp_port_range_end;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t rtp_port_range_next;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rtp_ip_dscp;</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%);">+              uint8_t ciphers;        /* flags A5/1==0x1, A5/2==0x2, A5/3==0x4 */</span><br><span style="color: hsl(120, 100%, 40%);">+   } support;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t tc4_ctr;</span><br><span style="color: hsl(120, 100%, 40%);">+      } si;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_time gsm_time;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* frame number statistics (FN in PH-RTS.ind vs. PH-DATA.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+       struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              int32_t min;            /* minimum observed */</span><br><span style="color: hsl(120, 100%, 40%);">+                int32_t max;            /* maximum observed */</span><br><span style="color: hsl(120, 100%, 40%);">+                int32_t avg256;         /* accumulator */</span><br><span style="color: hsl(120, 100%, 40%);">+             uint32_t avg_count;     /* number of samples accumulated in avg256 */</span><br><span style="color: hsl(120, 100%, 40%);">+         uint32_t avg_window;    /* number of averages in avg_count */</span><br><span style="color: hsl(120, 100%, 40%);">+ } fn_stats;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Radio Link Timeout counter. -1 disables timeout for</span><br><span style="color: hsl(120, 100%, 40%);">+         * lab/measurement purpose */</span><br><span style="color: hsl(120, 100%, 40%);">+ int radio_link_timeout;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     int ul_power_target;            /* Uplink Rx power target */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* used by the sysmoBTS to adjust band */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t auto_band;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* State for SMSCB (Cell Broadcast) for BASIC and EXTENDED channel */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bts_smscb_state smscb_basic;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct bts_smscb_state smscb_extended;</span><br><span style="color: hsl(120, 100%, 40%);">+        int smscb_queue_tgt_len; /* ideal/target queue length */</span><br><span style="color: hsl(120, 100%, 40%);">+      int smscb_queue_max_len; /* maximum queue length */</span><br><span style="color: hsl(120, 100%, 40%);">+   int smscb_queue_hyst; /* hysteresis for CBCH load indications */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    int16_t min_qual_rach;  /* minimum link quality (in centiBels) for Access Bursts */</span><br><span style="color: hsl(120, 100%, 40%);">+   int16_t min_qual_norm;  /* minimum link quality (in centiBels) for Normal Bursts */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint16_t max_ber10k_rach;       /* Maximum permitted RACH BER in 0.01% */</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%);">+              char *sock_path;</span><br><span style="color: hsl(120, 100%, 40%);">+      } pcu;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      void *model_priv; /* Allocated by bts_model, contains model specific data pointer */</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 gsm_bts *gsm_bts_alloc(void *talloc_ctx, uint8_t bts_num);</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum bts_attribute str2btsattr(const char *s);</span><br><span style="color: hsl(120, 100%, 40%);">+const char *btsatttr2str(enum bts_attribute v);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum gsm_bts_type_variant str2btsvariant(const char *arg);</span><br><span style="color: hsl(120, 100%, 40%);">+const char *btsvariant2str(enum gsm_bts_type_variant v);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string gsm_pchant_names[13];</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string gsm_pchant_descs[13];</span><br><span style="color: hsl(120, 100%, 40%);">+const char *gsm_pchan_name(enum gsm_phys_chan_config c);</span><br><span style="color: hsl(120, 100%, 40%);">+enum gsm_phys_chan_config gsm_pchan_parse(const char *name);</span><br><span style="color: hsl(120, 100%, 40%);">+const char *gsm_lchant_name(enum gsm_chan_t c);</span><br><span style="color: hsl(120, 100%, 40%);">+char *gsm_trx_name(const struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+char *gsm_ts_name(const struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(120, 100%, 40%);">+char *gsm_ts_and_pchan_name(const struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(120, 100%, 40%);">+char *gsm_lchan_name_compute(const 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%);">+void gsm_abis_mo_reset(struct gsm_abis_mo *mo);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_abis_mo *</span><br><span style="color: hsl(120, 100%, 40%);">+gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class,</span><br><span style="color: hsl(120, 100%, 40%);">+     const struct abis_om_obj_inst *obj_inst);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_nm_state *</span><br><span style="color: hsl(120, 100%, 40%);">+gsm_objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class,</span><br><span style="color: hsl(120, 100%, 40%);">+           const struct abis_om_obj_inst *obj_inst);</span><br><span style="color: hsl(120, 100%, 40%);">+void *</span><br><span style="color: hsl(120, 100%, 40%);">+gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class,</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct abis_om_obj_inst *obj_inst);</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_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%);">+/* return the gsm_lchan for the CBCH (if it exists at all) */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_lchan *gsm_bts_get_cbch(struct gsm_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define BSIC2BCC(bsic) ((bsic) & 0x3)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static inline uint8_t gsm_ts_tsc(const struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ts->tsc != -1)</span><br><span style="color: hsl(120, 100%, 40%);">+         return ts->tsc;</span><br><span style="color: hsl(120, 100%, 40%);">+    else</span><br><span style="color: hsl(120, 100%, 40%);">+          return ts->trx->bts->bsic & 7;</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 *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   int *rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum gsm_phys_chan_config ts_pchan(struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t ts_subslots(struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(120, 100%, 40%);">+bool ts_is_tch(struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(120, 100%, 40%);">+const char *gsm_trx_unit_id(struct gsm_bts_trx *trx);</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> </span><br><span> 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>diff --git a/include/osmo-bts/gsm_data_shared.h b/include/osmo-bts/gsm_data_shared.h</span><br><span>deleted file mode 100644</span><br><span>index bbc1bd4..0000000</span><br><span>--- a/include/osmo-bts/gsm_data_shared.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,769 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef _GSM_DATA_SHAREDH</span><br><span style="color: hsl(0, 100%, 40%);">-#define _GSM_DATA_SHAREDH</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdbool.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdint.h></span><br><span style="color: hsl(0, 100%, 40%);">-</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/core/timer.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/bitvec.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/statistics.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/tlv.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/rxlev_stat.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/sysinfo.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/meas_rep.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/bts_features.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm48_rest_octets.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/protocol/gsm_08_58.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/protocol/gsm_12_21.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/abis/e1_input.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/lapdm.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* 16 is the max. number of SI2quater messages according to 3GPP TS 44.018 Table 10.5.2.33b.1:</span><br><span style="color: hsl(0, 100%, 40%);">-   4-bit index is used (2#1111 = 10#15) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define SI2Q_MAX_NUM 16</span><br><span style="color: hsl(0, 100%, 40%);">-/* length in bits (for single SI2quater message) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define SI2Q_MAX_LEN 160</span><br><span style="color: hsl(0, 100%, 40%);">-#define SI2Q_MIN_LEN 18</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* lchans 0..3 are SDCCH in combined channel configuration,</span><br><span style="color: hsl(0, 100%, 40%);">-   use 4 as magic number for BCCH hack - see osmo-bts-../oml.c:opstart_compl() */</span><br><span style="color: hsl(0, 100%, 40%);">-#define CCCH_LCHAN 4</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define TRX_NR_TS     8</span><br><span style="color: hsl(0, 100%, 40%);">-#define TS_MAX_LCHAN   8</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define MAX_VERSION_LENGTH 64</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%);">-struct osmo_rtp_socket;</span><br><span style="color: hsl(0, 100%, 40%);">-struct pcu_sock_state;</span><br><span style="color: hsl(0, 100%, 40%);">-struct smscb_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Network Management State */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_nm_state {</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t operational;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t administrative;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t availability;</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_abis_mo {</span><br><span style="color: hsl(0, 100%, 40%);">-     /* A-bis OML Object Class */</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t obj_class;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* is there still some procedure pending? */</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t procedure_pending;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* A-bis OML Object Instance */</span><br><span style="color: hsl(0, 100%, 40%);">- struct abis_om_obj_inst obj_inst;</span><br><span style="color: hsl(0, 100%, 40%);">-       /* human-readable name */</span><br><span style="color: hsl(0, 100%, 40%);">-       const char *name;</span><br><span style="color: hsl(0, 100%, 40%);">-       /* NM State */</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_nm_state nm_state;</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Attributes configured in this MO */</span><br><span style="color: hsl(0, 100%, 40%);">-  struct tlv_parsed *nm_attr;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* BTS to which this MO belongs */</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts *bts;</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_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%);">-       LCHAN_S_INACTIVE,       /* channel is set inactive */</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 dB */</span><br><span style="color: hsl(0, 100%, 40%);">-   float 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%);">-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%);">-      uint8_t rqd_ta;</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%);">-     /* 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%);">-                uint8_t l1_info[2];</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%);">-              /* 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%);">-  } 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%);">-       } 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%);">-   int 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%);">-     /* power handling */</span><br><span style="color: hsl(0, 100%, 40%);">-    struct {</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%);">-            bool fixed;</span><br><span style="color: hsl(0, 100%, 40%);">-     } ms_power_ctrl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* BTS power reduction (in dB) */</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t bs_power_red;</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static inline uint8_t lchan_get_ta(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->meas.l1_info[1];</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 style="color: hsl(0, 100%, 40%);">-enum gsm_bts_trx_ts_flags {</span><br><span style="color: hsl(0, 100%, 40%);">-     TS_F_PDCH_ACTIVE =              0x1000,</span><br><span style="color: hsl(0, 100%, 40%);">- TS_F_PDCH_ACT_PENDING =         0x2000,</span><br><span style="color: hsl(0, 100%, 40%);">- TS_F_PDCH_DEACT_PENDING =       0x4000,</span><br><span style="color: hsl(0, 100%, 40%);">- TS_F_PDCH_PENDING_MASK =        0x6000 /*<</span><br><span style="color: hsl(0, 100%, 40%);">-                   TS_F_PDCH_ACT_PENDING | TS_F_PDCH_DEACT_PENDING */</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%);">-/* One Timeslot in a TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_trx_ts {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-        /* number of this timeslot at the TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t nr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     enum gsm_phys_chan_config pchan;</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%);">-                enum gsm_phys_chan_config pchan_is;</span><br><span style="color: hsl(0, 100%, 40%);">-             enum gsm_phys_chan_config pchan_want;</span><br><span style="color: hsl(0, 100%, 40%);">-           struct msgb *pending_chan_activ;</span><br><span style="color: hsl(0, 100%, 40%);">-        } dyn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned int flags;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct tlv_parsed nm_attr;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t nm_chan_comb;</span><br><span style="color: hsl(0, 100%, 40%);">-   int tsc;                /* -1 == use BTS TSC */</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%);">-                /* Parameters below are configured by VTY */</span><br><span style="color: hsl(0, 100%, 40%);">-            int enabled;</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t maio;</span><br><span style="color: hsl(0, 100%, 40%);">-           uint8_t hsn;</span><br><span style="color: hsl(0, 100%, 40%);">-            struct bitvec arfcns;</span><br><span style="color: hsl(0, 100%, 40%);">-           uint8_t arfcns_data[1024/8];</span><br><span style="color: hsl(0, 100%, 40%);">-            /* This is the pre-computed MA for channel assignments */</span><br><span style="color: hsl(0, 100%, 40%);">-               struct bitvec ma;</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t ma_len; /* part of ma_data that is used */</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t ma_data[8];     /* 10.5.2.21: max 8 bytes value part */</span><br><span style="color: hsl(0, 100%, 40%);">- } hopping;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_lchan lchan[TS_MAX_LCHAN];</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%);">-/* One TRX in a BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_trx {</span><br><span style="color: hsl(0, 100%, 40%);">-       /* list header in bts->trx_list */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct llist_head list;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* number of this TRX in the BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t nr;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* human readable name / description */</span><br><span style="color: hsl(0, 100%, 40%);">- char *description;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* how do we talk RSL with this TRX? */</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t rsl_tei;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct e1inp_sign_link *rsl_link;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Some BTS (specifically Ericsson RBS) have a per-TRX OML Link */</span><br><span style="color: hsl(0, 100%, 40%);">-      struct e1inp_sign_link *oml_link;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct tlv_parsed nm_attr;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-  } bb_transc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    uint16_t arfcn;</span><br><span style="color: hsl(0, 100%, 40%);">- int nominal_power;              /* in dBm */</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned int max_power_red;     /* in actual dB */</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t max_power_backoff_8psk; /* in actual dB OC-2G only */</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t c0_idle_power_red;      /* in actual dB OC-2G only */</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 trx_power_params power_params;</span><br><span style="color: hsl(0, 100%, 40%);">-   bool ms_pwr_ctl_soft; /* is power control loop done by osmocom software? */</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%);">-                void *l1h;</span><br><span style="color: hsl(0, 100%, 40%);">-      } role_bts;</span><br><span style="color: hsl(0, 100%, 40%);">-</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%);">-                        unsigned int test_state;</span><br><span style="color: hsl(0, 100%, 40%);">-                        uint8_t test_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-                        struct rxlev_stats rxlev_stat;</span><br><span style="color: hsl(0, 100%, 40%);">-          } ipaccess;</span><br><span style="color: hsl(0, 100%, 40%);">-     };</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts_trx_ts ts[TRX_NR_TS];</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 GSM_BTS_SI2Q(bts, i)   (struct gsm48_system_information_type_2quater *)((bts)->si_buf[SYSINFO_TYPE_2quater][i])</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM_BTS_HAS_SI(bts, i) ((bts)->si_valid & (1 << i))</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM_BTS_SI(bts, i)     (void *)((bts)->si_buf[i][0])</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 style="color: hsl(0, 100%, 40%);">-enum gsm_bts_type_variant {</span><br><span style="color: hsl(0, 100%, 40%);">-     BTS_UNKNOWN,</span><br><span style="color: hsl(0, 100%, 40%);">-    BTS_OSMO_LITECELL15,</span><br><span style="color: hsl(0, 100%, 40%);">-        BTS_OSMO_OC2G,</span><br><span style="color: hsl(0, 100%, 40%);">-      BTS_OSMO_OCTPHY,</span><br><span style="color: hsl(0, 100%, 40%);">-        BTS_OSMO_SYSMO,</span><br><span style="color: hsl(0, 100%, 40%);">- BTS_OSMO_TRX,</span><br><span style="color: hsl(0, 100%, 40%);">-   BTS_OSMO_VIRTUAL,</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS_OSMO_OMLDUMMY,</span><br><span style="color: hsl(0, 100%, 40%);">-      _NUM_BTS_VARIANT</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%);">-/* Used by OML layer for BTS Attribute reporting */</span><br><span style="color: hsl(0, 100%, 40%);">-enum bts_attribute {</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS_TYPE_VARIANT,</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS_SUB_MODEL,</span><br><span style="color: hsl(0, 100%, 40%);">-  TRX_PHY_VERSION,</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%);">-/* BTS implementation flags (internal use, not exposed via OML) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define bts_internal_flag_get(bts, flag) \</span><br><span style="color: hsl(0, 100%, 40%);">-  ((bts->flags & (typeof(bts->flags)) flag) != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-#define bts_internal_flag_set(bts, flag) \</span><br><span style="color: hsl(0, 100%, 40%);">-     bts->flags |= (typeof(bts->flags)) flag</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* TODO: add a brief description of this flag */</span><br><span style="color: hsl(0, 100%, 40%);">-#define BTS_INTERNAL_FLAG_MS_PWR_CTRL_DSP          (1 << 0)</span><br><span style="color: hsl(0, 100%, 40%);">-/* When this flag is set then the measurement data is included in</span><br><span style="color: hsl(0, 100%, 40%);">- * (PRIM_PH_DATA) and struct ph_tch_param (PRIM_TCH). Otherwise the</span><br><span style="color: hsl(0, 100%, 40%);">- * measurement data is passed using a separate MPH INFO MEAS IND.</span><br><span style="color: hsl(0, 100%, 40%);">- * (See also ticket: OS#2977) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define BTS_INTERNAL_FLAG_MEAS_PAYLOAD_COMB          (1 << 1)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern const struct value_string bts_impl_flag_desc[];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_gprs_nsvc {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* data read via VTY config file, to configure the BTS</span><br><span style="color: hsl(0, 100%, 40%);">-   * via OML from BSC */</span><br><span style="color: hsl(0, 100%, 40%);">-  int id;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t nsvci;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t local_port;    /* on the BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-        uint16_t remote_port;   /* on the SGSN */</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t remote_ip;     /* on the SGSN */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm_abis_mo mo;</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 gprs_rlc_par {</span><br><span style="color: hsl(0, 100%, 40%);">-     RLC_T3142,</span><br><span style="color: hsl(0, 100%, 40%);">-      RLC_T3169,</span><br><span style="color: hsl(0, 100%, 40%);">-      RLC_T3191,</span><br><span style="color: hsl(0, 100%, 40%);">-      RLC_T3193,</span><br><span style="color: hsl(0, 100%, 40%);">-      RLC_T3195,</span><br><span style="color: hsl(0, 100%, 40%);">-      RLC_N3101,</span><br><span style="color: hsl(0, 100%, 40%);">-      RLC_N3103,</span><br><span style="color: hsl(0, 100%, 40%);">-      RLC_N3105,</span><br><span style="color: hsl(0, 100%, 40%);">-      CV_COUNTDOWN,</span><br><span style="color: hsl(0, 100%, 40%);">-   T_DL_TBF_EXT,   /* ms */</span><br><span style="color: hsl(0, 100%, 40%);">-        T_UL_TBF_EXT,   /* ms */</span><br><span style="color: hsl(0, 100%, 40%);">-        _NUM_RLC_PAR</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 gprs_cs {</span><br><span style="color: hsl(0, 100%, 40%);">-    GPRS_CS1,</span><br><span style="color: hsl(0, 100%, 40%);">-       GPRS_CS2,</span><br><span style="color: hsl(0, 100%, 40%);">-       GPRS_CS3,</span><br><span style="color: hsl(0, 100%, 40%);">-       GPRS_CS4,</span><br><span style="color: hsl(0, 100%, 40%);">-       GPRS_MCS1,</span><br><span style="color: hsl(0, 100%, 40%);">-      GPRS_MCS2,</span><br><span style="color: hsl(0, 100%, 40%);">-      GPRS_MCS3,</span><br><span style="color: hsl(0, 100%, 40%);">-      GPRS_MCS4,</span><br><span style="color: hsl(0, 100%, 40%);">-      GPRS_MCS5,</span><br><span style="color: hsl(0, 100%, 40%);">-      GPRS_MCS6,</span><br><span style="color: hsl(0, 100%, 40%);">-      GPRS_MCS7,</span><br><span style="color: hsl(0, 100%, 40%);">-      GPRS_MCS8,</span><br><span style="color: hsl(0, 100%, 40%);">-      GPRS_MCS9,</span><br><span style="color: hsl(0, 100%, 40%);">-      _NUM_GRPS_CS</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 gprs_rlc_cfg {</span><br><span style="color: hsl(0, 100%, 40%);">-     uint16_t parameter[_NUM_RLC_PAR];</span><br><span style="color: hsl(0, 100%, 40%);">-       struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                uint16_t repeat_time; /* ms */</span><br><span style="color: hsl(0, 100%, 40%);">-          uint8_t repeat_count;</span><br><span style="color: hsl(0, 100%, 40%);">-   } paging;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t cs_mask; /* bitmask of gprs_cs */</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t initial_cs;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t initial_mcs;</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 bts_smscb_state {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct llist_head queue; /* list of struct smscb_msg */</span><br><span style="color: hsl(0, 100%, 40%);">- int queue_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct rate_ctr_group *ctrs;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct smscb_msg *cur_msg; /* current SMS-CB */</span><br><span style="color: hsl(0, 100%, 40%);">- struct smscb_msg *default_msg; /* default broadcast message; NULL if none */</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%);">-/* The amount of time within which a sudden disconnect of a newly established</span><br><span style="color: hsl(0, 100%, 40%);">- * OML connection will cause a special warning to be logged. */</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSMO_BTS_OML_CONN_EARLY_DISCONNECT 10  /* in seconds */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* One BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts {</span><br><span style="color: hsl(0, 100%, 40%);">-  /* list header in net->bts_list */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct llist_head list;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* number of the BTS in network */</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t nr;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* human readable name / description */</span><br><span style="color: hsl(0, 100%, 40%);">- char *description;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Cell Identity */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint16_t cell_identity;</span><br><span style="color: hsl(0, 100%, 40%);">- /* location area code of this BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-    uint16_t location_area_code;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Base Station Identification Code (BSIC), lower 3 bits is BCC,</span><br><span style="color: hsl(0, 100%, 40%);">-         * which is used as TSC for the CCCH */</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t bsic;</span><br><span style="color: hsl(0, 100%, 40%);">-   /* type of BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-       enum gsm_bts_type_variant variant;</span><br><span style="color: hsl(0, 100%, 40%);">-      enum gsm_band band;</span><br><span style="color: hsl(0, 100%, 40%);">-     char version[MAX_VERSION_LENGTH];</span><br><span style="color: hsl(0, 100%, 40%);">-       char sub_model[MAX_VERSION_LENGTH];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* public features of a given BTS (set/reported via OML) */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct bitvec *features;</span><br><span style="color: hsl(0, 100%, 40%);">-        /* implementation flags of a given BTS (not exposed via OML) */</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t flags;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Connected PCU version (if any) */</span><br><span style="color: hsl(0, 100%, 40%);">-    char pcu_version[MAX_VERSION_LENGTH];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* maximum Tx power that the MS is permitted to use in this cell */</span><br><span style="color: hsl(0, 100%, 40%);">-     int ms_max_power;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* how do we talk OML with this TRX? */</span><br><span style="color: hsl(0, 100%, 40%);">- struct e1inp_sign_link *oml_link;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct timespec oml_conn_established_timestamp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Abis network management O&M handle */</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* number of this BTS on given E1 link */</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t bts_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* DTX features of this BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-  bool dtxd;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* CCCH is on C0 */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts_trx *c0;</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%);">-                struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-  } site_mgr;</span><br><span style="color: hsl(0, 100%, 40%);">-</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 si_valid;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* 3GPP TS 44.018 Table 10.5.2.33b.1 INDEX and COUNT for SI2quater */</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t si2q_index; /* distinguish individual SI2quater messages */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t si2q_count; /* si2q_index for the last (highest indexed) individual SI2quater message */</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%);">-  sysinfo_buf_t si_buf[_MAX_SYSINFO_TYPE][SI2Q_MAX_NUM];</span><br><span style="color: hsl(0, 100%, 40%);">-  /* offsets used while generating SI2quater */</span><br><span style="color: hsl(0, 100%, 40%);">-   size_t e_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-        size_t u_offset;</span><br><span style="color: hsl(0, 100%, 40%);">-        /* decoded SI3 rest octets - *unmodified* as received from BSC */</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_gsm48_si_ro_info si3_ro_decoded;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* is SI3 GPRS Indicator currently disabled due to lack of PCU connection? */</span><br><span style="color: hsl(0, 100%, 40%);">-   bool si3_gprs_ind_disabled;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* ip.access Unit ID's have Site/BTS/TRX layout */</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%);">-                        uint16_t site_id;</span><br><span style="color: hsl(0, 100%, 40%);">-                       uint16_t bts_id;</span><br><span style="color: hsl(0, 100%, 40%);">-                        uint32_t flags;</span><br><span style="color: hsl(0, 100%, 40%);">-                 uint32_t rsl_ip;</span><br><span style="color: hsl(0, 100%, 40%);">-                } ip_access;</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%);">-      /* Not entirely sure how ip.access specific this is */</span><br><span style="color: hsl(0, 100%, 40%);">-  struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-                  uint16_t nsei;</span><br><span style="color: hsl(0, 100%, 40%);">-                  uint8_t timer[7];</span><br><span style="color: hsl(0, 100%, 40%);">-               } nse;</span><br><span style="color: hsl(0, 100%, 40%);">-          struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-                  uint16_t bvci;</span><br><span style="color: hsl(0, 100%, 40%);">-                  uint8_t timer[11];</span><br><span style="color: hsl(0, 100%, 40%);">-                      struct gprs_rlc_cfg rlc_cfg;</span><br><span style="color: hsl(0, 100%, 40%);">-            } cell;</span><br><span style="color: hsl(0, 100%, 40%);">-         struct gsm_bts_gprs_nsvc nsvc[2];</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t rac;</span><br><span style="color: hsl(0, 100%, 40%);">-    } gprs;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* transceivers */</span><br><span style="color: hsl(0, 100%, 40%);">-      int num_trx;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct llist_head trx_list;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     struct rate_ctr_group *ctrs;</span><br><span style="color: hsl(0, 100%, 40%);">-    bool supp_meas_toa256;</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%);">-                /* Interference Boundaries for OML */</span><br><span style="color: hsl(0, 100%, 40%);">-           int16_t boundary[6];</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t intave;</span><br><span style="color: hsl(0, 100%, 40%);">- } interference;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int t200_ms[7];</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned int t3105_ms;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t overload_period;</span><br><span style="color: hsl(0, 100%, 40%);">-                struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* Input parameters from OML */</span><br><span style="color: hsl(0, 100%, 40%);">-                 uint8_t load_ind_thresh;        /* percent */</span><br><span style="color: hsl(0, 100%, 40%);">-                   uint8_t load_ind_period;        /* seconds */</span><br><span style="color: hsl(0, 100%, 40%);">-                   /* Internal data */</span><br><span style="color: hsl(0, 100%, 40%);">-                     struct osmo_timer_list timer;</span><br><span style="color: hsl(0, 100%, 40%);">-                   unsigned int pch_total;</span><br><span style="color: hsl(0, 100%, 40%);">-                 unsigned int pch_used;</span><br><span style="color: hsl(0, 100%, 40%);">-          } ccch;</span><br><span style="color: hsl(0, 100%, 40%);">-         struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* Input parameters from OML */</span><br><span style="color: hsl(0, 100%, 40%);">-                 int16_t busy_thresh;            /* in dBm */</span><br><span style="color: hsl(0, 100%, 40%);">-                    uint16_t averaging_slots;</span><br><span style="color: hsl(0, 100%, 40%);">-                       /* Internal data */</span><br><span style="color: hsl(0, 100%, 40%);">-                     unsigned int total;     /* total nr */</span><br><span style="color: hsl(0, 100%, 40%);">-                  unsigned int busy;      /* above busy_thresh */</span><br><span style="color: hsl(0, 100%, 40%);">-                 unsigned int access;    /* access bursts */</span><br><span style="color: hsl(0, 100%, 40%);">-             } rach;</span><br><span style="color: hsl(0, 100%, 40%);">- } load;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t ny1;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t max_ta;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* AGCH queuing */</span><br><span style="color: hsl(0, 100%, 40%);">-      struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                struct llist_head queue;</span><br><span style="color: hsl(0, 100%, 40%);">-                int length;</span><br><span style="color: hsl(0, 100%, 40%);">-             int max_length;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         int thresh_level;       /* Cleanup threshold in percent of max len */</span><br><span style="color: hsl(0, 100%, 40%);">-           int low_level;          /* Low water mark in percent of max len */</span><br><span style="color: hsl(0, 100%, 40%);">-              int high_level;         /* High water mark in percent of max len */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             /* TODO: Use a rate counter group instead */</span><br><span style="color: hsl(0, 100%, 40%);">-            uint64_t dropped_msgs;</span><br><span style="color: hsl(0, 100%, 40%);">-          uint64_t merged_msgs;</span><br><span style="color: hsl(0, 100%, 40%);">-           uint64_t rejected_msgs;</span><br><span style="color: hsl(0, 100%, 40%);">-         uint64_t agch_msgs;</span><br><span style="color: hsl(0, 100%, 40%);">-             uint64_t pch_msgs;</span><br><span style="color: hsl(0, 100%, 40%);">-      } agch_queue;</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%);">-                uint8_t *prim_notif;    /* ETWS primary notification (NULL if none) */</span><br><span style="color: hsl(0, 100%, 40%);">-          ssize_t prim_notif_len; /* Length of prim_notif; expected 56 bytes */</span><br><span style="color: hsl(0, 100%, 40%);">-           uint8_t page_size;</span><br><span style="color: hsl(0, 100%, 40%);">-              uint8_t num_pages;      /* total number of pages */</span><br><span style="color: hsl(0, 100%, 40%);">-             uint8_t next_page;      /* next page number to be sent */</span><br><span style="color: hsl(0, 100%, 40%);">-               bool pni;               /* Primary Notification Identifier */</span><br><span style="color: hsl(0, 100%, 40%);">-   } etws;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- struct paging_state *paging_state;</span><br><span style="color: hsl(0, 100%, 40%);">-      char *bsc_oml_host;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct llist_head oml_queue;</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned int rtp_jitter_buf_ms;</span><br><span style="color: hsl(0, 100%, 40%);">- bool rtp_jitter_adaptive;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       uint16_t rtp_port_range_start;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint16_t rtp_port_range_end;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint16_t rtp_port_range_next;</span><br><span style="color: hsl(0, 100%, 40%);">-   int rtp_ip_dscp;</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%);">-                uint8_t ciphers;        /* flags A5/1==0x1, A5/2==0x2, A5/3==0x4 */</span><br><span style="color: hsl(0, 100%, 40%);">-     } support;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t tc4_ctr;</span><br><span style="color: hsl(0, 100%, 40%);">-        } si;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_time gsm_time;</span><br><span style="color: hsl(0, 100%, 40%);">-       /* frame number statistics (FN in PH-RTS.ind vs. PH-DATA.ind */</span><br><span style="color: hsl(0, 100%, 40%);">- struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                int32_t min;            /* minimum observed */</span><br><span style="color: hsl(0, 100%, 40%);">-          int32_t max;            /* maximum observed */</span><br><span style="color: hsl(0, 100%, 40%);">-          int32_t avg256;         /* accumulator */</span><br><span style="color: hsl(0, 100%, 40%);">-               uint32_t avg_count;     /* number of samples accumulated in avg256 */</span><br><span style="color: hsl(0, 100%, 40%);">-           uint32_t avg_window;    /* number of averages in avg_count */</span><br><span style="color: hsl(0, 100%, 40%);">-   } fn_stats;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Radio Link Timeout counter. -1 disables timeout for</span><br><span style="color: hsl(0, 100%, 40%);">-   * lab/measurement purpose */</span><br><span style="color: hsl(0, 100%, 40%);">-   int radio_link_timeout;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- int ul_power_target;            /* Uplink Rx power target */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* used by the sysmoBTS to adjust band */</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t auto_band;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* State for SMSCB (Cell Broadcast) for BASIC and EXTENDED channel */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct bts_smscb_state smscb_basic;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct bts_smscb_state smscb_extended;</span><br><span style="color: hsl(0, 100%, 40%);">-  int smscb_queue_tgt_len; /* ideal/target queue length */</span><br><span style="color: hsl(0, 100%, 40%);">-        int smscb_queue_max_len; /* maximum queue length */</span><br><span style="color: hsl(0, 100%, 40%);">-     int smscb_queue_hyst; /* hysteresis for CBCH load indications */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        int16_t min_qual_rach;  /* minimum link quality (in centiBels) for Access Bursts */</span><br><span style="color: hsl(0, 100%, 40%);">-     int16_t min_qual_norm;  /* minimum link quality (in centiBels) for Normal Bursts */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint16_t max_ber10k_rach;       /* Maximum permitted RACH BER in 0.01% */</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%);">-                char *sock_path;</span><br><span style="color: hsl(0, 100%, 40%);">-        } pcu;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  void *model_priv; /* Allocated by bts_model, contains model specific data pointer */</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 gsm_bts *gsm_bts_alloc(void *talloc_ctx, uint8_t bts_num);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts);</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum bts_attribute str2btsattr(const char *s);</span><br><span style="color: hsl(0, 100%, 40%);">-const char *btsatttr2str(enum bts_attribute v);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum gsm_bts_type_variant str2btsvariant(const char *arg);</span><br><span style="color: hsl(0, 100%, 40%);">-const char *btsvariant2str(enum gsm_bts_type_variant v);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern const struct value_string gsm_pchant_names[13];</span><br><span style="color: hsl(0, 100%, 40%);">-extern const struct value_string gsm_pchant_descs[13];</span><br><span style="color: hsl(0, 100%, 40%);">-const char *gsm_pchan_name(enum gsm_phys_chan_config c);</span><br><span style="color: hsl(0, 100%, 40%);">-enum gsm_phys_chan_config gsm_pchan_parse(const char *name);</span><br><span style="color: hsl(0, 100%, 40%);">-const char *gsm_lchant_name(enum gsm_chan_t c);</span><br><span style="color: hsl(0, 100%, 40%);">-char *gsm_trx_name(const struct gsm_bts_trx *trx);</span><br><span style="color: hsl(0, 100%, 40%);">-char *gsm_ts_name(const struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(0, 100%, 40%);">-char *gsm_ts_and_pchan_name(const struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(0, 100%, 40%);">-char *gsm_lchan_name_compute(const 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 style="color: hsl(0, 100%, 40%);">-</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%);">-void gsm_abis_mo_reset(struct gsm_abis_mo *mo);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_abis_mo *</span><br><span style="color: hsl(0, 100%, 40%);">-gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class,</span><br><span style="color: hsl(0, 100%, 40%);">-           const struct abis_om_obj_inst *obj_inst);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_nm_state *</span><br><span style="color: hsl(0, 100%, 40%);">-gsm_objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class,</span><br><span style="color: hsl(0, 100%, 40%);">-           const struct abis_om_obj_inst *obj_inst);</span><br><span style="color: hsl(0, 100%, 40%);">-void *</span><br><span style="color: hsl(0, 100%, 40%);">-gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class,</span><br><span style="color: hsl(0, 100%, 40%);">-             const struct abis_om_obj_inst *obj_inst);</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_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%);">-/* return the gsm_lchan for the CBCH (if it exists at all) */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_lchan *gsm_bts_get_cbch(struct gsm_bts *bts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define BSIC2BCC(bsic) ((bsic) & 0x3)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static inline uint8_t gsm_ts_tsc(const struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- if (ts->tsc != -1)</span><br><span style="color: hsl(0, 100%, 40%);">-           return ts->tsc;</span><br><span style="color: hsl(0, 100%, 40%);">-      else</span><br><span style="color: hsl(0, 100%, 40%);">-            return ts->trx->bts->bsic & 7;</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 *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   int *rc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum gsm_phys_chan_config ts_pchan(struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t ts_subslots(struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(0, 100%, 40%);">-bool ts_is_tch(struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(0, 100%, 40%);">-const char *gsm_trx_unit_id(struct gsm_bts_trx *trx);</span><br><span style="color: hsl(0, 100%, 40%);">-</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%);">-#endif</span><br><span>diff --git a/src/common/Makefile.am b/src/common/Makefile.am</span><br><span>index cd22f7b..85b7038 100644</span><br><span>--- a/src/common/Makefile.am</span><br><span>+++ b/src/common/Makefile.am</span><br><span>@@ -8,7 +8,7 @@</span><br><span> </span><br><span> noinst_LIBRARIES = libbts.a libl1sched.a</span><br><span> libbts_a_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_data_shared.c \</span><br><span style="color: hsl(120, 100%, 40%);">+   gsm_data.c \</span><br><span>         sysinfo.c \</span><br><span>  logging.c \</span><br><span>  abis.c \</span><br><span>diff --git a/src/common/gsm_data_shared.c b/src/common/gsm_data.c</span><br><span>similarity index 100%</span><br><span>rename from src/common/gsm_data_shared.c</span><br><span>rename to src/common/gsm_data.c</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/18884">change 18884</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/+/18884"/><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: Id60e7582e3a32dbc5e3531b87b2b49f07aee734d </div>
<div style="display:none"> Gerrit-Change-Number: 18884 </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>