Move more driver ops into struct hostapd_driver_ops
authorJouni Malinen <j@w1.fi>
Thu, 24 Dec 2009 18:41:30 +0000 (20:41 +0200)
committerJouni Malinen <j@w1.fi>
Thu, 24 Dec 2009 18:41:30 +0000 (20:41 +0200)
This removes need to include driver_i.h into ieee802_1x.c.

hostapd/ap_drv_ops.c
hostapd/driver_i.h
hostapd/hostapd.c
hostapd/hostapd.h
hostapd/iapp.c
hostapd/ieee802_1x.c
hostapd/sta_info.c
hostapd/sta_info.h
hostapd/vlan_init.c

index c560f1e..d663115 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "common.h"
 #include "hostapd.h"
+#include "sta_info.h"
 #include "driver_i.h"
 
 
@@ -39,8 +40,51 @@ static int hostapd_send_mgmt_frame(struct hostapd_data *hapd, const void *msg,
 }
 
 
+static int hostapd_send_eapol(struct hostapd_data *hapd, const u8 *addr,
+                             const u8 *data, size_t data_len, int encrypt)
+{
+       if (hapd->driver == NULL || hapd->driver->hapd_send_eapol == NULL)
+               return 0;
+       return hapd->driver->hapd_send_eapol(hapd->drv_priv, addr, data,
+                                            data_len, encrypt,
+                                            hapd->own_addr);
+}
+
+
+static int hostapd_set_authorized(struct hostapd_data *hapd,
+                                 struct sta_info *sta, int authorized)
+{
+       if (authorized) {
+               return hostapd_sta_set_flags(hapd, sta->addr,
+                                            hostapd_sta_flags_to_drv(
+                                                    sta->flags),
+                                            WPA_STA_AUTHORIZED, ~0);
+       }
+
+       return hostapd_sta_set_flags(hapd, sta->addr,
+                                    hostapd_sta_flags_to_drv(sta->flags),
+                                    0, ~WPA_STA_AUTHORIZED);
+}
+
+
+static int hostapd_set_key(const char *ifname, struct hostapd_data *hapd,
+                          wpa_alg alg, const u8 *addr, int key_idx,
+                          int set_tx, const u8 *seq, size_t seq_len,
+                          const u8 *key, size_t key_len)
+{
+       if (hapd->driver == NULL || hapd->driver->set_key == NULL)
+               return 0;
+       return hapd->driver->set_key(ifname, hapd->drv_priv, alg, addr,
+                                    key_idx, set_tx, seq, seq_len, key,
+                                    key_len);
+}
+
+
 void hostapd_set_driver_ops(struct hostapd_driver_ops *ops)
 {
        ops->set_ap_wps_ie = hostapd_set_ap_wps_ie;
        ops->send_mgmt_frame = hostapd_send_mgmt_frame;
+       ops->send_eapol = hostapd_send_eapol;
+       ops->set_authorized = hostapd_set_authorized;
+       ops->set_key = hostapd_set_key;
 }
index 9a1d56d..d6ac63e 100644 (file)
@@ -80,19 +80,6 @@ hostapd_set_privacy(struct hostapd_data *hapd, int enabled)
 }
 
 static inline int
