From f019981aee20f53d29ee1079973e609517d6d7e6 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Tue, 14 Apr 2009 15:15:33 +0300 Subject: [PATCH] nl82011: Use common code for setting channel --- src/drivers/driver_nl80211.c | 102 +++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 60 deletions(-) diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 2c20293..5993c97 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -2100,27 +2100,10 @@ static int wpa_driver_nl80211_set_beacon_int(void *priv, int value) return -ENOBUFS; } -#endif /* CONFIG_AP || HOSTAPD */ - - -#ifdef CONFIG_AP - -static int wpa_driver_nl80211_set_beacon(void *priv, - const u8 *head, size_t head_len, - const u8 *tail, size_t tail_len, - int dtim_period) -{ - struct wpa_driver_nl80211_data *drv = priv; - return wpa_driver_nl80211_set_beacon_iface(drv->ifindex, priv, - head, head_len, - tail, tail_len, - dtim_period); -} - -static int wpa_driver_nl80211_set_freq2( - struct wpa_driver_nl80211_data *drv, - struct wpa_driver_associate_params *params) +static int wpa_driver_nl80211_set_freq(struct wpa_driver_nl80211_data *drv, + int freq, int ht_enabled, + int sec_channel_offset) { struct nl_msg *msg; int ret; @@ -2133,18 +2116,50 @@ static int wpa_driver_nl80211_set_freq2( NL80211_CMD_SET_WIPHY, 0); NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex); - - NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq); + NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq); + if (ht_enabled) { + switch (sec_channel_offset) { + case -1: + NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, + NL80211_CHAN_HT40MINUS); + break; + case 1: + NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, + NL80211_CHAN_HT40PLUS); + break; + default: + NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, + NL80211_CHAN_HT20); + break; + } + } ret = send_and_recv_msgs(drv, msg, NULL, NULL); if (ret == 0) return 0; - wpa_printf(MSG_DEBUG, "nl80211: MLME Failed to set channel (freq=%d): " - "%d (%s)", params->freq, ret, strerror(-ret)); + wpa_printf(MSG_DEBUG, "nl80211: Failed to set channel (freq=%d): " + "%d (%s)", freq, ret, strerror(-ret)); nla_put_failure: return -1; } +#endif /* CONFIG_AP || HOSTAPD */ + + +#ifdef CONFIG_AP + +static int wpa_driver_nl80211_set_beacon(void *priv, + const u8 *head, size_t head_len, + const u8 *tail, size_t tail_len, + int dtim_period) +{ + struct wpa_driver_nl80211_data *drv = priv; + return wpa_driver_nl80211_set_beacon_iface(drv->ifindex, priv, + head, head_len, + tail, tail_len, + dtim_period); +} + #endif /* CONFIG_AP */ #if defined(CONFIG_AP) || defined(HOSTAPD) @@ -2693,7 +2708,7 @@ static int wpa_driver_nl80211_ap(struct wpa_driver_nl80211_data *drv, return -1; if (wpa_driver_nl80211_set_mode(drv, params->mode) || - wpa_driver_nl80211_set_freq2(drv, params)) { + wpa_driver_nl80211_set_freq(drv, params->freq, 0, 0)) { nl80211_remove_iface(drv, drv->monitor_ifidx); drv->monitor_ifidx = -1; return -1; @@ -3057,41 +3072,8 @@ static int i802_set_rate_sets(void *priv, int *supp_rates, int *basic_rates, static int i802_set_freq(void *priv, struct hostapd_freq_params *freq) { struct wpa_driver_nl80211_data *drv = priv; - struct nl_msg *msg; - - msg = nlmsg_alloc(); - if (!msg) - return -1; - - drv->last_freq = freq->freq; - drv->last_freq_ht = freq->ht_enabled; - - genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0, - NL80211_CMD_SET_WIPHY, 0); - - NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->ifname)); - NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq->freq); - if (freq->ht_enabled) { - switch (freq->sec_channel_offset) { - case -1: - NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, - NL80211_CHAN_HT40MINUS); - break; - case 1: - NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, - NL80211_CHAN_HT40PLUS); - break; - default: - NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, - NL80211_CHAN_HT20); - break; - } - } - - if (send_and_recv_msgs(drv, msg, NULL, NULL) == 0) - return 0; - nla_put_failure: - return -1; + return wpa_driver_nl80211_set_freq(drv, freq->freq, freq->ht_enabled, + freq->sec_channel_offset); } -- 1.7.9.5