nl80211: use attributes to parse beacons
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. Change-Id: I1445cf91edbf018f8a1de5434f0a84acb27dbbdd 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>
This commit is contained in:
parent
b0c61e650c
commit
3e6ec988cf
|
@ -3072,61 +3072,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;
|
||||
|
@ -3209,7 +3206,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, ¶ms.beacon);
|
||||
err = nl80211_parse_beacon(info->attrs, ¶ms.beacon);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -3364,7 +3361,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, ¶ms);
|
||||
err = nl80211_parse_beacon(info->attrs, ¶ms);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
|
Loading…
Reference in New Issue