Fix small HTTP processing issues
[wpasupplicant] / hostapd / ieee802_1x.c
index b3118df..a1545c7 100644 (file)
@@ -185,6 +185,7 @@ static void ieee802_1x_tx_key_one(struct hostapd_data *hapd,
 }
 
 
+#ifndef CONFIG_NO_VLAN
 static struct hostapd_wep_keys *
 ieee802_1x_group_alloc(struct hostapd_data *hapd, const char *ifname)
 {
@@ -219,8 +220,8 @@ ieee802_1x_group_alloc(struct hostapd_data *hapd, const char *ifname)
        wpa_hexdump_key(MSG_DEBUG, "Default WEP key (dynamic VLAN)",
                        key->key[key->idx], key->len[key->idx]);
 
-       if (hostapd_set_encryption(ifname, hapd, "WEP", NULL, key->idx,
-                                  key->key[key->idx], key->len[key->idx], 1))
+       if (hostapd_set_key(ifname, hapd, WPA_ALG_WEP, NULL, key->idx, 1,
+                           NULL, 0, key->key[key->idx], key->len[key->idx]))
                printf("Could not set dynamic VLAN WEP encryption key.\n");
 
        hostapd_set_ieee8021x(ifname, hapd, 1);
@@ -279,13 +280,16 @@ ieee802_1x_get_group(struct hostapd_data *hapd, struct hostapd_ssid *ssid,
 
        return ssid->dyn_vlan_keys[vlan_id];
 }
+#endif /* CONFIG_NO_VLAN */
 
 
 void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta)
 {
-       struct hostapd_wep_keys *key = NULL;
        struct eapol_state_machine *sm = sta->eapol_sm;
+#ifndef CONFIG_NO_VLAN
+       struct hostapd_wep_keys *key = NULL;
        int vlan_id;
+#endif /* CONFIG_NO_VLAN */
 
        if (sm == NULL || !sm->eap_if->eapKeyData)
                return;
@@ -293,6 +297,7 @@ void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta)
        wpa_printf(MSG_DEBUG, "IEEE 802.1X: Sending EAPOL-Key(s) to " MACSTR,
                   MAC2STR(sta->addr));
 
+#ifndef CONFIG_NO_VLAN
        vlan_id = sta->vlan_id;
        if (vlan_id < 0 || vlan_id > MAX_VLAN_ID)
                vlan_id = 0;
@@ -303,7 +308,9 @@ void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta)
                        ieee802_1x_tx_key_one(hapd, sta, key->idx, 1,
                                              key->key[key->idx],
                                              key->len[key->idx]);
-       } else if (hapd->default_wep_key) {
+       } else
+#endif /* CONFIG_NO_VLAN */
+       if (hapd->default_wep_key) {
                ieee802_1x_tx_key_one(hapd, sta, hapd->default_wep_key_idx, 1,
                                      hapd->default_wep_key,
                                      hapd->conf->default_wep_key_len);
@@ -328,10 +335,9 @@ void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta)
 
                /* TODO: set encryption in TX callback, i.e., only after STA
                 * has ACKed EAPOL-Key frame */
-               if (hostapd_set_encryption(hapd->conf->iface, hapd, "WEP",
-                                          sta->addr, 0, ikey,
-                                          hapd->conf->individual_wep_key_len,
-                                          1)) {
+               if (hostapd_set_key(hapd->conf->iface, hapd, WPA_ALG_WEP,
+                                   sta->addr, 0, 1, NULL, 0, ikey,
+                                   hapd->conf->individual_wep_key_len)) {
                        wpa_printf(MSG_ERROR, "Could not set individual WEP "
                                   "encryption.");
                }
@@ -674,8 +680,9 @@ void ieee802_1x_receive(struct hostapd_data *hapd, const u8 *sa, const u8 *buf,
        wpa_printf(MSG_DEBUG, "IEEE 802.1X: %lu bytes from " MACSTR,
                   (unsigned long) len, MAC2STR(sa));
        sta = ap_get_sta(hapd, sa);
-       if (!sta) {
-               printf("   no station information available\n");
+       if (!sta || !(sta->flags & WLAN_STA_ASSOC)) {
+               wpa_printf(MSG_DEBUG, "IEEE 802.1X data frame from not "
+                          "associated STA");
                return;
        }
 
@@ -739,6 +746,8 @@ void ieee802_1x_receive(struct hostapd_data *hapd, const u8 *sa, const u8 *buf,
                        sta->eapol_sm->flags |= EAPOL_SM_WAIT_START;
                }
 #endif /* CONFIG_WPS */
+
+               sta->eapol_sm->eap_if->portEnabled = TRUE;
        }
 
        /* since we support version 1, we can ignore version field and proceed
@@ -821,7 +830,7 @@ void ieee802_1x_new_station(struct hostapd_data *hapd, struct sta_info *sta)
        int force_1x = 0;
 
 #ifdef CONFIG_WPS
-       if (hapd->conf->wps_state &&
+       if (hapd->conf->wps_state && hapd->conf->wpa &&
            (sta->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS))) {
                /*
                 * Need to enable IEEE 802.1X/EAPOL state machines for possible
@@ -900,47 +909,6 @@ void ieee802_1x_new_station(struct hostapd_data *hapd, struct sta_info *sta)
 }
 
 
-void ieee802_1x_free_radius_class(struct radius_class_data *class)
-{
-       size_t i;
-       if (class == NULL)
-               return;
-       for (i = 0; i < class->count; i++)
-               os_free(class->attr[i].data);
-       os_free(class->attr);
-       class->attr = NULL;
-       class->count = 0;
-}
-
-
-int ieee802_1x_copy_radius_class(struct radius_class_data *dst,
-                                const struct radius_class_data *src)
-{
-       size_t i;
-
-       if (src->attr == NULL)
-               return 0;
-
-       dst->attr = os_zalloc(src->count * sizeof(struct radius_attr_data));
-       if (dst->attr == NULL)
-               return -1;
-
-       dst->count = 0;
-
-       for (i = 0; i < src->count; i++) {
-               dst->attr[i].data = os_malloc(src->attr[i].len);
-               if (dst->attr[i].data == NULL)
-                       break;
-               dst->count++;
-               os_memcpy(dst->attr[i].data, src->attr[i].data,
-                         src->attr[i].len);
-               dst->attr[i].len = src->attr[i].len;
-       }
-
-       return 0;
-}
-
-
 void ieee802_1x_free_station(struct sta_info *sta)
 {
        struct eapol_state_machine *sm = sta->eapol_sm;
@@ -955,10 +923,10 @@ void ieee802_1x_free_station(struct sta_info *sta)
                radius_msg_free(sm->last_recv_radius);
                os_free(sm->last_recv_radius);
        }
+       radius_free_class(&sm->radius_class);
 #endif /* CONFIG_NO_RADIUS */
 
        os_free(sm->identity);
-       ieee802_1x_free_radius_class(&sm->radius_class);
        eapol_auth_free(sm);
 }
 
@@ -1100,7 +1068,7 @@ static void ieee802_1x_store_radius_class(struct hostapd_data *hapd,
            sm == NULL)
                return;
 
-       ieee802_1x_free_radius_class(&sm->radius_class);
+       radius_free_class(&sm->radius_class);
        count = radius_msg_count_attr(msg, RADIUS_ATTR_CLASS, 1);
        if (count <= 0)
                return;
@@ -1298,6 +1266,7 @@ ieee802_1x_receive_auth(struct radius_msg *msg, struct radius_msg *req,
        case RADIUS_CODE_ACCESS_ACCEPT:
                if (sta->ssid->dynamic_vlan == DYNAMIC_VLAN_DISABLED)
                        sta->vlan_id = 0;
+#ifndef CONFIG_NO_VLAN
                else {
                        old_vlanid = sta->vlan_id;
                        sta->vlan_id = radius_msg_get_vlanid(msg);
@@ -1318,6 +1287,7 @@ ieee802_1x_receive_auth(struct radius_msg *msg, struct radius_msg *req,
                                       "ID in Access-Accept");
                        break;
                }
+#endif /* CONFIG_NO_VLAN */
 
                ap_sta_bind_vlan(hapd, sta, old_vlanid);
 
@@ -1512,10 +1482,10 @@ static void ieee802_1x_rekey(void *eloop_ctx, void *timeout_ctx)
 
        /* TODO: Could setup key for RX here, but change default TX keyid only
         * after new broadcast key has been sent to all stations. */
-       if (hostapd_set_encryption(hapd->conf->iface, hapd, "WEP", NULL,
-                                  hapd->default_wep_key_idx,
-                                  hapd->default_wep_key,
-                                  hapd->conf->default_wep_key_len, 1)) {
+       if (hostapd_set_key(hapd->conf->iface, hapd, WPA_ALG_WEP, NULL,
+                           hapd->default_wep_key_idx, 1, NULL, 0,
+                           hapd->default_wep_key,
+                           hapd->conf->default_wep_key_len)) {
                hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE8021X,
                               HOSTAPD_LEVEL_WARNING, "failed to configure a "
                               "new broadcast key");
@@ -1616,6 +1586,7 @@ static int ieee802_1x_sta_entry_alive(void *ctx, const u8 *addr)
 static void ieee802_1x_logger(void *ctx, const u8 *addr,
                              eapol_logger_level level, const char *txt)
 {
+#ifndef CONFIG_NO_HOSTAPD_LOGGER
        struct hostapd_data *hapd = ctx;
        int hlevel;
 
@@ -1634,6 +1605,7 @@ static void ieee802_1x_logger(void *ctx, const u8 *addr,
 
        hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE8021X, hlevel, "%s",
                       txt);
+#endif /* CONFIG_NO_HOSTAPD_LOGGER */
 }
 
 
@@ -1718,8 +1690,8 @@ int ieee802_1x_init(struct hostapd_data *hapd)
                hostapd_set_privacy(hapd, 1);
 
                for (i = 0; i < 4; i++)
-                       hostapd_set_encryption(hapd->conf->iface, hapd,
-                                              "none", NULL, i, NULL, 0, 0);
+                       hostapd_set_key(hapd->conf->iface, hapd, WPA_ALG_NONE,
+                                       NULL, i, 0, NULL, 0, NULL, 0);
 
                ieee802_1x_rekey(hapd, NULL);
 
@@ -1754,7 +1726,7 @@ int ieee802_1x_reconfig(struct hostapd_data *hapd,
 
 
 int ieee802_1x_tx_status(struct hostapd_data *hapd, struct sta_info *sta,
-                        u8 *buf, size_t len, int ack)
+                        const u8 *buf, size_t len, int ack)
 {
        struct ieee80211_hdr *hdr;
        struct ieee802_1x_hdr *xhdr;