@@ -68,4 +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);
#endif /* L1SAP_H */
@@ -481,6 +481,46 @@ 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)
+{
+ 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;
+ }
+
+ /* 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;
+
+ if ((data[1] & 0x01) != 0)
+ return;
+
+ n_s = data[1] >> 5;
+ if (lchan->ciph_ns != n_s)
+ return;
+
+ lchan->ciph_state = LCHAN_CIPH_TXRX_REQ;
+
+ /* 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);
+}
+
+/* public helper for the test */
+void bts_check_for_first_ciphrd(struct gsm_lchan *lchan,
+ uint8_t *data, int len, uint8_t chan_nr)
+{
+ return check_for_first_ciphrd(lchan, data, len, chan_nr);
+}
+
/* DATA received from bts model */
static int l1sap_ph_data_ind(struct gsm_bts_trx *trx,
struct osmo_phsap_prim *l1sap, struct ph_data_param *data_ind)
@@ -557,16 +597,7 @@ static int l1sap_ph_data_ind(struct gsm_bts_trx *trx,
} else
le = &lchan->lapdm_ch.lapdm_dcch;
- /* 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) {
- /* 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 && (data[1] & 0x01) == 0) {
- l1sap_tx_ciph_req(trx, chan_nr, 1, 0);
- }
- }
+ check_for_first_ciphrd(lchan, data, len, chan_nr);
/* SDCCH, SACCH and FACCH all go to LAPDm */
msgb_pull(msg, (msg->l2h - msg->data));
@@ -356,31 +356,6 @@ static int check_for_ciph_cmd(struct femtol1_hdl *fl1h,
return 1;
}
-static inline void check_for_first_ciphrd(struct femtol1_hdl *fl1h,
- GsmL1_MsgUnitParam_t *msgUnitParam,
- struct gsm_lchan *lchan)
-{
- 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)
- return;
-
- /* HACK: check if it's an I frame, in order to
- * ignore some still buffered/queued UI frames received
- * before decryption was enabled */
- if (msgUnitParam->u8Buffer[0] != 0x01)
- return;
- if ((msgUnitParam->u8Buffer[1] & 0x01) != 0)
- return;
- n_s = msgUnitParam->u8Buffer[1] >> 5;
- if (lchan->ciph_ns != n_s)
- return;
- lchan->ciph_state = LCHAN_CIPH_TXRX_REQ;
- l1if_set_ciphering(fl1h, lchan, 1);
-}
-
/* public helpers for the test */
int bts_check_for_ciph_cmd(struct femtol1_hdl *fl1h,
struct msgb *msg, struct gsm_lchan *lchan)
@@ -388,13 +363,6 @@ int bts_check_for_ciph_cmd(struct femtol1_hdl *fl1h,
return check_for_ciph_cmd(fl1h, msg, lchan);
}
-void bts_check_for_first_ciphrd(struct femtol1_hdl *fl1h,
- GsmL1_MsgUnitParam_t *msgUnitParam,
- struct gsm_lchan *lchan)
-{
- return check_for_first_ciphrd(fl1h, msgUnitParam, lchan);
-}
-
static const uint8_t fill_frame[GSM_MACBLOCK_LEN] = {
0x03, 0x03, 0x01, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B,
0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B,
@@ -138,7 +138,4 @@ int l1if_rf_clock_info_correct(struct femtol1_hdl *fl1h);
/* public helpers for test */
int bts_check_for_ciph_cmd(struct femtol1_hdl *fl1h,
struct msgb *msg, struct gsm_lchan *lchan);
-void bts_check_for_first_ciphrd(struct femtol1_hdl *fl1h,
- GsmL1_MsgUnitParam_t *msgUnitParam,
- struct gsm_lchan *lchan);
#endif /* _FEMTO_L1_H */
@@ -18,6 +18,7 @@
*/
#include <osmo-bts/bts.h>
+#include <osmo-bts/l1sap.h>
#include "femtobts.h"
#include "l1_if.h"
@@ -169,13 +170,13 @@ 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(&fl1h, &unit, &lchan);
+ bts_check_for_first_ciphrd(&lchan, unit.u8Buffer, unit.u8Size, 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(&fl1h, &unit, &lchan);
+ bts_check_for_first_ciphrd(&lchan, unit.u8Buffer, unit.u8Size, 0);
OSMO_ASSERT(lchan.ciph_state == LCHAN_CIPH_TXRX_REQ);
}