cfg80211: add flags to cfg80211_rx_mgmt()
Add flags intended to report various auxiliary information and introduce the NL80211_RXMGMT_FLAG_ANSWERED flag to report that the frame was already answered by the device. Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> [REPLIED->ANSWERED, reword commit message] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
		
					parent
					
						
							
								c4c205f3cd
							
						
					
				
			
			
				commit
				
					
						19504cf5f3
					
				
			
		
					 10 changed files with 34 additions and 17 deletions
				
			
		| 
						 | 
					@ -568,8 +568,8 @@ static int ath6kl_wmi_rx_probe_req_event_rx(struct wmi *wmi, u8 *datap, int len,
 | 
				
			||||||
		   dlen, freq, vif->probe_req_report);
 | 
							   dlen, freq, vif->probe_req_report);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (vif->probe_req_report || vif->nw_type == AP_NETWORK)
 | 
						if (vif->probe_req_report || vif->nw_type == AP_NETWORK)
 | 
				
			||||||
		cfg80211_rx_mgmt(&vif->wdev, freq, 0,
 | 
							cfg80211_rx_mgmt(&vif->wdev, freq, 0, ev->data, dlen, 0,
 | 
				
			||||||
				 ev->data, dlen, GFP_ATOMIC);
 | 
									 GFP_ATOMIC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -608,8 +608,7 @@ static int ath6kl_wmi_rx_action_event_rx(struct wmi *wmi, u8 *datap, int len,
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ath6kl_dbg(ATH6KL_DBG_WMI, "rx_action: len=%u freq=%u\n", dlen, freq);
 | 
						ath6kl_dbg(ATH6KL_DBG_WMI, "rx_action: len=%u freq=%u\n", dlen, freq);
 | 
				
			||||||
	cfg80211_rx_mgmt(&vif->wdev, freq, 0,
 | 
						cfg80211_rx_mgmt(&vif->wdev, freq, 0, ev->data, dlen, 0, GFP_ATOMIC);
 | 
				
			||||||
			 ev->data, dlen, GFP_ATOMIC);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -339,7 +339,7 @@ static void wmi_evt_rx_mgmt(struct wil6210_priv *wil, int id, void *d, int len)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		cfg80211_rx_mgmt(wil->wdev, freq, signal,
 | 
							cfg80211_rx_mgmt(wil->wdev, freq, signal,
 | 
				
			||||||
				 (void *)rx_mgmt_frame, d_len, GFP_KERNEL);
 | 
									 (void *)rx_mgmt_frame, d_len, 0, GFP_KERNEL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1430,7 +1430,7 @@ int brcmf_p2p_notify_action_frame_rx(struct brcmf_if *ifp,
 | 
				
			||||||
					      IEEE80211_BAND_5GHZ);
 | 
										      IEEE80211_BAND_5GHZ);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wdev = &ifp->vif->wdev;
 | 
						wdev = &ifp->vif->wdev;
 | 
				
			||||||
	cfg80211_rx_mgmt(wdev, freq, 0, (u8 *)mgmt_frame, mgmt_frame_len,
 | 
						cfg80211_rx_mgmt(wdev, freq, 0, (u8 *)mgmt_frame, mgmt_frame_len, 0,
 | 
				
			||||||
			 GFP_ATOMIC);
 | 
								 GFP_ATOMIC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kfree(mgmt_frame);
 | 
						kfree(mgmt_frame);
 | 
				
			||||||
| 
						 | 
					@ -1895,7 +1895,7 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probereq(struct brcmf_if *ifp,
 | 
				
			||||||
					      IEEE80211_BAND_2GHZ :
 | 
										      IEEE80211_BAND_2GHZ :
 | 
				
			||||||
					      IEEE80211_BAND_5GHZ);
 | 
										      IEEE80211_BAND_5GHZ);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cfg80211_rx_mgmt(&vif->wdev, freq, 0, mgmt_frame, mgmt_frame_len,
 | 
						cfg80211_rx_mgmt(&vif->wdev, freq, 0, mgmt_frame, mgmt_frame_len, 0,
 | 
				
			||||||
			 GFP_ATOMIC);
 | 
								 GFP_ATOMIC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	brcmf_dbg(INFO, "mgmt_frame_len (%d) , e->datalen (%d), chanspec (%04x), freq (%d)\n",
 | 
						brcmf_dbg(INFO, "mgmt_frame_len (%d) , e->datalen (%d), chanspec (%04x), freq (%d)\n",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -171,8 +171,8 @@ mwifiex_process_mgmt_packet(struct mwifiex_private *priv,
 | 
				
			||||||
	rx_pd->rx_pkt_length = cpu_to_le16(pkt_len);
 | 
						rx_pd->rx_pkt_length = cpu_to_le16(pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cfg80211_rx_mgmt(priv->wdev, priv->roc_cfg.chan.center_freq,
 | 
						cfg80211_rx_mgmt(priv->wdev, priv->roc_cfg.chan.center_freq,
 | 
				
			||||||
			 CAL_RSSI(rx_pd->snr, rx_pd->nf),
 | 
								 CAL_RSSI(rx_pd->snr, rx_pd->nf), skb->data, pkt_len,
 | 
				
			||||||
			 skb->data, pkt_len, GFP_ATOMIC);
 | 
								 0, GFP_ATOMIC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4056,6 +4056,7 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
 | 
				
			||||||
 * @sig_dbm: signal strength in mBm, or 0 if unknown
 | 
					 * @sig_dbm: signal strength in mBm, or 0 if unknown
 | 
				
			||||||
 * @buf: Management frame (header + body)
 | 
					 * @buf: Management frame (header + body)
 | 
				
			||||||
 * @len: length of the frame data
 | 
					 * @len: length of the frame data
 | 
				
			||||||
 | 
					 * @flags: flags, as defined in enum nl80211_rxmgmt_flags
 | 
				
			||||||
 * @gfp: context flags
 | 
					 * @gfp: context flags
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This function is called whenever an Action frame is received for a station
 | 
					 * This function is called whenever an Action frame is received for a station
 | 
				
			||||||
| 
						 | 
					@ -4067,7 +4068,7 @@ void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
 | 
				
			||||||
 * driver is responsible for rejecting the frame.
 | 
					 * driver is responsible for rejecting the frame.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm,
 | 
					bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm,
 | 
				
			||||||
		      const u8 *buf, size_t len, gfp_t gfp);
 | 
							      const u8 *buf, size_t len, u32 flags, gfp_t gfp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * cfg80211_mgmt_tx_status - notification of TX status for management frame
 | 
					 * cfg80211_mgmt_tx_status - notification of TX status for management frame
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1493,6 +1493,9 @@ enum nl80211_commands {
 | 
				
			||||||
 * @NL80211_ATTR_CSA_C_OFF_PRESP: Offset of the channel switch counter
 | 
					 * @NL80211_ATTR_CSA_C_OFF_PRESP: Offset of the channel switch counter
 | 
				
			||||||
 *	field in the probe response (%NL80211_ATTR_PROBE_RESP).
 | 
					 *	field in the probe response (%NL80211_ATTR_PROBE_RESP).
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
					 * @NL80211_ATTR_RXMGMT_FLAGS: flags for nl80211_send_mgmt(), u32.
 | 
				
			||||||
 | 
					 *	As specified in the &enum nl80211_rxmgmt_flags.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 * @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
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -1801,6 +1804,8 @@ enum nl80211_attrs {
 | 
				
			||||||
	NL80211_ATTR_CSA_C_OFF_BEACON,
 | 
						NL80211_ATTR_CSA_C_OFF_BEACON,
 | 
				
			||||||
	NL80211_ATTR_CSA_C_OFF_PRESP,
 | 
						NL80211_ATTR_CSA_C_OFF_PRESP,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						NL80211_ATTR_RXMGMT_FLAGS,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* 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,
 | 
				
			||||||
| 
						 | 
					@ -3901,4 +3906,15 @@ enum nl80211_crit_proto_id {
 | 
				
			||||||
/* maximum duration for critical protocol measures */
 | 
					/* maximum duration for critical protocol measures */
 | 
				
			||||||
#define NL80211_CRIT_PROTO_MAX_DURATION		5000 /* msec */
 | 
					#define NL80211_CRIT_PROTO_MAX_DURATION		5000 /* msec */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * enum nl80211_rxmgmt_flags - flags for received management frame.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Used by cfg80211_rx_mgmt()
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @NL80211_RXMGMT_FLAG_ANSWERED: frame was answered by device/driver.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					enum nl80211_rxmgmt_flags {
 | 
				
			||||||
 | 
						NL80211_RXMGMT_FLAG_ANSWERED = 1 << 0,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __LINUX_NL80211_H */
 | 
					#endif /* __LINUX_NL80211_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2678,8 +2678,7 @@ ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx)
 | 
				
			||||||
		sig = status->signal;
 | 
							sig = status->signal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (cfg80211_rx_mgmt(&rx->sdata->wdev, status->freq, sig,
 | 
						if (cfg80211_rx_mgmt(&rx->sdata->wdev, status->freq, sig,
 | 
				
			||||||
			     rx->skb->data, rx->skb->len,
 | 
								     rx->skb->data, rx->skb->len, 0, GFP_ATOMIC)) {
 | 
				
			||||||
			     GFP_ATOMIC)) {
 | 
					 | 
				
			||||||
		if (rx->sta)
 | 
							if (rx->sta)
 | 
				
			||||||
			rx->sta->rx_packets++;
 | 
								rx->sta->rx_packets++;
 | 
				
			||||||
		dev_kfree_skb(rx->skb);
 | 
							dev_kfree_skb(rx->skb);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -621,7 +621,7 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
 | 
					bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
 | 
				
			||||||
		      const u8 *buf, size_t len, gfp_t gfp)
 | 
							      const u8 *buf, size_t len, u32 flags, gfp_t gfp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct wiphy *wiphy = wdev->wiphy;
 | 
						struct wiphy *wiphy = wdev->wiphy;
 | 
				
			||||||
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
 | 
						struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
 | 
				
			||||||
| 
						 | 
					@ -664,7 +664,7 @@ bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_mbm,
 | 
				
			||||||
		/* Indicate the received Action frame to user space */
 | 
							/* Indicate the received Action frame to user space */
 | 
				
			||||||
		if (nl80211_send_mgmt(rdev, wdev, reg->nlportid,
 | 
							if (nl80211_send_mgmt(rdev, wdev, reg->nlportid,
 | 
				
			||||||
				      freq, sig_mbm,
 | 
									      freq, sig_mbm,
 | 
				
			||||||
				      buf, len, gfp))
 | 
									      buf, len, flags, gfp))
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		result = true;
 | 
							result = true;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10446,7 +10446,7 @@ EXPORT_SYMBOL(cfg80211_rx_unexpected_4addr_frame);
 | 
				
			||||||
int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
 | 
					int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
 | 
				
			||||||
		      struct wireless_dev *wdev, u32 nlportid,
 | 
							      struct wireless_dev *wdev, u32 nlportid,
 | 
				
			||||||
		      int freq, int sig_dbm,
 | 
							      int freq, int sig_dbm,
 | 
				
			||||||
		      const u8 *buf, size_t len, gfp_t gfp)
 | 
							      const u8 *buf, size_t len, u32 flags, gfp_t gfp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct net_device *netdev = wdev->netdev;
 | 
						struct net_device *netdev = wdev->netdev;
 | 
				
			||||||
	struct sk_buff *msg;
 | 
						struct sk_buff *msg;
 | 
				
			||||||
| 
						 | 
					@ -10469,7 +10469,9 @@ int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
 | 
				
			||||||
	    nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
 | 
						    nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
 | 
				
			||||||
	    (sig_dbm &&
 | 
						    (sig_dbm &&
 | 
				
			||||||
	     nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
 | 
						     nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
 | 
				
			||||||
	    nla_put(msg, NL80211_ATTR_FRAME, len, buf))
 | 
						    nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
 | 
				
			||||||
 | 
						    (flags &&
 | 
				
			||||||
 | 
						     nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, flags)))
 | 
				
			||||||
		goto nla_put_failure;
 | 
							goto nla_put_failure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	genlmsg_end(msg, hdr);
 | 
						genlmsg_end(msg, hdr);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,7 +66,7 @@ void nl80211_send_ibss_bssid(struct cfg80211_registered_device *rdev,
 | 
				
			||||||
int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
 | 
					int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
 | 
				
			||||||
		      struct wireless_dev *wdev, u32 nlpid,
 | 
							      struct wireless_dev *wdev, u32 nlpid,
 | 
				
			||||||
		      int freq, int sig_dbm,
 | 
							      int freq, int sig_dbm,
 | 
				
			||||||
		      const u8 *buf, size_t len, gfp_t gfp);
 | 
							      const u8 *buf, size_t len, u32 flags, gfp_t gfp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
nl80211_radar_notify(struct cfg80211_registered_device *rdev,
 | 
					nl80211_radar_notify(struct cfg80211_registered_device *rdev,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue