laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmocom-bb/+/33318 )
Change subject: [untested] layer23: migrate away from gsm48_generate_mid_from_* ......................................................................
[untested] layer23: migrate away from gsm48_generate_mid_from_*
Migrate from deprecated gsm48_mi_to_string to osmo_mobile_identity
Change-Id: Ib0d7f76cd635e8d1092ffc1d07ecb29ec0435dda Depends: libosmocore.git If4f7be606e54cfa1c59084cf169785b1cbda5cf5 --- M src/host/layer23/src/mobile/gsm48_mm.c M src/host/layer23/src/mobile/gsm48_rr.c 2 files changed, 69 insertions(+), 49 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/18/33318/1
diff --git a/src/host/layer23/src/mobile/gsm48_mm.c b/src/host/layer23/src/mobile/gsm48_mm.c index 2bba0e1..bdd7642 100644 --- a/src/host/layer23/src/mobile/gsm48_mm.c +++ b/src/host/layer23/src/mobile/gsm48_mm.c @@ -278,20 +278,24 @@ { struct gsm_subscriber *subscr = &ms->subscr; struct gsm_settings *set = &ms->settings; - uint8_t *ie; + struct osmo_mobile_identity mi;
switch(mi_type) { case GSM_MI_TYPE_TMSI: - gsm48_generate_mid_from_tmsi(buf, subscr->tmsi); + mi.type = GSM_MI_TYPE_TMSI; + mi.tmsi = subscr->tmsi; break; case GSM_MI_TYPE_IMSI: - gsm48_generate_mid_from_imsi(buf, subscr->imsi); + mi.type = GSM_MI_TYPE_IMSI; + OSMO_STRLCPY_ARRAY(mi.imsi, subscr->imsi); break; case GSM_MI_TYPE_IMEI: - gsm48_generate_mid_from_imsi(buf, set->imei); + mi.type = GSM_MI_TYPE_IMEI; + OSMO_STRLCPY_ARRAY(mi.imei, set->imei); break; case GSM_MI_TYPE_IMEISV: - gsm48_generate_mid_from_imsi(buf, set->imeisv); + mi.type = GSM_MI_TYPE_IMEISV; + OSMO_STRLCPY_ARRAY(mi.imeisv, set->imeisv); break; case GSM_MI_TYPE_NONE: default: @@ -300,13 +304,13 @@ buf[2] = 0xf0; break; } - /* alter MI type */ - buf[2] = (buf[2] & ~GSM_MI_TYPE_MASK) | mi_type;
if (msg) { - /* MI as LV */ - ie = msgb_put(msg, 1 + buf[1]); - memcpy(ie, buf + 1, 1 + buf[1]); + if (mi_type != GSM_MI_TYPE_NONE) { + int rc = osmo_mobile_identity_encode_buf(buf, 11, &mi, false); + if (rc < 0) + return rc; + } }
return 0; @@ -2793,9 +2797,12 @@ : rr->cd_now.arfcn); /* MI */ if (mm->est_cause == RR_EST_CAUSE_EMERGENCY && set->emergency_imsi[0]) { + struct osmo_mobile_identity mi; LOGP(DMM, LOGL_INFO, "-> Using IMSI %s for emergency\n", set->emergency_imsi); - gsm48_generate_mid_from_imsi(buf, set->emergency_imsi); + mi.type = GSM_MI_TYPE_IMSI; + OSMO_STRLCPY_ARRAY(mi.imsi, set->emergency_imsi); + osmo_mobile_identity_encode_buf(buf, sizeof(buf), &mi, false); } else if (!subscr->sim_valid) { /* have no SIM ? */ LOGP(DMM, LOGL_INFO, "-> Using IMEI %s\n", diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c index a0aad3c..9cf9294 100644 --- a/src/host/layer23/src/mobile/gsm48_rr.c +++ b/src/host/layer23/src/mobile/gsm48_rr.c @@ -926,7 +926,6 @@ struct msgb *nmsg; struct gsm48_hdr *gh; struct gsm48_rr_hdr *nrrh; - uint8_t buf[11], *tlv;
LOGP(DRR, LOGL_INFO, "CIPHERING MODE COMPLETE (cr %d)\n", cr);
@@ -940,11 +939,17 @@
/* MI */ if (cr) { - gsm48_generate_mid_from_imsi(buf, set->imeisv); - /* alter MI type */ - buf[2] = (buf[2] & ~GSM_MI_TYPE_MASK) | GSM_MI_TYPE_IMEISV; - tlv = msgb_put(nmsg, 2 + buf[1]); - memcpy(tlv, buf, 2 + buf[1]); + struct osmo_mobile_identity mi; + uint8_t *l; + int rc; + + mi.type = GSM_MI_TYPE_IMEISV; + OSMO_STRLCPY_ARRAY(mi.imeisv, set->imeisv); + l = msgb_tl_put(nmsg, GSM48_IE_MOBILE_ID); + rc = osmo_mobile_identity_encode_msgb(nmsg, &mi, false); + if (rc < 0) + return rc; + *l = rc; }
gsm48_send_rsl(ms, RSL_MT_DATA_REQ, nmsg, 0); @@ -2128,43 +2133,37 @@ };
/* given LV of mobile identity is checked against ms */ -static uint8_t gsm_match_mi(struct osmocom_ms *ms, uint8_t *mi) +static uint8_t gsm_match_mi(struct osmocom_ms *ms, const uint8_t *mi_lv) { struct gsm322_cellsel *cs = &ms->cellsel; - char imsi[16]; - uint32_t tmsi; - uint8_t mi_type; + struct osmo_mobile_identity mi; + char buf[32]; + int rc;
- if (mi[0] < 1) - return 0; - mi_type = mi[1] & GSM_MI_TYPE_MASK; - switch (mi_type) { + rc = osmo_mobile_identity_decode(&mi, mi_lv+1, mi_lv[0], false); + if (rc < 0) + return rc; + osmo_mobile_identity_to_str_buf(buf, sizeof(buf), &mi); + + switch (mi.type) { case GSM_MI_TYPE_TMSI: - if (mi[0] < 5) - return 0; - memcpy(&tmsi, mi+2, 4); - if (ms->subscr.tmsi == ntohl(tmsi) + if ((ms->subscr.tmsi == mi.tmsi) && (osmo_lai_cmp(&ms->subscr.lai, &cs->sel_cgi.lai) == 0)) { - LOGP(DPAG, LOGL_INFO, " TMSI %08x matches\n", - ntohl(tmsi)); - - return mi_type; + LOGP(DPAG, LOGL_INFO, " %s matches\n", buf); + return mi.type; } else - LOGP(DPAG, LOGL_INFO, " TMSI %08x (not for us)\n", - ntohl(tmsi)); + LOGP(DPAG, LOGL_INFO, " %s (not for us)\n", buf); break; case GSM_MI_TYPE_IMSI: - gsm48_mi_to_string(imsi, sizeof(imsi), mi + 1, mi[0]); - if (!strcmp(imsi, ms->subscr.imsi)) { - LOGP(DPAG, LOGL_INFO, " IMSI %s matches\n", imsi); - - return mi_type; + if (!strcmp(mi.imsi, ms->subscr.imsi)) { + LOGP(DPAG, LOGL_INFO, " %s matches\n", buf); + return mi.type; } else - LOGP(DPAG, LOGL_INFO, " IMSI %s (not for us)\n", imsi); + LOGP(DPAG, LOGL_INFO, " %s (not for us)\n", buf); break; default: LOGP(DPAG, LOGL_NOTICE, "Paging with unsupported MI type %d.\n", - mi_type); + mi.type); }
return 0; @@ -3217,7 +3216,6 @@ struct msgb *nmsg; struct gsm48_hdr *gh; struct gsm48_pag_rsp *pr; - uint8_t mi[11]; uint16_t ma[64]; uint8_t ma_len;
@@ -3277,6 +3275,7 @@ /* set sequence number and increment */ gsm48_apply_v_sd(rr, nmsg); } else { + struct osmo_mobile_identity mid; /* create paging response */ nmsg = gsm48_l3_msgb_alloc(); if (!nmsg) @@ -3294,21 +3293,23 @@ if (ms->subscr.tmsi != GSM_RESERVED_TMSI && (osmo_lai_cmp(&ms->subscr.lai, &cs->sel_cgi.lai) == 0) && rr->paging_mi_type == GSM_MI_TYPE_TMSI) { - gsm48_generate_mid_from_tmsi(mi, subscr->tmsi); + mid.type = GSM_MI_TYPE_TMSI; + mid.tmsi = ms->subscr.tmsi; + osmo_mobile_identity_encode_msgb(nmsg, &mid, false); LOGP(DRR, LOGL_INFO, "sending paging response with " "TMSI\n"); } else if (subscr->imsi[0]) { - gsm48_generate_mid_from_imsi(mi, subscr->imsi); + mid.type = GSM_MI_TYPE_IMSI; + OSMO_STRLCPY_ARRAY(mid.imsi, subscr->imsi); + osmo_mobile_identity_encode_msgb(nmsg, &mid, false); LOGP(DRR, LOGL_INFO, "sending paging response with " "IMSI\n"); } else { - mi[1] = 1; - mi[2] = 0xf0 | GSM_MI_TYPE_NONE; + msgb_put_u8(nmsg, 1); + msgb_put_u8(nmsg, 0xf0 | GSM_MI_TYPE_NONE); LOGP(DRR, LOGL_INFO, "sending paging response without " "TMSI/IMSI\n"); } - msgb_put(nmsg, 1 + mi[1]); - memcpy(pr->data, mi + 1, 1 + mi[1]); }
#ifdef TEST_FREQUENCY_MOD