Commit 5bd2ce6a authored by David S. Miller's avatar David S. Miller

Merge tag 'mac80211-next-for-net-next-2019-11-08' of...

Merge tag 'mac80211-next-for-net-next-2019-11-08' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next

Johannes Berg says:

====================
Some relatively small changes:
 * typo fixes in docs
 * APIs for station separation using VLAN tags rather
   than separate wifi netdevs
 * some preparations for upcoming features (802.3 offload
   and airtime queue limits (AQL)
 * stack reduction in ieee80211_assoc_success()
 * use DEFINE_DEBUGFS_ATTRIBUTE in hwsim
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents c8119fa8 14f34e36
...@@ -769,7 +769,7 @@ static int hwsim_fops_ps_write(void *dat, u64 val) ...@@ -769,7 +769,7 @@ static int hwsim_fops_ps_write(void *dat, u64 val)
return 0; return 0;
} }
DEFINE_SIMPLE_ATTRIBUTE(hwsim_fops_ps, hwsim_fops_ps_read, hwsim_fops_ps_write, DEFINE_DEBUGFS_ATTRIBUTE(hwsim_fops_ps, hwsim_fops_ps_read, hwsim_fops_ps_write,
"%llu\n"); "%llu\n");
static int hwsim_write_simulate_radar(void *dat, u64 val) static int hwsim_write_simulate_radar(void *dat, u64 val)
...@@ -781,7 +781,7 @@ static int hwsim_write_simulate_radar(void *dat, u64 val) ...@@ -781,7 +781,7 @@ static int hwsim_write_simulate_radar(void *dat, u64 val)
return 0; return 0;
} }
DEFINE_SIMPLE_ATTRIBUTE(hwsim_simulate_radar, NULL, DEFINE_DEBUGFS_ATTRIBUTE(hwsim_simulate_radar, NULL,
hwsim_write_simulate_radar, "%llu\n"); hwsim_write_simulate_radar, "%llu\n");
static int hwsim_fops_group_read(void *dat, u64 *val) static int hwsim_fops_group_read(void *dat, u64 *val)
...@@ -798,7 +798,7 @@ static int hwsim_fops_group_write(void *dat, u64 val) ...@@ -798,7 +798,7 @@ static int hwsim_fops_group_write(void *dat, u64 val)
return 0; return 0;
} }
DEFINE_SIMPLE_ATTRIBUTE(hwsim_fops_group, DEFINE_DEBUGFS_ATTRIBUTE(hwsim_fops_group,
hwsim_fops_group_read, hwsim_fops_group_write, hwsim_fops_group_read, hwsim_fops_group_write,
"%llx\n"); "%llx\n");
......
...@@ -565,6 +565,7 @@ struct vif_params { ...@@ -565,6 +565,7 @@ struct vif_params {
* with the get_key() callback, must be in little endian, * with the get_key() callback, must be in little endian,
* length given by @seq_len. * length given by @seq_len.
* @seq_len: length of @seq. * @seq_len: length of @seq.
* @vlan_id: vlan_id for VLAN group key (if nonzero)
* @mode: key install mode (RX_TX, NO_TX or SET_TX) * @mode: key install mode (RX_TX, NO_TX or SET_TX)
*/ */
struct key_params { struct key_params {
...@@ -572,6 +573,7 @@ struct key_params { ...@@ -572,6 +573,7 @@ struct key_params {
const u8 *seq; const u8 *seq;
int key_len; int key_len;
int seq_len; int seq_len;
u16 vlan_id;
u32 cipher; u32 cipher;
enum nl80211_key_mode mode; enum nl80211_key_mode mode;
}; };
...@@ -1124,6 +1126,7 @@ struct sta_txpwr { ...@@ -1124,6 +1126,7 @@ struct sta_txpwr {
* (bitmask of BIT(%NL80211_STA_FLAG_...)) * (bitmask of BIT(%NL80211_STA_FLAG_...))
* @listen_interval: listen interval or -1 for no change * @listen_interval: listen interval or -1 for no change
* @aid: AID or zero for no change * @aid: AID or zero for no change
* @vlan_id: VLAN ID for station (if nonzero)
* @peer_aid: mesh peer AID or zero for no change * @peer_aid: mesh peer AID or zero for no change
* @plink_action: plink action to take * @plink_action: plink action to take
* @plink_state: set the peer link state for a station * @plink_state: set the peer link state for a station
...@@ -1159,6 +1162,7 @@ struct station_parameters { ...@@ -1159,6 +1162,7 @@ struct station_parameters {
u32 sta_modify_mask; u32 sta_modify_mask;
int listen_interval; int listen_interval;
u16 aid; u16 aid;
u16 vlan_id;
u16 peer_aid; u16 peer_aid;
u8 supported_rates_len; u8 supported_rates_len;
u8 plink_action; u8 plink_action;
......
...@@ -312,7 +312,7 @@ struct ieee80211_vif_chanctx_switch { ...@@ -312,7 +312,7 @@ struct ieee80211_vif_chanctx_switch {
* @BSS_CHANGED_KEEP_ALIVE: keep alive options (idle period or protected * @BSS_CHANGED_KEEP_ALIVE: keep alive options (idle period or protected
* keep alive) changed. * keep alive) changed.
* @BSS_CHANGED_MCAST_RATE: Multicast Rate setting changed for this interface * @BSS_CHANGED_MCAST_RATE: Multicast Rate setting changed for this interface
* @BSS_CHANGED_FTM_RESPONDER: fime timing reasurement request responder * @BSS_CHANGED_FTM_RESPONDER: fine timing measurement request responder
* functionality changed for this BSS (AP mode). * functionality changed for this BSS (AP mode).
* @BSS_CHANGED_TWT: TWT status changed * @BSS_CHANGED_TWT: TWT status changed
* @BSS_CHANGED_HE_OBSS_PD: OBSS Packet Detection status changed. * @BSS_CHANGED_HE_OBSS_PD: OBSS Packet Detection status changed.
...@@ -967,6 +967,7 @@ ieee80211_rate_get_vht_nss(const struct ieee80211_tx_rate *rate) ...@@ -967,6 +967,7 @@ ieee80211_rate_get_vht_nss(const struct ieee80211_tx_rate *rate)
* @band: the band to transmit on (use for checking for races) * @band: the band to transmit on (use for checking for races)
* @hw_queue: HW queue to put the frame on, skb_get_queue_mapping() gives the AC * @hw_queue: HW queue to put the frame on, skb_get_queue_mapping() gives the AC
* @ack_frame_id: internal frame ID for TX status, used internally * @ack_frame_id: internal frame ID for TX status, used internally
* @tx_time_est: TX time estimate in units of 4us, used internally
* @control: union part for control data * @control: union part for control data
* @control.rates: TX rates array to try * @control.rates: TX rates array to try
* @control.rts_cts_rate_idx: rate for RTS or CTS * @control.rts_cts_rate_idx: rate for RTS or CTS
...@@ -1007,7 +1008,8 @@ struct ieee80211_tx_info { ...@@ -1007,7 +1008,8 @@ struct ieee80211_tx_info {
u8 hw_queue; u8 hw_queue;
u16 ack_frame_id; u16 ack_frame_id:6;
u16 tx_time_est:10;
union { union {
struct { struct {
...@@ -1059,7 +1061,7 @@ struct ieee80211_tx_info { ...@@ -1059,7 +1061,7 @@ struct ieee80211_tx_info {
}; };
/** /**
* struct ieee80211_tx_status - extended tx staus info for rate control * struct ieee80211_tx_status - extended tx status info for rate control
* *
* @sta: Station that the packet was transmitted for * @sta: Station that the packet was transmitted for
* @info: Basic tx status information * @info: Basic tx status information
...@@ -1702,7 +1704,7 @@ struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif); ...@@ -1702,7 +1704,7 @@ struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif);
* %IEEE80211_KEY_FLAG_SW_MGMT_TX flag to encrypt such frames in SW. * %IEEE80211_KEY_FLAG_SW_MGMT_TX flag to encrypt such frames in SW.
* @IEEE80211_KEY_FLAG_GENERATE_IV_MGMT: This flag should be set by the * @IEEE80211_KEY_FLAG_GENERATE_IV_MGMT: This flag should be set by the
* driver for a CCMP/GCMP key to indicate that is requires IV generation * driver for a CCMP/GCMP key to indicate that is requires IV generation
* only for managment frames (MFP). * only for management frames (MFP).
* @IEEE80211_KEY_FLAG_RESERVE_TAILROOM: This flag should be set by the * @IEEE80211_KEY_FLAG_RESERVE_TAILROOM: This flag should be set by the
* driver for a key to indicate that sufficient tailroom must always * driver for a key to indicate that sufficient tailroom must always
* be reserved for ICV or MIC, even when HW encryption is enabled. * be reserved for ICV or MIC, even when HW encryption is enabled.
...@@ -1998,7 +2000,7 @@ struct ieee80211_sta { ...@@ -1998,7 +2000,7 @@ struct ieee80211_sta {
* *
* * If the skb is transmitted as part of a BA agreement, the * * If the skb is transmitted as part of a BA agreement, the
* A-MSDU maximal size is min(max_amsdu_len, 4065) bytes. * A-MSDU maximal size is min(max_amsdu_len, 4065) bytes.
* * If the skb is not part of a BA aggreement, the A-MSDU maximal * * If the skb is not part of a BA agreement, the A-MSDU maximal
* size is min(max_amsdu_len, 7935) bytes. * size is min(max_amsdu_len, 7935) bytes.
* *
* Both additional HT limits must be enforced by the low level * Both additional HT limits must be enforced by the low level
...@@ -2626,7 +2628,7 @@ ieee80211_get_alt_retry_rate(const struct ieee80211_hw *hw, ...@@ -2626,7 +2628,7 @@ ieee80211_get_alt_retry_rate(const struct ieee80211_hw *hw,
* @hw: the hardware * @hw: the hardware
* @skb: the skb * @skb: the skb
* *
* Free a transmit skb. Use this funtion when some failure * Free a transmit skb. Use this function when some failure
* to transmit happened and thus status cannot be reported. * to transmit happened and thus status cannot be reported.
*/ */
void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb); void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);
...@@ -3187,13 +3189,13 @@ enum ieee80211_rate_control_changed { ...@@ -3187,13 +3189,13 @@ enum ieee80211_rate_control_changed {
* *
* With the support for multi channel contexts and multi channel operations, * With the support for multi channel contexts and multi channel operations,
* remain on channel operations might be limited/deferred/aborted by other * remain on channel operations might be limited/deferred/aborted by other
* flows/operations which have higher priority (and vise versa). * flows/operations which have higher priority (and vice versa).
* Specifying the ROC type can be used by devices to prioritize the ROC * Specifying the ROC type can be used by devices to prioritize the ROC
* operations compared to other operations/flows. * operations compared to other operations/flows.
* *
* @IEEE80211_ROC_TYPE_NORMAL: There are no special requirements for this ROC. * @IEEE80211_ROC_TYPE_NORMAL: There are no special requirements for this ROC.
* @IEEE80211_ROC_TYPE_MGMT_TX: The remain on channel request is required * @IEEE80211_ROC_TYPE_MGMT_TX: The remain on channel request is required
* for sending managment frames offchannel. * for sending management frames offchannel.
*/ */
enum ieee80211_roc_type { enum ieee80211_roc_type {
IEEE80211_ROC_TYPE_NORMAL = 0, IEEE80211_ROC_TYPE_NORMAL = 0,
...@@ -5616,7 +5618,7 @@ void ieee80211_iter_keys_rcu(struct ieee80211_hw *hw, ...@@ -5616,7 +5618,7 @@ void ieee80211_iter_keys_rcu(struct ieee80211_hw *hw,
/** /**
* ieee80211_iter_chan_contexts_atomic - iterate channel contexts * ieee80211_iter_chan_contexts_atomic - iterate channel contexts
* @hw: pointre obtained from ieee80211_alloc_hw(). * @hw: pointer obtained from ieee80211_alloc_hw().
* @iter: iterator function * @iter: iterator function
* @iter_data: data passed to iterator function * @iter_data: data passed to iterator function
* *
...@@ -6364,7 +6366,7 @@ ieee80211_return_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq, ...@@ -6364,7 +6366,7 @@ ieee80211_return_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq,
* again. * again.
* *
* The API ieee80211_txq_may_transmit() also ensures that TXQ list will be * The API ieee80211_txq_may_transmit() also ensures that TXQ list will be
* aligned aginst driver's own round-robin scheduler list. i.e it rotates * aligned against driver's own round-robin scheduler list. i.e it rotates
* the TXQ list till it makes the requested node becomes the first entry * the TXQ list till it makes the requested node becomes the first entry
* in TXQ list. Thus both the TXQ list and driver's list are in sync. If this * in TXQ list. Thus both the TXQ list and driver's list are in sync. If this
* function returns %true, the driver is expected to schedule packets * function returns %true, the driver is expected to schedule packets
......
...@@ -248,6 +248,22 @@ ...@@ -248,6 +248,22 @@
* %NL80211_ATTR_SAE_PASSWORD. * %NL80211_ATTR_SAE_PASSWORD.
*/ */
/**
* DOC: VLAN offload support for setting group keys and binding STAs to VLANs
*
* By setting @NL80211_EXT_FEATURE_VLAN_OFFLOAD flag drivers can indicate they
* support offloading VLAN functionality in a manner where the driver exposes a
* single netdev that uses VLAN tagged frames and separate VLAN-specific netdevs
* can then be added using RTM_NEWLINK/IFLA_VLAN_ID similarly to the Ethernet
* case. Frames received from stations that are not assigned to any VLAN are
* delivered on the main netdev and frames to such stations can be sent through
* that main netdev.
*
* %NL80211_CMD_NEW_KEY (for group keys), %NL80211_CMD_NEW_STATION, and
* %NL80211_CMD_SET_STATION will optionally specify vlan_id using
* %NL80211_ATTR_VLAN_ID.
*/
/** /**
* enum nl80211_commands - supported nl80211 commands * enum nl80211_commands - supported nl80211 commands
* *
...@@ -2381,6 +2397,9 @@ enum nl80211_commands { ...@@ -2381,6 +2397,9 @@ enum nl80211_commands {
* the allowed channel bandwidth configurations. (u8 attribute) * the allowed channel bandwidth configurations. (u8 attribute)
* Defined by IEEE P802.11ay/D4.0 section 9.4.2.251, Table 13. * Defined by IEEE P802.11ay/D4.0 section 9.4.2.251, Table 13.
* *
* @NL80211_ATTR_VLAN_ID: VLAN ID (1..4094) for the station and VLAN group key
* (u16).
*
* @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NUM_NL80211_ATTR: total number of nl80211_attrs available
* @NL80211_ATTR_MAX: highest attribute number currently defined * @NL80211_ATTR_MAX: highest attribute number currently defined
* @__NL80211_ATTR_AFTER_LAST: internal use * @__NL80211_ATTR_AFTER_LAST: internal use
...@@ -2843,6 +2862,8 @@ enum nl80211_attrs { ...@@ -2843,6 +2862,8 @@ enum nl80211_attrs {
NL80211_ATTR_WIPHY_EDMG_CHANNELS, NL80211_ATTR_WIPHY_EDMG_CHANNELS,
NL80211_ATTR_WIPHY_EDMG_BW_CONFIG, NL80211_ATTR_WIPHY_EDMG_BW_CONFIG,
NL80211_ATTR_VLAN_ID,
/* add attributes here, update the policy in nl80211.c */ /* add attributes here, update the policy in nl80211.c */
__NL80211_ATTR_AFTER_LAST, __NL80211_ATTR_AFTER_LAST,
...@@ -5492,6 +5513,10 @@ enum nl80211_feature_flags { ...@@ -5492,6 +5513,10 @@ enum nl80211_feature_flags {
* @NL80211_EXT_FEATURE_SAE_OFFLOAD: Device wants to do SAE authentication in * @NL80211_EXT_FEATURE_SAE_OFFLOAD: Device wants to do SAE authentication in
* station mode (SAE password is passed as part of the connect command). * station mode (SAE password is passed as part of the connect command).
* *
* @NL80211_EXT_FEATURE_VLAN_OFFLOAD: The driver supports a single netdev
* with VLAN tagged frames and separate VLAN-specific netdevs added using
* vconfig similarly to the Ethernet case.
*
* @NUM_NL80211_EXT_FEATURES: number of extended features. * @NUM_NL80211_EXT_FEATURES: number of extended features.
* @MAX_NL80211_EXT_FEATURES: highest extended feature index. * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
*/ */
...@@ -5537,6 +5562,7 @@ enum nl80211_ext_feature_index { ...@@ -5537,6 +5562,7 @@ enum nl80211_ext_feature_index {
NL80211_EXT_FEATURE_EXT_KEY_ID, NL80211_EXT_FEATURE_EXT_KEY_ID,
NL80211_EXT_FEATURE_STA_TX_PWR, NL80211_EXT_FEATURE_STA_TX_PWR,
NL80211_EXT_FEATURE_SAE_OFFLOAD, NL80211_EXT_FEATURE_SAE_OFFLOAD,
NL80211_EXT_FEATURE_VLAN_OFFLOAD,
/* add new features before the definition below */ /* add new features before the definition below */
NUM_NL80211_EXT_FEATURES, NUM_NL80211_EXT_FEATURES,
......
...@@ -3428,7 +3428,7 @@ int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb, ...@@ -3428,7 +3428,7 @@ int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,
spin_lock_irqsave(&local->ack_status_lock, spin_flags); spin_lock_irqsave(&local->ack_status_lock, spin_flags);
id = idr_alloc(&local->ack_status_frames, ack_skb, id = idr_alloc(&local->ack_status_frames, ack_skb,
1, 0x10000, GFP_ATOMIC); 1, 0x40, GFP_ATOMIC);
spin_unlock_irqrestore(&local->ack_status_lock, spin_flags); spin_unlock_irqrestore(&local->ack_status_lock, spin_flags);
if (id < 0) { if (id < 0) {
......
This diff is collapsed.
...@@ -2417,6 +2417,33 @@ static int ieee80211_lookup_ra_sta(struct ieee80211_sub_if_data *sdata, ...@@ -2417,6 +2417,33 @@ static int ieee80211_lookup_ra_sta(struct ieee80211_sub_if_data *sdata,
return 0; return 0;
} }
static int ieee80211_store_ack_skb(struct ieee80211_local *local,
struct sk_buff *skb,
u32 *info_flags)
{
struct sk_buff *ack_skb = skb_clone_sk(skb);
u16 info_id = 0;
if (ack_skb) {
unsigned long flags;
int id;
spin_lock_irqsave(&local->ack_status_lock, flags);
id = idr_alloc(&local->ack_status_frames, ack_skb,
1, 0x40, GFP_ATOMIC);
spin_unlock_irqrestore(&local->ack_status_lock, flags);
if (id >= 0) {
info_id = id;
*info_flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
} else {
kfree_skb(ack_skb);
}
}
return info_id;
}
/** /**
* ieee80211_build_hdr - build 802.11 header in the given frame * ieee80211_build_hdr - build 802.11 header in the given frame
* @sdata: virtual interface to build the header for * @sdata: virtual interface to build the header for
...@@ -2710,26 +2737,8 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata, ...@@ -2710,26 +2737,8 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
} }
if (unlikely(!multicast && skb->sk && if (unlikely(!multicast && skb->sk &&
skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)) { skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS))
struct sk_buff *ack_skb = skb_clone_sk(skb); info_id = ieee80211_store_ack_skb(local, skb, &info_flags);
if (ack_skb) {
unsigned long flags;
int id;
spin_lock_irqsave(&local->ack_status_lock, flags);
id = idr_alloc(&local->ack_status_frames, ack_skb,
1, 0x10000, GFP_ATOMIC);
spin_unlock_irqrestore(&local->ack_status_lock, flags);
if (id >= 0) {
info_id = id;
info_flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
} else {
kfree_skb(ack_skb);
}
}
}
/* /*
* If the skb is shared we need to obtain our own copy. * If the skb is shared we need to obtain our own copy.
......
...@@ -624,6 +624,7 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { ...@@ -624,6 +624,7 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
.len = SAE_PASSWORD_MAX_LEN }, .len = SAE_PASSWORD_MAX_LEN },
[NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG }, [NL80211_ATTR_TWT_RESPONDER] = { .type = NLA_FLAG },
[NL80211_ATTR_HE_OBSS_PD] = NLA_POLICY_NESTED(he_obss_pd_policy), [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 */ /* policy for the key attributes */
...@@ -3940,6 +3941,10 @@ static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info) ...@@ -3940,6 +3941,10 @@ static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
key.type != NL80211_KEYTYPE_GROUP) key.type != NL80211_KEYTYPE_GROUP)
return -EINVAL; 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) if (!rdev->ops->add_key)
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -5711,6 +5716,9 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) ...@@ -5711,6 +5716,9 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
if (info->attrs[NL80211_ATTR_STA_AID]) if (info->attrs[NL80211_ATTR_STA_AID])
params.aid = nla_get_u16(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]) if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
params.listen_interval = params.listen_interval =
nla_get_u16(info->attrs[NL80211_ATTR_STA_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) ...@@ -5856,6 +5864,9 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
params.listen_interval = params.listen_interval =
nla_get_u16(info->attrs[NL80211_ATTR_STA_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]) { if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
params.support_p2p_ps = params.support_p2p_ps =
nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]); nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment