Browse Source

qcacld-3.0: Implement NDP_END_REQ

Add MCL changes for NDP_END_REQ.

Change-Id: I55262f58149654e9bd1ee8c9a121e361f8d94d11
CRs-Fixed: 2014795
Naveen Rawat 8 years ago
parent
commit
b3143ea845

+ 1 - 0
core/hdd/src/wlan_hdd_main.c

@@ -1941,6 +1941,7 @@ static void hdd_nan_register_callbacks(hdd_context_t *hdd_ctx)
 
 	cb_obj.new_peer_ind = hdd_ndp_new_peer_handler;
 	cb_obj.get_peer_idx = hdd_ndp_get_peer_idx;
+	cb_obj.peer_departed_ind = hdd_ndp_peer_departed_handler;
 
 	os_if_nan_register_hdd_callbacks(hdd_ctx->hdd_psoc, &cb_obj);
 }

+ 31 - 0
core/hdd/src/wlan_hdd_nan_datapath.c

@@ -2294,4 +2294,35 @@ int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id,
 	return 0;
 }
 
+
+/**
+ * hdd_ndp_peer_departed_handler() - Handle NDP peer departed indication
+ * @adapter: pointer to adapter context
+ * @ind_params: indication parameters
+ *
+ * Return: none
+ */
+void hdd_ndp_peer_departed_handler(uint8_t vdev_id, uint16_t sta_id,
+			struct qdf_mac_addr *peer_mac_addr, bool last_peer)
+{
+	hdd_context_t *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
+	hdd_adapter_t *adapter = hdd_get_adapter_by_vdev(hdd_ctx, vdev_id);
+	hdd_station_ctx_t *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
+
+	ENTER();
+	hdd_roam_deregister_sta(adapter, sta_id);
+	hdd_delete_peer(sta_ctx, sta_id);
+	hdd_ctx->sta_to_adapter[sta_id] = NULL;
+
+	if (last_peer) {
+		hdd_info("No more ndp peers.");
+		sta_ctx->conn_info.connState = eConnectionState_NdiDisconnected;
+		hdd_conn_set_connection_state(adapter,
+			eConnectionState_NdiDisconnected);
+		hdd_info("Stop netif tx queues.");
+		wlan_hdd_netif_queue_control(adapter, WLAN_STOP_ALL_NETIF_QUEUE,
+					     WLAN_CONTROL_PATH);
+	}
+	EXIT();
+}
 #endif

+ 2 - 0
core/hdd/src/wlan_hdd_nan_datapath.h

@@ -259,5 +259,7 @@ void hdd_ndi_drv_ndi_delete_rsp_handler(uint8_t vdev_id);
 int hdd_ndp_get_peer_idx(uint8_t vdev_id, struct qdf_mac_addr *addr);
 int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id,
 			struct qdf_mac_addr *peer_mac_addr, bool fist_peer);
+void hdd_ndp_peer_departed_handler(uint8_t vdev_id, uint16_t sta_id,
+			struct qdf_mac_addr *peer_mac_addr, bool last_peer);
 
 #endif /* __WLAN_HDD_NAN_DATAPATH_H */

+ 2 - 0
core/mac/src/pe/lim/lim_api.c

@@ -746,6 +746,8 @@ static void lim_nan_register_callbacks(tpAniSirGlobal mac_ctx)
 	struct nan_callbacks cb_obj = {0};
 
 	cb_obj.add_ndi_peer = lim_add_ndi_peer_converged;
+	cb_obj.ndp_delete_peers = lim_ndp_delete_peers_converged;
+	cb_obj.delete_peers_by_addr = lim_ndp_delete_peers_by_addr_converged;
 
 	ucfg_nan_register_lim_callbacks(mac_ctx->psoc, &cb_obj);
 }

+ 47 - 3
core/mac/src/pe/nan/nan_datapath.c

@@ -37,6 +37,7 @@
 #include "nan_ucfg_api.h"
 #endif
 
