Browse Source

Move more driver ops into struct hostapd_driver_ops

This removes need to include driver_i.h into ieee802_1x.c.
Jouni Malinen 15 years ago
parent
commit
45cefa0bf3
9 changed files with 122 additions and 94 deletions
  1. 44 0
      hostapd/ap_drv_ops.c
  2. 0 24
      hostapd/driver_i.h
  3. 21 29
      hostapd/hostapd.c
  4. 12 1
      hostapd/hostapd.h
  5. 1 4
      hostapd/iapp.c
  6. 20 33
      hostapd/ieee802_1x.c
  7. 19 0
      hostapd/sta_info.c
  8. 2 0
      hostapd/sta_info.h
  9. 3 3
      hostapd/vlan_init.c

+ 44 - 0
hostapd/ap_drv_ops.c

@@ -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;
 }

+ 0 - 24
hostapd/driver_i.h

@@ -79,19 +79,6 @@ hostapd_set_privacy(struct hostapd_data *hapd, int enabled)
 					 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)
@@ -129,17 +116,6 @@ hostapd_read_sta_data(struct hostapd_data *hapd,
 	return hapd->driver->read_sta_data(hapd->drv_priv, data, addr);
 }
 
-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)
 {

+ 21 - 29
hostapd/hostapd.c

@@ -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);
 }
 
 

+ 12 - 1
hostapd/hostapd.h

@@ -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);
 };
 
 /**

+ 1 - 4
hostapd/iapp.c

@@ -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);
 }
 
 

+ 20 - 33
hostapd/ieee802_1x.c

@@ -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);
 

+ 19 - 0
hostapd/sta_info.c

@@ -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;
+}

+ 2 - 0
hostapd/sta_info.h

@@ -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 */

+ 3 - 3
hostapd/vlan_init.c

@@ -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;