summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 95bc2ea)
raw | patch | inline | side by side (parent: 95bc2ea)
author | Jouni Malinen <jouni@qca.qualcomm.com> | |
Thu, 16 Feb 2012 14:32:00 +0000 (16:32 +0200) | ||
committer | Jouni Malinen <j@w1.fi> | |
Thu, 16 Feb 2012 14:32:00 +0000 (16:32 +0200) |
Use Domain Name List (ANQP) and the new home_domain configuration
parameter to figure out whether a network is operated by the home
service provider and if so, prefer it over networks that would
require roaming.
Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
parameter to figure out whether a network is operated by the home
service provider and if so, prefer it over networks that would
require roaming.
Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
wpa_supplicant/config.c | patch | blob | history | |
wpa_supplicant/config.h | patch | blob | history | |
wpa_supplicant/interworking.c | patch | blob | history |
index a7c178480389652bfbd6a5e7cffe4768bee110fa..5910b5dc8f952d9962736916665e2ac953d49970 100644 (file)
--- a/wpa_supplicant/config.c
+++ b/wpa_supplicant/config.c
os_free(config->home_ca_cert);
os_free(config->home_imsi);
os_free(config->home_milenage);
+ os_free(config->home_domain);
os_free(config);
}
{ STR(home_ca_cert), 0 },
{ STR(home_imsi), 0 },
{ STR(home_milenage), 0 },
+ { STR(home_domain), 0 },
{ INT_RANGE(interworking, 0, 1), 0 },
{ FUNC(hessid), 0 },
{ INT_RANGE(access_network_type, 0, 15), 0 }
index a62f288167ffb19bb13dad31a95613abeeef0863..380bfbb28f200b42353910d052d6fa005ee27bf6 100644 (file)
--- a/wpa_supplicant/config.h
+++ b/wpa_supplicant/config.h
* <Ki>:<OPc>:<SQN> format
*/
char *home_milenage;
+
+ /**
+ * home_domain - Home service provider FQDN
+ *
+ * This is used to compare against the Domain Name List to figure out
+ * whether the AP is operated by the Home SP.
+ */
+ char *home_domain;
};
index 56dd5b1a37400a87c345ba573d2854cdc63d7ddc..572e2ed7c77fce4583342e87ebc7e4e54b53cd26 100644 (file)
}
+static int interworking_home_sp(struct wpa_supplicant *wpa_s,
+ struct wpabuf *domain_names)
+{
+ const u8 *pos, *end;
+ size_t len;
+
+ if (wpa_s->conf->home_domain == NULL || domain_names == NULL)
+ return -1;
+
+ len = os_strlen(wpa_s->conf->home_domain);
+ pos = wpabuf_head(domain_names);
+ end = pos + wpabuf_len(domain_names);
+
+ while (pos + 1 < end) {
+ if (pos + 1 + pos[0] > end)
+ break;
+
+ if (pos[0] == len &&
+ os_strncasecmp(wpa_s->conf->home_domain,
+ (const char *) (pos + 1), len) == 0)
+ return 1;
+
+ pos += 1 + pos[0];
+ }
+
+ return 0;
+}
+
+
static void interworking_select_network(struct wpa_supplicant *wpa_s)
{
- struct wpa_bss *bss, *selected = NULL;
+ struct wpa_bss *bss, *selected = NULL, *selected_home = NULL;
unsigned int count = 0;
+ const char *type;
+ int res;
wpa_s->network_select = 0;
if (!interworking_credentials_available(wpa_s, bss))
continue;
count++;
- wpa_msg(wpa_s, MSG_INFO, INTERWORKING_AP MACSTR,
- MAC2STR(bss->bssid));
- if (selected == NULL && wpa_s->auto_select)
- selected = bss;
+ res = interworking_home_sp(wpa_s, bss->anqp_domain_name);
+ if (res > 0)
+ type = "home";
+ else if (res == 0)
+ type = "roaming";
+ else
+ type = "unknown";
+ wpa_msg(wpa_s, MSG_INFO, INTERWORKING_AP MACSTR " type=%s",
+ MAC2STR(bss->bssid), type);
+ if (wpa_s->auto_select) {
+ if (selected == NULL)
+ selected = bss;
+ if (selected_home == NULL && res > 0)
+ selected_home = bss;
+ }
+ }
+
+ if (selected_home && selected_home != selected) {
+ /* Prefer network operated by the Home SP */
+ selected = selected_home;
}
if (count == 0) {