+#ifndef WLAN_FEATURE_NAN_CONVERGENCE
 /**
  * lim_send_ndp_event_to_sme() - generic function to prepare and send NDP
  * message to SME.
@@ -67,6 +68,26 @@ static void lim_send_ndp_event_to_sme(tpAniSirGlobal mac_ctx, uint32_t msg_type,
 	lim_sys_process_mmh_msg_api(mac_ctx, &mmh_msg, ePROT);
 }
 
+static void lim_send_peer_departed(tpAniSirGlobal mac_ctx, uint8_t vdev_id,
+				uint32_t msg_type, void *body_ptr, uint32_t len,
+				uint32_t body_val)
+{
+	lim_send_ndp_event_to_sme(mac_ctx, msg_type, body_ptr, len, body_val);
+}
+#else
+static void lim_send_peer_departed(tpAniSirGlobal mac_ctx, uint8_t vdev_id,
+				uint32_t msg_type, void *body_ptr, uint32_t len,
+				uint32_t body_val)
+{
+	struct wlan_objmgr_psoc *psoc = mac_ctx->psoc;
+	struct wlan_objmgr_vdev *vdev =
+			wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+							     WLAN_NAN_ID);
+
+	ucfg_nan_event_handler(psoc, vdev, NDP_PEER_DEPARTED, body_ptr);
+}
+#endif
+
 /**
  * lim_add_ndi_peer() - Function to add ndi peer
  * @mac_ctx: handle to mac structure
@@ -232,6 +253,7 @@ responder_rsp:
 				bodyval ? 0 : sizeof(*rsp_ind), bodyval);
 	return ret_val;
 }
+#endif /* WLAN_FEATURE_NAN_CONVERGENCE */
 
 /**
  * lim_ndp_delete_peer_by_addr() - Delete NAN data peer, given addr and vdev_id
@@ -279,6 +301,17 @@ static void lim_ndp_delete_peer_by_addr(tpAniSirGlobal mac_ctx, uint8_t vdev_id,
 	lim_del_sta(mac_ctx, sta_ds, true, session);
 }
 
+void lim_ndp_delete_peers_by_addr_converged(uint8_t vdev_id,
+					struct qdf_mac_addr peer_ndi_mac_addr)
+{
+	tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
+
+	if (!mac_ctx)
+		return;
+
+	lim_ndp_delete_peer_by_addr(mac_ctx, vdev_id, peer_ndi_mac_addr);
+}
+
 /**
  * lim_ndp_delete_peers() - Delete NAN data peers
  * @mac_ctx: handle to mac context
@@ -362,7 +395,18 @@ static void lim_ndp_delete_peers(tpAniSirGlobal mac_ctx,
 	}
 	qdf_mem_free(deleted_peers);
 }
-#endif
+
+void lim_ndp_delete_peers_converged(struct peer_nan_datapath_map *ndp_map,
+				    uint8_t num_peers)
+{
+	tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
+
+	if (!mac_ctx)
+		return;
+
+	lim_ndp_delete_peers(mac_ctx, (struct peer_ndp_map *)ndp_map,
+			     num_peers);
+}
 
 #ifndef WLAN_FEATURE_NAN_CONVERGENCE
 /**
@@ -465,8 +509,8 @@ void lim_process_ndi_del_sta_rsp(tpAniSirGlobal mac_ctx,
 	lim_delete_dph_hash_entry(mac_ctx, sta_ds->staAddr, sta_ds->assocId,
 			pe_session);
 	pe_session->limMlmState = eLIM_MLM_IDLE_STATE;
-
-	lim_send_ndp_event_to_sme(mac_ctx, eWNI_SME_NDP_PEER_DEPARTED_IND,
+	lim_send_peer_departed(mac_ctx, peer_ind.session_id,
+				eWNI_SME_NDP_PEER_DEPARTED_IND,
 				&peer_ind, sizeof(peer_ind), false);
 
 skip_event:

+ 9 - 0
core/mac/src/pe/nan/nan_datapath.h

@@ -33,6 +33,8 @@
 #include "ani_global.h"
 #include "sir_params.h"
 
+struct peer_nan_datapath_map;
+
 /**
  * struct ndp_peer_node - structure for holding per-peer context
  * @next: pointer to the next peer
@@ -116,6 +118,13 @@ void lim_process_ndi_del_sta_rsp(tpAniSirGlobal mac_ctx,
 
 QDF_STATUS lim_add_ndi_peer_converged(uint32_t vdev_id,
 				struct qdf_mac_addr peer_mac_addr);
+
+void lim_ndp_delete_peers_converged(struct peer_nan_datapath_map *ndp_map,
+				    uint8_t num_peers);
+
+void lim_ndp_delete_peers_by_addr_converged(uint8_t vdev_id,
+					struct qdf_mac_addr peer_ndi_mac_addr);
+
 #else
 static inline void lim_process_ndi_mlm_add_bss_rsp(tpAniSirGlobal mac_ctx,
 					struct scheduler_msg *lim_msg_q,