nl80211: use attributes to parse beacons
authorSimon Wunderlich <simon.wunderlich@s2003.tu-chemnitz.de>
Fri, 14 Jun 2013 12:15:19 +0000 (14:15 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 18 Jun 2013 13:55:19 +0000 (15:55 +0200)
only the attributes are required and not the whole netlink info, as the
function accesses the attributes only anyway. This makes it easier to
parse nested beacon IEs later.

Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Mathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/nl80211.c

index e402819..1c4f7da 100644 (file)
@@ -2882,61 +2882,58 @@ static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info)
        return err;
 }
 
-static int nl80211_parse_beacon(struct genl_info *info,
+static int nl80211_parse_beacon(struct nlattr *attrs[],
                                struct cfg80211_beacon_data *bcn)
 {
        bool haveinfo = false;
 
-       if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_BEACON_TAIL]) ||
-           !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]) ||
-           !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE_PROBE_RESP]) ||
-           !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE_ASSOC_RESP]))
+       if (!is_valid_ie_attr(attrs[NL80211_ATTR_BEACON_TAIL]) ||
+           !is_valid_ie_attr(attrs[NL80211_ATTR_IE]) ||
+           !is_valid_ie_attr(attrs[NL80211_ATTR_IE_PROBE_RESP]) ||
+           !is_valid_ie_attr(attrs[NL80211_ATTR_IE_ASSOC_RESP]))
                return -EINVAL;
 
        memset(bcn, 0, sizeof(*bcn));
 
-       if (info->attrs[NL80211_ATTR_BEACON_HEAD]) {
-               bcn->head = nla_data(info->attrs[NL80211_ATTR_BEACON_HEAD]);
-               bcn->head_len = nla_len(info->attrs[NL80211_ATTR_BEACON_HEAD]);
+       if (attrs[NL80211_ATTR_BEACON_HEAD]) {
+               bcn->head = nla_data(attrs[NL80211_ATTR_BEACON_HEAD]);
+               bcn->head_len = nla_len(attrs[NL80211_ATTR_BEACON_HEAD]);
                if (!bcn->head_len)
                        return -EINVAL;
                haveinfo = true;
        }
 
-       if (info->attrs[NL80211_ATTR_BEACON_TAIL]) {
-               bcn->tail = nla_data(info->attrs[NL80211_ATTR_BEACON_TAIL]);
-               bcn->tail_len =
-                   nla_len(info->attrs[NL80211_ATTR_BEACON_TAIL]);
+       if (attrs[NL80211_ATTR_BEACON_TAIL]) {
+               bcn->tail = nla_data(attrs[NL80211_ATTR_BEACON_TAIL]);
+               bcn->tail_len = nla_len(attrs[NL80211_ATTR_BEACON_TAIL]);
                haveinfo = true;
        }
 
        if (!haveinfo)
                return -EINVAL;
 
-       if (info->attrs[NL80211_ATTR_IE]) {
-               bcn->beacon_ies = nla_data(info->attrs[NL80211_ATTR_IE]);
-               bcn->beacon_ies_len = nla_len(info->attrs[NL80211_ATTR_IE]);
+       if (attrs[NL80211_ATTR_IE]) {
+               bcn->beacon_ies = nla_data(attrs[NL80211_ATTR_IE]);
+               bcn->beacon_ies_len = nla_len(attrs[NL80211_ATTR_IE]);
        }
 
-       if (info->attrs[NL80211_ATTR_IE_PROBE_RESP]) {
+       if (attrs[NL80211_ATTR_IE_PROBE_RESP]) {
                bcn->proberesp_ies =
-                       nla_data(info->attrs[NL80211_ATTR_IE_PROBE_RESP]);
+                       nla_data(attrs[NL80211_ATTR_IE_PROBE_RESP]);
                bcn->proberesp_ies_len =
-                       nla_len(info->attrs[NL80211_ATTR_IE_PROBE_RESP]);
+                       nla_len(attrs[NL80211_ATTR_IE_PROBE_RESP]);
        }
 
-       if (info->attrs[NL80211_ATTR_IE_ASSOC_RESP]) {
+       if (attrs[NL80211_ATTR_IE_ASSOC_RESP]) {
                bcn->assocresp_ies =
-                       nla_data(info->attrs[NL80211_ATTR_IE_ASSOC_RESP]);
+                       nla_data(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
                bcn->assocresp_ies_len =
-                       nla_len(info->attrs[NL80211_ATTR_IE_ASSOC_RESP]);
+                       nla_len(attrs[NL80211_ATTR_IE_ASSOC_RESP]);
        }
 
-       if (info->attrs[NL80211_ATTR_PROBE_RESP]) {
-               bcn->probe_resp =
-                       nla_data(info->attrs[NL80211_ATTR_PROBE_RESP]);
-               bcn->probe_resp_len =
-                       nla_len(info->attrs[NL80211_ATTR_PROBE_RESP]);
+       if (attrs[NL80211_ATTR_PROBE_RESP]) {
+               bcn->probe_resp = nla_data(attrs[NL80211_ATTR_PROBE_RESP]);
+               bcn->probe_resp_len = nla_len(attrs[NL80211_ATTR_PROBE_RESP]);
        }
 
        return 0;
@@ -3015,7 +3012,7 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
            !info->attrs[NL80211_ATTR_BEACON_HEAD])
                return -EINVAL;
 
-       err = nl80211_parse_beacon(info, &params.beacon);
+       err = nl80211_parse_beacon(info->attrs, &params.beacon);
        if (err)
                return err;
 
@@ -3167,7 +3164,7 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
        if (!wdev->beacon_interval)
                return -EINVAL;
 
-       err = nl80211_parse_beacon(info, &params);
+       err = nl80211_parse_beacon(info->attrs, &params);
        if (err)
                return err;