<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9482">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">remove struct bsc_api<br><br>struct bsc_api was used to provide an abstract API for both osmo-bsc and<br>osmo-msc, between BSC and MSC. That's no longer needed, so get rid of it, to<br>prevent code turbulences it creates for no reason.<br><br>Change-Id: I3fd5888c63a0b4f95520a498320aa105a6d60579<br>---<br>M include/osmocom/bsc/bsc_api.h<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/bsc_api.c<br>M src/osmo-bsc/osmo_bsc_api.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>M tests/bsc/bsc_test.c<br>M tests/handover/handover_test.c<br>7 files changed, 86 insertions(+), 198 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/82/9482/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/bsc_api.h b/include/osmocom/bsc/bsc_api.h</span><br><span>index 06f8093..a90268b 100644</span><br><span>--- a/include/osmocom/bsc/bsc_api.h</span><br><span>+++ b/include/osmocom/bsc/bsc_api.h</span><br><span>@@ -8,43 +8,18 @@</span><br><span> #define BSC_API_CONN_POL_ACCEPT       0</span><br><span> #define BSC_API_CONN_POL_REJECT    1</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_api {</span><br><span style="color: hsl(0, 100%, 40%);">-   /*! \brief BTS->MSC: tell MSC a SAPI was not established */</span><br><span style="color: hsl(0, 100%, 40%);">-  void (*sapi_n_reject)(struct gsm_subscriber_connection *conn, int dlci);</span><br><span style="color: hsl(0, 100%, 40%);">-        /*! \brief MS->MSC: Tell MSC that ciphering has been enabled */</span><br><span style="color: hsl(0, 100%, 40%);">-      void (*cipher_mode_compl)(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 struct msgb *msg, uint8_t chosen_encr);</span><br><span style="color: hsl(0, 100%, 40%);">-       /*! \brief MS->MSC: New MM context with L3 payload */</span><br><span style="color: hsl(0, 100%, 40%);">-        int (*compl_l3)(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                 struct msgb *msg, uint16_t chosen_channel); </span><br><span style="color: hsl(0, 100%, 40%);">-    /*! \brief MS->BSC/MSC: Um L3 message */</span><br><span style="color: hsl(0, 100%, 40%);">-     void (*dtap)(struct gsm_subscriber_connection *conn, uint8_t link_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                   struct msgb *msg);</span><br><span style="color: hsl(0, 100%, 40%);">-      /*! \brief BSC->MSC: Assignment of lchan successful */</span><br><span style="color: hsl(0, 100%, 40%);">-       void (*assign_compl)(struct gsm_subscriber_connection *conn, uint8_t rr_cause);</span><br><span style="color: hsl(0, 100%, 40%);">- /*! \brief BSC->MSC: Assignment of lchan failed */</span><br><span style="color: hsl(0, 100%, 40%);">-   void (*assign_fail)(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                      uint8_t cause, uint8_t *rr_cause);</span><br><span style="color: hsl(0, 100%, 40%);">-     /*! \brief BSC->MSC: RR conn has been cleared */</span><br><span style="color: hsl(0, 100%, 40%);">-     int (*clear_request)(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                          uint32_t cause);</span><br><span style="color: hsl(0, 100%, 40%);">-  /*! \brief BSC->MSC: Classmark Update */</span><br><span style="color: hsl(0, 100%, 40%);">-     void (*classmark_chg)(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                         const uint8_t *cm2, uint8_t cm2_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                            const uint8_t *cm3, uint8_t cm3_len);</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_sapi_n_reject(struct gsm_subscriber_connection *conn, int dlci);</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_cipher_mode_compl(struct gsm_subscriber_connection *conn, struct msgb *msg, uint8_t chosen_encr);</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg, uint16_t chosen_channel);</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_dtap(struct gsm_subscriber_connection *conn, uint8_t link_id, struct msgb *msg);</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_assign_compl(struct gsm_subscriber_connection *conn, uint8_t rr_cause);</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_assign_fail(struct gsm_subscriber_connection *conn, uint8_t cause, uint8_t *rr_cause);</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause);</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_cm_update(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(120, 100%, 40%);">+               const uint8_t *cm2, uint8_t cm2_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                  const uint8_t *cm3, uint8_t cm3_len);</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_mr_config(struct gsm_subscriber_connection *conn, struct gsm_lchan *lchan, int full_rate);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /**</span><br><span style="color: hsl(0, 100%, 40%);">-      * Configure the multirate setting on this channel. If it is</span><br><span style="color: hsl(0, 100%, 40%);">-     * not implemented AMR5.9 will be used.</span><br><span style="color: hsl(0, 100%, 40%);">-  */</span><br><span style="color: hsl(0, 100%, 40%);">-     void (*mr_config)(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                               struct gsm_lchan *lchan, int full_rate);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /** Callback for additional actions during conn cleanup */</span><br><span style="color: hsl(0, 100%, 40%);">-      void (*conn_cleanup)(struct gsm_subscriber_connection *conn);</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%);">-int bsc_api_init(struct gsm_network *network, struct bsc_api *api);</span><br><span> int gsm0808_submit_dtap(struct gsm_subscriber_connection *conn, struct msgb *msg, int link_id, int allow_sacch);</span><br><span> int gsm0808_assign_req(struct gsm_subscriber_connection *conn, int chan_mode, int full_rate);</span><br><span> int gsm0808_cipher_mode(struct gsm_subscriber_connection *conn, int cipher,</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index a8d1f92..56cca16 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -256,7 +256,6 @@</span><br><span> struct gsm_lchan;</span><br><span> struct osmo_rtp_socket;</span><br><span> struct rtp_socket;</span><br><span style="color: hsl(0, 100%, 40%);">-struct bsc_api;</span><br><span> </span><br><span> /* Network Management State */</span><br><span> struct gsm_nm_state {</span><br><span>@@ -1217,8 +1216,6 @@</span><br><span> </span><br><span>    struct rate_ctr_group *bsc_ctrs;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    struct bsc_api *bsc_api;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     unsigned int num_bts;</span><br><span>        struct llist_head bts_list;</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/bsc_api.c b/src/osmo-bsc/bsc_api.c</span><br><span>index 8ae781e..5334314 100644</span><br><span>--- a/src/osmo-bsc/bsc_api.c</span><br><span>+++ b/src/osmo-bsc/bsc_api.c</span><br><span>@@ -45,52 +45,9 @@</span><br><span> #define HO_DTAP_CACHE_MSGB_CB_ALLOW_SACCH 1</span><br><span> </span><br><span> static void rll_ind_cb(struct gsm_lchan *, uint8_t, void *, enum bsc_rllr_ind);</span><br><span style="color: hsl(0, 100%, 40%);">-static void send_sapi_reject(struct gsm_subscriber_connection *conn, int link_id);</span><br><span style="color: hsl(0, 100%, 40%);">-static void handle_release(struct gsm_subscriber_connection *conn, struct bsc_api *bsc, struct  gsm_lchan *lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-static void handle_chan_ack(struct gsm_subscriber_connection *conn, struct bsc_api *bsc, struct  gsm_lchan *lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-static void handle_chan_nack(struct gsm_subscriber_connection *conn, struct bsc_api *bsc, struct  gsm_lchan *lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! \brief Determine and apply AMR multi-rate configuration to lchan</span><br><span style="color: hsl(0, 100%, 40%);">- *  Determine which AMR multi-rate configuration to use and apply it to</span><br><span style="color: hsl(0, 100%, 40%);">- *  the lchan (so it can be communicated to BTS and MS during channel</span><br><span style="color: hsl(0, 100%, 40%);">- *  activation.</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] conn subscriber connection (used to resolve bsc_api)</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[out] lchan logical channel to which to apply mr config</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] full_rate whether to use full-rate (1) or half-rate (0) config</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static void handle_mr_config(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                            struct gsm_lchan *lchan, int full_rate)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct bsc_api *api;</span><br><span style="color: hsl(0, 100%, 40%);">-    api = conn->network->bsc_api;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct amr_multirate_conf *mr;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm48_multi_rate_conf *mr_conf;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* BSC api override for this method, used in OsmoBSC mode with</span><br><span style="color: hsl(0, 100%, 40%);">-   * bsc_mr_config() to use MSC-specific/specified configuration */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (api->mr_config)</span><br><span style="color: hsl(0, 100%, 40%);">-          return api->mr_config(conn, lchan, full_rate);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* NITB case: use the BTS-specic multi-rate configuration from</span><br><span style="color: hsl(0, 100%, 40%);">-   * the vty/configuration file */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (full_rate)</span><br><span style="color: hsl(0, 100%, 40%);">-          mr = &lchan->ts->trx->bts->mr_full;</span><br><span style="color: hsl(0, 100%, 40%);">-     else</span><br><span style="color: hsl(0, 100%, 40%);">-            mr = &lchan->ts->trx->bts->mr_half;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     mr_conf = (struct gsm48_multi_rate_conf *) mr->gsm48_ie;</span><br><span style="color: hsl(0, 100%, 40%);">-     mr_conf->ver = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* default, if no AMR codec defined */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!mr->gsm48_ie[1]) {</span><br><span style="color: hsl(0, 100%, 40%);">-              mr_conf->icmi = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-           mr_conf->m5_90 = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* store encoded MR config IE lchan for both MS (uplink) and BTS</span><br><span style="color: hsl(0, 100%, 40%);">-         * (downlink) directions */</span><br><span style="color: hsl(0, 100%, 40%);">-     gsm48_multirate_config(lchan->mr_ms_lv, mr, mr->ms_mode);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm48_multirate_config(lchan->mr_bts_lv, mr, mr->bts_mode);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+static void handle_release(struct gsm_subscriber_connection *conn, struct  gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+static void handle_chan_ack(struct gsm_subscriber_connection *conn, struct  gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+static void handle_chan_nack(struct gsm_subscriber_connection *conn, struct  gsm_lchan *lchan);</span><br><span> </span><br><span> /*</span><br><span>  * Start a new assignment and make sure that it is completed within T10 either</span><br><span>@@ -145,7 +102,7 @@</span><br><span> </span><br><span>     /* handle AMR correctly */</span><br><span>   if (chan_mode == GSM48_CMODE_SPEECH_AMR)</span><br><span style="color: hsl(0, 100%, 40%);">-                handle_mr_config(conn, new_lchan, full_rate);</span><br><span style="color: hsl(120, 100%, 40%);">+         bsc_mr_config(conn, new_lchan, full_rate);</span><br><span> </span><br><span>       if (rsl_chan_activate_lchan(new_lchan, 0x1, 0) < 0) {</span><br><span>             LOGPLCHAN(new_lchan, DHO, LOGL_ERROR, "could not activate channel\n");</span><br><span>@@ -202,12 +159,6 @@</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_api_init(struct gsm_network *network, struct bsc_api *api)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   network->bsc_api = api;</span><br><span style="color: hsl(0, 100%, 40%);">-      return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /*! \brief process incoming 08.08 DTAP from MSC (send via BTS to MS) */</span><br><span> int gsm0808_submit_dtap(struct gsm_subscriber_connection *conn,</span><br><span>                     struct msgb *msg, int link_id, int allow_sacch)</span><br><span>@@ -246,7 +197,7 @@</span><br><span>                OBSC_LINKID_CB(msg) = link_id;</span><br><span>               if (rll_establish(msg->lchan, sapi, rll_ind_cb, msg) != 0) {</span><br><span>                      msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-                 send_sapi_reject(conn, link_id);</span><br><span style="color: hsl(120, 100%, 40%);">+                      bsc_sapi_n_reject(conn, link_id);</span><br><span>                    return -1;</span><br><span>           }</span><br><span>            return 0;</span><br><span>@@ -306,9 +257,6 @@</span><br><span> {</span><br><span>         /* TODO: Add multirate configuration, make it work for more than audio. */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  struct bsc_api *api;</span><br><span style="color: hsl(0, 100%, 40%);">-    api = conn->network->bsc_api;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>  if (!chan_compat_with_mode(conn->lchan, chan_mode, full_rate)) {</span><br><span>          if (handle_new_assignment(conn, chan_mode, full_rate) != 0)</span><br><span>                  goto error;</span><br><span>@@ -319,7 +267,7 @@</span><br><span>                    return 1;</span><br><span> </span><br><span>                if (chan_mode == GSM48_CMODE_SPEECH_AMR)</span><br><span style="color: hsl(0, 100%, 40%);">-                        handle_mr_config(conn, conn->lchan, full_rate);</span><br><span style="color: hsl(120, 100%, 40%);">+                    bsc_mr_config(conn, conn->lchan, full_rate);</span><br><span> </span><br><span>          LOGPLCHAN(conn->lchan, DMSC, LOGL_NOTICE,</span><br><span>                           "Sending ChanModify for speech: %s\n",</span><br><span>@@ -331,7 +279,7 @@</span><br><span>     return 0;</span><br><span> </span><br><span> error:</span><br><span style="color: hsl(0, 100%, 40%);">- api->assign_fail(conn, 0, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+   bsc_assign_fail(conn, 0, NULL);</span><br><span>      return -1;</span><br><span> }</span><br><span> </span><br><span>@@ -345,7 +293,6 @@</span><br><span>                         struct msgb *msg)</span><br><span> {</span><br><span>  struct gsm48_hdr *gh = msgb_l3(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    struct bsc_api *api = conn->network->bsc_api;</span><br><span>  enum gsm48_rr_cause cause;</span><br><span> </span><br><span>       /* Expecting gsm48_hdr + cause value */</span><br><span>@@ -393,13 +340,12 @@</span><br><span>      if (is_ipaccess_bts(conn_get_bts(conn)) && conn->lchan->tch_mode != GSM48_CMODE_SIGN)</span><br><span>          rsl_ipacc_crcx(conn->lchan);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     api->assign_compl(conn, cause);</span><br><span style="color: hsl(120, 100%, 40%);">+    bsc_assign_compl(conn, cause);</span><br><span> }</span><br><span> </span><br><span> static void handle_ass_fail(struct gsm_subscriber_connection *conn,</span><br><span>                           struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct bsc_api *api = conn->network->bsc_api;</span><br><span>  uint8_t *rr_failure;</span><br><span>         struct gsm48_hdr *gh;</span><br><span> </span><br><span>@@ -446,15 +392,12 @@</span><br><span>            rr_failure = &gh->data[0];</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   api->assign_fail(conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                        GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE,</span><br><span style="color: hsl(0, 100%, 40%);">-                  rr_failure);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_assign_fail(conn, GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE, rr_failure);</span><br><span> }</span><br><span> </span><br><span> static void handle_classmark_chg(struct gsm_subscriber_connection *conn,</span><br><span>                                struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_api *api = msg->lchan->ts->trx->bts->network->bsc_api;</span><br><span>  struct gsm48_hdr *gh = msgb_l3(msg);</span><br><span>         unsigned int payload_len = msgb_l3len(msg) - sizeof(*gh);</span><br><span>    uint8_t cm2_len, cm3_len = 0;</span><br><span>@@ -486,7 +429,7 @@</span><br><span>          }</span><br><span>            DEBUGPC(DRR, "CM3(len=%u)\n", cm3_len);</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-       api->classmark_chg(conn, cm2, cm2_len, cm3, cm3_len);</span><br><span style="color: hsl(120, 100%, 40%);">+      bsc_cm_update(conn, cm2, cm2_len, cm3, cm3_len);</span><br><span> }</span><br><span> </span><br><span> /* Chapter 9.1.16 Handover complete */</span><br><span>@@ -533,7 +476,6 @@</span><br><span> static void dispatch_dtap(struct gsm_subscriber_connection *conn,</span><br><span>                         uint8_t link_id, struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct bsc_api *api = msg->lchan->ts->trx->bts->network->bsc_api;</span><br><span>  struct gsm48_hdr *gh;</span><br><span>        uint8_t pdisc;</span><br><span>       uint8_t msg_type;</span><br><span>@@ -582,9 +524,7 @@</span><br><span>                      handle_rr_ho_fail(msg);</span><br><span>                      break;</span><br><span>               case GSM48_MT_RR_CIPH_M_COMPL:</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (api->cipher_mode_compl)</span><br><span style="color: hsl(0, 100%, 40%);">-                          api->cipher_mode_compl(conn, msg,</span><br><span style="color: hsl(0, 100%, 40%);">-                                            conn->lchan->encr.alg_id);</span><br><span style="color: hsl(120, 100%, 40%);">+                      bsc_cipher_mode_compl(conn, msg, conn->lchan->encr.alg_id);</span><br><span>                    break;</span><br><span>               case GSM48_MT_RR_ASS_COMPL:</span><br><span>                  handle_ass_compl(conn, msg);</span><br><span>@@ -595,13 +535,10 @@</span><br><span>                 case GSM48_MT_RR_CHAN_MODE_MODIF_ACK:</span><br><span>                        osmo_timer_del(&conn->T10);</span><br><span>                   rc = gsm48_rx_rr_modif_ack(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                api->assign_fail(conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE,</span><br><span style="color: hsl(0, 100%, 40%);">-                                              NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                 } else if (rc >= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                api->assign_compl(conn, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                                bsc_assign_fail(conn, GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+                       else</span><br><span style="color: hsl(120, 100%, 40%);">+                          bsc_assign_compl(conn, 0);</span><br><span>                   break;</span><br><span>               case GSM48_MT_RR_CLSM_CHG:</span><br><span>                   handle_classmark_chg(conn, msg);</span><br><span>@@ -609,8 +546,7 @@</span><br><span>               case GSM48_MT_RR_APP_INFO:</span><br><span>                   /* Passing RR APP INFO to MSC, not quite</span><br><span>                      * according to spec */</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (api->dtap)</span><br><span style="color: hsl(0, 100%, 40%);">-                               api->dtap(conn, link_id, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                     bsc_dtap(conn, link_id, msg);</span><br><span>                        break;</span><br><span>               default:</span><br><span>                     /* Drop unknown RR message */</span><br><span>@@ -621,8 +557,7 @@</span><br><span>          }</span><br><span>            break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                if (api->dtap)</span><br><span style="color: hsl(0, 100%, 40%);">-                       api->dtap(conn, link_id, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+             bsc_dtap(conn, link_id, msg);</span><br><span>                break;</span><br><span>       }</span><br><span> }</span><br><span>@@ -631,7 +566,6 @@</span><br><span> int gsm0408_rcvmsg(struct msgb *msg, uint8_t link_id)</span><br><span> {</span><br><span>   int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_api *api = msg->lchan->ts->trx->bts->network->bsc_api;</span><br><span>  struct gsm_lchan *lchan;</span><br><span> </span><br><span>         lchan = msg->lchan;</span><br><span>@@ -656,7 +590,7 @@</span><br><span>                 lchan->conn->lchan = lchan;</span><br><span> </span><br><span>                /* fwd via bsc_api to send COMPLETE L3 INFO to MSC */</span><br><span style="color: hsl(0, 100%, 40%);">-           rc = api->compl_l3(lchan->conn, msg, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = bsc_compl_l3(lchan->conn, msg, 0);</span><br><span> </span><br><span>               if (rc != BSC_API_CONN_POL_ACCEPT) {</span><br><span>                         //osmo_fsm_inst_dispatch(lchan->conn->fi, FIXME, NULL);</span><br><span>@@ -716,20 +650,6 @@</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void send_sapi_reject(struct gsm_subscriber_connection *conn, int link_id)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct bsc_api *api;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!conn)</span><br><span style="color: hsl(0, 100%, 40%);">-              return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- api = conn->network->bsc_api;</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!api || !api->sapi_n_reject)</span><br><span style="color: hsl(0, 100%, 40%);">-             return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- api->sapi_n_reject(conn, link_id);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void rll_ind_cb(struct gsm_lchan *lchan, uint8_t link_id, void *_data, enum bsc_rllr_ind rllr_ind)</span><br><span> {</span><br><span>     struct msgb *msg = _data;</span><br><span>@@ -749,7 +669,7 @@</span><br><span>      case BSC_RLLR_IND_REL_IND:</span><br><span>   case BSC_RLLR_IND_ERR_IND:</span><br><span>   case BSC_RLLR_IND_TIMEOUT:</span><br><span style="color: hsl(0, 100%, 40%);">-              send_sapi_reject(lchan->conn, OBSC_LINKID_CB(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+                bsc_sapi_n_reject(lchan->conn, OBSC_LINKID_CB(msg));</span><br><span>              msgb_free(msg);</span><br><span>              break;</span><br><span>       }</span><br><span>@@ -758,7 +678,6 @@</span><br><span> static int bsc_handle_lchan_signal(unsigned int subsys, unsigned int signal,</span><br><span>                                 void *handler_data, void *signal_data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct bsc_api *bsc;</span><br><span>         struct gsm_lchan *lchan;</span><br><span>     struct lchan_signal_data *lchan_data;</span><br><span> </span><br><span>@@ -771,40 +690,33 @@</span><br><span>            return 0;</span><br><span> </span><br><span>        lchan = lchan_data->lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-   bsc = lchan->ts->trx->bts->network->bsc_api;</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!bsc)</span><br><span style="color: hsl(0, 100%, 40%);">-               return 0;</span><br><span> </span><br><span>        switch (signal) {</span><br><span>    case S_LCHAN_UNEXPECTED_RELEASE:</span><br><span style="color: hsl(0, 100%, 40%);">-                handle_release(lchan->conn, bsc, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+           handle_release(lchan->conn, lchan);</span><br><span>               break;</span><br><span>       case S_LCHAN_ACTIVATE_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-              handle_chan_ack(lchan->conn, bsc, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+          handle_chan_ack(lchan->conn, lchan);</span><br><span>              break;</span><br><span>       case S_LCHAN_ACTIVATE_NACK:</span><br><span style="color: hsl(0, 100%, 40%);">-             handle_chan_nack(lchan->conn, bsc, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+         handle_chan_nack(lchan->conn, lchan);</span><br><span>             break;</span><br><span>       }</span><br><span> </span><br><span>        return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void handle_release(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                       struct bsc_api *bsc, struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+static void handle_release(struct gsm_subscriber_connection *conn, struct gsm_lchan *lchan)</span><br><span> {</span><br><span>   if (conn->secondary_lchan == lchan) {</span><br><span>             osmo_timer_del(&conn->T10);</span><br><span>           conn->secondary_lchan = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            bsc->assign_fail(conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                GSM0808_CAUSE_RADIO_INTERFACE_FAILURE,</span><br><span style="color: hsl(0, 100%, 40%);">-                          NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+               bsc_assign_fail(conn, GSM0808_CAUSE_RADIO_INTERFACE_FAILURE, NULL);</span><br><span>  }</span><br><span> </span><br><span>        /* clear the connection now */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (bsc->clear_request)</span><br><span style="color: hsl(0, 100%, 40%);">-              bsc->clear_request(conn, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       bsc_clear_request(conn, 0);</span><br><span> </span><br><span>      /* now give up all channels */</span><br><span>       if (conn->lchan == lchan)</span><br><span>@@ -814,8 +726,7 @@</span><br><span>   lchan->conn = NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void handle_chan_ack(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                          struct bsc_api *api, struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+static void handle_chan_ack(struct gsm_subscriber_connection *conn, struct gsm_lchan *lchan)</span><br><span> {</span><br><span>         if (conn->secondary_lchan != lchan)</span><br><span>               return;</span><br><span>@@ -824,8 +735,7 @@</span><br><span>        gsm48_send_rr_ass_cmd(conn->lchan, lchan, lchan->ms_power);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void handle_chan_nack(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                       struct bsc_api *api, struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+static void handle_chan_nack(struct gsm_subscriber_connection *conn, struct gsm_lchan *lchan)</span><br><span> {</span><br><span>       if (conn->secondary_lchan != lchan)</span><br><span>               return;</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_api.c b/src/osmo-bsc/osmo_bsc_api.c</span><br><span>index 8081ea4..51fbdd3 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_api.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_api.c</span><br><span>@@ -51,7 +51,6 @@</span><br><span>         return true;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause);</span><br><span> static int complete_layer3(struct gsm_subscriber_connection *conn,</span><br><span>                        struct msgb *msg, struct bsc_msc_data *msc);</span><br><span> </span><br><span>@@ -135,12 +134,13 @@</span><br><span>  return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void bsc_sapi_n_reject(struct gsm_subscriber_connection *conn, int dlci)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! BTS->MSC: tell MSC a SAPI was not established. */</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_sapi_n_reject(struct gsm_subscriber_connection *conn, int dlci)</span><br><span> {</span><br><span>  int rc;</span><br><span>      struct msgb *resp;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (!msc_connected(conn))</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!conn || !msc_connected(conn))</span><br><span>           return;</span><br><span> </span><br><span>  LOGP(DMSC, LOGL_NOTICE, "Tx MSC SAPI N REJECT DLCI=0x%02x\n", dlci);</span><br><span>@@ -150,8 +150,8 @@</span><br><span>                 msgb_free(resp);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void bsc_cipher_mode_compl(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                struct msgb *msg, uint8_t chosen_encr)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! MS->MSC: Tell MSC that ciphering has been enabled. */</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_cipher_mode_compl(struct gsm_subscriber_connection *conn, struct msgb *msg, uint8_t chosen_encr)</span><br><span> {</span><br><span>       int rc;</span><br><span>      struct msgb *resp;</span><br><span>@@ -210,12 +210,8 @@</span><br><span>    bsc_send_ussd_release_complete(conn);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">- * Instruct to reserve data for a new connectiom, create the complete</span><br><span style="color: hsl(0, 100%, 40%);">- * layer three message, send it to open the connection.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static int bsc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg,</span><br><span style="color: hsl(0, 100%, 40%);">-                        uint16_t chosen_channel)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! MS->MSC: New MM context with L3 payload. */</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg, uint16_t chosen_channel)</span><br><span> {</span><br><span>       struct bsc_msc_data *msc;</span><br><span> </span><br><span>@@ -367,7 +363,8 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void bsc_dtap(struct gsm_subscriber_connection *conn, uint8_t link_id, struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! MS->BSC/MSC: Um L3 message. */</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_dtap(struct gsm_subscriber_connection *conn, uint8_t link_id, struct msgb *msg)</span><br><span> {</span><br><span>        int lu_cause;</span><br><span> </span><br><span>@@ -399,7 +396,8 @@</span><br><span>      osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_MO_DTAP, msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void bsc_assign_compl(struct gsm_subscriber_connection *conn, uint8_t rr_cause)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! BSC->MSC: Assignment of lchan successful. */</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_assign_compl(struct gsm_subscriber_connection *conn, uint8_t rr_cause)</span><br><span> {</span><br><span>        if (!msc_connected(conn))</span><br><span>            return;</span><br><span>@@ -424,14 +422,15 @@</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void bsc_assign_fail(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                       uint8_t cause, uint8_t *rr_cause)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! BSC->MSC: Assignment of lchan failed. */</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_assign_fail(struct gsm_subscriber_connection *conn, uint8_t cause, uint8_t *rr_cause)</span><br><span> {</span><br><span>  LOGP(DMSC, LOGL_INFO, "Tx MSC ASSIGN FAIL\n");</span><br><span>     osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_RR_ASS_FAIL, NULL);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! BSC->MSC: RR conn has been cleared. */</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause)</span><br><span> {</span><br><span>     int rc;</span><br><span>      struct msgb *resp;</span><br><span>@@ -454,9 +453,10 @@</span><br><span>    return 1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void bsc_cm_update(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                       const uint8_t *cm2, uint8_t cm2_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                    const uint8_t *cm3, uint8_t cm3_len)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! BSC->MSC: Classmark Update. */</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_cm_update(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(120, 100%, 40%);">+                const uint8_t *cm2, uint8_t cm2_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                  const uint8_t *cm3, uint8_t cm3_len)</span><br><span> {</span><br><span>         int rc;</span><br><span>      struct msgb *resp;</span><br><span>@@ -470,8 +470,8 @@</span><br><span>             msgb_free(resp);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void bsc_mr_config(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                              struct gsm_lchan *lchan, int full_rate)</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Configure the multirate setting on this channel. */</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_mr_config(struct gsm_subscriber_connection *conn, struct gsm_lchan *lchan, int full_rate)</span><br><span> {</span><br><span>    struct bsc_msc_data *msc;</span><br><span>    struct gsm48_multi_rate_conf *ms_conf, *bts_conf;</span><br><span>@@ -511,20 +511,3 @@</span><br><span>     /* now copy this into the bts structure */</span><br><span>   memcpy(lchan->mr_bts_lv, lchan->mr_ms_lv, sizeof(lchan->mr_ms_lv));</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct bsc_api bsc_handler = {</span><br><span style="color: hsl(0, 100%, 40%);">-  .sapi_n_reject = bsc_sapi_n_reject,</span><br><span style="color: hsl(0, 100%, 40%);">-     .cipher_mode_compl = bsc_cipher_mode_compl,</span><br><span style="color: hsl(0, 100%, 40%);">-     .compl_l3 = bsc_compl_l3,</span><br><span style="color: hsl(0, 100%, 40%);">-       .dtap = bsc_dtap,</span><br><span style="color: hsl(0, 100%, 40%);">-       .assign_compl = bsc_assign_compl,</span><br><span style="color: hsl(0, 100%, 40%);">-       .assign_fail = bsc_assign_fail,</span><br><span style="color: hsl(0, 100%, 40%);">- .clear_request = bsc_clear_request,</span><br><span style="color: hsl(0, 100%, 40%);">-     .classmark_chg = bsc_cm_update,</span><br><span style="color: hsl(0, 100%, 40%);">- .mr_config = bsc_mr_config,</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 bsc_api *osmo_bsc_api()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    return &bsc_handler;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>index 5c6a872..494f280 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_main.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>@@ -827,7 +827,6 @@</span><br><span>                 fprintf(stderr, "Bootstrapping the network failed. exiting.\n");</span><br><span>           exit(1);</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       bsc_api_init(bsc_gsmnet, osmo_bsc_api());</span><br><span> </span><br><span>        /* start control interface after reading config for</span><br><span>   * ctrl_vty_get_bind_addr() */</span><br><span>diff --git a/tests/bsc/bsc_test.c b/tests/bsc/bsc_test.c</span><br><span>index 183fddf..652c8c6 100644</span><br><span>--- a/tests/bsc/bsc_test.c</span><br><span>+++ b/tests/bsc/bsc_test.c</span><br><span>@@ -242,3 +242,17 @@</span><br><span> struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *net) {</span><br><span>   OSMO_ASSERT(0);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_sapi_n_reject(struct gsm_subscriber_connection *conn, int dlci) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_cipher_mode_compl(struct gsm_subscriber_connection *conn, struct msgb *msg, uint8_t chosen_encr) {}</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg, uint16_t chosen_channel)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_dtap(struct gsm_subscriber_connection *conn, uint8_t link_id, struct msgb *msg) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_assign_compl(struct gsm_subscriber_connection *conn, uint8_t rr_cause) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_assign_fail(struct gsm_subscriber_connection *conn, uint8_t cause, uint8_t *rr_cause) {}</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_cm_update(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(120, 100%, 40%);">+              const uint8_t *cm2, uint8_t cm2_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                  const uint8_t *cm3, uint8_t cm3_len) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_mr_config(struct gsm_subscriber_connection *conn, struct gsm_lchan *lchan, int full_rate) {}</span><br><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index 26074a2..87e64ec 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -1346,7 +1346,6 @@</span><br><span>       struct gsm_lchan *lchan[256];</span><br><span>        int lchan_num = 0;</span><br><span>   int i;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct bsc_api bsc_api = {};</span><br><span>         int algorithm;</span><br><span>       int test_case_i;</span><br><span>     int last_test_i;</span><br><span>@@ -1376,8 +1375,6 @@</span><br><span>     if (!bsc_gsmnet)</span><br><span>             exit(1);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    bsc_api_init(bsc_gsmnet, &bsc_api);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>      ho_set_algorithm(bsc_gsmnet->ho, 2);</span><br><span>      ho_set_ho_active(bsc_gsmnet->ho, true);</span><br><span>   ho_set_hodec2_as_active(bsc_gsmnet->ho, true);</span><br><span>@@ -1695,3 +1692,16 @@</span><br><span> void trau_send_frame() {}</span><br><span> int osmo_bsc_sigtran_send(struct gsm_subscriber_connection *conn, struct msgb *msg) { return 0; }</span><br><span> int osmo_bsc_sigtran_open_conn(struct gsm_subscriber_connection *conn, struct msgb *msg) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_sapi_n_reject(struct gsm_subscriber_connection *conn, int dlci) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_cipher_mode_compl(struct gsm_subscriber_connection *conn, struct msgb *msg, uint8_t chosen_encr) {}</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg, uint16_t chosen_channel)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_dtap(struct gsm_subscriber_connection *conn, uint8_t link_id, struct msgb *msg) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_assign_compl(struct gsm_subscriber_connection *conn, uint8_t rr_cause) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_assign_fail(struct gsm_subscriber_connection *conn, uint8_t cause, uint8_t *rr_cause) {}</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_cm_update(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(120, 100%, 40%);">+              const uint8_t *cm2, uint8_t cm2_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                  const uint8_t *cm3, uint8_t cm3_len) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_mr_config(struct gsm_subscriber_connection *conn, struct gsm_lchan *lchan, int full_rate) {}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9482">change 9482</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/9482"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I3fd5888c63a0b4f95520a498320aa105a6d60579 </div>
<div style="display:none"> Gerrit-Change-Number: 9482 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>