/*
* Copyright (c) 2017 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
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/**
 * DOC: Declare ns offload feature API's
 */

#ifndef _WLAN_PMO_NS_H_
#define _WLAN_PMO_NS_H_

#include "wlan_pmo_common_public_struct.h"
#include "wlan_pmo_ns_public_struct.h"

/**
 * pmo_core_cache_ns_offload_req() - API to cache ns req in pmo vdev priv ctx
 * @ns_req: ns offload request
 *
 * API to cache ns offload in pmo vdev priv ctx
 *
 * Return:QDF_STATUS_SUCCESS in case of success else return error
 */
QDF_STATUS pmo_core_cache_ns_offload_req(struct pmo_ns_req *ns_req);

/**
 * pmo_core_flush_ns_offload_req() - API to flush ns req from pmo vdev priv ctx
 * @vdev: vdev objmgr handle
 *
 * API to flush ns offload from pmo vdev priv ctx
 *
 * Return: QDF_STATUS_SUCCESS in case of success else return error
 */
QDF_STATUS pmo_core_flush_ns_offload_req(struct wlan_objmgr_vdev *vdev);

/**
 * pmo_core_enable_ns_offload_in_fwr() -  API to enable ns offload in fwr
 * @vdev: objmgr vdev
 * @trigger: trigger reason enable ns offload
 *
 * API to enable ns offload in fwr from vdev priv ctx
 *
 * Return: QDF_STATUS_SUCCESS in case of success else return error
 */
QDF_STATUS pmo_core_enable_ns_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
		enum pmo_offload_trigger trigger);

/**
 * pmo_core_disable_ns_offload_in_fwr() - API to disable ns offload in fwr
 * @vdev: objmgr vdev
 * @trigger: trigger reason disable ns offload
 *
 *  API to disable arp offload in fwr
 *
 * Return: QDF_STATUS_SUCCESS in case of success else return error
 */
QDF_STATUS pmo_core_disable_ns_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
		enum pmo_offload_trigger trigger);

#endif /* end  of _WLAN_PMO_NS_H_ */
