Skip to content

Commit

Permalink
nl80211: use attributes to parse beacons
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Mathias Kretschmer <[email protected]>
Signed-off-by: Johannes Berg <[email protected]>
  • Loading branch information
Simon Wunderlich authored and jmberg-intel committed Jun 18, 2013
1 parent 38745c7 commit a1193be
Showing 1 changed file with 25 additions and 28 deletions.
53 changes: 25 additions & 28 deletions net/wireless/nl80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit a1193be

Please sign in to comment.