aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2016-01-25 15:43:03 +0100
committerHarald Welte <laforge@gnumonks.org>2016-01-25 15:59:20 +0100
commitf11087a9bc483424a5853b40b5932a2cbd5aa5c9 (patch)
treee654ce2923ebfbb31e934fd066a060ce11b40ea4
parent728448a7f18d8b771c56f16777110c83d4f00a2b (diff)
fix migration of check_for_ciph_cmd() from sysmobts to l1saplaforge/ciph-fix
During the L1SAP related changes, somehow an old version of check_for_ciph_cmd() was re-introduced, which didn't store the N(s) as part of the lchan. To make things worse, the old code was still present in the sysmobts specific part, but never executed.
-rw-r--r--src/common/l1sap.c12
-rw-r--r--src/osmo-bts-sysmo/l1_if.c45
2 files changed, 12 insertions, 45 deletions
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index 9d048e0..3f77f05 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -113,6 +113,7 @@ static int l1sap_tx_ciph_req(struct gsm_bts_trx *trx, uint8_t chan_nr,
static int check_for_ciph_cmd(struct msgb *msg, struct gsm_lchan *lchan,
uint8_t chan_nr)
{
+ uint8_t n_s;
/* only do this if we are in the right state */
switch (lchan->ciph_state) {
@@ -133,11 +134,22 @@ static int check_for_ciph_cmd(struct msgb *msg, struct gsm_lchan *lchan,
if ((msg->data[4] & 0x3F) != GSM48_MT_RR_CIPH_M_CMD)
return 0;
+ /* Remember N(S) + 1 to find the first ciphered frame */
+ n_s = (msg->data[1] >> 1) & 0x7;
+ lchan->ciph_ns = (n_s + 1) % 8;
+
l1sap_tx_ciph_req(lchan->ts->trx, chan_nr, 0, 1);
return 1;
}
+/* public helpers for the test */
+int bts_check_for_ciph_cmd(struct msgb *msg, struct gsm_lchan *lchan,
+ uint8_t chan_nr)
+{
+ return check_for_ciph_cmd(msg, lchan, chan_nr);
+}
+
struct gsmtap_inst *gsmtap = NULL;
uint32_t gsmtap_sapi_mask = 0;
uint8_t gsmtap_sapi_acch = 0;
diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c
index 8457a74..ce393a4 100644
--- a/src/osmo-bts-sysmo/l1_if.c
+++ b/src/osmo-bts-sysmo/l1_if.c
@@ -232,51 +232,6 @@ empty_req_from_rts_ind(GsmL1_Prim_t *l1p,
return empty_req;
}
-/* check if the message is a GSM48_MT_RR_CIPH_M_CMD, and if yes, enable
- * uni-directional de-cryption on the uplink. We need this ugly layering
- * violation as we have no way of passing down L3 metadata (RSL CIPHERING CMD)
- * to this point in L1 */
-static int check_for_ciph_cmd(struct femtol1_hdl *fl1h,
- struct msgb *msg, struct gsm_lchan *lchan)
-{
- uint8_t n_s;
-
- /* only do this if we are in the right state */
- switch (lchan->ciph_state) {
- case LCHAN_CIPH_NONE:
- case LCHAN_CIPH_RX_REQ:
- break;
- default:
- return 0;
- }
-
- /* First byte (Address Field) of LAPDm header) */
- if (msg->data[0] != 0x03)
- return 0;
- /* First byte (protocol discriminator) of RR */
- if ((msg->data[3] & 0xF) != GSM48_PDISC_RR)
- return 0;
- /* 2nd byte (msg type) of RR */
- if ((msg->data[4] & 0x3F) != GSM48_MT_RR_CIPH_M_CMD)
- return 0;
-
- /* Remember N(S) + 1 to find the first ciphered frame */
- n_s = (msg->data[1] >> 1) & 0x7;
- lchan->ciph_ns = (n_s + 1) % 8;
-
- lchan->ciph_state = LCHAN_CIPH_RX_REQ;
- l1if_set_ciphering(fl1h, lchan, 0);
-
- return 1;
-}
-
-/* public helpers for the test */
-int bts_check_for_ciph_cmd(struct femtol1_hdl *fl1h,
- struct msgb *msg, struct gsm_lchan *lchan)
-{
- return check_for_ciph_cmd(fl1h, msg, 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,