All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] cfg80211/mac80211: cqm rssi config for AP mode
@ 2018-01-17  7:31 tamizhr
  2018-01-17  7:31 ` [PATCH 1/4] wireless: allow send peer mac in rssi cqm notify tamizhr
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: tamizhr @ 2018-01-17  7:31 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, tamizhr, Tamizh chelvam

From: Tamizh chelvam <tamizhr@codeaurora.org>

Currently station mode has the support of rssi based cqm. This patchsets
extended the support for AP mode as well. Already netlink accepts mac
address in cqm notification event. We can use that to pass mac address of
the station to specify its rssi change event and bssid will be passed for
STA mode. This patchset changes cfg80211_cqm_rssi_notify and
ieee80211_cqm_rssi_notify apis to accepts mac address. RSSI config is
common for all the stations in bss.

Pradeep Kumar Chitrapu (3):
  wireless: allow send peer mac in rssi cqm notify
  cfg80211: enable setting cqm config for AP mode
  mac80211: enable setting cqm config for AP mode

Tamizh chelvam (1):
  mac80211: implement cqm using rx data signal

 drivers/net/wireless/intel/iwlwifi/mvm/rx.c      |  4 +--
 drivers/net/wireless/marvell/mwifiex/sta_event.c |  4 +--
 drivers/net/wireless/rndis_wlan.c                |  2 +-
 drivers/net/wireless/rsi/rsi_91x_mac80211.c      |  2 +-
 drivers/net/wireless/st/cw1200/sta.c             |  4 ++-
 drivers/net/wireless/ti/wl1251/event.c           |  4 +--
 drivers/net/wireless/ti/wlcore/event.c           |  5 +--
 include/net/cfg80211.h                           |  3 +-
 include/net/mac80211.h                           | 10 +++++-
 net/mac80211/cfg.c                               | 32 ++++++++++++------
 net/mac80211/mlme.c                              | 14 ++++----
 net/mac80211/rx.c                                | 43 +++++++++++++++++++++++-
 net/mac80211/sta_info.h                          |  3 ++
 net/mac80211/trace.h                             | 11 +++---
 net/wireless/nl80211.c                           | 11 +++---
 net/wireless/trace.h                             | 12 ++++---
 16 files changed, 121 insertions(+), 43 deletions(-)

-- 
1.9.1

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/4] wireless: allow send peer mac in rssi cqm notify
  2018-01-17  7:31 [PATCH 0/4] cfg80211/mac80211: cqm rssi config for AP mode tamizhr
@ 2018-01-17  7:31 ` tamizhr
  2018-01-22 12:56   ` Johannes Berg
  2018-01-17  7:31 ` [PATCH 2/4] cfg80211: enable setting cqm config for AP mode tamizhr
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: tamizhr @ 2018-01-17  7:31 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, tamizhr, Pradeep Kumar Chitrapu, Tamizh chelvam

From: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>

Extend cqm rssi notifier apis to include peer mac address. Currently
netlink cqm msg already accepts the mac. With this change just passing
the mac address as an argument to cfg and mac80211 apis.

Co-Developed-by: Tamizh Chelvam <tamizhr@codeaurora.org>
Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Signed-off-by: Tamizh chelvam <tamizhr@codeaurora.org>
---
 drivers/net/wireless/intel/iwlwifi/mvm/rx.c      |  4 ++--
 drivers/net/wireless/marvell/mwifiex/sta_event.c |  4 ++--
 drivers/net/wireless/rndis_wlan.c                |  3 ++-
 drivers/net/wireless/rsi/rsi_91x_mac80211.c      |  2 +-
 drivers/net/wireless/st/cw1200/sta.c             |  4 +++-
 drivers/net/wireless/ti/wl1251/event.c           | 14 ++++++++------
 drivers/net/wireless/ti/wlcore/event.c           |  5 +++--
 include/net/cfg80211.h                           |  3 ++-
 include/net/mac80211.h                           |  3 ++-
 net/mac80211/mlme.c                              | 14 +++++++-------
 net/mac80211/trace.h                             | 11 +++++++----
 net/wireless/nl80211.c                           |  6 +++---
 net/wireless/trace.h                             | 12 ++++++++----
 13 files changed, 50 insertions(+), 35 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rx.c b/drivers/net/wireless/intel/iwlwifi/mvm/rx.c
index d26833c..a47c7d2 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rx.c
@@ -600,7 +600,7 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
 		IWL_DEBUG_RX(mvm, "cqm_iterator cqm low %d\n",
 			     sig);
 		ieee80211_cqm_rssi_notify(
-			vif,
+			vif, vif->bss_conf.bssid,
 			NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
 			sig,
 			GFP_KERNEL);
@@ -610,7 +610,7 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
 		IWL_DEBUG_RX(mvm, "cqm_iterator cqm high %d\n",
 			     sig);
 		ieee80211_cqm_rssi_notify(
-			vif,
+			vif, vif->bss_conf.bssid,
 			NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
 			sig,
 			GFP_KERNEL);
diff --git a/drivers/net/wireless/marvell/mwifiex/sta_event.c b/drivers/net/wireless/marvell/mwifiex/sta_event.c
index 93dfb76..5e4cf59 100644
--- a/drivers/net/wireless/marvell/mwifiex/sta_event.c
+++ b/drivers/net/wireless/marvell/mwifiex/sta_event.c
@@ -877,7 +877,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
 		break;
 
 	case EVENT_RSSI_LOW:
-		cfg80211_cqm_rssi_notify(priv->netdev,
+		cfg80211_cqm_rssi_notify(priv->netdev, priv->cfg_bssid,
 					 NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
 					 0, GFP_KERNEL);
 		mwifiex_send_cmd(priv, HostCmd_CMD_RSSI_INFO,
@@ -892,7 +892,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
 		mwifiex_dbg(adapter, EVENT, "event: MAX_FAIL\n");
 		break;
 	case EVENT_RSSI_HIGH:
-		cfg80211_cqm_rssi_notify(priv->netdev,
+		cfg80211_cqm_rssi_notify(priv->netdev, priv->cfg_bssid,
 					 NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
 					 0, GFP_KERNEL);
 		mwifiex_send_cmd(priv, HostCmd_CMD_RSSI_INFO,
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c
index 9935bd0..f5a5637 100644
--- a/drivers/net/wireless/rndis_wlan.c
+++ b/drivers/net/wireless/rndis_wlan.c
@@ -3194,7 +3194,8 @@ static void rndis_do_cqm(struct usbnet *usbdev, s32 rssi)
 		return;
 
 	priv->last_cqm_event_rssi = rssi;
-	cfg80211_cqm_rssi_notify(usbdev->net, event, rssi, GFP_KERNEL);
+	cfg80211_cqm_rssi_notify(usbdev->net, priv->bssid, event, rssi,
+				 GFP_KERNEL);
 }
 
 #define DEVICE_POLLER_JIFFIES (HZ)
diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index 32f5cb4..63e0f7a 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -1172,7 +1172,7 @@ static void rsi_perform_cqm(struct rsi_common *common,
 
 	common->cqm_info.last_cqm_event_rssi = rssi;
 	rsi_dbg(INFO_ZONE, "CQM: Notifying event: %d\n", event);
-	ieee80211_cqm_rssi_notify(vif, event, rssi, GFP_KERNEL);
+	ieee80211_cqm_rssi_notify(vif, bssid, event, rssi, GFP_KERNEL);
 
 	return;
 }
diff --git a/drivers/net/wireless/st/cw1200/sta.c b/drivers/net/wireless/st/cw1200/sta.c
index 38678e9..93efdee 100644
--- a/drivers/net/wireless/st/cw1200/sta.c
+++ b/drivers/net/wireless/st/cw1200/sta.c
@@ -1019,7 +1019,9 @@ void cw1200_event_handler(struct work_struct *work)
 				NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW :
 				NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH;
 			pr_debug("[CQM] RSSI event: %d.\n", rcpi_rssi);
-			ieee80211_cqm_rssi_notify(priv->vif, cqm_evt, rcpi_rssi,
+			ieee80211_cqm_rssi_notify(priv->vif,
+						  priv->vif->bss_conf.bssid,
+						  cqm_evt, rcpi_rssi,
 						  GFP_KERNEL);
 			break;
 		}
diff --git a/drivers/net/wireless/ti/wl1251/event.c b/drivers/net/wireless/ti/wl1251/event.c
index f5acd24..1f919a2 100644
--- a/drivers/net/wireless/ti/wl1251/event.c
+++ b/drivers/net/wireless/ti/wl1251/event.c
@@ -148,17 +148,19 @@ static int wl1251_event_process(struct wl1251 *wl, struct event_mailbox *mbox)
 		if (vector & ROAMING_TRIGGER_LOW_RSSI_EVENT_ID) {
 			wl1251_debug(DEBUG_EVENT,
 				     "ROAMING_TRIGGER_LOW_RSSI_EVENT");
-			ieee80211_cqm_rssi_notify(wl->vif,
-				NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
-				0, GFP_KERNEL);
+			ieee80211_cqm_rssi_notify(
+					wl->vif, wl->bssid,
+					NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
+					0, GFP_KERNEL);
 		}
 
 		if (vector & ROAMING_TRIGGER_REGAINED_RSSI_EVENT_ID) {
 			wl1251_debug(DEBUG_EVENT,
 				     "ROAMING_TRIGGER_REGAINED_RSSI_EVENT");
-			ieee80211_cqm_rssi_notify(wl->vif,
-				NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
-				0, GFP_KERNEL);
+			ieee80211_cqm_rssi_notify(
+					wl->vif, wl->bssid,
+					NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
+					0, GFP_KERNEL);
 		}
 	}
 
diff --git a/drivers/net/wireless/ti/wlcore/event.c b/drivers/net/wireless/ti/wlcore/event.c
index f2e90d2..a0df89d 100644
--- a/drivers/net/wireless/ti/wlcore/event.c
+++ b/drivers/net/wireless/ti/wlcore/event.c
@@ -129,8 +129,9 @@ void wlcore_event_rssi_trigger(struct wl1271 *wl, s8 *metric_arr)
 
 		vif = wl12xx_wlvif_to_vif(wlvif);
 		if (event != wlvif->last_rssi_event)
-			ieee80211_cqm_rssi_notify(vif, event, metric,
-						  GFP_KERNEL);
+			ieee80211_cqm_rssi_notify(vif,
+						  wl->roc_vif->bss_conf.bssid,
+						  event, metric, GFP_KERNEL);
 		wlvif->last_rssi_event = event;
 	}
 }
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 81174f9..da7f5d7 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -5626,6 +5626,7 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
 /**
  * cfg80211_cqm_rssi_notify - connection quality monitoring rssi event
  * @dev: network device
+ * @peer: peer's MAC address
  * @rssi_event: the triggered RSSI event
  * @rssi_level: new RSSI level value or 0 if not available
  * @gfp: context flags
@@ -5633,7 +5634,7 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
  * This function is called when a configured connection quality monitoring
  * rssi threshold reached event occurs.
  */
-void cfg80211_cqm_rssi_notify(struct net_device *dev,
+void cfg80211_cqm_rssi_notify(struct net_device *dev, const u8 *peer,
 			      enum nl80211_cqm_rssi_threshold_event rssi_event,
 			      s32 rssi_level, gfp_t gfp);
 
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 906e902..d71ac81 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -5345,6 +5345,7 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,
  *	rssi threshold triggered
  *
  * @vif: &struct ieee80211_vif pointer from the add_interface callback.
+ * @peer: peer's MAC address
  * @rssi_event: the RSSI trigger event type
  * @rssi_level: new RSSI level value or 0 if not available
  * @gfp: context flags
@@ -5353,7 +5354,7 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,
  * monitoring is configured with an rssi threshold, the driver will inform
  * whenever the rssi level reaches the threshold.
  */
-void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
+void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif, const u8 *peer,
 			       enum nl80211_cqm_rssi_threshold_event rssi_event,
 			       s32 rssi_level,
 			       gfp_t gfp);
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 39b660b..d8e76e7 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -3418,14 +3418,14 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
 		    (last_event == 0 || sig < last_event - hyst)) {
 			ifmgd->last_cqm_event_signal = sig;
 			ieee80211_cqm_rssi_notify(
-				&sdata->vif,
+				&sdata->vif, bssid,
 				NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
 				sig, GFP_KERNEL);
 		} else if (sig > thold &&
 			   (last_event == 0 || sig > last_event + hyst)) {
 			ifmgd->last_cqm_event_signal = sig;
 			ieee80211_cqm_rssi_notify(
-				&sdata->vif,
+				&sdata->vif, bssid,
 				NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
 				sig, GFP_KERNEL);
 		}
@@ -3442,14 +3442,14 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
 		    (last_event == 0 || last_event >= low)) {
 			ifmgd->last_cqm_event_signal = sig;
 			ieee80211_cqm_rssi_notify(
-				&sdata->vif,
+				&sdata->vif, bssid,
 				NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
 				sig, GFP_KERNEL);
 		} else if (sig > high &&
 			   (last_event == 0 || last_event <= high)) {
 			ifmgd->last_cqm_event_signal = sig;
 			ieee80211_cqm_rssi_notify(
-				&sdata->vif,
+				&sdata->vif, bssid,
 				NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
 				sig, GFP_KERNEL);
 		}
@@ -5070,16 +5070,16 @@ void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
 	sdata_unlock(sdata);
 }
 
-void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
+void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif, const u8 *peer,
 			       enum nl80211_cqm_rssi_threshold_event rssi_event,
 			       s32 rssi_level,
 			       gfp_t gfp)
 {
 	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
 
-	trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level);
+	trace_api_cqm_rssi_notify(sdata, peer, rssi_event, rssi_level);
 
-	cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, rssi_level, gfp);
+	cfg80211_cqm_rssi_notify(sdata->dev, peer, rssi_event, rssi_level, gfp);
 }
 EXPORT_SYMBOL(ieee80211_cqm_rssi_notify);
 
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index 591ad02..7de1cbc 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -1999,27 +1999,30 @@ struct trace_switch_entry {
 );
 
 TRACE_EVENT(api_cqm_rssi_notify,
-	TP_PROTO(struct ieee80211_sub_if_data *sdata,
+	TP_PROTO(struct ieee80211_sub_if_data *sdata, const u8 *peer,
 		 enum nl80211_cqm_rssi_threshold_event rssi_event,
 		 s32 rssi_level),
 
-	TP_ARGS(sdata, rssi_event, rssi_level),
+	TP_ARGS(sdata, peer, rssi_event, rssi_level),
 
 	TP_STRUCT__entry(
 		VIF_ENTRY
+		__array(char, peer, ETH_ALEN)
 		__field(u32, rssi_event)
 		__field(s32, rssi_level)
 	),
 
 	TP_fast_assign(
 		VIF_ASSIGN;
+		memcpy(__entry->peer, peer, ETH_ALEN);
 		__entry->rssi_event = rssi_event;
 		__entry->rssi_level = rssi_level;
 	),
 
 	TP_printk(
-		VIF_PR_FMT " event:%d rssi:%d",
-		VIF_PR_ARG, __entry->rssi_event, __entry->rssi_level
+		VIF_PR_FMT " peer :%pM event:%d rssi:%d",
+		VIF_PR_ARG, __entry->peer, __entry->rssi_event,
+		__entry->rssi_level
 	)
 );
 
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index b48eb6d..ce5ee6f 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -14538,7 +14538,7 @@ static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp)
 				NL80211_MCGRP_MLME, gfp);
 }
 
-void cfg80211_cqm_rssi_notify(struct net_device *dev,
+void cfg80211_cqm_rssi_notify(struct net_device *dev, const u8 *peer,
 			      enum nl80211_cqm_rssi_threshold_event rssi_event,
 			      s32 rssi_level, gfp_t gfp)
 {
@@ -14546,7 +14546,7 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev,
 	struct wireless_dev *wdev = dev->ieee80211_ptr;
 	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
 
-	trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level);
+	trace_cfg80211_cqm_rssi_notify(dev, peer, rssi_event, rssi_level);
 
 	if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
 		    rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
@@ -14561,7 +14561,7 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev,
 			rssi_level = wdev->cqm_config->last_rssi_event_value;
 	}
 
