Kaynağa Gözat

qcacmn: Add TDLS user command getTDLSPeers

Add TDLS user command getTDLSPeers for TDLS functional verification

Change-Id: Ia02461a364ca604672d728f7dad7c3537e78f067
CRs-Fixed: 2146626
Kabilan Kannan 7 yıl önce
ebeveyn
işleme
28c82c3f42
2 değiştirilmiş dosya ile 72 ekleme ve 0 silme
  1. 16 0
      inc/wlan_cfg80211_tdls.h
  2. 56 0
      src/wlan_cfg80211_tdls.c

+ 16 - 0
inc/wlan_cfg80211_tdls.h

@@ -44,8 +44,11 @@
  * @tdls_mgmt_comp: Completion to send tdls mgmt packets
  * @tdls_link_establish_req_comp: Completion to establish link, sync to
  * send establish params to firmware, not used today.
+ * @tdls_teardown_comp: tdls teardown completion event
+ * @tdls_user_cmd_comp: tdls user command completion event
  * @tdls_add_peer_status: Peer status after add peer
  * @mgmt_tx_completion_status: Tdls mgmt frames TX completion status code
+ * @tdls_user_cmd_len: tdls user command written buffer length
  */
 struct osif_tdls_vdev {
 	struct completion tdls_add_peer_comp;
@@ -53,8 +56,10 @@ struct osif_tdls_vdev {
 	struct completion tdls_mgmt_comp;
 	struct completion tdls_link_establish_req_comp;
 	struct completion tdls_teardown_comp;
+	struct completion tdls_user_cmd_comp;
 	QDF_STATUS tdls_add_peer_status;
 	uint32_t mgmt_tx_completion_status;
+	uint32_t tdls_user_cmd_len;
 };
 
 /**
@@ -146,6 +151,17 @@ int wlan_cfg80211_tdls_oper(struct wlan_objmgr_pdev *pdev,
 			    const uint8_t *peer,
 			    enum nl80211_tdls_operation oper);
 
+/**
+ * wlan_cfg80211_tdls_get_all_peers() - get all the TDLS peers from the list
+ * @vdev: vdev object
+ * @buf: output buffer
+ * @buflen: valid length of the output error
+ *
+ * Return: length of the output buffer
+ */
+int wlan_cfg80211_tdls_get_all_peers(struct wlan_objmgr_vdev *vdev,
+				char *buf, int buflen);
+
 /**
  * wlan_cfg80211_tdls_mgmt() - process tdls management frames from the supplicant
  * @pdev: pdev object

+ 56 - 0
src/wlan_cfg80211_tdls.c

@@ -67,6 +67,7 @@ QDF_STATUS wlan_cfg80211_tdls_priv_init(struct vdev_osif_priv *osif_priv)
 	init_completion(&tdls_priv->tdls_mgmt_comp);
 	init_completion(&tdls_priv->tdls_link_establish_req_comp);
 	init_completion(&tdls_priv->tdls_teardown_comp);
+	init_completion(&tdls_priv->tdls_user_cmd_comp);
 
 	osif_priv->osif_tdls = tdls_priv;
 
@@ -636,6 +637,56 @@ fail:
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
 }
 
+int wlan_cfg80211_tdls_get_all_peers(struct wlan_objmgr_vdev *vdev,
+				char *buf, int buflen)
+{
+	struct vdev_osif_priv *osif_priv;
+	struct osif_tdls_vdev *tdls_priv;
+	int32_t len;
+	QDF_STATUS status;
+	unsigned long rc;
+
+	if (wlan_objmgr_vdev_try_get_ref(vdev, WLAN_OSIF_ID) !=
+							QDF_STATUS_SUCCESS) {
+		len = scnprintf(buf, buflen,
+				"\nNo TDLS VDEV is null\n");
+		return len;
+	}
+
+	osif_priv = wlan_vdev_get_ospriv(vdev);
+	tdls_priv = osif_priv->osif_tdls;
+
+	reinit_completion(&tdls_priv->tdls_user_cmd_comp);
+	status = ucfg_tdls_get_all_peers(vdev, buf, buflen);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		cfg80211_err("ucfg_tdls_get_all_peers failed err %d", status);
+		len = scnprintf(buf, buflen,
+				"\nucfg_tdls_send_mgmt failed\n");
+		goto error_get_tdls_peers;
+	}
+
+	cfg80211_info("Wait for tdls_user_cmd_comp. Timeout %u ms",
+		WAIT_TIME_FOR_TDLS_USER_CMD);
+
+	rc = wait_for_completion_timeout(
+		&tdls_priv->tdls_user_cmd_comp,
+		msecs_to_jiffies(WAIT_TIME_FOR_TDLS_USER_CMD));
+
+	if (0 == rc) {
+		cfg80211_err("TDLS user cmd get all peers timed out rc %ld",
+			     rc);
+		len = scnprintf(buf, buflen,
+				"\nTDLS user cmd get all peers timed out\n");
+		goto error_get_tdls_peers;
+	}
+
+	len = tdls_priv->tdls_user_cmd_len;
+
+error_get_tdls_peers:
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_OSIF_ID);
+	return len;
+}
+
 int wlan_cfg80211_tdls_mgmt(struct wlan_objmgr_pdev *pdev,
 				struct net_device *dev, const uint8_t *peer_mac,
 				uint8_t action_code, uint8_t dialog_token,
@@ -840,6 +891,11 @@ void wlan_cfg80211_tdls_event_callback(void *user_data,
 	case TDLS_EVENT_TEARDOWN_LINKS_DONE:
 		complete(&tdls_priv->tdls_teardown_comp);
 		break;
+	case TDLS_EVENT_USER_CMD:
+		tdls_priv->tdls_user_cmd_len = ind->status;
+		complete(&tdls_priv->tdls_user_cmd_comp);
+		break;
+
 	default:
 		break;
 	}