Move RX-from-unknown-STA processing away from driver_*.c

This cleans up the driver wrapper interface by getting rid of sta_info.h
dependency in all drivers that use MLME implementation in hostapd
(driver_hostap.c and driver_nl80211.c).
This commit is contained in:
Jouni Malinen 2009-01-09 15:44:45 +02:00 committed by Jouni Malinen
parent 8607f4c31f
commit 214021f585
4 changed files with 24 additions and 39 deletions

View file

@ -215,5 +215,6 @@ void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
int reassoc); int reassoc);
void hostapd_tx_status(struct hostapd_data *hapd, const u8 *addr, void hostapd_tx_status(struct hostapd_data *hapd, const u8 *addr,
const u8 *buf, size_t len, int ack); const u8 *buf, size_t len, int ack);
void hostapd_rx_from_unknown_sta(struct hostapd_data *hapd, const u8 *addr);
#endif /* DRIVER_H */ #endif /* DRIVER_H */

View file

@ -38,7 +38,6 @@
#include "eloop.h" #include "eloop.h"
#include "priv_netlink.h" #include "priv_netlink.h"
#include "ieee802_11.h" #include "ieee802_11.h"
#include "sta_info.h"
#include "hostap_common.h" #include "hostap_common.h"
#include "hw_features.h" #include "hw_features.h"
@ -74,7 +73,6 @@ static void handle_data(struct hostap_driver_data *drv, u8 *buf, size_t len,
u16 fc, ethertype; u16 fc, ethertype;
u8 *pos, *sa; u8 *pos, *sa;
size_t left; size_t left;
struct sta_info *sta;
if (len < sizeof(struct ieee80211_hdr)) if (len < sizeof(struct ieee80211_hdr))
return; return;
@ -88,20 +86,7 @@ static void handle_data(struct hostap_driver_data *drv, u8 *buf, size_t len,
} }
sa = hdr->addr2; sa = hdr->addr2;
sta = ap_get_sta(drv->hapd, sa); hostapd_rx_from_unknown_sta(drv->hapd, sa);
if (!sta || !(sta->flags & WLAN_STA_ASSOC)) {
printf("Data frame from not associated STA " MACSTR "\n",
MAC2STR(sa));
if (sta && (sta->flags & WLAN_STA_AUTH))
hostap_sta_disassoc(
drv, sa,
WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
else
hostap_sta_deauth(
drv, sa,
WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
return;
}
pos = (u8 *) (hdr + 1); pos = (u8 *) (hdr + 1);
left = len - sizeof(*hdr); left = len - sizeof(*hdr);

View file

@ -34,7 +34,6 @@
#include "ieee802_1x.h" #include "ieee802_1x.h"
#include "eloop.h" #include "eloop.h"
#include "ieee802_11.h" #include "ieee802_11.h"
#include "sta_info.h"
#include "hw_features.h" #include "hw_features.h"
#include "mlme.h" #include "mlme.h"
#include "radiotap.h" #include "radiotap.h"
@ -1636,26 +1635,6 @@ static int i802_set_country(void *priv, const char *country)
} }
static void handle_unknown_sta(struct i802_driver_data *drv, u8 *ta)
{
struct sta_info *sta;
sta = ap_get_sta(drv->hapd, ta);
if (!sta || !(sta->flags & WLAN_STA_ASSOC)) {
printf("Data/PS-poll frame from not associated STA "
MACSTR "\n", MAC2STR(ta));
if (sta && (sta->flags & WLAN_STA_AUTH))
i802_sta_disassoc(
drv, ta,
WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
else
i802_sta_deauth(
drv, ta,
WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
}
}
static void handle_tx_callback(struct hostapd_data *hapd, u8 *buf, size_t len, static void handle_tx_callback(struct hostapd_data *hapd, u8 *buf, size_t len,
int ok) int ok)
{ {
@ -1797,10 +1776,10 @@ static void handle_frame(struct i802_driver_data *drv,
case WLAN_FC_TYPE_CTRL: case WLAN_FC_TYPE_CTRL:
/* can only get here with PS-Poll frames */ /* can only get here with PS-Poll frames */
wpa_printf(MSG_DEBUG, "CTRL"); wpa_printf(MSG_DEBUG, "CTRL");
handle_unknown_sta(drv, hdr->addr2); hostapd_rx_from_unknown_sta(drv->hapd, hdr->addr2);
break; break;
case WLAN_FC_TYPE_DATA: case WLAN_FC_TYPE_DATA:
handle_unknown_sta(drv, hdr->addr2); hostapd_rx_from_unknown_sta(drv->hapd, hdr->addr2);
break; break;
} }
} }

View file

@ -278,6 +278,26 @@ void hostapd_tx_status(struct hostapd_data *hapd, const u8 *addr,
} }
void hostapd_rx_from_unknown_sta(struct hostapd_data *hapd, const u8 *addr)
{
struct sta_info *sta;
sta = ap_get_sta(hapd, addr);
if (!sta || !(sta->flags & WLAN_STA_ASSOC)) {
wpa_printf(MSG_DEBUG, "Data/PS-poll frame from not associated "
"STA " MACSTR, MAC2STR(addr));
if (sta && (sta->flags & WLAN_STA_AUTH))
hostapd_sta_disassoc(
hapd, addr,
WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
else
hostapd_sta_deauth(
hapd, addr,
WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
}
}
#ifdef EAP_SERVER #ifdef EAP_SERVER
static int hostapd_sim_db_cb_sta(struct hostapd_data *hapd, static int hostapd_sim_db_cb_sta(struct hostapd_data *hapd,
struct sta_info *sta, void *ctx) struct sta_info *sta, void *ctx)