-	msg = cfg80211_prepare_cqm(dev, NULL, gfp);
+	msg = cfg80211_prepare_cqm(dev, peer, gfp);
 	if (!msg)
 		return;
 
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index bcfedd3..052ce620 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -2578,22 +2578,26 @@
 );
 
 TRACE_EVENT(cfg80211_cqm_rssi_notify,
-	TP_PROTO(struct net_device *netdev,
+	TP_PROTO(struct net_device *netdev, const u8 *peer,
 		 enum nl80211_cqm_rssi_threshold_event rssi_event,
 		 s32 rssi_level),
-	TP_ARGS(netdev, rssi_event, rssi_level),
+	TP_ARGS(netdev, peer, rssi_event, rssi_level),
 	TP_STRUCT__entry(
 		NETDEV_ENTRY
+		MAC_ENTRY(peer)
 		__field(enum nl80211_cqm_rssi_threshold_event, rssi_event)
 		__field(s32, rssi_level)
 	),
 	TP_fast_assign(
 		NETDEV_ASSIGN;
+		MAC_ASSIGN(peer, peer);
 		__entry->rssi_event = rssi_event;
 		__entry->rssi_level = rssi_level;
 	),
-	TP_printk(NETDEV_PR_FMT ", rssi event: %d, level: %d",
-		  NETDEV_PR_ARG, __entry->rssi_event, __entry->rssi_level)
+	TP_printk(NETDEV_PR_FMT ", peer: "
+		  MAC_PR_FMT ", rssi event: %d, level: %d",
+		  NETDEV_PR_ARG, MAC_PR_ARG(peer), __entry->rssi_event,
+		   __entry->rssi_level)
 );
 
 TRACE_EVENT(cfg80211_reg_can_beacon,
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/4] cfg80211: enable setting cqm config for AP mode
  2018-01-17  7:31 [PATCH 0/4] cfg80211/mac80211: cqm rssi config for AP mode tamizhr
  2018-01-17  7:31 ` [PATCH 1/4] wireless: allow send peer mac in rssi cqm notify tamizhr
@ 2018-01-17  7:31 ` tamizhr
  2018-01-22 12:56   ` Johannes Berg
  2018-01-22 13:01   ` Johannes Berg
  2018-01-17  7:31 ` [PATCH 3/4] mac80211: " tamizhr
  2018-01-17  7:31 ` [PATCH 4/4] mac80211: implement cqm using rx data signal tamizhr
  3 siblings, 2 replies; 10+ messages in thread
From: tamizhr @ 2018-01-17  7:31 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, tamizhr, Pradeep Kumar Chitrapu, Tamizh chelvam

From: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>

Enable connection monitoring for AP mode which makes it possible to
track signal strength of connected stations.

Co-Developed-by: Tamizh Chelvam <tamizhr@codeaurora.org>
Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Signed-off-by: Tamizh chelvam <tamizhr@codeaurora.org>
---
 net/wireless/nl80211.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index ce5ee6f..3bb8eaa 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -9884,7 +9884,10 @@ static int nl80211_set_cqm_rssi(struct genl_info *info,
 	}
 
 	if (wdev->iftype != NL80211_IFTYPE_STATION &&
-	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
+	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT &&
+	    wdev->iftype != NL80211_IFTYPE_AP &&
+	    wdev->iftype != NL80211_IFTYPE_P2P_GO &&
+	    wdev->iftype != NL80211_IFTYPE_AP_VLAN)
 		return -EOPNOTSUPP;
 
 	wdev_lock(wdev);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/4] mac80211: enable setting cqm config for AP mode
  2018-01-17  7:31 [PATCH 0/4] cfg80211/mac80211: cqm rssi config for AP mode tamizhr
  2018-01-17  7:31 ` [PATCH 1/4] wireless: allow send peer mac in rssi cqm notify tamizhr
  2018-01-17  7:31 ` [PATCH 2/4] cfg80211: enable setting cqm config for AP mode tamizhr
@ 2018-01-17  7:31 ` tamizhr
  2018-01-22 12:57   ` Johannes Berg
  2018-01-17  7:31 ` [PATCH 4/4] mac80211: implement cqm using rx data signal tamizhr
  3 siblings, 1 reply; 10+ messages in thread
From: tamizhr @ 2018-01-17  7:31 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, tamizhr, Pradeep Kumar Chitrapu, Tamizh chelvam

From: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>

Enable connection monitoring for AP mode which makes it possible to
track signal strength of connected stations.

Co-Developed-by: Tamizh Chelvam <tamizhr@codeaurora.org>
Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Signed-off-by: Tamizh chelvam <tamizhr@codeaurora.org>
---
 net/mac80211/cfg.c | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 46028e1..f290ca4 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -2689,6 +2689,26 @@ static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
 	return 0;
 }
 
+static void ieee80211_update_rssi_config(struct ieee80211_sub_if_data *sdata)
+{
+	if (!(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI))
+		return;
+
+	/* tell the driver upon association, unless already associated */
+	if (sdata->vif.type == NL80211_IFTYPE_STATION &&
+	    !sdata->u.mgd.associated)
+		return;
+
+	/* if AP, always tell the driver by checking beacon status */
+	if ((sdata->vif.type == NL80211_IFTYPE_AP ||
+	     sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
+	     sdata->vif.type == NL80211_IFTYPE_P2P_GO) &&
+	     !sdata->vif.bss_conf.enable_beacon)
+		return;
+
+	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
+}
+
 static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
 					 struct net_device *dev,
 					 s32 rssi_thold, u32 rssi_hyst)
@@ -2711,11 +2731,7 @@ static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
 	bss_conf->cqm_rssi_high = 0;
 	sdata->u.mgd.last_cqm_event_signal = 0;
 
-	/* tell the driver upon association, unless already associated */
-	if (sdata->u.mgd.associated &&
-	    sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)
-		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
-
+	ieee80211_update_rssi_config(sdata);
 	return 0;
 }
 
@@ -2736,11 +2752,7 @@ static int ieee80211_set_cqm_rssi_range_config(struct wiphy *wiphy,
 	bss_conf->cqm_rssi_hyst = 0;
 	sdata->u.mgd.last_cqm_event_signal = 0;
 
-	/* tell the driver upon association, unless already associated */
-	if (sdata->u.mgd.associated &&
-	    sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)
-		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
-
+	ieee80211_update_rssi_config(sdata);
 	return 0;
 }
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/4] mac80211: implement cqm using rx data signal
  2018-01-17  7:31 [PATCH 0/4] cfg80211/mac80211: cqm rssi config for AP mode tamizhr
                   ` (2 preceding siblings ...)
  2018-01-17  7:31 ` [PATCH 3/4] mac80211: " tamizhr
@ 2018-01-17  7:31 ` tamizhr
  2018-01-22 13:01   ` Johannes Berg
  3 siblings, 1 reply; 10+ messages in thread
From: tamizhr @ 2018-01-17  7:31 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, tamizhr, Tamizh chelvam

From: Tamizh chelvam <tamizhr@codeaurora.org>

Triggers ieee80211_cqm_rssi_notify with the corresponding event when
station signal goes lower than the configured rssi threshold. And
notify back to user space once the station signal becomes greater than
the configured value. It uses rx data signal and compare with rssi value
given by user. This rssi threshold is bss specific and it is common for
all the stations.

Signed-off-by: Tamizh chelvam <tamizhr@codeaurora.org>
---
 include/net/mac80211.h  |  7 +++++++
 net/mac80211/rx.c       | 43 ++++++++++++++++++++++++++++++++++++++++++-
 net/mac80211/sta_info.h |  3 +++
 3 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index d71ac81..1dec4ec 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -799,6 +799,13 @@ enum mac80211_rate_control_flags {
 };
 
 
+/*
+ * How many frames need to have been used in average station's
+ * signal strength before checking against the threshold
+ */
+#define IEEE80211_STA_SIGNAL_AVE_MIN_COUNT	4
+
+
 /* there are 40 bytes if you don't need the rateset to be kept */
 #define IEEE80211_TX_INFO_DRIVER_DATA_SIZE 40
 
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index fd58061..e6f728a 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1534,6 +1534,39 @@ void ieee80211_sta_uapsd_trigger(struct ieee80211_sta *pubsta, u8 tid)
 	return RX_CONTINUE;
 }
 
+static void ieee80211_sta_rx_signal_thold_check(struct ieee80211_rx_data *rx)
+{
+	struct sta_info *sta = rx->sta;
+	struct ieee80211_bss_conf *bss_conf =
+		&rx->sdata->vif.bss_conf;
+	int sig, last_event, thold;
+
+	if (!bss_conf->cqm_rssi_thold || !bss_conf->enable_beacon) {
+		sta->count_rx_signal = 0;
+		return;
+	}
+
+	sig = -ewma_signal_read(&sta->rx_stats_avg.signal);
+	last_event = sta->last_cqm_event_signal;
+	thold = bss_conf->cqm_rssi_thold;
+
+	if (sig < thold && last_event == 0) {
+		sta->last_cqm_event_signal = sig;
+		ieee80211_cqm_rssi_notify(
+				&rx->sdata->vif, sta->addr,
+				NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
+				sig, GFP_ATOMIC);
+		sta->count_rx_signal = 0;
+	} else if (last_event && sig > thold) {
+		sta->last_cqm_event_signal = 0;
+		ieee80211_cqm_rssi_notify(
+				&rx->sdata->vif, sta->addr,
+				NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
+				sig, GFP_ATOMIC);
+		sta->count_rx_signal = 0;
+	}
+}
+
 static ieee80211_rx_result debug_noinline
 ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
 {
@@ -1589,6 +1622,9 @@ void ieee80211_sta_uapsd_trigger(struct ieee80211_sta *pubsta, u8 tid)
 	if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
 		sta->rx_stats.last_signal = status->signal;
 		ewma_signal_add(&sta->rx_stats_avg.signal, -status->signal);
+		sta->count_rx_signal++;
+		if (sta->count_rx_signal >= IEEE80211_STA_SIGNAL_AVE_MIN_COUNT)
+			ieee80211_sta_rx_signal_thold_check(rx);
 	}
 
 	if (status->chains) {
@@ -3967,9 +4003,14 @@ static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,
 
 	if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
 		stats->last_signal = status->signal;
-		if (!fast_rx->uses_rss)
+		if (!fast_rx->uses_rss) {
 			ewma_signal_add(&sta->rx_stats_avg.signal,
 					-status->signal);
+			sta->count_rx_signal++;
+			if (sta->count_rx_signal >=
+			    IEEE80211_STA_SIGNAL_AVE_MIN_COUNT)
+				ieee80211_sta_rx_signal_thold_check(rx);
+		}
 	}
 
 	if (status->chains) {
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index cd53619..76e8877 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -579,6 +579,9 @@ struct sta_info {
 
 	struct cfg80211_chan_def tdls_chandef;
 
+	int last_cqm_event_signal;
+	unsigned int count_rx_signal;
+
 	/* keep last! */
 	struct ieee80211_sta sta;
 };
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] wireless: allow send peer mac in rssi cqm notify
  2018-01-17  7:31 ` [PATCH 1/4] wireless: allow send peer mac in rssi cqm notify tamizhr
@ 2018-01-22 12:56   ` Johannes Berg
  0 siblings, 0 replies; 10+ messages in thread
From: Johannes Berg @ 2018-01-22 12:56 UTC (permalink / raw)
  To: tamizhr; +Cc: linux-wireless, tamizhr, Pradeep Kumar Chitrapu

On Wed, 2018-01-17 at 13:01 +0530, tamizhr@codeaurora.org wrote:
> From: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
> 
> Extend cqm rssi notifier apis to include peer mac address. Currently
> netlink cqm msg already accepts the mac. With this change just passing
> the mac address as an argument to cfg and mac80211 apis.
> 
It seems eminently reasonable to have this functionality, but I'm not
sure you can implement it like this?

I'd be worried that there's some userspace that just listens for these
events and could get confused if another virtual interface shows up
with notifications - if it's not doing proper filtering etc.?

I'd be more comfortable at least moving the per-station notifications
to a new command ID, or making them opt-in by clients by having a
registration command and sending them unicast instead.

Or actually, perhaps the best would be to just go and create a new
multicast group for them, then we don't need a new command ID and
existing clients can't get confused, but new clients don't really have
to do anything but sign up to the new multicast group. We could check
if the group is non-empty before we even build the message too.

johannes

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/4] cfg80211: enable setting cqm config for AP mode
  2018-01-17  7:31 ` [PATCH 2/4] cfg80211: enable setting cqm config for AP mode tamizhr
@ 2018-01-22 12:56   ` Johannes Berg
  2018-01-22 13:01   ` Johannes Berg
  1 sibling, 0 replies; 10+ messages in thread
From: Johannes Berg @ 2018-01-22 12:56 UTC (permalink / raw)
  To: tamizhr; +Cc: linux-wireless, tamizhr, Pradeep Kumar Chitrapu

On Wed, 2018-01-17 at 13:01 +0530, tamizhr@codeaurora.org wrote:
> From: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
> 
> Enable connection monitoring for AP mode which makes it possible to
> track signal strength of connected stations.

