From: Andreas Eversberg <[email protected]>

This part moves processing of measurement infos from osmo-bts-sysmo to
common part.
---
 include/osmo-bts/l1sap.h       |  4 +--
 src/common/l1sap.c             | 64 +++++++++++++++++++++++++++++-------------
 src/osmo-bts-sysmo/l1_if.c     | 26 ++++++++---------
 tests/sysmobts/sysmobts_test.c |  9 ++++--
 4 files changed, 66 insertions(+), 37 deletions(-)

diff --git a/include/osmo-bts/l1sap.h b/include/osmo-bts/l1sap.h
index 8165c81..e76aca6 100644
--- a/include/osmo-bts/l1sap.h
+++ b/include/osmo-bts/l1sap.h
@@ -68,6 +68,6 @@ extern uint8_t gsmtap_sapi_acch;
 
 #define msgb_l1sap_prim(msg) ((struct osmo_phsap_prim *)(msg)->l1h)
 
-void bts_check_for_first_ciphrd(struct gsm_lchan *lchan,
-                               uint8_t *data, int len, uint8_t chan_nr);
+int bts_check_for_first_ciphrd(struct gsm_lchan *lchan,
+                               uint8_t *data, int len);
 #endif /* L1SAP_H */
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index 3f942e6..f00c5d2 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -155,6 +155,35 @@ static int l1sap_info_time_ind(struct gsm_bts_trx *trx,
        return 0;
 }
 
+/* measurement information received from bts model */
+static int l1sap_info_meas_ind(struct gsm_bts_trx *trx,
+       struct osmo_phsap_prim *l1sap,
+       struct info_meas_ind_param *info_meas_ind)
+{
+       struct bts_ul_meas ulm;
+       struct gsm_lchan *lchan;
+
+       DEBUGP(DL1P, "MPH_INFO meas ind chan_nr=%02x\n",
+               info_meas_ind->chan_nr);
+
+       lchan = &trx->ts[L1SAP_CHAN2TS(info_meas_ind->chan_nr)]
+                               .lchan[l1sap_chan2ss(info_meas_ind->chan_nr)];
+
+       /* in the GPRS case we are not interested in measurement
+        * processing.  The PCU will take care of it */
+       if (lchan->type == GSM_LCHAN_PDTCH)
+               return 0;
+
+       memset(&ulm, 0, sizeof(ulm));
+       ulm.ta_offs_qbits = info_meas_ind->ta_offs_qbits;
+       ulm.ber10k = info_meas_ind->ber10k;
+       ulm.inv_rssi = info_meas_ind->inv_rssi;
+
+       lchan_new_ul_meas(lchan, &ulm);
+
+       return 0;
+}
+
 /* any L1 MPH_INFO indication prim recevied from bts model */
 static int l1sap_mph_info_ind(struct gsm_bts_trx *trx,
         struct osmo_phsap_prim *l1sap, struct mph_info_param *info)
@@ -165,6 +194,9 @@ static int l1sap_mph_info_ind(struct gsm_bts_trx *trx,
        case PRIM_INFO_TIME:
                rc = l1sap_info_time_ind(trx, l1sap, &info->u.time_ind);
                break;
+       case PRIM_INFO_MEAS:
+               rc = l1sap_info_meas_ind(trx, l1sap, &info->u.meas_ind);
+               break;
        default:
                LOGP(DL1P, LOGL_NOTICE, "unknown MPH_INFO ind type %d\n",
                        info->type);
@@ -481,44 +513,37 @@ static void radio_link_timeout(struct gsm_lchan *lchan, 
int bad_frame)
        }
 }
 
-static inline void check_for_first_ciphrd(struct gsm_lchan *lchan,
-                                         uint8_t *data, int len,
-                                         uint8_t chan_nr)
+static inline int check_for_first_ciphrd(struct gsm_lchan *lchan,
+                                         uint8_t *data, int len)
 {
        uint8_t n_s;
 
        /* if this is the first valid message after enabling Rx
         * decryption, we have to enable Tx encryption */
-       if (lchan->ciph_state != LCHAN_CIPH_RX_CONF) {
-               printf("ciph_State\n");
-               return;
-       }
+       if (lchan->ciph_state != LCHAN_CIPH_RX_CONF)
+               return 0;
 
        /* HACK: check if it's an I frame, in order to
         * ignore some still buffered/queued UI frames received
         * before decryption was enabled */
        if (data[0] != 0x01)
-               return;
+               return 0;
 
        if ((data[1] & 0x01) != 0)
-               return;
+               return 0;
 
        n_s = data[1] >> 5;
        if (lchan->ciph_ns != n_s)
-               return;
-
-       lchan->ciph_state = LCHAN_CIPH_TXRX_REQ;
+               return 0;
 
-       /* this check is only introduced to make the test work :/ */
-       if (lchan->ts && lchan->ts->trx)
-               l1sap_tx_ciph_req(lchan->ts->trx, chan_nr, 1, 0);
+       return 1;
 }
 
 /* public helper for the test */
-void bts_check_for_first_ciphrd(struct gsm_lchan *lchan,
-                               uint8_t *data, int len, uint8_t chan_nr)
+int bts_check_for_first_ciphrd(struct gsm_lchan *lchan,
+                               uint8_t *data, int len)
 {
-       return check_for_first_ciphrd(lchan, data, len, chan_nr);
+       return check_for_first_ciphrd(lchan, data, len);
 }
 
 /* DATA received from bts model */
@@ -597,7 +622,8 @@ static int l1sap_ph_data_ind(struct gsm_bts_trx *trx,
        } else
                le = &lchan->lapdm_ch.lapdm_dcch;
 
-       check_for_first_ciphrd(lchan, data, len, chan_nr);
+       if (check_for_first_ciphrd(lchan, data, len))
+               l1sap_tx_ciph_req(lchan->ts->trx, chan_nr, 0, 1);
 
        /* SDCCH, SACCH and FACCH all go to LAPDm */
        msgb_pull(msg, (msg->l2h - msg->data));
diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c
index 14efc2c..38daa97 100644
--- a/src/osmo-bts-sysmo/l1_if.c
+++ b/src/osmo-bts-sysmo/l1_if.c
@@ -891,20 +891,20 @@ static void dump_meas_res(int ll, GsmL1_MeasParam_t *m)
                m->fBer, m->i16BurstTiming);
 }
 
-static int process_meas_res(struct gsm_lchan *lchan, GsmL1_MeasParam_t *m)
+static int process_meas_res(struct gsm_bts_trx *trx, uint8_t chan_nr,
+                               GsmL1_MeasParam_t *m)
 {
-       struct bts_ul_meas ulm;
-
-       /* in the GPRS case we are not interested in measurement
-        * processing.  The PCU will take care of it */
-       if (lchan->type == GSM_LCHAN_PDTCH)
-               return 0;
-
-       ulm.ta_offs_qbits = m->i16BurstTiming;
-       ulm.ber10k = (unsigned int) (m->fBer * 100);
-       ulm.inv_rssi = (uint8_t) (m->fRssi * -1);
+       struct osmo_phsap_prim l1sap;
+       memset(&l1sap, 0, sizeof(l1sap));
+       osmo_prim_init(&l1sap.oph, SAP_GSM_PH, PRIM_MPH_INFO,
+               PRIM_OP_INDICATION, NULL);
+       l1sap.u.info.type = PRIM_INFO_MEAS;
+       l1sap.u.info.u.meas_ind.chan_nr = chan_nr;
+       l1sap.u.info.u.meas_ind.ta_offs_qbits = m->i16BurstTiming;
+       l1sap.u.info.u.meas_ind.ber10k = (unsigned int) (m->fBer * 100);
+       l1sap.u.info.u.meas_ind.inv_rssi = (uint8_t) (m->fRssi * -1);
 
-       return lchan_new_ul_meas(lchan, &ulm);
+       return l1sap_up(trx, &l1sap);
 }
 
 static int handle_ph_data_ind(struct femtol1_hdl *fl1, GsmL1_PhDataInd_t 
*data_ind,
@@ -940,7 +940,7 @@ static int handle_ph_data_ind(struct femtol1_hdl *fl1, 
GsmL1_PhDataInd_t *data_i
        fn = data_ind->u32Fn;
        link_id =  (data_ind->sapi == GsmL1_Sapi_Sacch) ? 0x40 : 0x00;
 
-       process_meas_res(lchan, &data_ind->measParam);
+       process_meas_res(trx, chan_nr, &data_ind->measParam);
 
        if (data_ind->measParam.fLinkQuality < fl1->min_qual_norm
         && data_ind->msgUnitParam.u8Size != 0) {
diff --git a/tests/sysmobts/sysmobts_test.c b/tests/sysmobts/sysmobts_test.c
index d5035bd..93fa0e9 100644
--- a/tests/sysmobts/sysmobts_test.c
+++ b/tests/sysmobts/sysmobts_test.c
@@ -170,14 +170,17 @@ static void test_sysmobts_cipher(void)
        /* Handle message sent before ciphering was received */
        memcpy(&unit.u8Buffer[0], too_early_classmark, 
ARRAY_SIZE(too_early_classmark));
        unit.u8Size = ARRAY_SIZE(too_early_classmark);
-       bts_check_for_first_ciphrd(&lchan, unit.u8Buffer, unit.u8Size, 0);
+       rc = bts_check_for_first_ciphrd(&lchan, unit.u8Buffer, unit.u8Size);
+       OSMO_ASSERT(rc == 0);
        OSMO_ASSERT(lchan.ciph_state == LCHAN_CIPH_RX_CONF);
 
        /* Now send the first ciphered message */
        memcpy(&unit.u8Buffer[0], first_ciphered_cipher_cmpl, 
ARRAY_SIZE(first_ciphered_cipher_cmpl));
        unit.u8Size = ARRAY_SIZE(first_ciphered_cipher_cmpl);
-       bts_check_for_first_ciphrd(&lchan, unit.u8Buffer, unit.u8Size, 0);
-       OSMO_ASSERT(lchan.ciph_state == LCHAN_CIPH_TXRX_REQ);
+       rc = bts_check_for_first_ciphrd(&lchan, unit.u8Buffer, unit.u8Size);
+       OSMO_ASSERT(rc == 1);
+       /* we cannot test for lchan.ciph_state == LCHAN_CIPH_RX_CONF_TX_REQ, as
+        * this happens asynchronously on the other side of the l1sap queue */
 }
 
 int main(int argc, char **argv)
-- 
2.1.0


Reply via email to