Interworking: Use 3gppnetwork.org for matching home SP for SIM/USIM
Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
61b2ed7012
commit
9914c96feb
1 changed files with 52 additions and 11 deletions
|
@ -505,10 +505,10 @@ static int plmn_id_match(struct wpabuf *anqp, const char *imsi)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int set_root_nai(struct wpa_ssid *ssid, const char *imsi, char prefix)
|
static int build_root_nai(char *nai, const char *imsi, char prefix)
|
||||||
{
|
{
|
||||||
const char *sep, *msin;
|
const char *sep, *msin;
|
||||||
char nai[100], *end, *pos;
|
char *end, *pos;
|
||||||
size_t msin_len, plmn_len;
|
size_t msin_len, plmn_len;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -533,6 +533,7 @@ static int set_root_nai(struct wpa_ssid *ssid, const char *imsi, char prefix)
|
||||||
|
|
||||||
pos = nai;
|
pos = nai;
|
||||||
end = pos + sizeof(nai);
|
end = pos + sizeof(nai);
|
||||||
|
if (prefix)
|
||||||
*pos++ = prefix;
|
*pos++ = prefix;
|
||||||
os_memcpy(pos, imsi, plmn_len);
|
os_memcpy(pos, imsi, plmn_len);
|
||||||
pos += plmn_len;
|
pos += plmn_len;
|
||||||
|
@ -551,6 +552,15 @@ static int set_root_nai(struct wpa_ssid *ssid, const char *imsi, char prefix)
|
||||||
pos += os_snprintf(pos, end - pos, ".mcc%c%c%c.3gppnetwork.org",
|
pos += os_snprintf(pos, end - pos, ".mcc%c%c%c.3gppnetwork.org",
|
||||||
imsi[0], imsi[1], imsi[2]);
|
imsi[0], imsi[1], imsi[2]);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int set_root_nai(struct wpa_ssid *ssid, const char *imsi, char prefix)
|
||||||
|
{
|
||||||
|
char nai[100];
|
||||||
|
if (build_root_nai(nai, imsi, prefix) < 0)
|
||||||
|
return -1;
|
||||||
return wpa_config_set_quoted(ssid, "identity", nai);
|
return wpa_config_set_quoted(ssid, "identity", nai);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -855,16 +865,13 @@ static int interworking_credentials_available(struct wpa_supplicant *wpa_s,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int interworking_home_sp(struct wpa_supplicant *wpa_s,
|
static int domain_name_list_contains(struct wpabuf *domain_names,
|
||||||
struct wpabuf *domain_names)
|
const char *domain)
|
||||||
{
|
{
|
||||||
const u8 *pos, *end;
|
const u8 *pos, *end;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
if (wpa_s->conf->home_domain == NULL || domain_names == NULL)
|
len = os_strlen(domain);
|
||||||
return -1;
|
|
||||||
|
|
||||||
len = os_strlen(wpa_s->conf->home_domain);
|
|
||||||
pos = wpabuf_head(domain_names);
|
pos = wpabuf_head(domain_names);
|
||||||
end = pos + wpabuf_len(domain_names);
|
end = pos + wpabuf_len(domain_names);
|
||||||
|
|
||||||
|
@ -872,9 +879,10 @@ static int interworking_home_sp(struct wpa_supplicant *wpa_s,
|
||||||
if (pos + 1 + pos[0] > end)
|
if (pos + 1 + pos[0] > end)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
wpa_hexdump_ascii(MSG_DEBUG, "Interworking: AP domain name",
|
||||||
|
pos + 1, pos[0]);
|
||||||
if (pos[0] == len &&
|
if (pos[0] == len &&
|
||||||
os_strncasecmp(wpa_s->conf->home_domain,
|
os_strncasecmp(domain, (const char *) (pos + 1), len) == 0)
|
||||||
(const char *) (pos + 1), len) == 0)
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
pos += 1 + pos[0];
|
pos += 1 + pos[0];
|
||||||
|
@ -884,6 +892,39 @@ static int interworking_home_sp(struct wpa_supplicant *wpa_s,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int interworking_home_sp(struct wpa_supplicant *wpa_s,
|
||||||
|
struct wpabuf *domain_names)
|
||||||
|
{
|
||||||
|
#ifdef INTERWORKING_3GPP
|
||||||
|
char nai[100], *realm;
|
||||||
|
#endif /* INTERWORKING_3GPP */
|
||||||
|
|
||||||
|
if (domain_names == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
#ifdef INTERWORKING_3GPP
|
||||||
|
if (wpa_s->conf->home_imsi &&
|
||||||
|
build_root_nai(nai, wpa_s->conf->home_imsi, 0) == 0) {
|
||||||
|
realm = os_strchr(nai, '@');
|
||||||
|
if (realm)
|
||||||
|
realm++;
|
||||||
|
wpa_printf(MSG_DEBUG, "Interworking: Search for match with "
|
||||||
|
"SIM/USIM domain %s", realm);
|
||||||
|
if (realm && domain_name_list_contains(domain_names, realm))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif /* INTERWORKING_3GPP */
|
||||||
|
|
||||||
|
if (wpa_s->conf->home_domain == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
wpa_printf(MSG_DEBUG, "Interworking: Search for match with "
|
||||||
|
"home SP FQDN %s", wpa_s->conf->home_domain);
|
||||||
|
return domain_name_list_contains(domain_names,
|
||||||
|
wpa_s->conf->home_domain);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void interworking_select_network(struct wpa_supplicant *wpa_s)
|
static void interworking_select_network(struct wpa_supplicant *wpa_s)
|
||||||
{
|
{
|
||||||
struct wpa_bss *bss, *selected = NULL, *selected_home = NULL;
|
struct wpa_bss *bss, *selected = NULL, *selected_home = NULL;
|
||||||
|
|
Loading…
Reference in a new issue