]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/wireless/nl80211.c
cfg80211: check for set_wiphy_params
[linux.git] / net / wireless / nl80211.c
index 141cdb171665e6b371c7d03818b46d17810ef912..1e97ac5435b236fdaa6b087a579e7e950a2bf669 100644 (file)
@@ -393,7 +393,7 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
        [NL80211_ATTR_MNTR_FLAGS] = { /* NLA_NESTED can't be empty */ },
        [NL80211_ATTR_MESH_ID] = { .type = NLA_BINARY,
                                   .len = IEEE80211_MAX_MESH_ID_LEN },
-       [NL80211_ATTR_MPATH_NEXT_HOP] = { .type = NLA_U32 },
+       [NL80211_ATTR_MPATH_NEXT_HOP] = NLA_POLICY_ETH_ADDR_COMPAT,
 
        [NL80211_ATTR_REG_ALPHA2] = { .type = NLA_STRING, .len = 2 },
        [NL80211_ATTR_REG_RULES] = { .type = NLA_NESTED },
@@ -624,6 +624,7 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
                                        .len = SAE_PASSWORD_MAX_LEN },
        [NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG },
        [NL80211_ATTR_HE_OBSS_PD] = NLA_POLICY_NESTED(he_obss_pd_policy),
+       [NL80211_ATTR_VLAN_ID] = NLA_POLICY_RANGE(NLA_U16, 1, VLAN_N_VID - 2),
 };
 
 /* policy for the key attributes */
@@ -3940,6 +3941,10 @@ static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
            key.type != NL80211_KEYTYPE_GROUP)
                return -EINVAL;
 
+       if (key.type == NL80211_KEYTYPE_GROUP &&
+           info->attrs[NL80211_ATTR_VLAN_ID])
+               key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
+
        if (!rdev->ops->add_key)
                return -EOPNOTSUPP;
 
@@ -5711,6 +5716,9 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
        if (info->attrs[NL80211_ATTR_STA_AID])
                params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
 
+       if (info->attrs[NL80211_ATTR_VLAN_ID])
+               params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
+
        if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
                params.listen_interval =
                     nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
@@ -5856,6 +5864,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_VLAN_ID])
+               params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
+
        if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
                params.support_p2p_ps =
                        nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
@@ -8265,10 +8276,8 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
        /* leave request id zero for legacy request
         * or if driver does not support multi-scheduled scan
         */
-       if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1) {
-               while (!sched_scan_req->reqid)
-                       sched_scan_req->reqid = cfg80211_assign_cookie(rdev);
-       }
+       if (want_multi && rdev->wiphy.max_sched_scan_reqs > 1)
+               sched_scan_req->reqid = cfg80211_assign_cookie(rdev);
 
        err = rdev_sched_scan_start(rdev, dev, sched_scan_req);
        if (err)
@@ -10834,6 +10843,7 @@ static int cfg80211_cqm_rssi_update(struct cfg80211_registered_device *rdev,
                if (err)
                        return err;
 
+               cfg80211_sinfo_release_content(&sinfo);
                if (sinfo.filled & BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG))
                        wdev->cqm_config->last_rssi_event_value =
                                (s8) sinfo.rx_beacon_signal_avg;
@@ -13682,7 +13692,7 @@ static int nl80211_get_ftm_responder_stats(struct sk_buff *skb,
        hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
                             NL80211_CMD_GET_FTM_RESPONDER_STATS);
        if (!hdr)
-               return -ENOBUFS;
+               goto nla_put_failure;
 
        if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
                goto nla_put_failure;
@@ -13787,6 +13797,8 @@ static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info)
        if (err)
                return err;
 
+       cfg80211_sinfo_release_content(&sinfo);
+
        return rdev_probe_mesh_link(rdev, dev, dest, buf, len);
 }