pespin has submitted this change. (
https://gerrit.osmocom.org/c/osmocom-bb/+/32551 )
Change subject: layer23: modem: Resolve auth requests coming from GMM layer
......................................................................
layer23: modem: Resolve auth requests coming from GMM layer
Change-Id: I75dc3fe3e4d9e23443fb778e36ca024f1bc46641
---
M src/host/layer23/include/osmocom/bb/common/ms.h
M src/host/layer23/include/osmocom/bb/modem/gmm.h
M src/host/layer23/src/modem/app_modem.c
M src/host/layer23/src/modem/gmm.c
4 files changed, 57 insertions(+), 1 deletion(-)
Approvals:
laforge: Looks good to me, but someone else must approve
Jenkins Builder: Verified
osmith: Looks good to me, but someone else must approve
pespin: Looks good to me, approved
diff --git a/src/host/layer23/include/osmocom/bb/common/ms.h
b/src/host/layer23/include/osmocom/bb/common/ms.h
index e4888a7..d9c6255 100644
--- a/src/host/layer23/include/osmocom/bb/common/ms.h
+++ b/src/host/layer23/include/osmocom/bb/common/ms.h
@@ -20,6 +20,11 @@
#include <osmocom/bb/common/sim.h>
#include <osmocom/bb/common/l1ctl.h>
+struct osmobb_ms_gmm_layer {
+ uint8_t ac_ref_nr;
+ uint8_t key_seq;
+ uint8_t rand[16];
+};
struct osmosap_entity {
struct osmo_fsm_inst *fi;
@@ -93,6 +98,7 @@
/* GPRS */
struct gprs_settings gprs;
+ struct osmobb_ms_gmm_layer gmmlayer;
/* Audio I/O */
struct gapk_io_state *gapk_io;
diff --git a/src/host/layer23/include/osmocom/bb/modem/gmm.h
b/src/host/layer23/include/osmocom/bb/modem/gmm.h
index 6269c82..41e1e7e 100644
--- a/src/host/layer23/include/osmocom/bb/modem/gmm.h
+++ b/src/host/layer23/include/osmocom/bb/modem/gmm.h
@@ -1,6 +1,7 @@
#pragma once
#include <stdbool.h>
+#include <stdint.h>
struct osmocom_ms;
@@ -8,3 +9,5 @@
int modem_gmm_gmmreg_attach_req(const struct osmocom_ms *ms);
int modem_gmm_gmmreg_detach_req(const struct osmocom_ms *ms);
+int modem_gmm_gmmreg_sim_auth_rsp(const struct osmocom_ms *ms,
+ uint8_t *sres, uint8_t *kc, uint8_t kc_len);
diff --git a/src/host/layer23/src/modem/app_modem.c
b/src/host/layer23/src/modem/app_modem.c
index d80fe91..07211d0 100644
--- a/src/host/layer23/src/modem/app_modem.c
+++ b/src/host/layer23/src/modem/app_modem.c
@@ -135,7 +135,9 @@
case S_L23_SUBSCR_SIM_AUTH_RESP:
sim_auth_resp = signal_data;
ms = sim_auth_resp->ms;
- /* TODO: pass sim_auth_resp->sres to GMM layer */
+ modem_gmm_gmmreg_sim_auth_rsp(ms, sim_auth_resp->sres,
+ ms->subscr.key,
+ sizeof(ms->subscr.key));
break;
default:
OSMO_ASSERT(0);
diff --git a/src/host/layer23/src/modem/gmm.c b/src/host/layer23/src/modem/gmm.c
index 0ad3035..129c4ba 100644
--- a/src/host/layer23/src/modem/gmm.c
+++ b/src/host/layer23/src/modem/gmm.c
@@ -65,6 +65,22 @@
__func__, pdu_name, cause, get_value_string(gsm48_gmm_cause_names, cause));
}
break;
+ case OSMO_PRIM(OSMO_GPRS_GMM_GMMREG_SIM_AUTH, PRIM_OP_INDICATION):
+ LOGP(DGMM, LOGL_NOTICE, "%s(): Rx %s ac_ref_nr=%u key_seq=%u rand=%s\n",
+ __func__, pdu_name,
+ gmm_prim->gmmreg.sim_auth_ind.ac_ref_nr,
+ gmm_prim->gmmreg.sim_auth_ind.key_seq,
+ osmo_hexdump(gmm_prim->gmmreg.sim_auth_ind.rand,
+ sizeof(gmm_prim->gmmreg.sim_auth_ind.rand)));
+ /* Cache request information, it'll be needed during response time: */
+ ms->gmmlayer.ac_ref_nr = gmm_prim->gmmreg.sim_auth_ind.ac_ref_nr;
+ ms->gmmlayer.key_seq = gmm_prim->gmmreg.sim_auth_ind.key_seq;
+ memcpy(ms->gmmlayer.rand, gmm_prim->gmmreg.sim_auth_ind.rand,
+ sizeof(ms->gmmlayer.rand));
+ /* Request SIM to authenticate. Wait for signal S_L23_SUBSCR_SIM_AUTH_RESP. */
+ rc = gsm_subscr_generate_kc(ms, gmm_prim->gmmreg.sim_auth_ind.key_seq,
+ gmm_prim->gmmreg.sim_auth_ind.rand, false);
+ break;
case OSMO_PRIM(OSMO_GPRS_GMM_GMMREG_DETACH, PRIM_OP_CONFIRM):
case OSMO_PRIM(OSMO_GPRS_GMM_GMMREG_DETACH, PRIM_OP_INDICATION):
default:
@@ -185,3 +201,23 @@
LOGP(DMM, LOGL_ERROR, "Failed submitting GMMREG-DETACH.req\n");
return rc;
}
+
+int modem_gmm_gmmreg_sim_auth_rsp(const struct osmocom_ms *ms, uint8_t *sres, uint8_t
*kc, uint8_t kc_len)
+{
+ struct osmo_gprs_gmm_prim *gmm_prim;
+ int rc;
+
+ gmm_prim = osmo_gprs_gmm_prim_alloc_gmmreg_sim_auth_rsp();
+ gmm_prim->gmmreg.sim_auth_rsp.ac_ref_nr = ms->gmmlayer.ac_ref_nr;
+ gmm_prim->gmmreg.sim_auth_rsp.key_seq = ms->gmmlayer.key_seq;
+ memcpy(gmm_prim->gmmreg.sim_auth_rsp.rand, ms->gmmlayer.rand,
+ sizeof(gmm_prim->gmmreg.sim_auth_rsp.rand));
+ memcpy(gmm_prim->gmmreg.sim_auth_rsp.sres, sres,
+ sizeof(gmm_prim->gmmreg.sim_auth_rsp.sres));
+ memcpy(gmm_prim->gmmreg.sim_auth_rsp.kc, kc,
+ kc_len);
+ rc = osmo_gprs_gmm_prim_upper_down(gmm_prim);
+ if (rc < 0)
+ LOGP(DMM, LOGL_ERROR, "Failed submitting GMMREG-SIM_AUTH.rsp\n");
+ return rc;
+}
--
To view, visit
https://gerrit.osmocom.org/c/osmocom-bb/+/32551
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: I75dc3fe3e4d9e23443fb778e36ca024f1bc46641
Gerrit-Change-Number: 32551
Gerrit-PatchSet: 2
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: merged