On Fri, Feb 10, 2012 at 12:53 AM, Luis R. Rodriguez <mcgrof@xxxxxxxxxxxxx> wrote: > On Thu, Jan 26, 2012 at 4:38 AM, Victor Goldenshtein <victorg@xxxxxx> wrote: >> Add new NL80211_CMD_AP_CHANNEL_SWITCH command which >> triggers a channel switch process, this command also >> notifies usermode about channel switch complete event. >> >> Signed-off-by: Victor Goldenshtein <victorg@xxxxxx> >> --- >> include/linux/nl80211.h | 23 +++++++++++++ >> include/net/cfg80211.h | 16 +++++++++ >> net/wireless/mlme.c | 11 ++++++ >> net/wireless/nl80211.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++ >> net/wireless/nl80211.h | 4 ++ >> 5 files changed, 134 insertions(+), 0 deletions(-) >> >> diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h >> index b45ceb1..8a004fc 100644 >> --- a/include/linux/nl80211.h >> +++ b/include/linux/nl80211.h >> @@ -551,6 +551,15 @@ >> * radar interference is detected during this period the dfs master may >> * initiate the tx. >> * >> + * @NL80211_CMD_AP_CHANNEL_SWITCH: Perform a channel switch in the driver (for >> + * AP/GO). >> + * %NL80211_ATTR_WIPHY_FREQ: new channel frequency. >> + * %NL80211_ATTR_CH_SWITCH_BLOCK_TX: block tx on the current channel. >> + * %NL80211_ATTR_CH_SWITCH_POST_BLOCK_TX: block tx on the target channel. > > This is left as optional. It would be good to explain why this is > option and/or why userspace would set this > NL80211_ATTR_CH_SWITCH_POST_BLOCK_TX flag or not. > >> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c >> @@ -4072,6 +4075,39 @@ static int nl80211_dfs_en_tx(struct sk_buff *skb, struct genl_info *info) >> return rdev->ops->dfs_en_tx(&rdev->wiphy, dev); >> } >> >> +static int nl80211_ap_channel_switch(struct sk_buff *skb, >> + struct genl_info *info) >> +{ >> + struct cfg80211_registered_device *rdev = info->user_ptr[0]; >> + struct net_device *dev = info->user_ptr[1]; >> + u32 freq = 0, count = 0, post_switch_block_tx = 0, block_tx = 0; > > Please use bool for flags. > ok. >> + >> + ASSERT_RDEV_LOCK(rdev); >> + >> + if (!rdev->ops->ap_channel_switch) >> + return -EOPNOTSUPP; >> + >> + if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && >> + dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) >> + return -EOPNOTSUPP; > > If we want to restrict this command from userspace to only be able to > issue a channel switch for DFS we need to consider some additional > sanity checks here. It may be worth adding a small state machine to > cfg80211 for the device and only allow certain of these commands for > specific DFS states, if these commands are to be used only on DFS > states. This would limit the stupidities that userspace can put > cfg80211 into. > DFS implementation in driver has only one state - DFS_CAC_IN_PROGRESS, so I"m not sure we need here a state machine but some sanity checks will be added in the next RFC. -- Thanks, Victor. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html