nl80211: does not allow NEW_STATION and DEL_STATION for mesh
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Fri, 12 Feb 2010 14:34:50 +0000 (12:34 -0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 15 Feb 2010 21:12:52 +0000 (16:12 -0500)
As discussed in linux-wireless mailing list, adding and removing
stations for mesh topologies is not necessary. Since doing it triggers
bugs, the sugestion was to simply disable it.

Tested using a custom iw command "station new". Works only after using
hostapd. "station del" command also works.

Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: Simon Raffeiner <sturmflut@lieberbiber.de>
Cc: Andrey Yurovsky <andrey@cozybit.com>
Cc: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/wireless/nl80211.c

index 5b79ecf17bea47a102a57187d04cf4ce2af0589d..a95ab9e4c19e40f233afd0cc59f62fcee8cf159e 100644 (file)
@@ -2010,6 +2010,9 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
        if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
                return -EINVAL;
 
+       if (!info->attrs[NL80211_ATTR_STA_AID])
+               return -EINVAL;
+
        mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
        params.supported_rates =
                nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
@@ -2018,11 +2021,9 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
        params.listen_interval =
                nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
 
-       if (info->attrs[NL80211_ATTR_STA_AID]) {
-               params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
-               if (!params.aid || params.aid > IEEE80211_MAX_AID)
-                       return -EINVAL;
-       }
+       params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
+       if (!params.aid || params.aid > IEEE80211_MAX_AID)
+               return -EINVAL;
 
        if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
                params.ht_capa =
@@ -2037,6 +2038,12 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
        if (err)
                goto out_rtnl;
 
+       if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
+           dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN) {
+               err = -EINVAL;
+               goto out;
+       }
+
        err = get_vlan(info, rdev, &params.vlan);
        if (err)
                goto out;
@@ -2044,35 +2051,6 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
        /* validate settings */
        err = 0;
 
-       switch (dev->ieee80211_ptr->iftype) {
-       case NL80211_IFTYPE_AP:
-       case NL80211_IFTYPE_AP_VLAN:
-               /* all ok but must have AID */
-               if (!params.aid)
-                       err = -EINVAL;
-               break;
-       case NL80211_IFTYPE_MESH_POINT:
-               /* disallow things mesh doesn't support */
-               if (params.vlan)
-                       err = -EINVAL;
-               if (params.aid)
-                       err = -EINVAL;
-               if (params.ht_capa)
-                       err = -EINVAL;
-               if (params.listen_interval >= 0)
-                       err = -EINVAL;
-               if (params.supported_rates)
-                       err = -EINVAL;
-               if (params.sta_flags_mask)
-                       err = -EINVAL;
-               break;
-       default:
-               err = -EINVAL;
-       }
-
-       if (err)
-               goto out;
-
        if (!rdev->ops->add_station) {
                err = -EOPNOTSUPP;
                goto out;
@@ -2113,8 +2091,7 @@ static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
                goto out_rtnl;
 
        if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
-           dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN &&
-           dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) {
+           dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP_VLAN) {
                err = -EINVAL;
                goto out;
        }