hostapd: Use stations nsts capability in (Re)Association Response frame
[mech_eap.git] / wpa_supplicant / interworking.c
index 9df1607..697810e 100644 (file)
@@ -950,11 +950,9 @@ static int interworking_set_hs20_params(struct wpa_supplicant *wpa_s,
        if (!key_mgmt)
                key_mgmt = wpa_s->conf->pmf != NO_MGMT_FRAME_PROTECTION ?
                        "WPA-EAP WPA-EAP-SHA256" : "WPA-EAP";
-       if (wpa_config_set(ssid, "key_mgmt", key_mgmt, 0) < 0)
-               return -1;
-       if (wpa_config_set(ssid, "proto", "RSN", 0) < 0)
-               return -1;
-       if (wpa_config_set(ssid, "pairwise", "CCMP", 0) < 0)
+       if (wpa_config_set(ssid, "key_mgmt", key_mgmt, 0) < 0 ||
+           wpa_config_set(ssid, "proto", "RSN", 0) < 0 ||
+           wpa_config_set(ssid, "pairwise", "CCMP", 0) < 0)
                return -1;
        return 0;
 }
@@ -1451,7 +1449,24 @@ static int interworking_set_eap_params(struct wpa_ssid *ssid,
                os_free(anon);
        }
 
-       if (cred->username && cred->username[0] &&
+       if (!ttls && cred->username && cred->username[0] && cred->realm &&
+           !os_strchr(cred->username, '@')) {
+               char *id;
+               size_t buflen;
+               int res;
+
+               buflen = os_strlen(cred->username) + 1 +
+                       os_strlen(cred->realm) + 1;
+
+               id = os_malloc(buflen);
+               if (!id)
+                       return -1;
+               os_snprintf(id, buflen, "%s@%s", cred->username, cred->realm);
+               res = wpa_config_set_quoted(ssid, "identity", id);
+               os_free(id);
+               if (res < 0)
+                       return -1;
+       } else if (cred->username && cred->username[0] &&
            wpa_config_set_quoted(ssid, "identity", cred->username) < 0)
                return -1;
 
@@ -1573,9 +1588,8 @@ fail:
 }
 
 
