Browse Source

qcacld-3.0: Add debugfs support for offload info

Add debugfs entry to get offload info (mc addr list, arp, ns etc.,)
for STA interface.

Change-Id: I8bf4491929b5ef04ed5ce19f4b0030945f0eb0c0
CRs-Fixed: 2203786
Rajeev Kumar Sirasanagandla 7 years ago
parent
commit
f1a6d08ebc

+ 11 - 0
pmo/core/inc/wlan_pmo_arp.h

@@ -70,6 +70,17 @@ QDF_STATUS pmo_core_enable_arp_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS pmo_core_disable_arp_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 		enum pmo_offload_trigger trigger);
 
+/**
+ * pmo_core_get_arp_offload_params() - API to get arp offload params
+ * @vdev: objmgr vdev
+ * @params: output pointer to hold offload params
+ *
+ * Return: QDF_STATUS_SUCCESS in case of success else return error
+ */
+QDF_STATUS
+pmo_core_get_arp_offload_params(struct wlan_objmgr_vdev *vdev,
+				struct pmo_arp_offload_params *params);
+
 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
 
 #endif /* end  of _WLAN_PMO_ARP_H_ */

+ 13 - 0
pmo/core/inc/wlan_pmo_mc_addr_filtering.h

@@ -144,6 +144,19 @@ int pmo_core_get_mc_addr_list_count(struct wlan_objmgr_psoc *psoc,
  */
 uint8_t pmo_core_max_mc_addr_supported(struct wlan_objmgr_psoc *psoc);
 
+/**
+ * pmo_core_get_mc_addr_list() - Get mc addr list configured
+ * @psoc: objmgr psoc
+ * @vdev_id: vdev identifier
+ * @mc_list_req: output pointer to hold mc addr list params
+ *
+ * Return: QDF_STATUS_SUCCESS in case of success else return error
+ */
+QDF_STATUS
+pmo_core_get_mc_addr_list(struct wlan_objmgr_psoc *psoc,
+			  uint8_t vdev_id,
+			  struct pmo_mc_addr_list *mc_list_req);
+
 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
 
 #endif /* end  of _WLAN_PMO_MC_ADDR_FILTERING_H_ */

+ 11 - 0
pmo/core/inc/wlan_pmo_ns.h

@@ -71,6 +71,17 @@ QDF_STATUS pmo_core_enable_ns_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS pmo_core_disable_ns_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 		enum pmo_offload_trigger trigger);
 
+/**
+ * pmo_core_get_ns_offload_params() - API to get ns offload params
+ * @vdev: objmgr vdev
+ * @params: output pointer to hold offload params
+ *
+ * Return: QDF_STATUS_SUCCESS in case of success else return error
+ */
+QDF_STATUS
+pmo_core_get_ns_offload_params(struct wlan_objmgr_vdev *vdev,
+			       struct pmo_ns_offload_params *params);
+
 #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
 
 #endif /* end  of _WLAN_PMO_NS_H_ */

+ 44 - 0
pmo/core/src/wlan_pmo_arp.c

@@ -56,6 +56,7 @@ static QDF_STATUS pmo_core_cache_arp_in_vdev_priv(
 		peer_bssid.bytes);
 
 	request->enable = PMO_OFFLOAD_ENABLE;
+	request->is_offload_applied = false;
 	/* converting u32 to IPV4 address */
 	for (index = 0; index < PMO_IPV4_ADDR_LEN; index++)
 		request->host_ipv4_addr[index] =
@@ -93,6 +94,7 @@ static QDF_STATUS pmo_core_flush_arp_from_vdev_priv(
 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
 	qdf_mem_zero(&vdev_ctx->vdev_arp_req, sizeof(vdev_ctx->vdev_arp_req));
 	vdev_ctx->vdev_arp_req.enable = PMO_OFFLOAD_DISABLE;
+	vdev_ctx->vdev_arp_req.is_offload_applied = false;
 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
 
 	pmo_exit();
@@ -366,3 +368,45 @@ out:
 	return status;
 }
 
