mac80211 fixes
Johannes Berg
maintainercover mac80211 fixes
various things
johannes
Johannes Berg
maintainerPATCH 1/3 mac80211: remove IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE flag
I forgot this in the previous patch that made it unused.
Signed-off-by Johannes Berg <[email protected]>
--- drivers/net/wireless/b43/main.c | 3 +-- drivers/net/wireless/b43legacy/main.c | 3 +-- drivers/net/wireless/iwlwifi/iwl-core.c | 3 +-- drivers/net/wireless/iwlwifi/iwl3945-base.c | 3 +-- drivers/net/wireless/rt2x00/rt2500usb.c | 1 - drivers/net/wireless/rt2x00/rt61pci.c | 1 - drivers/net/wireless/rt2x00/rt73usb.c | 1 - drivers/net/wireless/zd1211rw/zd_mac.c | 1 - include/net/mac80211.h | 1 - 9 files changed, 4 insertions(+), 13 deletions(-)
include/net/mac80211.h +0 -1
@@ -740,7 +740,6 @@ enum ieee80211_tkip_key_type {* Measurement, Channel Switch, Quieting, TPC */ enum ieee80211_hw_flags { -IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE =1 <<0 ,IEEE80211_HW_RX_INCLUDES_FCS =1 <<1 ,IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING =1 <<2 ,IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE =1 <<3 ,
drivers/net/wireless/b43/main.c +1 -2
@@ -4645,8 +4645,7 @@ static int b43_wireless_init(struct ssb_ }/* fill hw info */ - hw->flags =IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE | -IEEE80211_HW_RX_INCLUDES_FCS | + hw->flags =IEEE80211_HW_RX_INCLUDES_FCS |IEEE80211_HW_SIGNAL_DBM |IEEE80211_HW_NOISE_DBM ;
drivers/net/wireless/b43legacy/main.c +1 -2
@@ -3702,8 +3702,7 @@ static int b43legacy_wireless_init(struc }/* fill hw info */ - hw->flags =IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE | -IEEE80211_HW_RX_INCLUDES_FCS | + hw->flags =IEEE80211_HW_RX_INCLUDES_FCS |IEEE80211_HW_SIGNAL_DBM |IEEE80211_HW_NOISE_DBM ; hw->queues =1 ;/* FIXME: hardware has more queues */
drivers/net/wireless/iwlwifi/iwl-core.c +1 -2
@@ -818,8 +818,7 @@ int iwl_setup_mac(struct iwl_priv *priv) hw->rate_control_algorithm ="iwl-4965-rs" ;/* Tell mac80211 our characteristics */ - hw->flags =IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE | -IEEE80211_HW_SIGNAL_DBM | + hw->flags =IEEE80211_HW_SIGNAL_DBM |IEEE80211_HW_NOISE_DBM ;/* Default value; 4 EDCA QOS priorities */ hw->queues =4 ;
drivers/net/wireless/iwlwifi/iwl3945-base.c +1 -2
@@ -7899,8 +7899,7 @@ static int iwl3945_pci_probe(struct pci_ priv->ibss_beacon =NULL ;/* Tell mac80211 our characteristics */ - hw->flags =IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE | -IEEE80211_HW_SIGNAL_DBM | + hw->flags =IEEE80211_HW_SIGNAL_DBM |IEEE80211_HW_NOISE_DBM ;/* 4 EDCA QOS priorities */
drivers/net/wireless/rt2x00/rt2500usb.c +0 -1
@@ -1650,7 +1650,6 @@ static void rt2500usb_probe_hw_mode(stru* Initialize all hw fields. */ rt2x00dev->hw->flags = -IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |IEEE80211_HW_RX_INCLUDES_FCS |IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |IEEE80211_HW_SIGNAL_DBM ;
drivers/net/wireless/rt2x00/rt61pci.c +0 -1
@@ -2278,7 +2278,6 @@ static void rt61pci_probe_hw_mode(struct* Initialize all hw fields. */ rt2x00dev->hw->flags = -IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |IEEE80211_HW_SIGNAL_DBM ; rt2x00dev->hw->extra_tx_headroom =0 ;
drivers/net/wireless/rt2x00/rt73usb.c +0 -1
@@ -1871,7 +1871,6 @@ static void rt73usb_probe_hw_mode(struct* Initialize all hw fields. */ rt2x00dev->hw->flags = -IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |IEEE80211_HW_SIGNAL_DBM ; rt2x00dev->hw->extra_tx_headroom =TXD_DESC_SIZE ;
drivers/net/wireless/zd1211rw/zd_mac.c +0 -1
@@ -935,7 +935,6 @@ struct ieee80211_hw *zd_mac_alloc_hw(str hw->wiphy->bands[IEEE80211_BAND_2GHZ ] = &mac->band; hw->flags =IEEE80211_HW_RX_INCLUDES_FCS | -IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE |IEEE80211_HW_SIGNAL_DB ; hw->max_signal =100 ;
Johannes Berg
maintainerPATCH 2/3 nl80211: fix dump callbacks
In reply to Johannes BergJulius Volz pointed out that the dump callbacks in nl80211 were broken and fixed one of them. This patch fixes the other three and also addresses the TODOs there.
Signed-off-by Johannes Berg <[email protected]>
Cc Julius Volz <[email protected]>
Cc Thomas Graf <[email protected]>
--- net/wireless/nl80211.c | 275 +++++++++++++++++++++++++++---------------------- 1 file changed, 153 insertions(+), 122 deletions(-)
net/wireless/nl80211.c +153 -122
@@ -29,16 +29,16 @@ static struct genl_family nl80211_fam = };/* internal helper: get drv and dev */ -static int get_drv_dev_by_info_ifindex (struct genl_info *info, +static int get_drv_dev_by_info_ifindex (struct nlattr **attrs,struct cfg80211_registered_device **drv,struct net_device **dev) {int ifindex; -if (!info->attrs[NL80211_ATTR_IFINDEX ]) +if (!attrs[NL80211_ATTR_IFINDEX ])return -EINVAL ; - ifindex =nla_get_u32 (info->attrs[NL80211_ATTR_IFINDEX ]); + ifindex =nla_get_u32 (attrs[NL80211_ATTR_IFINDEX ]); *dev =dev_get_by_index (&init_net, ifindex);if (!*dev)return -ENODEV ;
@@ -291,21 +291,31 @@ static int nl80211_dump_interface(structmutex_lock (&cfg80211_drv_mutex);list_for_each_entry (dev, &cfg80211_drv_list, list) { -if (++wp_idx < wp_start) +if (wp_idx < wp_start) { + wp_idx++;continue ; + } if_idx =0 ;mutex_lock (&dev->devlist_mtx);list_for_each_entry (wdev, &dev->netdev_list, list) { -if (++if_idx < if_start) +if (if_idx < if_start) { + if_idx++;continue ; + }if (nl80211_send_iface (skb,NETLINK_CB (cb->skb).pid, cb->nlh->nlmsg_seq,NLM_F_MULTI , - wdev->netdev) <0 ) -break ; + wdev->netdev) <0 ) { +mutex_unlock (&dev->devlist_mtx); + goto out; + } + if_idx++; }mutex_unlock (&dev->devlist_mtx); + + wp_idx++; } + out:mutex_unlock (&cfg80211_drv_mutex); cb->args[0 ] = wp_idx;
@@ -321,7 +331,7 @@ static int nl80211_get_interface(structstruct net_device *netdev;int err; - err =get_drv_dev_by_info_ifindex (info, &dev, &netdev); + err =get_drv_dev_by_info_ifindex (info->attrs, &dev, &netdev);if (err)return err;
@@ -392,7 +402,7 @@ static int nl80211_set_interface(struct }else return -EINVAL ; - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err; ifindex = dev->ifindex;
@@ -477,7 +487,7 @@ static int nl80211_del_interface(structint ifindex, err;struct net_device *dev; - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err; ifindex = dev->ifindex;
@@ -545,7 +555,7 @@ static int nl80211_get_key(struct sk_bufif (info->attrs[NL80211_ATTR_MAC ]) mac_addr =nla_data (info->attrs[NL80211_ATTR_MAC ]); - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -618,7 +628,7 @@ static int nl80211_set_key(struct sk_bufif (!info->attrs[NL80211_ATTR_KEY_DEFAULT ])return -EINVAL ; - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -699,7 +709,7 @@ static int nl80211_new_key(struct sk_bufreturn -EINVAL ; } - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -735,7 +745,7 @@ static int nl80211_del_key(struct sk_bufif (info->attrs[NL80211_ATTR_MAC ]) mac_addr =nla_data (info->attrs[NL80211_ATTR_MAC ]); - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -764,7 +774,7 @@ static int nl80211_addset_beacon(structstruct beacon_parameters params;int haveinfo =0 ; - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -843,7 +853,7 @@ static int nl80211_del_beacon(struct sk_int err;struct net_device *dev; - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -937,67 +947,78 @@ static int nl80211_send_station(struct s }static int nl80211_dump_station (struct sk_buff *skb, -struct netlink_callback *cb) +struct netlink_callback *cb) { -int wp_idx =0 ; -int if_idx =0 ; -int sta_idx = cb->args[2 ]; -int wp_start = cb->args[0 ]; -int if_start = cb->args[1 ];struct station_info sinfo;struct cfg80211_registered_device *dev; -struct wireless_dev *wdev; +struct net_device *netdev;u8 mac_addr[ETH_ALEN ]; +int ifidx = cb->args[0 ]; +int sta_idx = cb->args[1 ];int err; -int exit =0 ; -/* TODO: filter by device */ -mutex_lock (&cfg80211_drv_mutex); -list_for_each_entry (dev, &cfg80211_drv_list, list) { -if (exit) +if (!ifidx) { + err =nlmsg_parse (cb->nlh,GENL_HDRLEN + nl80211_fam.hdrsize, + nl80211_fam.attrbuf, nl80211_fam.maxattr, + nl80211_policy); +if (err) +return err; + +if (!nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX ]) +return -EINVAL ; + + ifidx =nla_get_u32 (nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX ]); +if (!ifidx) +return -EINVAL ; + } + + netdev =dev_get_by_index (&init_net, ifidx); +if (!netdev) +return -ENODEV ; + + dev =cfg80211_get_dev_from_ifindex (ifidx); +if (IS_ERR (dev)) { + err =PTR_ERR (dev); + goto out_put_netdev; + } + +if (!dev->ops->dump_station) { + err = -ENOSYS ; + goto out_err; + } + +rtnl_lock (); + +while (1 ) { + err = dev->ops->dump_station (&dev->wiphy, netdev, sta_idx, + mac_addr, &sinfo); +if (err == -ENOENT )break ; -if (++wp_idx < wp_start) -continue ; - if_idx =0 ; +if (err) + goto out_err_rtnl; -mutex_lock (&dev->devlist_mtx); -list_for_each_entry (wdev, &dev->netdev_list, list) { -if (exit) -break ; -if (++if_idx < if_start) -continue ; -if (!dev->ops->dump_station) -continue ; +if (nl80211_send_station (skb, +NETLINK_CB (cb->skb).pid, + cb->nlh->nlmsg_seq,NLM_F_MULTI , + netdev, mac_addr, + &sinfo) <0 ) + goto out; -for (;; ++sta_idx) { -rtnl_lock (); - err = dev->ops->dump_station (&dev->wiphy, - wdev->netdev, sta_idx, mac_addr, - &sinfo); -rtnl_unlock (); -if (err) { - sta_idx =0 ; -break ; - } -if (nl80211_send_station (skb, -NETLINK_CB (cb->skb).pid, - cb->nlh->nlmsg_seq,NLM_F_MULTI , - wdev->netdev, mac_addr, - &sinfo) <0 ) { - exit =1 ; -break ; - } - } - } -mutex_unlock (&dev->devlist_mtx); + sta_idx++; } -mutex_unlock (&cfg80211_drv_mutex); - cb->args[0 ] = wp_idx; - cb->args[1 ] = if_idx; - cb->args[2 ] = sta_idx; -return skb->len; + out: + cb->args[1 ] = sta_idx; + err = skb->len; + out_err_rtnl: +rtnl_unlock (); + out_err: +cfg80211_put_dev (dev); + out_put_netdev: +dev_put (netdev); + +return err; }static int nl80211_get_station (struct sk_buff *skb,struct genl_info *info)
@@ -1016,7 +1037,7 @@ static int nl80211_get_station(struct sk mac_addr =nla_data (info->attrs[NL80211_ATTR_MAC ]); - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -1112,7 +1133,7 @@ static int nl80211_set_station(struct sk params.plink_action =nla_get_u8 (info->attrs[NL80211_ATTR_STA_PLINK_ACTION ]); - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -1172,7 +1193,7 @@ static int nl80211_new_station(struct sk ¶ms.station_flags))return -EINVAL ; - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -1207,7 +1228,7 @@ static int nl80211_del_station(struct skif (info->attrs[NL80211_ATTR_MAC ]) mac_addr =nla_data (info->attrs[NL80211_ATTR_MAC ]); - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -1277,68 +1298,78 @@ static int nl80211_send_mpath(struct sk_ }static int nl80211_dump_mpath (struct sk_buff *skb, -struct netlink_callback *cb) +struct netlink_callback *cb) { -int wp_idx =0 ; -int if_idx =0 ; -int sta_idx = cb->args[2 ]; -int wp_start = cb->args[0 ]; -int if_start = cb->args[1 ];struct mpath_info pinfo;struct cfg80211_registered_device *dev; -struct wireless_dev *wdev; +struct net_device *netdev;u8 dst[ETH_ALEN ];u8 next_hop[ETH_ALEN ]; +int ifidx = cb->args[0 ]; +int path_idx = cb->args[1 ];int err; -int exit =0 ; -/* TODO: filter by device */ -mutex_lock (&cfg80211_drv_mutex); -list_for_each_entry (dev, &cfg80211_drv_list, list) { -if (exit) +if (!ifidx) { + err =nlmsg_parse (cb->nlh,GENL_HDRLEN + nl80211_fam.hdrsize, + nl80211_fam.attrbuf, nl80211_fam.maxattr, + nl80211_policy); +if (err) +return err; + +if (!nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX ]) +return -EINVAL ; + + ifidx =nla_get_u32 (nl80211_fam.attrbuf[NL80211_ATTR_IFINDEX ]); +if (!ifidx) +return -EINVAL ; + } + + netdev =dev_get_by_index (&init_net, ifidx); +if (!netdev) +return -ENODEV ; + + dev =cfg80211_get_dev_from_ifindex (ifidx); +if (IS_ERR (dev)) { + err =PTR_ERR (dev); + goto out_put_netdev; + } + +if (!dev->ops->dump_mpath) { + err = -ENOSYS ; + goto out_err; + } + +rtnl_lock (); + +while (1 ) { + err = dev->ops->dump_mpath (&dev->wiphy, netdev, path_idx, + dst, next_hop, &pinfo); +if (err == -ENOENT )break ; -if (++wp_idx < wp_start) -continue ; - if_idx =0 ; +if (err) + goto out_err_rtnl; -mutex_lock (&dev->devlist_mtx); -list_for_each_entry (wdev, &dev->netdev_list, list) { -if (exit) -break ; -if (++if_idx < if_start) -continue ; -if (!dev->ops->dump_mpath) -continue ; +if (nl80211_send_mpath (skb,NETLINK_CB (cb->skb).pid, + cb->nlh->nlmsg_seq,NLM_F_MULTI , + netdev, dst, next_hop, + &pinfo) <0 ) + goto out; -for (;; ++sta_idx) { -rtnl_lock (); - err = dev->ops->dump_mpath (&dev->wiphy, - wdev->netdev, sta_idx, dst, - next_hop, &pinfo); -rtnl_unlock (); -if (err) { - sta_idx =0 ; -break ; - } -if (nl80211_send_mpath (skb, -NETLINK_CB (cb->skb).pid, - cb->nlh->nlmsg_seq,NLM_F_MULTI , - wdev->netdev, dst, next_hop, - &pinfo) <0 ) { - exit =1 ; -break ; - } - } - } -mutex_unlock (&dev->devlist_mtx); + path_idx++; } -mutex_unlock (&cfg80211_drv_mutex); - cb->args[0 ] = wp_idx; - cb->args[1 ] = if_idx; - cb->args[2 ] = sta_idx; -return skb->len; + out: + cb->args[1 ] = path_idx; + err = skb->len; + out_err_rtnl: +rtnl_unlock (); + out_err: +cfg80211_put_dev (dev); + out_put_netdev: +dev_put (netdev); + +return err; }static int nl80211_get_mpath (struct sk_buff *skb,struct genl_info *info)
@@ -1358,7 +1389,7 @@ static int nl80211_get_mpath(struct sk_b dst =nla_data (info->attrs[NL80211_ATTR_MAC ]); - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -1411,7 +1442,7 @@ static int nl80211_set_mpath(struct sk_b dst =nla_data (info->attrs[NL80211_ATTR_MAC ]); next_hop =nla_data (info->attrs[NL80211_ATTR_MPATH_NEXT_HOP ]); - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -1446,7 +1477,7 @@ static int nl80211_new_mpath(struct sk_b dst =nla_data (info->attrs[NL80211_ATTR_MAC ]); next_hop =nla_data (info->attrs[NL80211_ATTR_MPATH_NEXT_HOP ]); - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
@@ -1475,7 +1506,7 @@ static int nl80211_del_mpath(struct sk_bif (info->attrs[NL80211_ATTR_MAC ]) dst =nla_data (info->attrs[NL80211_ATTR_MAC ]); - err =get_drv_dev_by_info_ifindex (info, &drv, &dev); + err =get_drv_dev_by_info_ifindex (info->attrs, &drv, &dev);if (err)return err;
Johannes Berg
maintainerPATCH 3/3 mac80211: fix cfg80211 hooks for master interface
In reply to Johannes BergThe master interface is a virtual interface that is registered to mac80211, changing that does not seem like a good idea at the moment. However, since it has no sdata, we cannot accept any configuration for it. This patch makes the cfg80211 hooks reject any such attempt.
Signed-off-by Johannes Berg <[email protected]>
--- net/mac80211/cfg.c | 103 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 88 insertions(+), 15 deletions(-)
net/mac80211/cfg.c +88 -15
@@ -81,6 +81,7 @@ static int ieee80211_change_iface(struct enum nl80211_iftype type, u32 *flags, struct vif_params *params) { + struct ieee80211_local *local = wiphy_priv(wiphy);struct net_device *dev;enum ieee80211_if_types itype;struct ieee80211_sub_if_data *sdata;
@@ -95,6 +96,9 @@ static int ieee80211_change_iface(structif (itype ==IEEE80211_IF_TYPE_INVALID )return -EINVAL ; +if (dev == local->mdev) +return -EOPNOTSUPP ; + sdata =IEEE80211_DEV_TO_SUB_IF (dev); ret =ieee80211_if_change_type (sdata, itype);
@@ -117,12 +121,16 @@ static int ieee80211_add_key(struct wiph u8 key_idx, u8 *mac_addr, struct key_params *params) { + struct ieee80211_local *local = wiphy_priv(wiphy);struct ieee80211_sub_if_data *sdata;struct sta_info *sta =NULL ;enum ieee80211_key_alg alg;struct ieee80211_key *key;int err; +if (dev == local->mdev) +return -EOPNOTSUPP ; + sdata =IEEE80211_DEV_TO_SUB_IF (dev);switch (params->cipher) {
@@ -167,10 +175,14 @@ static int ieee80211_add_key(struct wiphstatic int ieee80211_del_key (struct wiphy *wiphy,struct net_device *dev,u8 key_idx,u8 *mac_addr) { +struct ieee80211_local *local =wiphy_priv (wiphy);struct ieee80211_sub_if_data *sdata;struct sta_info *sta;int ret; +if (dev == local->mdev) +return -EOPNOTSUPP ; + sdata =IEEE80211_DEV_TO_SUB_IF (dev);rcu_read_lock ();
@@ -211,7 +223,8 @@ static int ieee80211_get_key(struct wiphvoid (*callback)(void *cookie, struct key_params *params)) { -struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local =wiphy_priv (wiphy); +struct ieee80211_sub_if_data *sdata;struct sta_info *sta =NULL ;u8 seq[6 ] = {0 };struct key_params params;
@@ -220,6 +233,11 @@ static int ieee80211_get_key(struct wiphu16 iv16;int err = -ENOENT ; +if (dev == local->mdev) +return -EOPNOTSUPP ; + + sdata =IEEE80211_DEV_TO_SUB_IF (dev); +rcu_read_lock ();if (mac_addr) {
@@ -293,8 +311,12 @@ static int ieee80211_config_default_key( struct net_device *dev, u8 key_idx) { +struct ieee80211_local *local =wiphy_priv (wiphy);struct ieee80211_sub_if_data *sdata; +if (dev == local->mdev) +return -EOPNOTSUPP ; +rcu_read_lock (); sdata =IEEE80211_DEV_TO_SUB_IF (dev);
@@ -475,9 +497,15 @@ static int ieee80211_config_beacon(strucstatic int ieee80211_add_beacon (struct wiphy *wiphy,struct net_device *dev,struct beacon_parameters *params) { -struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local =wiphy_priv (wiphy); +struct ieee80211_sub_if_data *sdata;struct beacon_data *old; +if (dev == local->mdev) +return -EOPNOTSUPP ; + + sdata =IEEE80211_DEV_TO_SUB_IF (dev); +if (sdata->vif.type !=IEEE80211_IF_TYPE_AP )return -EINVAL ;
@@ -492,9 +520,15 @@ static int ieee80211_add_beacon(struct wstatic int ieee80211_set_beacon (struct wiphy *wiphy,struct net_device *dev,struct beacon_parameters *params) { -struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local =wiphy_priv (wiphy); +struct ieee80211_sub_if_data *sdata;struct beacon_data *old; +if (dev == local->mdev) +return -EOPNOTSUPP ; + + sdata =IEEE80211_DEV_TO_SUB_IF (dev); +if (sdata->vif.type !=IEEE80211_IF_TYPE_AP )return -EINVAL ;
@@ -508,9 +542,15 @@ static int ieee80211_set_beacon(struct wstatic int ieee80211_del_beacon (struct wiphy *wiphy,struct net_device *dev) { -struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local =wiphy_priv (wiphy); +struct ieee80211_sub_if_data *sdata;struct beacon_data *old; +if (dev == local->mdev) +return -EOPNOTSUPP ; + + sdata =IEEE80211_DEV_TO_SUB_IF (dev); +if (sdata->vif.type !=IEEE80211_IF_TYPE_AP )return -EINVAL ;
@@ -646,11 +686,14 @@ static void sta_apply_parameters(structstatic int ieee80211_add_station (struct wiphy *wiphy,struct net_device *dev,u8 *mac,struct station_parameters *params) { -struct ieee80211_local *local =wdev_priv (dev->ieee80211_ptr); +struct ieee80211_local *local =wiphy_priv (wiphy);struct sta_info *sta;struct ieee80211_sub_if_data *sdata;int err; +if (dev == local->mdev || params->vlan == local->mdev) +return -EOPNOTSUPP ; +/* Prevent a race with changing the rate control algorithm */ if (!netif_running (dev))return -ENETDOWN ;
@@ -701,10 +744,15 @@ static int ieee80211_add_station(structstatic int ieee80211_del_station (struct wiphy *wiphy,struct net_device *dev,u8 *mac) { -struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); -struct ieee80211_local *local = sdata->local; +struct ieee80211_local *local =wiphy_priv (wiphy); +struct ieee80211_sub_if_data *sdata;struct sta_info *sta; +if (dev == local->mdev) +return -EOPNOTSUPP ; + + sdata =IEEE80211_DEV_TO_SUB_IF (dev); +if (mac) {rcu_read_lock ();
@@ -730,10 +778,13 @@ static int ieee80211_change_station(struu8 *mac, struct station_parameters *params) { - struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); + struct ieee80211_local *local = wiphy_priv(wiphy);struct sta_info *sta;struct ieee80211_sub_if_data *vlansdata; +if (dev == local->mdev || params->vlan == local->mdev) +return -EOPNOTSUPP ; +rcu_read_lock ();/* XXX: get sta belonging to dev */
@@ -752,7 +803,7 @@ static int ieee80211_change_station(strureturn -EINVAL ; } - sta->sdata =IEEE80211_DEV_TO_SUB_IF (params->vlan); + sta->sdata = vlansdata;ieee80211_send_layer2_update (sta); }
@@ -767,15 +818,20 @@ static int ieee80211_change_station(strustatic int ieee80211_add_mpath (struct wiphy *wiphy,struct net_device *dev,u8 *dst,u8 *next_hop) { -struct ieee80211_local *local =wdev_priv (dev->ieee80211_ptr); -struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local =wiphy_priv (wiphy); +struct ieee80211_sub_if_data *sdata;struct mesh_path *mpath;struct sta_info *sta;int err; +if (dev == local->mdev) +return -EOPNOTSUPP ; +if (!netif_running (dev))return -ENETDOWN ; + sdata =IEEE80211_DEV_TO_SUB_IF (dev); +if (sdata->vif.type !=IEEE80211_IF_TYPE_MESH_POINT )return -ENOTSUPP ;
@@ -817,14 +873,19 @@ static int ieee80211_change_mpath(structstruct net_device *dev, u8 *dst, u8 *next_hop) { - struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); -struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); + struct ieee80211_local *local = wiphy_priv(wiphy); +struct ieee80211_sub_if_data *sdata;struct mesh_path *mpath;struct sta_info *sta; +if (dev == local->mdev) +return -EOPNOTSUPP ; +if (!netif_running (dev))return -ENETDOWN ; + sdata =IEEE80211_DEV_TO_SUB_IF (dev); +if (sdata->vif.type !=IEEE80211_IF_TYPE_MESH_POINT )return -ENOTSUPP ;
@@ -891,9 +952,15 @@ static int ieee80211_get_mpath(struct wi u8 *dst, u8 *next_hop, struct mpath_info *pinfo) { -struct ieee80211_sub_if_data *sdata =IEEE80211_DEV_TO_SUB_IF (dev); +struct ieee80211_local *local =wiphy_priv (wiphy); +struct ieee80211_sub_if_data *sdata;struct mesh_path *mpath; +if (dev == local->mdev) +return -EOPNOTSUPP ; + + sdata =IEEE80211_DEV_TO_SUB_IF (dev); +if (sdata->vif.type !=IEEE80211_IF_TYPE_MESH_POINT )return -ENOTSUPP ;
@@ -913,9 +980,15 @@ static int ieee80211_dump_mpath(struct w int idx, u8 *dst, u8 *next_hop, struct mpath_info *pinfo) { - struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); + struct ieee80211_local *local = wiphy_priv(wiphy); +struct ieee80211_sub_if_data *sdata;struct mesh_path *mpath; +if (dev == local->mdev) +return -EOPNOTSUPP ; + + sdata =IEEE80211_DEV_TO_SUB_IF (dev); +if (sdata->vif.type !=IEEE80211_IF_TYPE_MESH_POINT )return -ENOTSUPP ;