wpa_supplicant AP: Add sta_set_flags

This commit is contained in:
Jouni Malinen 2009-04-20 16:33:13 +03:00 committed by Jouni Malinen
parent db149ac949
commit a8d6ffa48f
3 changed files with 65 additions and 51 deletions

View file

@ -40,10 +40,10 @@
#include "radiotap_iter.h" #include "radiotap_iter.h"
#include "../../hostapd/hostapd_defs.h" #include "../../hostapd/hostapd_defs.h"
#include "../../hostapd/sta_flags.h"
#endif /* CONFIG_AP || HOSTAPD */ #endif /* CONFIG_AP || HOSTAPD */
#ifdef HOSTAPD #ifdef HOSTAPD
#include "../../hostapd/sta_flags.h"
#include "ieee802_11_common.h" #include "ieee802_11_common.h"
#ifdef CONFIG_LIBNL20 #ifdef CONFIG_LIBNL20
@ -2955,6 +2955,54 @@ static int wpa_driver_nl80211_hapd_send_eapol(
return res; return res;
} }
static int wpa_driver_nl80211_sta_set_flags(void *priv, const u8 *addr,
int total_flags, int flags_or,
int flags_and)
{
struct wpa_driver_nl80211_data *drv = priv;
struct nl_msg *msg, *flags = NULL;
msg = nlmsg_alloc();
if (!msg)
return -ENOMEM;
flags = nlmsg_alloc();
if (!flags) {
nlmsg_free(msg);
return -ENOMEM;
}
genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
0, NL80211_CMD_SET_STATION, 0);
NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
if_nametoindex(drv->ifname));
NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
if (total_flags & WLAN_STA_AUTHORIZED)
NLA_PUT_FLAG(flags, NL80211_STA_FLAG_AUTHORIZED);
if (total_flags & WLAN_STA_WMM)
NLA_PUT_FLAG(flags, NL80211_STA_FLAG_WME);
if (total_flags & WLAN_STA_SHORT_PREAMBLE)
NLA_PUT_FLAG(flags, NL80211_STA_FLAG_SHORT_PREAMBLE);
if (total_flags & WLAN_STA_MFP)
NLA_PUT_FLAG(flags, NL80211_STA_FLAG_MFP);
if (nla_put_nested(msg, NL80211_ATTR_STA_FLAGS, flags))
goto nla_put_failure;
nlmsg_free(flags);
return send_and_recv_msgs(drv, msg, NULL, NULL);
nla_put_failure:
nlmsg_free(flags);
return -ENOBUFS;
}
#endif /* CONFIG_AP || HOSTAPD */ #endif /* CONFIG_AP || HOSTAPD */
#ifdef CONFIG_AP #ifdef CONFIG_AP
@ -3517,53 +3565,6 @@ static int i802_read_sta_data(void *priv, struct hostap_sta_driver_data *data,
} }
static int i802_sta_set_flags(void *priv, const u8 *addr,
int total_flags, int flags_or, int flags_and)
{
struct wpa_driver_nl80211_data *drv = priv;
struct nl_msg *msg, *flags = NULL;
msg = nlmsg_alloc();
if (!msg)
return -ENOMEM;
flags = nlmsg_alloc();
if (!flags) {
nlmsg_free(msg);
return -ENOMEM;
}
genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0,
0, NL80211_CMD_SET_STATION, 0);
NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
if_nametoindex(drv->ifname));
NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
if (total_flags & WLAN_STA_AUTHORIZED)
NLA_PUT_FLAG(flags, NL80211_STA_FLAG_AUTHORIZED);
if (total_flags & WLAN_STA_WMM)
NLA_PUT_FLAG(flags, NL80211_STA_FLAG_WME);
if (total_flags & WLAN_STA_SHORT_PREAMBLE)
NLA_PUT_FLAG(flags, NL80211_STA_FLAG_SHORT_PREAMBLE);
if (total_flags & WLAN_STA_MFP)
NLA_PUT_FLAG(flags, NL80211_STA_FLAG_MFP);
if (nla_put_nested(msg, NL80211_ATTR_STA_FLAGS, flags))
goto nla_put_failure;
nlmsg_free(flags);
return send_and_recv_msgs(drv, msg, NULL, NULL);
nla_put_failure:
nlmsg_free(flags);
return -ENOBUFS;
}
static int i802_set_tx_queue_params(void *priv, int queue, int aifs, static int i802_set_tx_queue_params(void *priv, int queue, int aifs,
int cw_min, int cw_max, int burst_time) int cw_min, int cw_max, int burst_time)
{ {
@ -3970,6 +3971,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
.sta_add = wpa_driver_nl80211_sta_add, .sta_add = wpa_driver_nl80211_sta_add,
.sta_remove = wpa_driver_nl80211_sta_remove, .sta_remove = wpa_driver_nl80211_sta_remove,
.hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol, .hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol,
.sta_set_flags = wpa_driver_nl80211_sta_set_flags,
#endif /* CONFIG_AP || HOSTAPD */ #endif /* CONFIG_AP || HOSTAPD */
#ifdef HOSTAPD #ifdef HOSTAPD
.hapd_init = i802_init, .hapd_init = i802_init,
@ -3978,7 +3980,6 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
.get_seqnum = i802_get_seqnum, .get_seqnum = i802_get_seqnum,
.flush = i802_flush, .flush = i802_flush,
.read_sta_data = i802_read_sta_data, .read_sta_data = i802_read_sta_data,
.sta_set_flags = i802_sta_set_flags,
.sta_deauth = i802_sta_deauth, .sta_deauth = i802_sta_deauth,
.sta_disassoc = i802_sta_disassoc, .sta_disassoc = i802_sta_disassoc,
.get_inact_sec = i802_get_inact_sec, .get_inact_sec = i802_get_inact_sec,

View file

@ -128,8 +128,10 @@ static int ap_driver_read_sta_data(void *priv,
static int ap_driver_sta_set_flags(void *priv, const u8 *addr, int total_flags, static int ap_driver_sta_set_flags(void *priv, const u8 *addr, int total_flags,
int flags_or, int flags_and) int flags_or, int flags_and)
{ {
wpa_printf(MSG_DEBUG, "AP TODO: %s", __func__); struct ap_driver_data *drv = priv;
return -1; struct wpa_supplicant *wpa_s = drv->hapd->iface->owner;
return wpa_drv_sta_set_flags(wpa_s, addr, total_flags, flags_or,
flags_and);
} }

View file

@ -427,4 +427,15 @@ static inline int wpa_drv_hapd_send_eapol(struct wpa_supplicant *wpa_s,
return -1; return -1;
} }
static inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s,
const u8 *addr, int total_flags,
int flags_or, int flags_and)
{
if (wpa_s->driver->sta_set_flags)
return wpa_s->driver->sta_set_flags(wpa_s->drv_priv, addr,
total_flags, flags_or,
flags_and);
return -1;
}
#endif /* DRIVER_I_H */ #endif /* DRIVER_I_H */