+QDF_STATUS
+pmo_core_get_arp_offload_params(struct wlan_objmgr_vdev *vdev,
+				struct pmo_arp_offload_params *params)
+{
+	QDF_STATUS status;
+	struct pmo_vdev_priv_obj *vdev_ctx;
+	uint8_t vdev_id;
+
+	pmo_enter();
+
+	if (!params)
+		return QDF_STATUS_E_INVAL;
+
+	qdf_mem_zero(params, sizeof(*params));
+
+	if (!vdev) {
+		pmo_err("vdev is NULL");
+		status = QDF_STATUS_E_NULL_VALUE;
+		goto out;
+	}
+
+	status = pmo_vdev_get_ref(vdev);
+	if (status != QDF_STATUS_SUCCESS)
+		goto out;
+
+	status = pmo_core_arp_offload_sanity(vdev);
+	if (status != QDF_STATUS_SUCCESS)
+		goto put_ref;
+
+	vdev_id = pmo_vdev_get_id(vdev);
+	vdev_ctx = pmo_vdev_get_priv(vdev);
+	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+	*params = vdev_ctx->vdev_arp_req;
+	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+
+put_ref:
+	pmo_vdev_put_ref(vdev);
+out:
+	pmo_exit();
+
+	return status;
+}

+ 51 - 0
pmo/core/src/wlan_pmo_mc_addr_filtering.c

@@ -634,3 +634,54 @@ out:
 	return status;
 }
 
+QDF_STATUS
+pmo_core_get_mc_addr_list(struct wlan_objmgr_psoc *psoc,
+			  uint8_t vdev_id,
+			  struct pmo_mc_addr_list *mc_list_req)
+{
+	QDF_STATUS status;
+	struct wlan_objmgr_vdev *vdev;
+	struct pmo_vdev_priv_obj *vdev_ctx;
+
+	pmo_enter();
+
+	if (!mc_list_req)
+		return QDF_STATUS_E_INVAL;
+
+	qdf_mem_zero(mc_list_req, sizeof(*mc_list_req));
+
+	status = pmo_psoc_get_ref(psoc);
+	if (QDF_IS_STATUS_ERROR(status))
+		goto exit_with_status;
+
+	vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+	if (!vdev) {
+		pmo_err("vdev is NULL");
+		status = QDF_STATUS_E_INVAL;
+		goto put_psoc;
+	}
+
+	status = pmo_vdev_get_ref(vdev);
+	if (QDF_IS_STATUS_ERROR(status))
+		goto put_psoc;
+
+	status = pmo_core_mc_addr_flitering_sanity(vdev);
+	if (status != QDF_STATUS_SUCCESS)
+		goto put_vdev;
+
+	vdev_ctx = pmo_vdev_get_priv(vdev);
+	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+	*mc_list_req = vdev_ctx->vdev_mc_list_req;
+	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+
+put_vdev:
+	pmo_vdev_put_ref(vdev);
+
+put_psoc:
+	pmo_psoc_put_ref(psoc);
+
+exit_with_status:
+	pmo_exit();
+
+	return status;
+}

+ 45 - 0
pmo/core/src/wlan_pmo_ns.c

@@ -61,6 +61,8 @@ static void pmo_core_fill_ns_addr(struct pmo_ns_offload_params *request,
 		request->target_ipv6_addr_ac_type[i] =
 			ns_req->ipv6_addr_type[i];
 
+		request->scope[i] = ns_req->scope[i];
+
 		pmo_debug("NSoffload solicitIp: %pI6 targetIp: %pI6 Index: %d",
 			&request->self_ipv6_addr[i],
 			&request->target_ipv6_addr[i], i);
@@ -84,6 +86,7 @@ static QDF_STATUS pmo_core_cache_ns_in_vdev_priv(
 	pmo_core_fill_ns_addr(&request, ns_req);
 
 	request.enable = PMO_OFFLOAD_ENABLE;
+	request.is_offload_applied = false;
 	qdf_mem_copy(&request.self_macaddr.bytes,
 			  wlan_vdev_mlme_get_macaddr(vdev),
 			  QDF_MAC_ADDR_SIZE);
@@ -128,6 +131,7 @@ static QDF_STATUS pmo_core_flush_ns_from_vdev_priv(
 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
 	qdf_mem_zero(&vdev_ctx->vdev_ns_req, sizeof(vdev_ctx->vdev_ns_req));
 	vdev_ctx->vdev_ns_req.enable = PMO_OFFLOAD_DISABLE;
+	vdev_ctx->vdev_ns_req.is_offload_applied = false;
 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
 
 	pmo_exit();
@@ -453,3 +457,44 @@ out:
 	return status;
 }
 
+QDF_STATUS
+pmo_core_get_ns_offload_params(struct wlan_objmgr_vdev *vdev,
+			       struct pmo_ns_offload_params *params)
+{
+	QDF_STATUS status;
+	struct pmo_vdev_priv_obj *vdev_ctx;
+
+	pmo_enter();
+
+	if (!params)
+		return QDF_STATUS_E_INVAL;
+
+	qdf_mem_zero(params, sizeof(*params));
+
+	if (!vdev) {
+		pmo_err("vdev is NULL");
+		status = QDF_STATUS_E_INVAL;
+		goto out;
+	}
+
+	status = pmo_vdev_get_ref(vdev);
+	if (status != QDF_STATUS_SUCCESS)
+		goto out;
+
+	vdev_ctx = pmo_vdev_get_priv(vdev);
+
+	status = pmo_core_ns_offload_sanity(vdev);
+	if (status != QDF_STATUS_SUCCESS)
+		goto dec_ref;
+
+	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+	*params = vdev_ctx->vdev_ns_req;
+	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+
+dec_ref:
+	pmo_vdev_put_ref(vdev);
+out:
+	pmo_exit();
+
+	return status;
+}

+ 1 - 0
pmo/dispatcher/inc/wlan_pmo_arp_public_struct.h

@@ -52,6 +52,7 @@ struct pmo_arp_offload_params {
 	uint8_t enable;
 	uint8_t host_ipv4_addr[PMO_IPV4_ADDR_LEN];
 	struct qdf_mac_addr bssid;
+	bool is_offload_applied;
 };
 
 #endif /* end  of _WLAN_PMO_ARP_PUBLIC_STRUCT_H_ */

+ 22 - 1
pmo/dispatcher/inc/wlan_pmo_ns_public_struct.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -28,6 +28,24 @@
 
 #include "wlan_pmo_common_public_struct.h"
 
+/**
+ * enum pmo_ns_addr_scope - Internal identification of IPv6 addr scope
+ * @PMO_NS_ADDR_SCOPE_INVALID: invalid scope
+ * @PMO_NS_ADDR_SCOPE_NODELOCAL: node local scope
+ * @PMO_NS_ADDR_SCOPE_LINKLOCAL: link local scope
+ * @PMO_NS_ADDR_SCOPE_SITELOCAL: site local scope
+ * @PMO_NS_ADDR_SCOPE_ORGLOCAL: org local scope
+ * @PMO_NS_ADDR_SCOPE_GLOBAL: global scope
+ */
+enum pmo_ns_addr_scope {
+	PMO_NS_ADDR_SCOPE_INVALID = 0,
+	PMO_NS_ADDR_SCOPE_NODELOCAL = 1,
+	PMO_NS_ADDR_SCOPE_LINKLOCAL = 2,
+	PMO_NS_ADDR_SCOPE_SITELOCAL = 3,
+	PMO_NS_ADDR_SCOPE_ORGLOCAL = 4,
+	PMO_NS_ADDR_SCOPE_GLOBAL = 5
+};
+
 /**
  * struct pmo_ns_offload_params - pmo ns offload parameters
  * @enable: true when ns offload enable
@@ -55,6 +73,8 @@ struct pmo_ns_offload_params {
 	uint8_t target_ipv6_addr_ac_type[PMO_MAC_NUM_TARGET_IPV6_NS_OFFLOAD_NA];
 	uint8_t slot_idx;
 	struct qdf_mac_addr bssid;
+	enum pmo_ns_addr_scope scope[PMO_MAC_NUM_TARGET_IPV6_NS_OFFLOAD_NA];
+	bool is_offload_applied;
 };
 
 /**
@@ -74,5 +94,6 @@ struct pmo_ns_req {
 	uint8_t ipv6_addr[PMO_MAC_NUM_TARGET_IPV6_NS_OFFLOAD_NA]
 				[PMO_MAC_IPV6_ADDR_LEN];
 	uint8_t ipv6_addr_type[PMO_MAC_NUM_TARGET_IPV6_NS_OFFLOAD_NA];
+	enum pmo_ns_addr_scope scope[PMO_MAC_NUM_TARGET_IPV6_NS_OFFLOAD_NA];
 };
 #endif /* end  of _WLAN_PMO_NS_PUBLIC_STRUCT_H_ */

+ 73 - 0
pmo/dispatcher/inc/wlan_pmo_ucfg_api.h

@@ -173,6 +173,17 @@ QDF_STATUS pmo_ucfg_enable_arp_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS pmo_ucfg_disable_arp_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 		enum pmo_offload_trigger trigger);
 
+/**
+ * pmo_ucfg_get_arp_offload_params() - API to get arp offload params
+ * @vdev: objmgr vdev
+ * @params: output pointer to hold offload params
+ *
+ * Return: QDF_STATUS_SUCCESS in case of success else return error
+ */
+QDF_STATUS
+pmo_ucfg_get_arp_offload_params(struct wlan_objmgr_vdev *vdev,
+				struct pmo_arp_offload_params *params);
+
 /**
  * pmo_ucfg_cache_ns_offload_req(): API to cache ns req in pmo vdev priv ctx
  * @ns_req: pmo ns req param
@@ -213,6 +224,27 @@ QDF_STATUS pmo_ucfg_enable_ns_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS pmo_ucfg_disable_ns_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 		enum pmo_offload_trigger trigger);
 
+/**
+ * pmo_ucfg_get_ns_offload_params() - API to get ns offload params
+ * @vdev: objmgr vdev
+ * @params: output pointer to hold offload params
+ *
+ * Return: QDF_STATUS_SUCCESS in case of success else return error
+ */
+QDF_STATUS
+pmo_ucfg_get_ns_offload_params(struct wlan_objmgr_vdev *vdev,
+			       struct pmo_ns_offload_params *params);
+
+/**
+ * pmo_ucfg_ns_addr_scope() - Convert linux specific IPv6 addr scope to
+ *			      WLAN driver specific value
+ * @scope: linux specific IPv6 addr scope
+ *
+ * Return: PMO identifier of linux IPv6 addr scope
+ */
+enum pmo_ns_addr_scope
+pmo_ucfg_ns_addr_scope(uint32_t ipv6_scope);
+
 /**
  * pmo_ucfg_enable_hw_filter_in_fwr() - enable previously configured hw filter
  * @vdev: objmgr vdev to configure
@@ -314,6 +346,19 @@ QDF_STATUS pmo_ucfg_disable_mc_addr_filtering_in_fwr(
 		uint8_t vdev_id,
 		enum pmo_offload_trigger trigger);
 
+/**
+ * pmo_ucfg_get_mc_addr_list() - API to get mc addr list configured
+ * @psoc: objmgr psoc
+ * @vdev_id: vdev identifier
+ * @mc_list_req: output pointer to hold mc addr list params
+ *
+ * Return: QDF_STATUS_SUCCESS in case of success else return error
+ */
+QDF_STATUS
+pmo_ucfg_get_mc_addr_list(struct wlan_objmgr_psoc *psoc,
+			  uint8_t vdev_id,
+			  struct pmo_mc_addr_list *mc_list_req);
+
 /**
  * pmo_ucfg_cache_gtk_offload_req(): API to cache gtk req in pmo vdev priv obj
  * @vdev: objmgr vdev handle
@@ -765,6 +810,13 @@ pmo_ucfg_disable_arp_offload_in_fwr(
 	return QDF_STATUS_SUCCESS;
 }
 
+static inline QDF_STATUS
+pmo_ucfg_get_arp_offload_params(struct wlan_objmgr_vdev *vdev,
+				struct pmo_arp_offload_params *params)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
 static inline QDF_STATUS
 pmo_ucfg_cache_ns_offload_req(struct pmo_ns_req *ns_req)
 {
@@ -793,6 +845,19 @@ pmo_ucfg_disable_ns_offload_in_fwr(
 	return QDF_STATUS_SUCCESS;
 }
 
+static inline QDF_STATUS
+pmo_ucfg_get_ns_offload_params(struct wlan_objmgr_vdev *vdev,
+			       struct pmo_ns_offload_params *params)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline enum pmo_ns_addr_scope
+pmo_ucfg_ns_addr_scope(uint32_t ipv6_scope)
+{
+	return PMO_NS_ADDR_SCOPE_INVALID;
+}
+
 static inline QDF_STATUS
 pmo_ucfg_cache_mc_addr_list(
 		struct pmo_mc_addr_list_params *mc_list_config)
@@ -832,6 +897,14 @@ pmo_ucfg_max_mc_addr_supported(struct wlan_objmgr_psoc *psoc)
 	return 0;
 }
 
+static inline QDF_STATUS
+pmo_ucfg_get_mc_addr_list(struct wlan_objmgr_psoc *psoc,
+			  uint8_t vdev_id,
+			  struct pmo_mc_addr_list *mc_list_req)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
 static inline QDF_STATUS
 pmo_ucfg_cache_gtk_offload_req(
 		struct wlan_objmgr_vdev *vdev,

+ 16 - 1
pmo/dispatcher/src/wlan_pmo_tgt_arp.c

@@ -79,8 +79,18 @@ QDF_STATUS pmo_tgt_enable_arp_offload_req(struct wlan_objmgr_vdev *vdev,
 	}
 	status = pmo_tx_ops.send_arp_offload_req(
 			vdev, arp_offload_req, ns_offload_req);
-	if (status != QDF_STATUS_SUCCESS)
+	if (status != QDF_STATUS_SUCCESS) {
 		pmo_err("Failed to send ARP offload");
+		goto out;
+	}
+
+	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+	if (vdev_ctx->vdev_arp_req.enable)
+		vdev_ctx->vdev_arp_req.is_offload_applied = true;
+	if (vdev_ctx->vdev_ns_req.enable)
+		vdev_ctx->vdev_ns_req.is_offload_applied = true;
+	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+
 out:
 	if (arp_offload_req)
 		qdf_mem_free(arp_offload_req);
@@ -147,6 +157,11 @@ QDF_STATUS pmo_tgt_disable_arp_offload_req(struct wlan_objmgr_vdev *vdev,
 	if (status != QDF_STATUS_SUCCESS)
 		pmo_err("Failed to send ARP offload");
 
+	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+	vdev_ctx->vdev_arp_req.is_offload_applied = false;
+	vdev_ctx->vdev_ns_req.is_offload_applied = false;
+	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+
 out:
 	if (arp_offload_req)
 		qdf_mem_free(arp_offload_req);

+ 15 - 1
pmo/dispatcher/src/wlan_pmo_tgt_ns.c

@@ -79,8 +79,17 @@ QDF_STATUS pmo_tgt_enable_ns_offload_req(struct wlan_objmgr_vdev *vdev,
 	}
 	status = pmo_tx_ops.send_ns_offload_req(
 			vdev, arp_offload_req, ns_offload_req);
-	if (status != QDF_STATUS_SUCCESS)
+	if (status != QDF_STATUS_SUCCESS) {
 		pmo_err("Failed to send NS offload");
+		goto out;
+	}
+
+	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+	if (vdev_ctx->vdev_arp_req.enable)
+		vdev_ctx->vdev_arp_req.is_offload_applied = true;
+	if (vdev_ctx->vdev_ns_req.enable)
+		vdev_ctx->vdev_ns_req.is_offload_applied = true;
+	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
 
 out:
 	if (arp_offload_req)
@@ -148,6 +157,11 @@ QDF_STATUS pmo_tgt_disable_ns_offload_req(struct wlan_objmgr_vdev *vdev,
 	if (status != QDF_STATUS_SUCCESS)
 		pmo_err("Failed to send NS offload");
 
+	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
+	vdev_ctx->vdev_arp_req.is_offload_applied = false;
+	vdev_ctx->vdev_ns_req.is_offload_applied = false;
+	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
+
 out:
 	if (arp_offload_req)
 		qdf_mem_free(arp_offload_req);

+ 41 - 0
pmo/dispatcher/src/wlan_pmo_ucfg_api.c

@@ -128,6 +128,13 @@ QDF_STATUS pmo_ucfg_disable_arp_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 	return pmo_core_disable_arp_offload_in_fwr(vdev, trigger);
 }
 
+QDF_STATUS
+pmo_ucfg_get_arp_offload_params(struct wlan_objmgr_vdev *vdev,
+				struct pmo_arp_offload_params *params)
+{
+	return pmo_core_get_arp_offload_params(vdev, params);
+}
+
 #ifdef WLAN_NS_OFFLOAD
 QDF_STATUS pmo_ucfg_cache_ns_offload_req(struct pmo_ns_req *ns_req)
 {
@@ -152,6 +159,32 @@ QDF_STATUS pmo_ucfg_disable_ns_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 }
 #endif /* WLAN_NS_OFFLOAD */
 
+QDF_STATUS
+pmo_ucfg_get_ns_offload_params(struct wlan_objmgr_vdev *vdev,
+			       struct pmo_ns_offload_params *params)
+{
+	return pmo_core_get_ns_offload_params(vdev, params);
+}
+
+enum pmo_ns_addr_scope
+pmo_ucfg_ns_addr_scope(uint32_t ipv6_scope)
+{
+	switch (ipv6_scope) {
+	case IPV6_ADDR_SCOPE_NODELOCAL:
+		return PMO_NS_ADDR_SCOPE_NODELOCAL;
+	case IPV6_ADDR_SCOPE_LINKLOCAL:
+		return PMO_NS_ADDR_SCOPE_LINKLOCAL;
+	case IPV6_ADDR_SCOPE_SITELOCAL:
+		return PMO_NS_ADDR_SCOPE_SITELOCAL;
+	case IPV6_ADDR_SCOPE_ORGLOCAL:
+		return PMO_NS_ADDR_SCOPE_ORGLOCAL;
+	case IPV6_ADDR_SCOPE_GLOBAL:
+		return PMO_NS_ADDR_SCOPE_GLOBAL;
+	}
+
+	return PMO_NS_ADDR_SCOPE_INVALID;
+}
+
 QDF_STATUS pmo_ucfg_cache_mc_addr_list(
 		struct pmo_mc_addr_list_params *mc_list_config)
 {
@@ -187,6 +220,14 @@ uint8_t pmo_ucfg_max_mc_addr_supported(struct wlan_objmgr_psoc *psoc)
 	return pmo_core_max_mc_addr_supported(psoc);
 }
 
+QDF_STATUS
+pmo_ucfg_get_mc_addr_list(struct wlan_objmgr_psoc *psoc,
+			  uint8_t vdev_id,
+			  struct pmo_mc_addr_list *mc_list_req)
+{
+	return pmo_core_get_mc_addr_list(psoc, vdev_id, mc_list_req);
+}
+
 QDF_STATUS pmo_ucfg_cache_gtk_offload_req(struct wlan_objmgr_vdev *vdev,
 		struct pmo_gtk_req *gtk_req)
 {