summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/l1ctl_proto.h1
-rw-r--r--src/host/layer23/include/osmocom/bb/common/l1ctl.h4
-rw-r--r--src/host/layer23/src/common/l1ctl.c8
-rw-r--r--src/host/layer23/src/mobile/gsm48_rr.c12
-rw-r--r--src/target/firmware/layer1/l23_api.c5
5 files changed, 19 insertions, 11 deletions
diff --git a/include/l1ctl_proto.h b/include/l1ctl_proto.h
index 17065349..9d548bc4 100644
--- a/include/l1ctl_proto.h
+++ b/include/l1ctl_proto.h
@@ -281,6 +281,7 @@ struct l1ctl_dm_freq_req {
struct l1ctl_crypto_req {
uint8_t algo;
+ uint8_t key_len;
uint8_t key[0];
} __attribute__((packed));
diff --git a/src/host/layer23/include/osmocom/bb/common/l1ctl.h b/src/host/layer23/include/osmocom/bb/common/l1ctl.h
index 3534589d..824b1b03 100644
--- a/src/host/layer23/include/osmocom/bb/common/l1ctl.h
+++ b/src/host/layer23/include/osmocom/bb/common/l1ctl.h
@@ -16,8 +16,8 @@ int l1ctl_tx_data_req(struct osmocom_ms *ms, struct msgb *msg, uint8_t chan_nr,
/* Transmit L1CTL_PARAM_REQ */
int l1ctl_tx_param_req(struct osmocom_ms *ms, uint8_t ta, uint8_t tx_power);
-int l1ctl_tx_crypto_req(struct osmocom_ms *ms, uint8_t algo, uint8_t *key,
- uint8_t len);
+int l1ctl_tx_crypto_req(struct osmocom_ms *ms, uint8_t chan_nr,
+ uint8_t algo, uint8_t *key, uint8_t len);
/* Transmit L1CTL_RACH_REQ */
int l1ctl_tx_rach_req(struct osmocom_ms *ms, uint8_t ra, uint16_t offset,
diff --git a/src/host/layer23/src/common/l1ctl.c b/src/host/layer23/src/common/l1ctl.c
index c75872e4..c90588ea 100644
--- a/src/host/layer23/src/common/l1ctl.c
+++ b/src/host/layer23/src/common/l1ctl.c
@@ -427,8 +427,8 @@ int l1ctl_tx_param_req(struct osmocom_ms *ms, uint8_t ta, uint8_t tx_power)
}
/* Transmit L1CTL_CRYPTO_REQ */
-int l1ctl_tx_crypto_req(struct osmocom_ms *ms, uint8_t algo, uint8_t *key,
- uint8_t len)
+int l1ctl_tx_crypto_req(struct osmocom_ms *ms, uint8_t chan_nr,
+ uint8_t algo, uint8_t *key, uint8_t len)
{
struct msgb *msg;
struct l1ctl_info_ul *ul;
@@ -441,7 +441,11 @@ int l1ctl_tx_crypto_req(struct osmocom_ms *ms, uint8_t algo, uint8_t *key,
DEBUGP(DL1C, "CRYPTO Req. algo=%d, len=%d\n", algo, len);
ul = (struct l1ctl_info_ul *) msgb_put(msg, sizeof(*ul));
req = (struct l1ctl_crypto_req *) msgb_put(msg, sizeof(*req) + len);
+
+ ul->chan_nr = chan_nr;
+ req->key_len = len;
req->algo = algo;
+
if (len)
memcpy(req->key, key, len);
diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c
index f4b95002..dd3fe933 100644
--- a/src/host/layer23/src/mobile/gsm48_rr.c
+++ b/src/host/layer23/src/mobile/gsm48_rr.c
@@ -1005,9 +1005,11 @@ static int gsm48_rr_rx_cip_mode_cmd(struct osmocom_ms *ms, struct msgb *msg)
rr->cipher_on = sc;
rr->cipher_type = alg_id;
if (rr->cipher_on)
- l1ctl_tx_crypto_req(ms, rr->cipher_type + 1, subscr->key, 8);
+ l1ctl_tx_crypto_req(ms, rr->cd_now.chan_nr,
+ rr->cipher_type + 1, subscr->key, 8);
else
- l1ctl_tx_crypto_req(ms, 0, NULL, 0);
+ l1ctl_tx_crypto_req(ms, rr->cd_now.chan_nr,
+ 0, NULL, 0);
/* response (using the new mode) */
return gsm48_rr_tx_cip_mode_cpl(ms, cr);
@@ -2996,7 +2998,8 @@ static int gsm48_rr_activate_channel(struct osmocom_ms *ms,
s->si5 = s->si5bis = s->si5ter = s->si6 = 0;
if (rr->cipher_on)
- l1ctl_tx_crypto_req(ms, rr->cipher_type + 1, subscr->key, 8);
+ l1ctl_tx_crypto_req(ms, rr->cd_now.chan_nr,
+ rr->cipher_type + 1, subscr->key, 8);
return 0;
}
@@ -3015,7 +3018,8 @@ static int gsm48_rr_channel_after_time(struct osmocom_ms *ms,
l1ctl_tx_dm_freq_req_h0(ms, cd->arfcn, cd->tsc, fn);
if (rr->cipher_on)
- l1ctl_tx_crypto_req(ms, rr->cipher_type + 1, subscr->key, 8);
+ l1ctl_tx_crypto_req(ms, rr->cd_now.chan_nr,
+ rr->cipher_type + 1, subscr->key, 8);
gsm48_rr_set_mode(ms, cd->chan_nr, cd->mode);
diff --git a/src/target/firmware/layer1/l23_api.c b/src/target/firmware/layer1/l23_api.c
index 311ca6a2..e53b0c8f 100644
--- a/src/target/firmware/layer1/l23_api.c
+++ b/src/target/firmware/layer1/l23_api.c
@@ -301,11 +301,10 @@ static void l1ctl_rx_crypto_req(struct msgb *msg)
struct l1ctl_hdr *l1h = (struct l1ctl_hdr *) msg->data;
struct l1ctl_info_ul *ul = (struct l1ctl_info_ul *) l1h->data;
struct l1ctl_crypto_req *cr = (struct l1ctl_crypto_req *) ul->payload;
- uint8_t key_len = msg->len - sizeof(*l1h) - sizeof(*ul) - sizeof(*cr);
- printd("L1CTL_CRYPTO_REQ (algo=A5/%u, len=%u)\n", cr->algo, key_len);
+ printd("L1CTL_CRYPTO_REQ (algo=A5/%u, len=%u)\n", cr->algo, cr->key_len);
- if (cr->algo && key_len != 8) {
+ if (cr->algo && cr->key_len != 8) {
printd("L1CTL_CRYPTO_REQ -> Invalid key\n");
return;
}