-static int interworking_connect_helper(struct wpa_supplicant *wpa_s,
-                                      struct wpa_bss *bss, int allow_excluded,
-                                      int only_add)
+int interworking_connect(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
+                        int only_add)
 {
        struct wpa_cred *cred, *cred_rc, *cred_3gpp;
        struct wpa_ssid *ssid;
@@ -1583,7 +1597,7 @@ static int interworking_connect_helper(struct wpa_supplicant *wpa_s,
        struct nai_realm_eap *eap = NULL;
        u16 count, i;
        char buf[100];
-       int excluded = 0, *excl = allow_excluded ? &excluded : NULL;
+       int excluded = 0, *excl = &excluded;
        const char *name;
 
        if (wpa_s->conf->cred == NULL || bss == NULL)
@@ -1597,8 +1611,8 @@ static int interworking_connect_helper(struct wpa_supplicant *wpa_s,
        }
 
        wpa_printf(MSG_DEBUG, "Interworking: Considering BSS " MACSTR
-                  " for connection (allow_excluded=%d)",
-                  MAC2STR(bss->bssid), allow_excluded);
+                  " for connection",
+                  MAC2STR(bss->bssid));
 
        if (!wpa_bss_get_ie(bss, WLAN_EID_RSN)) {
                /*
@@ -1616,7 +1630,7 @@ static int interworking_connect_helper(struct wpa_supplicant *wpa_s,
                wpa_msg(wpa_s, MSG_DEBUG,
                        "Interworking: Highest roaming consortium matching credential priority %d sp_priority %d",
                        cred_rc->priority, cred_rc->sp_priority);
-               if (allow_excluded && excl && !(*excl))
+               if (excl && !(*excl))
                        excl = NULL;
        }
 
@@ -1625,7 +1639,7 @@ static int interworking_connect_helper(struct wpa_supplicant *wpa_s,
                wpa_msg(wpa_s, MSG_DEBUG,
                        "Interworking: Highest NAI Realm list matching credential priority %d sp_priority %d",
                        cred->priority, cred->sp_priority);
-               if (allow_excluded && excl && !(*excl))
+               if (excl && !(*excl))
                        excl = NULL;
        }
 
@@ -1635,7 +1649,7 @@ static int interworking_connect_helper(struct wpa_supplicant *wpa_s,
                wpa_msg(wpa_s, MSG_DEBUG,
                        "Interworking: Highest 3GPP matching credential priority %d sp_priority %d",
                        cred_3gpp->priority, cred_3gpp->sp_priority);
-               if (allow_excluded && excl && !(*excl))
+               if (excl && !(*excl))
                        excl = NULL;
        }
 
@@ -1648,7 +1662,7 @@ static int interworking_connect_helper(struct wpa_supplicant *wpa_s,
                        wpa_msg(wpa_s, MSG_DEBUG,
                                "Interworking: Highest roaming consortium matching credential priority %d sp_priority %d (ignore BW)",
                                cred_rc->priority, cred_rc->sp_priority);
-                       if (allow_excluded && excl && !(*excl))
+                       if (excl && !(*excl))
                                excl = NULL;
                }
 
@@ -1658,7 +1672,7 @@ static int interworking_connect_helper(struct wpa_supplicant *wpa_s,
                        wpa_msg(wpa_s, MSG_DEBUG,
                                "Interworking: Highest NAI Realm list matching credential priority %d sp_priority %d (ignore BW)",
                                cred->priority, cred->sp_priority);
-                       if (allow_excluded && excl && !(*excl))
+                       if (excl && !(*excl))
                                excl = NULL;
                }
 
@@ -1668,7 +1682,7 @@ static int interworking_connect_helper(struct wpa_supplicant *wpa_s,
                        wpa_msg(wpa_s, MSG_DEBUG,
                                "Interworking: Highest 3GPP matching credential priority %d sp_priority %d (ignore BW)",
                                cred_3gpp->priority, cred_3gpp->sp_priority);
-                       if (allow_excluded && excl && !(*excl))
+                       if (excl && !(*excl))
                                excl = NULL;
                }
        }
@@ -1833,13 +1847,6 @@ fail:
 }
 
 
-int interworking_connect(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
-                        int only_add)
-{
-       return interworking_connect_helper(wpa_s, bss, 1, only_add);
-}
-
-
 #ifdef PCSC_FUNCS
 static int interworking_pcsc_read_imsi(struct wpa_supplicant *wpa_s)
 {
@@ -2789,7 +2796,7 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
 
        switch (info_id) {
        case ANQP_CAPABILITY_LIST:
-               wpa_msg(wpa_s, MSG_INFO, "RX-ANQP " MACSTR
+               wpa_msg(wpa_s, MSG_INFO, RX_ANQP MACSTR
                        " ANQP Capability list", MAC2STR(sa));
                wpa_hexdump_ascii(MSG_DEBUG, "ANQP: Capability list",
                                  pos, slen);
@@ -2799,7 +2806,7 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
                }
                break;
        case ANQP_VENUE_NAME:
-               wpa_msg(wpa_s, MSG_INFO, "RX-ANQP " MACSTR
+               wpa_msg(wpa_s, MSG_INFO, RX_ANQP MACSTR
                        " Venue Name", MAC2STR(sa));
                wpa_hexdump_ascii(MSG_DEBUG, "ANQP: Venue Name", pos, slen);
                if (anqp) {
@@ -2808,7 +2815,7 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
                }
                break;
        case ANQP_NETWORK_AUTH_TYPE:
-               wpa_msg(wpa_s, MSG_INFO, "RX-ANQP " MACSTR
+               wpa_msg(wpa_s, MSG_INFO, RX_ANQP MACSTR
                        " Network Authentication Type information",
                        MAC2STR(sa));
                wpa_hexdump_ascii(MSG_DEBUG, "ANQP: Network Authentication "
@@ -2819,7 +2826,7 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
                }
                break;
        case ANQP_ROAMING_CONSORTIUM:
-               wpa_msg(wpa_s, MSG_INFO, "RX-ANQP " MACSTR
+               wpa_msg(wpa_s, MSG_INFO, RX_ANQP MACSTR
                        " Roaming Consortium list", MAC2STR(sa));
                wpa_hexdump_ascii(MSG_DEBUG, "ANQP: Roaming Consortium",
                                  pos, slen);
@@ -2829,7 +2836,7 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
                }
                break;
        case ANQP_IP_ADDR_TYPE_AVAILABILITY:
-               wpa_msg(wpa_s, MSG_INFO, "RX-ANQP " MACSTR
+               wpa_msg(wpa_s, MSG_INFO, RX_ANQP MACSTR
                        " IP Address Type Availability information",
                        MAC2STR(sa));
                wpa_hexdump(MSG_MSGDUMP, "ANQP: IP Address Availability",
@@ -2841,7 +2848,7 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
                }
                break;
        case ANQP_NAI_REALM:
-               wpa_msg(wpa_s, MSG_INFO, "RX-ANQP " MACSTR
+               wpa_msg(wpa_s, MSG_INFO, RX_ANQP MACSTR
                        " NAI Realm list", MAC2STR(sa));
                wpa_hexdump_ascii(MSG_DEBUG, "ANQP: NAI Realm", pos, slen);
                if (anqp) {
@@ -2850,7 +2857,7 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
                }
                break;
        case ANQP_3GPP_CELLULAR_NETWORK:
-               wpa_msg(wpa_s, MSG_INFO, "RX-ANQP " MACSTR
+               wpa_msg(wpa_s, MSG_INFO, RX_ANQP MACSTR
                        " 3GPP Cellular Network information", MAC2STR(sa));
                wpa_hexdump_ascii(MSG_DEBUG, "ANQP: 3GPP Cellular Network",
                                  pos, slen);
@@ -2860,7 +2867,7 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
                }
                break;
        case ANQP_DOMAIN_NAME:
-               wpa_msg(wpa_s, MSG_INFO, "RX-ANQP " MACSTR
+               wpa_msg(wpa_s, MSG_INFO, RX_ANQP MACSTR
                        " Domain Name list", MAC2STR(sa));
                wpa_hexdump_ascii(MSG_MSGDUMP, "ANQP: Domain Name", pos, slen);
                if (anqp) {