Interworking: Make plmn_id_match() for generic
Use separate mnc_len parameter instead of expecting the imsi parameter to be in special MCC|MNC|-|<MSIN> format to make this function more generic. Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
817bb3e1c1
commit
c21246f529
1 changed files with 22 additions and 9 deletions
|
@ -461,21 +461,17 @@ static struct nai_realm_eap * nai_realm_find_eap(struct wpa_cred *cred,
|
||||||
|
|
||||||
#ifdef INTERWORKING_3GPP
|
#ifdef INTERWORKING_3GPP
|
||||||
|
|
||||||
static int plmn_id_match(struct wpabuf *anqp, const char *imsi)
|
static int plmn_id_match(struct wpabuf *anqp, const char *imsi, int mnc_len)
|
||||||
{
|
{
|
||||||
const char *sep;
|
|
||||||
u8 plmn[3];
|
u8 plmn[3];
|
||||||
const u8 *pos, *end;
|
const u8 *pos, *end;
|
||||||
u8 udhl;
|
u8 udhl;
|
||||||
|
|
||||||
sep = os_strchr(imsi, '-');
|
|
||||||
if (sep == NULL || (sep - imsi != 5 && sep - imsi != 6))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* See Annex A of 3GPP TS 24.234 v8.1.0 for description */
|
/* See Annex A of 3GPP TS 24.234 v8.1.0 for description */
|
||||||
plmn[0] = (imsi[0] - '0') | ((imsi[1] - '0') << 4);
|
plmn[0] = (imsi[0] - '0') | ((imsi[1] - '0') << 4);
|
||||||
plmn[1] = imsi[2] - '0';
|
plmn[1] = imsi[2] - '0';
|
||||||
if (sep - imsi == 6)
|
/* default to MNC length 3 if unknown */
|
||||||
|
if (mnc_len != 2)
|
||||||
plmn[1] |= (imsi[5] - '0') << 4;
|
plmn[1] |= (imsi[5] - '0') << 4;
|
||||||
else
|
else
|
||||||
plmn[1] |= 0xf0;
|
plmn[1] |= 0xf0;
|
||||||
|
@ -602,10 +598,19 @@ static int interworking_connect_3gpp(struct wpa_supplicant *wpa_s,
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (cred = wpa_s->conf->cred; cred; cred = cred->next) {
|
for (cred = wpa_s->conf->cred; cred; cred = cred->next) {
|
||||||
|
char *sep;
|
||||||
|
|
||||||
if (cred->imsi == NULL || !cred->imsi[0] ||
|
if (cred->imsi == NULL || !cred->imsi[0] ||
|
||||||
cred->milenage == NULL || !cred->milenage[0])
|
cred->milenage == NULL || !cred->milenage[0])
|
||||||
continue;
|
continue;
|
||||||
if (plmn_id_match(bss->anqp_3gpp, cred->imsi))
|
|
||||||
|
sep = os_strchr(cred->imsi, '-');
|
||||||
|
if (sep == NULL ||
|
||||||
|
(sep - cred->imsi != 5 && sep - cred->imsi != 6))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (plmn_id_match(bss->anqp_3gpp, cred->imsi,
|
||||||
|
sep - cred->imsi - 3))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (cred == NULL)
|
if (cred == NULL)
|
||||||
|
@ -865,13 +870,21 @@ static struct wpa_cred * interworking_credentials_available_3gpp(
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (cred = wpa_s->conf->cred; cred; cred = cred->next) {
|
for (cred = wpa_s->conf->cred; cred; cred = cred->next) {
|
||||||
|
char *sep;
|
||||||
|
|
||||||
if (cred->imsi == NULL || !cred->imsi[0] ||
|
if (cred->imsi == NULL || !cred->imsi[0] ||
|
||||||
cred->milenage == NULL || !cred->milenage[0])
|
cred->milenage == NULL || !cred->milenage[0])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
sep = os_strchr(cred->imsi, '-');
|
||||||
|
if (sep == NULL ||
|
||||||
|
(sep - cred->imsi != 5 && sep - cred->imsi != 6))
|
||||||
|
continue;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "Interworking: Parsing 3GPP info from "
|
wpa_printf(MSG_DEBUG, "Interworking: Parsing 3GPP info from "
|
||||||
MACSTR, MAC2STR(bss->bssid));
|
MACSTR, MAC2STR(bss->bssid));
|
||||||
ret = plmn_id_match(bss->anqp_3gpp, cred->imsi);
|
ret = plmn_id_match(bss->anqp_3gpp, cred->imsi,
|
||||||
|
sep - cred->imsi - 3);
|
||||||
wpa_printf(MSG_DEBUG, "PLMN match %sfound", ret ? "" : "not ");
|
wpa_printf(MSG_DEBUG, "PLMN match %sfound", ret ? "" : "not ");
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (selected == NULL ||
|
if (selected == NULL ||
|
||||||
|
|
Loading…
Reference in a new issue