-hostapd_set_key(const char *ifname, struct hostapd_data *hapd,
-               wpa_alg alg, const u8 *addr, int key_idx,
-               int set_tx, const u8 *seq, size_t seq_len,
-               const u8 *key, size_t key_len)
-{
-       if (hapd->driver == NULL || hapd->driver->set_key == NULL)
-               return 0;
-       return hapd->driver->set_key(ifname, hapd->drv_priv, alg, addr,
-                                    key_idx, set_tx, seq, seq_len, key,
-                                    key_len);
-}
-
-static inline int
 hostapd_get_seqnum(const char *ifname, struct hostapd_data *hapd,
                   const u8 *addr, int idx, u8 *seq)
 {
@@ -130,17 +117,6 @@ hostapd_read_sta_data(struct hostapd_data *hapd,
 }
 
 static inline int
-hostapd_send_eapol(struct hostapd_data *hapd, const u8 *addr, const u8 *data,
-                  size_t data_len, int encrypt)
-{
-       if (hapd->driver == NULL || hapd->driver->hapd_send_eapol == NULL)
-               return 0;
-       return hapd->driver->hapd_send_eapol(hapd->drv_priv, addr, data,
-                                            data_len, encrypt,
-                                            hapd->own_addr);
-}
-
-static inline int
 hostapd_sta_deauth(struct hostapd_data *hapd, const u8 *addr, int reason)
 {
        if (hapd->driver == NULL || hapd->driver->sta_deauth == NULL)
index 0debda7..2835f38 100644 (file)
@@ -204,8 +204,8 @@ static void hostapd_broadcast_key_clear_iface(struct hostapd_data *hapd,
        int i;
 
        for (i = 0; i < NUM_WEP_KEYS; i++) {
-               if (hostapd_set_key(ifname, hapd, WPA_ALG_NONE, NULL, i,
-                                   i == 0 ? 1 : 0, NULL, 0, NULL, 0)) {
+               if (hapd->drv.set_key(ifname, hapd, WPA_ALG_NONE, NULL, i,
+                                     i == 0 ? 1 : 0, NULL, 0, NULL, 0)) {
                        wpa_printf(MSG_DEBUG, "Failed to clear default "
                                   "encryption keys (ifname=%s keyidx=%d)",
                                   ifname, i);
@@ -214,9 +214,9 @@ static void hostapd_broadcast_key_clear_iface(struct hostapd_data *hapd,
 #ifdef CONFIG_IEEE80211W
        if (hapd->conf->ieee80211w) {
                for (i = NUM_WEP_KEYS; i < NUM_WEP_KEYS + 2; i++) {
-                       if (hostapd_set_key(ifname, hapd, WPA_ALG_NONE, NULL,
-                                           i, i == 0 ? 1 : 0, NULL, 0,
-                                           NULL, 0)) {
+                       if (hapd->drv.set_key(ifname, hapd, WPA_ALG_NONE, NULL,
+                                             i, i == 0 ? 1 : 0, NULL, 0,
+                                             NULL, 0)) {
                                wpa_printf(MSG_DEBUG, "Failed to clear "
                                           "default mgmt encryption keys "
                                           "(ifname=%s keyidx=%d)", ifname, i);
@@ -241,9 +241,11 @@ static int hostapd_broadcast_wep_set(struct hostapd_data *hapd)
 
        idx = ssid->wep.idx;
        if (ssid->wep.default_len &&
-           hostapd_set_key(hapd->conf->iface,
-                           hapd, WPA_ALG_WEP, NULL, idx, idx == ssid->wep.idx,
-                           NULL, 0, ssid->wep.key[idx], ssid->wep.len[idx])) {
+           hapd->drv.set_key(hapd->conf->iface,
+                             hapd, WPA_ALG_WEP, NULL, idx,
+                             idx == ssid->wep.idx,
+                             NULL, 0, ssid->wep.key[idx],
+                             ssid->wep.len[idx])) {
                wpa_printf(MSG_WARNING, "Could not set WEP encryption.");
                errors++;
        }
@@ -261,9 +263,9 @@ static int hostapd_broadcast_wep_set(struct hostapd_data *hapd)
                                continue;
 
                        idx = key->idx;
-                       if (hostapd_set_key(ifname, hapd, WPA_ALG_WEP, NULL,
-                                           idx, idx == key->idx, NULL, 0,
-                                           key->key[idx], key->len[idx])) {
+                       if (hapd->drv.set_key(ifname, hapd, WPA_ALG_WEP, NULL,
+                                             idx, idx == key->idx, NULL, 0,
+                                             key->key[idx], key->len[idx])) {
                                wpa_printf(MSG_WARNING, "Could not set "
                                           "dynamic VLAN WEP encryption.");
                                errors++;
@@ -399,10 +401,10 @@ static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd)
 
        for (i = 0; i < 4; i++) {
                if (hapd->conf->ssid.wep.key[i] &&
-                   hostapd_set_key(iface, hapd, WPA_ALG_WEP, NULL, i,
-                                   i == hapd->conf->ssid.wep.idx, NULL, 0,
-                                   hapd->conf->ssid.wep.key[i],
-                                   hapd->conf->ssid.wep.len[i])) {
+                   hapd->drv.set_key(iface, hapd, WPA_ALG_WEP, NULL, i,
+                                     i == hapd->conf->ssid.wep.idx, NULL, 0,
+                                     hapd->conf->ssid.wep.key[i],
+                                     hapd->conf->ssid.wep.len[i])) {
                        wpa_printf(MSG_WARNING, "Could not set WEP "
                                   "encryption.");
                        return -1;
@@ -474,20 +476,10 @@ static void hostapd_wpa_auth_disconnect(void *ctx, const u8 *addr,
                                        u16 reason)
 {
        struct hostapd_data *hapd = ctx;
-       struct sta_info *sta;
-
        wpa_printf(MSG_DEBUG, "%s: WPA authenticator requests disconnect: "
                   "STA " MACSTR " reason %d",
                   __func__, MAC2STR(addr), reason);
-
-       sta = ap_get_sta(hapd, addr);
-       hostapd_sta_deauth(hapd, addr, reason);
-       if (sta == NULL)
-               return;
-       sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_AUTHORIZED);
-       eloop_cancel_timeout(ap_handle_timer, hapd, sta);
-       eloop_register_timeout(0, 0, ap_handle_timer, hapd, sta);
-       sta->timeout_next = STA_REMOVE;
+       ap_sta_disconnect(hapd, NULL, addr, reason);
 }
 
 
@@ -604,8 +596,8 @@ static int hostapd_wpa_auth_set_key(void *ctx, int vlan_id, wpa_alg alg,
                        return -1;
        }
 
-       return hostapd_set_key(ifname, hapd, alg, addr, idx, 1, NULL, 0,
-                              key, key_len);
+       return hapd->drv.set_key(ifname, hapd, alg, addr, idx, 1, NULL, 0,
+                                key, key_len);
 }
 
 
@@ -622,7 +614,7 @@ static int hostapd_wpa_auth_send_eapol(void *ctx, const u8 *addr,
                                       int encrypt)
 {
        struct hostapd_data *hapd = ctx;
-       return hostapd_send_eapol(hapd, addr, data, data_len, encrypt);
+       return hapd->drv.send_eapol(hapd, addr, data, data_len, encrypt);
 }
 
 
index bf50dfa..6695775 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * hostapd / Initialization and configuration
- * Copyright (c) 2002-2008, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -15,6 +15,8 @@
 #ifndef HOSTAPD_H
 #define HOSTAPD_H
 
+#include "common/defs.h"
+
 #define MAX_VLAN_ID 4094
 
 struct wpa_driver_ops;
@@ -23,6 +25,7 @@ struct radius_server_data;
 struct upnp_wps_device_sm;
 struct hapd_interfaces;
 struct hostapd_data;
+struct sta_info;
 
 #ifdef CONFIG_FULL_DYNAMIC_VLAN
 struct full_dynamic_vlan;
@@ -47,6 +50,14 @@ struct hostapd_driver_ops {
                             const struct wpabuf *probe);
        int (*send_mgmt_frame)(struct hostapd_data *hapd, const void *msg,
                               size_t len);
+       int (*send_eapol)(struct hostapd_data *hapd, const u8 *addr,
+                         const u8 *data, size_t data_len, int encrypt);
+       int (*set_authorized)(struct hostapd_data *hapd, struct sta_info *sta,
+                             int authorized);
+       int (*set_key)(const char *ifname, struct hostapd_data *hapd,
+                      wpa_alg alg, const u8 *addr, int key_idx,
+                      int set_tx, const u8 *seq, size_t seq_len,
+                      const u8 *key, size_t key_len);
 };
 
 /**
index e4db6e6..806dc19 100644 (file)
@@ -306,10 +306,7 @@ static void iapp_process_add_notify(struct iapp_data *iapp,
        hostapd_logger(iapp->hapd, add->mac_addr, HOSTAPD_MODULE_IAPP,
                       HOSTAPD_LEVEL_DEBUG,
                       "Removing STA due to IAPP ADD-notify");
-       sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_AUTHORIZED);
-       eloop_cancel_timeout(ap_handle_timer, iapp->hapd, sta);
-       eloop_register_timeout(0, 0, ap_handle_timer, iapp->hapd, sta);
-       sta->timeout_next = STA_REMOVE;
+       ap_sta_disconnect(iapp->hapd, sta, NULL, 0);
 }
 
 
index f16d713..9340709 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * hostapd / IEEE 802.1X-2004 Authenticator
- * Copyright (c) 2002-2008, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -31,7 +31,7 @@
 #include "wpa.h"
 #include "preauth.h"
 #include "pmksa_cache.h"
-#include "driver_i.h"
+#include "config.h"
 #include "hw_features.h"
 #include "eap_server/eap.h"
 
@@ -70,7 +70,7 @@ static void ieee802_1x_send(struct hostapd_data *hapd, struct sta_info *sta,
        if (sta->flags & WLAN_STA_PREAUTH) {
                rsn_preauth_send(hapd, sta, buf, len);
        } else {
-               hostapd_send_eapol(hapd, sta->addr, buf, len, encrypt);
+               hapd->drv.send_eapol(hapd, sta->addr, buf, len, encrypt);
        }
 
        os_free(buf);
@@ -90,10 +90,7 @@ void ieee802_1x_set_sta_authorized(struct hostapd_data *hapd,
                        wpa_msg(hapd->msg_ctx, MSG_INFO,
                                AP_STA_CONNECTED MACSTR, MAC2STR(sta->addr));
                sta->flags |= WLAN_STA_AUTHORIZED;
-               res = hostapd_sta_set_flags(hapd, sta->addr,
-                                           hostapd_sta_flags_to_drv(
-                                                   sta->flags),
-                                           WPA_STA_AUTHORIZED, ~0);
+               res = hapd->drv.set_authorized(hapd, sta, 1);
                hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
                               HOSTAPD_LEVEL_DEBUG, "authorizing port");
        } else {
@@ -103,10 +100,7 @@ void ieee802_1x_set_sta_authorized(struct hostapd_data *hapd,
                                AP_STA_DISCONNECTED MACSTR,
                                MAC2STR(sta->addr));
                sta->flags &= ~WLAN_STA_AUTHORIZED;
-               res = hostapd_sta_set_flags(hapd, sta->addr,
-                                           hostapd_sta_flags_to_drv(
-                                                   sta->flags),
-                                           0, ~WPA_STA_AUTHORIZED);
+               res = hapd->drv.set_authorized(hapd, sta, 0);
                hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE8021X,
                               HOSTAPD_LEVEL_DEBUG, "unauthorizing port");
        }
@@ -235,8 +229,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_key(ifname, hapd, WPA_ALG_WEP, NULL, key->idx, 1,
-                           NULL, 0, key->key[key->idx], key->len[key->idx]))
+       if (hapd->drv.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_drv_ieee8021x(hapd, ifname, 1);
@@ -351,9 +345,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_key(hapd->conf->iface, hapd, WPA_ALG_WEP,
-                                   sta->addr, 0, 1, NULL, 0, ikey,
-                                   hapd->conf->individual_wep_key_len)) {
+               if (hapd->drv.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.");
                }
@@ -365,10 +359,7 @@ void ieee802_1x_tx_key(struct hostapd_data *hapd, struct sta_info *sta)
 
 const char *radius_mode_txt(struct hostapd_data *hapd)
 {
-       if (hapd->iface->current_mode == NULL)
-               return "802.11";
-
-       switch (hapd->iface->current_mode->mode) {
+       switch (hapd->iface->conf->hw_mode) {
        case HOSTAPD_MODE_IEEE80211A:
                return "802.11a";
        case HOSTAPD_MODE_IEEE80211G:
@@ -1373,13 +1364,8 @@ void ieee802_1x_abort_auth(struct hostapd_data *hapd, struct sta_info *sta)
                 * could only be sent if the EAP peer actually replied).
                 */
                sm->eap_if->portEnabled = FALSE;
-               hostapd_sta_deauth(hapd, sta->addr,
-                                  WLAN_REASON_PREV_AUTH_NOT_VALID);
-               sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC |
-                               WLAN_STA_AUTHORIZED);
-               eloop_cancel_timeout(ap_handle_timer, hapd, sta);
-               eloop_register_timeout(0, 0, ap_handle_timer, hapd, sta);
-               sta->timeout_next = STA_REMOVE;
+               ap_sta_disconnect(hapd, sta, sta->addr,
+                                 WLAN_REASON_PREV_AUTH_NOT_VALID);
        }
 }
 
@@ -1446,10 +1432,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_key(hapd->conf->iface, hapd, WPA_ALG_WEP, NULL,
-                           eapol->default_wep_key_idx, 1, NULL, 0,
-                           eapol->default_wep_key,
-                           hapd->conf->default_wep_key_len)) {
+       if (hapd->drv.set_key(hapd->conf->iface, hapd, WPA_ALG_WEP, NULL,
+                             eapol->default_wep_key_idx, 1, NULL, 0,
+                             eapol->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");
@@ -1669,8 +1655,9 @@ int ieee802_1x_init(struct hostapd_data *hapd)
 
        if (hapd->conf->default_wep_key_len) {
                for (i = 0; i < 4; i++)
-                       hostapd_set_key(hapd->conf->iface, hapd, WPA_ALG_NONE,
-                                       NULL, i, 0, NULL, 0, NULL, 0);
+                       hapd->drv.set_key(hapd->conf->iface, hapd,
+                                         WPA_ALG_NONE, NULL, i, 0, NULL, 0,
+                                         NULL, 0);
 
                ieee802_1x_rekey(hapd, NULL);
 
index 2c82cec..7e564b2 100644 (file)
@@ -721,3 +721,22 @@ void ap_sta_stop_sa_query(struct hostapd_data *hapd, struct sta_info *sta)
 }
 
 #endif /* CONFIG_IEEE80211W */
+
+
+void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta,
+                      const u8 *addr, u16 reason)
+{
+
+       if (sta == NULL && addr)
+               sta = ap_get_sta(hapd, addr);
+
+       if (addr)
+               hostapd_sta_deauth(hapd, addr, reason);
+
+       if (sta == NULL)
+               return;
+       sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_AUTHORIZED);
+       eloop_cancel_timeout(ap_handle_timer, hapd, sta);
+       eloop_register_timeout(0, 0, ap_handle_timer, hapd, sta);
+       sta->timeout_next = STA_REMOVE;
+}
index f15a1b0..55faa5a 100644 (file)
@@ -149,5 +149,7 @@ int ap_sta_bind_vlan(struct hostapd_data *hapd, struct sta_info *sta,
 void ap_sta_start_sa_query(struct hostapd_data *hapd, struct sta_info *sta);
 void ap_sta_stop_sa_query(struct hostapd_data *hapd, struct sta_info *sta);
 int ap_check_sa_query_timeout(struct hostapd_data *hapd, struct sta_info *sta);
+void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta,
+                      const u8 *addr, u16 reason);
 
 #endif /* STA_INFO_H */
index 5a33399..d077532 100644 (file)
@@ -662,9 +662,9 @@ int vlan_setup_encryption_dyn(struct hostapd_data *hapd,
         * functions for setting up dynamic broadcast keys. */
        for (i = 0; i < 4; i++) {
                if (mssid->wep.key[i] &&
-                   hostapd_set_key(dyn_vlan, hapd, WPA_ALG_WEP, NULL, i,
-                                   i == mssid->wep.idx, NULL, 0,
-                                   mssid->wep.key[i], mssid->wep.len[i])) {
+                   hapd->drv.set_key(dyn_vlan, hapd, WPA_ALG_WEP, NULL, i,
+                                     i == mssid->wep.idx, NULL, 0,
+                                     mssid->wep.key[i], mssid->wep.len[i])) {
                        printf("VLAN: Could not set WEP encryption for "
                               "dynamic VLAN.\n");
                        return -1;