>  	if (wdev->iftype != NL80211_IFTYPE_STATION &&
> -	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
> +	    wdev->iftype != NL80211_IFTYPE_P2P_CLIENT &&
> +	    wdev->iftype != NL80211_IFTYPE_AP &&
> +	    wdev->iftype != NL80211_IFTYPE_P2P_GO &&
> +	    wdev->iftype != NL80211_IFTYPE_AP_VLAN)
>  		return -EOPNOTSUPP;
> 
This seems problematic - you'll probably need a driver support flag for
this. And since clients might want to know whether this works or not,
just make that an nl80211 extended feature bit?

johannes

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/4] mac80211: enable setting cqm config for AP mode
  2018-01-17  7:31 ` [PATCH 3/4] mac80211: " tamizhr
@ 2018-01-22 12:57   ` Johannes Berg
  0 siblings, 0 replies; 10+ messages in thread
From: Johannes Berg @ 2018-01-22 12:57 UTC (permalink / raw)
  To: tamizhr; +Cc: linux-wireless, tamizhr, Pradeep Kumar Chitrapu

On Wed, 2018-01-17 at 13:01 +0530, tamizhr@codeaurora.org wrote:
> 
> +static void ieee80211_update_rssi_config(struct ieee80211_sub_if_data *sdata)
[...]
> +	/* if AP, always tell the driver by checking beacon status */
> +	if ((sdata->vif.type == NL80211_IFTYPE_AP ||
> +	     sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
> +	     sdata->vif.type == NL80211_IFTYPE_P2P_GO) &&
> +	     !sdata->vif.bss_conf.enable_beacon)

nit: that line with !sdata should be indented one less, it doesn't
belong into the parenthesized expression.

Again though, this relies on a driver feature bit to not confuse the
driver.

johannes

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/4] cfg80211: enable setting cqm config for AP mode
  2018-01-17  7:31 ` [PATCH 2/4] cfg80211: enable setting cqm config for AP mode tamizhr
  2018-01-22 12:56   ` Johannes Berg
@ 2018-01-22 13:01   ` Johannes Berg
  1 sibling, 0 replies; 10+ messages in thread
From: Johannes Berg @ 2018-01-22 13:01 UTC (permalink / raw)
  To: tamizhr; +Cc: linux-wireless, tamizhr, Pradeep Kumar Chitrapu

In addition to what I said before, you should also document which CQM
modes are actually available per station.

Perhaps the feature bit also needs to be per mode, since in mac80211 at
least you're only implementing signal monitoring, not
nl80211_set_cqm_txe()?

johannes

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 4/4] mac80211: implement cqm using rx data signal
  2018-01-17  7:31 ` [PATCH 4/4] mac80211: implement cqm using rx data signal tamizhr
@ 2018-01-22 13:01   ` Johannes Berg
  0 siblings, 0 replies; 10+ messages in thread
From: Johannes Berg @ 2018-01-22 13:01 UTC (permalink / raw)
  To: tamizhr; +Cc: linux-wireless, tamizhr

On Wed, 2018-01-17 at 13:01 +0530, tamizhr@codeaurora.org wrote:
> 
> +		if (!fast_rx->uses_rss) {
>  			ewma_signal_add(&sta->rx_stats_avg.signal,
>  					-status->signal);
> +			sta->count_rx_signal++;
> +			if (sta->count_rx_signal >=
> +			    IEEE80211_STA_SIGNAL_AVE_MIN_COUNT)
> +				ieee80211_sta_rx_signal_thold_check(rx);
> +		}
> 
Obviously this also means that not all mac80211 drivers will get the
feature, which also means we really do need a feature bit for it, and
one that mac80211 can only set if the driver promised not to use RSS.

johannes

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2018-01-22 13:01 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-17  7:31 [PATCH 0/4] cfg80211/mac80211: cqm rssi config for AP mode tamizhr
2018-01-17  7:31 ` [PATCH 1/4] wireless: allow send peer mac in rssi cqm notify tamizhr
2018-01-22 12:56   ` Johannes Berg
2018-01-17  7:31 ` [PATCH 2/4] cfg80211: enable setting cqm config for AP mode tamizhr
2018-01-22 12:56   ` Johannes Berg
2018-01-22 13:01   ` Johannes Berg
2018-01-17  7:31 ` [PATCH 3/4] mac80211: " tamizhr
2018-01-22 12:57   ` Johannes Berg
2018-01-17  7:31 ` [PATCH 4/4] mac80211: implement cqm using rx data signal tamizhr
2018-01-22 13:01   ` Johannes Berg

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.