Skip to content

Commit

Permalink
nl80211: process additional attributes in NL80211_CMD_SET_BEACON
Browse files Browse the repository at this point in the history
FILS discovery and unsolicited broadcast probe response transmissions
are configured as part of NL80211_CMD_START_AP, however both stop
after userspace uses the NL80211_CMD_SET_BEACON command as these
attributes are not processed as part of this command.
Add the missing implementation.

Modify the local variable in nl80211_set_beacon() and input parameter
to rdev_change_beacon() from type struct cfg80211_beacon_data to
type struct cfg80211_ap_settings to support the new processing.

Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
  • Loading branch information
Aloka Dixit authored and intel-lab-lkp committed May 9, 2022
1 parent fc20106 commit 4b25831
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 29 deletions.
2 changes: 1 addition & 1 deletion include/net/cfg80211.h
Expand Up @@ -4195,7 +4195,7 @@ struct cfg80211_ops {
int (*start_ap)(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_ap_settings *settings);
int (*change_beacon)(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_beacon_data *info);
struct cfg80211_ap_settings *info);
int (*stop_ap)(struct wiphy *wiphy, struct net_device *dev);


Expand Down
28 changes: 24 additions & 4 deletions net/wireless/nl80211.c
Expand Up @@ -5799,7 +5799,8 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
struct cfg80211_registered_device *rdev = info->user_ptr[0];
struct net_device *dev = info->user_ptr[1];
struct wireless_dev *wdev = dev->ieee80211_ptr;
struct cfg80211_beacon_data params;
struct cfg80211_ap_settings *params;
struct nlattr *attrs;
int err;

if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
Expand All @@ -5812,16 +5813,35 @@ static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
if (!wdev->beacon_interval)
return -EINVAL;

err = nl80211_parse_beacon(rdev, info->attrs, &params);
params = kzalloc(sizeof(*params), GFP_KERNEL);
if (!params)
return -ENOMEM;

err = nl80211_parse_beacon(rdev, info->attrs, &params->beacon);
if (err)
goto out;

attrs = info->attrs[NL80211_ATTR_FILS_DISCOVERY];
if (attrs) {
err = nl80211_parse_fils_discovery(rdev, attrs, params);
if (err)
goto out;
}

attrs = info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP];
if (attrs) {
err = nl80211_parse_unsol_bcast_probe_resp(rdev, attrs, params);
if (err)
goto out;
}

wdev_lock(wdev);
err = rdev_change_beacon(rdev, dev, &params);
err = rdev_change_beacon(rdev, dev, params);
wdev_unlock(wdev);

out:
kfree(params.mbssid_ies);
kfree(params->beacon.mbssid_ies);
kfree(params);
return err;
}

Expand Down
2 changes: 1 addition & 1 deletion net/wireless/rdev-ops.h
Expand Up @@ -162,7 +162,7 @@ static inline int rdev_start_ap(struct cfg80211_registered_device *rdev,

static inline int rdev_change_beacon(struct cfg80211_registered_device *rdev,
struct net_device *dev,
struct cfg80211_beacon_data *info)
struct cfg80211_ap_settings *info)
{
int ret;
trace_rdev_change_beacon(&rdev->wiphy, dev, info);
Expand Down
52 changes: 29 additions & 23 deletions net/wireless/trace.h
Expand Up @@ -597,44 +597,50 @@ TRACE_EVENT(rdev_start_ap,

TRACE_EVENT(rdev_change_beacon,
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev,
struct cfg80211_beacon_data *info),
struct cfg80211_ap_settings *info),
TP_ARGS(wiphy, netdev, info),
TP_STRUCT__entry(
WIPHY_ENTRY
NETDEV_ENTRY
__dynamic_array(u8, head, info ? info->head_len : 0)
__dynamic_array(u8, tail, info ? info->tail_len : 0)
__dynamic_array(u8, beacon_ies, info ? info->beacon_ies_len : 0)
__dynamic_array(u8, head, info ? info->beacon.head_len : 0)
__dynamic_array(u8, tail, info ? info->beacon.tail_len : 0)
__dynamic_array(u8, beacon_ies,
info ? info->beacon.beacon_ies_len : 0)
__dynamic_array(u8, proberesp_ies,
info ? info->proberesp_ies_len : 0)
info ? info->beacon.proberesp_ies_len : 0)
__dynamic_array(u8, assocresp_ies,
info ? info->assocresp_ies_len : 0)
__dynamic_array(u8, probe_resp, info ? info->probe_resp_len : 0)
info ? info->beacon.assocresp_ies_len : 0)
__dynamic_array(u8, probe_resp,
info ? info->beacon.probe_resp_len : 0)
),
TP_fast_assign(
WIPHY_ASSIGN;
NETDEV_ASSIGN;
if (info) {
if (info->head)
memcpy(__get_dynamic_array(head), info->head,
info->head_len);
if (info->tail)
memcpy(__get_dynamic_array(tail), info->tail,
info->tail_len);
if (info->beacon_ies)
if (info->beacon.head)
memcpy(__get_dynamic_array(head),
info->beacon.head,
info->beacon.head_len);
if (info->beacon.tail)
memcpy(__get_dynamic_array(tail),
info->beacon.tail,
info->beacon.tail_len);
if (info->beacon.beacon_ies)
memcpy(__get_dynamic_array(beacon_ies),
info->beacon_ies, info->beacon_ies_len);
if (info->proberesp_ies)
info->beacon.beacon_ies,
info->beacon.beacon_ies_len);
if (info->beacon.proberesp_ies)
memcpy(__get_dynamic_array(proberesp_ies),
info->proberesp_ies,
info->proberesp_ies_len);
if (info->assocresp_ies)
info->beacon.proberesp_ies,
info->beacon.proberesp_ies_len);
if (info->beacon.assocresp_ies)
memcpy(__get_dynamic_array(assocresp_ies),
info->assocresp_ies,
info->assocresp_ies_len);
if (info->probe_resp)
info->beacon.assocresp_ies,
info->beacon.assocresp_ies_len);
if (info->beacon.probe_resp)
memcpy(__get_dynamic_array(probe_resp),
info->probe_resp, info->probe_resp_len);
info->beacon.probe_resp,
info->beacon.probe_resp_len);
}
),
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT, WIPHY_PR_ARG, NETDEV_PR_ARG)
Expand Down

0 comments on commit 4b25831

Please sign in to comment.