Commit 72bdcf34 authored by Jouni Malinen's avatar Jouni Malinen Committed by John W. Linville
Browse files

nl80211: Add frequency configuration (including HT40)



This patch adds new NL80211_CMD_SET_WIPHY attributes
NL80211_ATTR_WIPHY_FREQ and NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET to allow
userspace to set the operating channel (e.g., hostapd for AP mode).

Signed-off-by: default avatarJouni Malinen <jouni.malinen@atheros.com>
Acked-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 72eaa43a
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -26,8 +26,9 @@
 * @NL80211_CMD_GET_WIPHY: request information about a wiphy or dump request
 *	to get a list of all present wiphys.
 * @NL80211_CMD_SET_WIPHY: set wiphy parameters, needs %NL80211_ATTR_WIPHY or
 *	%NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME
 *	and/or %NL80211_ATTR_WIPHY_TXQ_PARAMS.
 *	%NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME,
 *	%NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ, and/or
 *	%NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET.
 * @NL80211_CMD_NEW_WIPHY: Newly created wiphy, response to get request
 *	or rename notification. Has attributes %NL80211_ATTR_WIPHY and
 *	%NL80211_ATTR_WIPHY_NAME.
@@ -180,6 +181,14 @@ enum nl80211_commands {
 *	/sys/class/ieee80211/<phyname>/index
 * @NL80211_ATTR_WIPHY_NAME: wiphy name (used for renaming)
 * @NL80211_ATTR_WIPHY_TXQ_PARAMS: a nested array of TX queue parameters
 * @NL80211_ATTR_WIPHY_FREQ: frequency of the selected channel in MHz
 * @NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET: included with NL80211_ATTR_WIPHY_FREQ
 *	if HT20 or HT40 are allowed (i.e., 802.11n disabled if not included):
 *	NL80211_SEC_CHAN_NO_HT = HT not allowed (i.e., same as not including
 *		this attribute)
 *	NL80211_SEC_CHAN_DISABLED = HT20 only
 *	NL80211_SEC_CHAN_BELOW = secondary channel is below the primary channel
 *	NL80211_SEC_CHAN_ABOVE = secondary channel is above the primary channel
 *
 * @NL80211_ATTR_IFINDEX: network interface index of the device to operate on
 * @NL80211_ATTR_IFNAME: network interface name
@@ -315,6 +324,8 @@ enum nl80211_attrs {
	NL80211_ATTR_BSS_BASIC_RATES,

	NL80211_ATTR_WIPHY_TXQ_PARAMS,
	NL80211_ATTR_WIPHY_FREQ,
	NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET,

	/* add attributes here, update the policy in nl80211.c */

@@ -329,6 +340,8 @@ enum nl80211_attrs {
#define NL80211_ATTR_HT_CAPABILITY NL80211_ATTR_HT_CAPABILITY
#define NL80211_ATTR_BSS_BASIC_RATES NL80211_ATTR_BSS_BASIC_RATES
#define NL80211_ATTR_WIPHY_TXQ_PARAMS NL80211_ATTR_WIPHY_TXQ_PARAMS
#define NL80211_ATTR_WIPHY_FREQ NL80211_ATTR_WIPHY_FREQ
#define NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET

#define NL80211_MAX_SUPP_RATES			32
#define NL80211_MAX_SUPP_REG_RULES		32
@@ -742,4 +755,10 @@ enum nl80211_txq_q {
	NL80211_TXQ_Q_BK
};

enum nl80211_sec_chan_offset {
	NL80211_SEC_CHAN_NO_HT /* No HT */,
	NL80211_SEC_CHAN_DISABLED /* HT20 only */,
	NL80211_SEC_CHAN_BELOW /* HT40- */,
	NL80211_SEC_CHAN_ABOVE /* HT40+ */
};
#endif /* __LINUX_NL80211_H */
+9 −0
Original line number Diff line number Diff line
@@ -392,6 +392,9 @@ struct ieee80211_txq_params {
/* from net/wireless.h */
struct wiphy;

/* from net/ieee80211.h */
struct ieee80211_channel;

/**
 * struct cfg80211_ops - backend description for wireless configuration
 *
@@ -450,6 +453,8 @@ struct wiphy;
 * @change_bss: Modify parameters for a given BSS.
 *
 * @set_txq_params: Set TX queue parameters
 *
 * @set_channel: Set channel
 */
struct cfg80211_ops {
	int	(*add_virtual_intf)(struct wiphy *wiphy, char *name,
@@ -513,6 +518,10 @@ struct cfg80211_ops {

	int	(*set_txq_params)(struct wiphy *wiphy,
				  struct ieee80211_txq_params *params);

	int	(*set_channel)(struct wiphy *wiphy,
			       struct ieee80211_channel *chan,
			       enum nl80211_sec_chan_offset);
};

#endif /* __NET_CFG80211_H */
+3 −0
Original line number Diff line number Diff line
@@ -507,6 +507,9 @@ static inline int __deprecated __IEEE80211_CONF_SHORT_SLOT_TIME(void)

struct ieee80211_ht_conf {
	bool enabled;
	int sec_chan_offset; /* 0 = HT40 disabled; -1 = HT40 enabled, secondary
			      * channel below primary; 1 = HT40 enabled,
			      * secondary channel above primary */
};

/**
+13 −0
Original line number Diff line number Diff line
@@ -1095,6 +1095,18 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
	return 0;
}

static int ieee80211_set_channel(struct wiphy *wiphy,
				 struct ieee80211_channel *chan,
				 enum nl80211_sec_chan_offset sec_chan_offset)
{
	struct ieee80211_local *local = wiphy_priv(wiphy);

	local->oper_channel = chan;
	local->oper_sec_chan_offset = sec_chan_offset;

	return ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
}

struct cfg80211_ops mac80211_config_ops = {
	.add_virtual_intf = ieee80211_add_iface,
	.del_virtual_intf = ieee80211_del_iface,
@@ -1122,4 +1134,5 @@ struct cfg80211_ops mac80211_config_ops = {
#endif
	.change_bss = ieee80211_change_bss,
	.set_txq_params = ieee80211_set_txq_params,
	.set_channel = ieee80211_set_channel,
};
+1 −0
Original line number Diff line number Diff line
@@ -626,6 +626,7 @@ struct ieee80211_local {
	struct delayed_work scan_work;
	struct ieee80211_sub_if_data *scan_sdata;
	struct ieee80211_channel *oper_channel, *scan_channel;
	enum nl80211_sec_chan_offset oper_sec_chan_offset;
	u8 scan_ssid[IEEE80211_MAX_SSID_LEN];
	size_t scan_ssid_len;
	struct list_head bss_list;
Loading