/*
 **************************************************************************
 * Copyright (c) 2014-2021, 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.
 **************************************************************************
 */

/*
 * @file nss_capwap.h
 *	NSS CAPWAP interface definitions.
 */

#ifndef __NSS_CAPWAP_H
#define __NSS_CAPWAP_H

/**
 * @addtogroup nss_capwap_subsystem
 * @{
 */

/**
 * Size of the headroom required for CAPWAP packets.
 */
#define NSS_CAPWAP_HEADROOM 256

/**
 * nss_capwap_stats_encap_types
 *	CAPWAP encapsulation statistics.
 */
enum nss_capwap_stats_encap_types {
	NSS_CAPWAP_STATS_ENCAP_TX_PKTS,
	NSS_CAPWAP_STATS_ENCAP_TX_BYTES,
	NSS_CAPWAP_STATS_ENCAP_TX_SEGMENTS,
	NSS_CAPWAP_STATS_ENCAP_TX_DROP_SG_REF,
	NSS_CAPWAP_STATS_ENCAP_TX_DROP_VER_MISMATCH,
	NSS_CAPWAP_STATS_ENCAP_TX_DROP_UNALIGN,
	NSS_CAPWAP_STATS_ENCAP_TX_DROP_HEADER_ROOM,
	NSS_CAPWAP_STATS_ENCAP_TX_DROP_DTLS,
	NSS_CAPWAP_STATS_ENCAP_TX_DROP_NWIRELESS,
	NSS_CAPWAP_STATS_ENCAP_TX_DROP_QUEUE_FULL,
	NSS_CAPWAP_STATS_ENCAP_TX_DROP_MEM_FAIL,
	NSS_CAPWAP_STATS_ENCAP_FAST_MEM,
	NSS_CAPWAP_STATS_ENCAP_MAX
};

/**
 * nss_capwap_stats_decap_types
 *	CAPWAP decapsulation statistics.
 */
enum nss_capwap_stats_decap_types {
	NSS_CAPWAP_STATS_DECAP_RX_PKTS,
	NSS_CAPWAP_STATS_DECAP_RX_BYTES,
	NSS_CAPWAP_STATS_DECAP_RX_DTLS_PKTS,
	NSS_CAPWAP_STATS_DECAP_RX_SEGMENTS,
	NSS_CAPWAP_STATS_DECAP_RX_DROP,
	NSS_CAPWAP_STATS_DECAP_RX_DROP_OVERSIZE,
	NSS_CAPWAP_STATS_DECAP_RX_DROP_FRAG_TIMEOUT,
	NSS_CAPWAP_STATS_DECAP_RX_DROP_DUP_FRAG,
	NSS_CAPWAP_STATS_DECAP_RX_DROP_FRAG_GAP,
	NSS_CAPWAP_STATS_DECAP_RX_DROP_QUEUE_FULL,
	NSS_CAPWAP_STATS_DECAP_RX_DROP_N2H_QUEUE_FULL,
	NSS_CAPWAP_STATS_DECAP_RX_DROP_MEM_FAIL,
	NSS_CAPWAP_STATS_DECAP_RX_DROP_CHECKSUM,
	NSS_CAPWAP_STATS_DECAP_RX_MALFORMED,
	NSS_CAPWAP_STATS_DECAP_FAST_MEM,
	NSS_CAPWAP_STATS_DECAP_MAX
};

/**
 * nss_capwap_msg_type
 *	CAPWAP message types.
 */
typedef enum nss_capwap_msg_type {
	NSS_CAPWAP_MSG_TYPE_NONE,
	NSS_CAPWAP_MSG_TYPE_CFG_RULE,
	NSS_CAPWAP_MSG_TYPE_UNCFG_RULE,
	NSS_CAPWAP_MSG_TYPE_ENABLE_TUNNEL,
	NSS_CAPWAP_MSG_TYPE_DISABLE_TUNNEL,
	NSS_CAPWAP_MSG_TYPE_UPDATE_PATH_MTU,
	NSS_CAPWAP_MSG_TYPE_SYNC_STATS,
	NSS_CAPWAP_MSG_TYPE_VERSION,		/**< Default is version 1. */
	NSS_CAPWAP_MSG_TYPE_DTLS,
	NSS_CAPWAP_MSG_TYPE_FLOW_RULE_ADD,
	NSS_CAPWAP_MSG_TYPE_FLOW_RULE_DEL,
	NSS_CAPWAP_MSG_TYPE_MAX,
} nss_capwap_msg_type_t;

/**
 * nss_capwap_msg_response
 *	Error types for CAPWAP responses to messages from the host.
 */
typedef enum nss_capwap_msg_response {
	NSS_CAPWAP_ERROR_MSG_INVALID_REASSEMBLY_TIMEOUT,
	NSS_CAPWAP_ERROR_MSG_INVALID_PATH_MTU,
	NSS_CAPWAP_ERROR_MSG_INVALID_MAX_FRAGMENT,
	NSS_CAPWAP_ERROR_MSG_INVALID_BUFFER_SIZE,
	NSS_CAPWAP_ERROR_MSG_INVALID_L3_PROTO,
	NSS_CAPWAP_ERROR_MSG_INVALID_UDP_PROTO,
	NSS_CAPWAP_ERROR_MSG_INVALID_VERSION,
	NSS_CAPWAP_ERROR_MSG_TUNNEL_DISABLED,
	NSS_CAPWAP_ERROR_MSG_TUNNEL_ENABLED,
	NSS_CAPWAP_ERROR_MSG_TUNNEL_NOT_CFG,
	NSS_CAPWAP_ERROR_MSG_INVALID_IP_NODE,
	NSS_CAPWAP_ERROR_MSG_INVALID_TYPE_FLAG,
	NSS_CAPWAP_ERROR_MSG_INVALID_DTLS_CFG,
	NSS_CAPWAP_ERROR_MSG_FLOW_TABLE_FULL,
	NSS_CAPWAP_ERROR_MSG_FLOW_EXIST,
	NSS_CAPWAP_ERROR_MSG_FLOW_NOT_EXIST,
	NSS_CAPWAP_ERROR_MSG_MAX,
} nss_capwap_msg_response_t;

/**
 * nss_capwap_stats_msg
 *	Per-tunnel statistics messages from the NSS firmware.
 */
struct nss_capwap_stats_msg {
	struct nss_cmn_node_stats pnode_stats;	/**< Common firmware statistics. */
	uint32_t dtls_pkts;		/**< Number of DTLS packets flowing through. */

	/*
	 * Rx/decap stats
	 */
	uint32_t rx_dup_frag;		/**< Number of duplicate fragments. */
	uint32_t rx_segments;		/**< Number of segments or fragments. */

	/**
	 * Packets dropped because they are larger than the payload size.
	 */
	uint32_t rx_oversize_drops;

	uint32_t rx_frag_timeout_drops;
			/**< Packets dropped because of a reassembly timeout. */
	uint32_t rx_n2h_drops;
			/**< Packets dropped because of error in packet processing. */
	uint32_t rx_n2h_queue_full_drops;
			/**< Packets dropped because the NSS-to-host queue is full. */
	uint32_t rx_csum_drops;
			/**< Packets dropped because of a checksum mismatch. */
	uint32_t rx_malformed;
			/**< Packets dropped because of a malformed packet. */
	uint32_t rx_mem_failure_drops;
			/**< Packets dropped because of a memory failure. */
	uint32_t rx_frag_gap_drops;
			/**< Packets dropped because of a non-sequential fragment offset. */

	/*
	 * Tx/encap stats
	 */
	uint32_t tx_segments;		/**< Number of segments or fragments. */
	uint32_t tx_queue_full_drops;	/**< Packets dropped because of a full queue. */
	uint32_t tx_mem_failure_drops;
			/**< Packets dropped because of a memory failure. */
	uint32_t tx_dropped_sg_ref;
			/**< Packets dropped because of a scatter-gather reference. */
	uint32_t tx_dropped_ver_mis;
			/**< Packets dropped because of a version mismatch. */
	uint32_t Reserved;
			/**< Reserved. */
	uint32_t tx_dropped_hroom;
			/**< Packets dropped because of insufficent headroom. */
	uint32_t tx_dropped_dtls;
			/**< Packets dropped because of a DTLS packet. */
	uint32_t tx_dropped_nwireless;
			/**< Packets dropped because the nwireless field information is wrong. */

	uint32_t fast_mem;
			/**< Set to 1 when tunnel is operating in fast memory. */
};

/**
 * nss_capwap_ip
 *	IP versions.
 */
struct nss_capwap_ip {
	/**
	 * Union of IPv4 and IPv6 IP addresses.
	 */
	union {
		uint32_t ipv4;		/**< IPv4 address. */
		uint32_t ipv6[4];	/**< IPv6 address. */
	} ip;		/**< Union of IPv4 and IPv6 IP addresses. */
};

/**
 * nss_capwap_encap_rule
 *	Encapsulation information for a CAPWAP tunnel.
 */
struct nss_capwap_encap_rule {
	struct  nss_capwap_ip src_ip;	/**< Source IP. */
	uint32_t src_port;		/**< Source port. */
	struct nss_capwap_ip dest_ip;	/**< Destination IP. */
	uint32_t dest_port;		/**< Destination port. */
	uint32_t path_mtu;		/**< MTU on the path. */
};

/**
 * nss_capwap_decap_rule
 *	Decapsulation information for a CAPWAP tunnel.
 */
struct nss_capwap_decap_rule {
	uint32_t reassembly_timeout;	/**< Timeout in milliseconds. */
	uint32_t max_fragments;		/**< Maximum number of fragments expected. */
	uint32_t max_buffer_size;	/**< Maximum size of the payload buffer. */
};

/**
 * nss_capwap_rule_msg
 *	CAPWAP rule message.
 *
 * The same rule structure applies for both encapsulation and decapsulation
 * in a tunnel.
 */
struct nss_capwap_rule_msg {
	struct nss_capwap_encap_rule encap;	/**< Encapsulation portion of the rule. */
	struct nss_capwap_decap_rule decap;	/**< Decapsulation portion of the rule. */
	uint32_t stats_timer;	/**< Statistics interval timer in milliseconds. */

	/**
	 * Core to choose for receiving packets.
	 *
	 * Set to -1 for the NSS firmware to decide.
	 */
	int8_t rps;

	uint8_t type_flags;		/**< VLAN or PPPOE is configured. */
	uint8_t l3_proto;
			/**< Prototype is NSS_CAPWAP_TUNNEL_IPV4 or NSS_CAPWAP_TUNNEL_IPV6. */
	uint8_t which_udp;		/**< Tunnel uses the UDP or UDPLite protocol. */
	uint32_t mtu_adjust;	/**< MTU is reserved for a DTLS process. */
	uint32_t gmac_ifnum;	/**< Outgoing physical interface. */
	uint32_t enabled_features;
			/**< Tunnel enabled features bit flag. */

	/*
	 * Parameters for each features
	 */
	uint32_t dtls_inner_if_num;	/**< Interface number of the associated DTLS node. */
	uint8_t bssid[ETH_ALEN];	/**< BSSID value. */
	uint16_t outer_sgt_value;
			/**< Security Group Tag value configured for this tunnel. */
};

/**
 * nss_capwap_version_msg
 *	Message to set the CAPWAP version.
 */
struct nss_capwap_version_msg {
	uint32_t version;	/**< CAPWAP protocol version. */
};

/**
 * nss_capwap_path_mtu_msg
 *	Message information for the path MTU.
 */
struct nss_capwap_path_mtu_msg {
	uint32_t path_mtu;	/**< Path MTU value between the controller and access point. */
};

/**
 * nss_capwap_dtls_msg
 *	DTLS message information.
 */
struct nss_capwap_dtls_msg {
	uint32_t enable;			/**< Enable or disable DTLS. */
	uint32_t dtls_inner_if_num;	/**< Interface number of the associated DTLS. */
	uint32_t mtu_adjust;		/**< MTU adjustment reported by the DTLS node. */
	uint32_t reserved;			/**< Reserved field for future use. */
};

/**
 * nss_capwap_flow_rule_msg
 *	CAPWAP flow rule message structure.
 */
struct nss_capwap_flow_rule_msg {
	/*
	 * 5-tuple info.
	 */
	uint16_t ip_version;            /**< IP version. */
	uint16_t protocol;              /**< Layer 4 protocol. */
	uint16_t src_port;		/**< Source port. */
	uint16_t dst_port;		/**< Destination port. */
	uint32_t src_ip[4];		/**< Source IP address. */
	uint32_t dst_ip[4];		/**< Destination IP address. */

	/*
	 * Flow attributes.
	 */
	uint32_t flow_id;		/**< Flow identification. */
};

/**
 * nss_capwap_enable_tunnel_msg
 *	Structure to update sibling interface number.
 */
struct nss_capwap_enable_tunnel_msg {
	uint32_t sibling_if_num; /**< Sibling interface number. */
};

/**
 * nss_capwap_msg
 *	Data for sending and receiving CAPWAP messages.
 */
struct nss_capwap_msg {
	struct nss_cmn_msg cm;		/**< Common message header. */

	/**
	 * Payload of a CAPWAP common message.
	 */
	union {
		struct nss_capwap_rule_msg rule;
				/**< Rule information. */
		struct nss_capwap_path_mtu_msg mtu;
				/**< New MTU information. */
		struct nss_capwap_stats_msg stats;
				/**< CAPWAP statistics. */
		struct nss_capwap_version_msg version;
				/**< CAPWAP version to use. */
		struct nss_capwap_dtls_msg dtls;
				/**< DTLS configuration. */
		struct nss_capwap_flow_rule_msg flow_rule_add;
				/**< Flow rule add message. */
		struct nss_capwap_flow_rule_msg flow_rule_del;
				/**< Flow rule delete message. */
		struct nss_capwap_enable_tunnel_msg enable_tunnel;
				/**< Enable tunnel message. */
	} msg;			/**< Message payload. */
};

/**
 * nss_capwap_pn_stats
 *	Pnode statistics (64-bit version).
 */
struct nss_capwap_pn_stats {
	uint64_t rx_packets;		/**< Number of packets received. */
	uint64_t rx_bytes;		/**< Number of bytes received. */
	uint64_t rx_dropped;		/**< Number of dropped Rx packets. */
	uint64_t tx_packets;		/**< Number of packets transmitted. */
	uint64_t tx_bytes;		/**< Number of bytes transmitted. */
};

/**
 * nss_capwap_tunnel_stats
 *	Per-tunnel statistics seen by the HLOS.
 */
struct nss_capwap_tunnel_stats {
	struct nss_capwap_pn_stats pnode_stats;	/**< Common firmware statistics. */
	uint64_t dtls_pkts;		/**< Number of DTLS packets flowing through. */

	/*
	 * Rx/decap stats
	 */
	uint64_t rx_dup_frag;		/**< Number of duplicate fragments. */
	uint64_t rx_segments;		/**< Number of segments or fragments. */

	/**
	 * Packets dropped because they are larger than the payload size.
	 */
	uint64_t rx_oversize_drops;

	uint64_t rx_frag_timeout_drops;
			/**< Packets dropped because of a reassembly timeout. */
	uint64_t rx_n2h_drops;
			/**< Packets dropped because of error in processing the packet. */
	uint64_t rx_n2h_queue_full_drops;
			/**< Packets dropped because the NSS-to-host queue is full. */
	uint64_t rx_csum_drops;
			/**< Packets dropped because of a checksum mismatch. */
	uint64_t rx_malformed;
			/**< Packets dropped because of a malformed packet. */
	uint64_t rx_mem_failure_drops;
			/**< Packets dropped because of a memory failure. */
	uint64_t rx_frag_gap_drops;
			/**< Packets dropped because of a non-sequential fragment offset. */

	/*
	 * Tx/encap stats
	 */
	uint64_t tx_dropped_inner;	/**<Packets dropped due to inflow queue full. */
	uint64_t tx_segments;		/**< Number of segments or fragments. */
	uint64_t tx_queue_full_drops;
			/**< Packets dropped because the queue is full. */
	uint64_t tx_mem_failure_drops;
			/**< Packets dropped because of a memory failure. */

	uint64_t tx_dropped_sg_ref;
			/**< Packets dropped because of a scatter-gather reference. */
	uint64_t tx_dropped_ver_mis;
			/**< Packets dropped because of a version mismatch. */
	uint64_t Reserved;
			/**< Reserved. */
	uint64_t tx_dropped_hroom;
			/**< Packets dropped because of insufficent headroom. */
	uint64_t tx_dropped_dtls;
			/**< Packets dropped because of a DTLS packet. */
	uint64_t tx_dropped_nwireless;
			/**< Packets dropped because the nwireless field information is wrong. */

	uint32_t fast_mem;
			/**< Set to 1 when tunnel is operating in fast memory. */
};

/**
 * nss_capwap_stats_notification
 *	CAPWAP statistics structure.
 */
struct nss_capwap_stats_notification {
	uint32_t core_id;			/**< Core ID. */
	uint32_t if_num;			/**< Interface number. */
	struct nss_capwap_tunnel_stats stats;	/**< Per-tunnel statistics. */
};

#ifdef __KERNEL__ /* only kernel will use. */

/**
 * Callback function for receiving CAPWAP tunnel data.
 *
 * @datatypes
 * net_device \n
 * sk_buff \n
 * napi_struct
 *
 * @param[in] netdev  Pointer to the associated network device.
 * @param[in] skb     Pointer to the data socket buffer.
 * @param[in] napi    Pointer to the NAPI structure.
 */
typedef void (*nss_capwap_buf_callback_t)(struct net_device *netdev, struct sk_buff *skb, struct napi_struct *napi);

/**
 * Callback function for receiving CAPWAP tunnel messages.
 *
 * @datatypes
 * nss_capwap_msg
 *
 * @param[in] app_data  Pointer to the application context of the message.
 * @param[in] msg       Pointer to the message data.
 */
typedef void (*nss_capwap_msg_callback_t)(void *app_data, struct nss_capwap_msg *msg);

/**
 * nss_capwap_data_register
 *	Registers the CAPWAP tunnel interface with the NSS for sending and
 *	receiving tunnel messages.
 *
 * @datatypes
 * nss_capwap_buf_callback_t \n
 * net_device
 *
 * @param[in] if_num           NSS interface number.
 * @param[in] capwap_callback  Callback for the CAPWAP tunnel data.
 * @param[in] netdev           Pointer to the associated network device.
 * @param[in] features         Data socket buffer types supported by this interface.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_capwap_data_register(uint32_t if_num, nss_capwap_buf_callback_t capwap_callback, struct net_device *netdev, uint32_t features);

/**
 * nss_capwap_tx_msg
 *	Sends CAPWAP tunnel messages to the NSS.
 *
 * Do not call this function from a softirq or interrupt because it
 * might sleep if the NSS firmware is busy serving another host thread.
 *
 * @datatypes
 * nss_ctx_instance \n
 * nss_capwap_msg
 *
 * @param[in]     nss_ctx  Pointer to the NSS context.
 * @param[in,out] msg      Pointer to the message data.
 *
 * @return
 * Status of the Tx operation.
 */
extern nss_tx_status_t nss_capwap_tx_msg(struct nss_ctx_instance *nss_ctx, struct nss_capwap_msg *msg);

/**
 * nss_capwap_tx_buf
 *	Sends a CAPWAP tunnel data buffer to the NSS interface.
 *
 * @datatypes
 * nss_ctx_instance \n
 * sk_buff
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 * @param[in] os_buf   Pointer to the OS data buffer.
 * @param[in] if_num   NSS interface number.
 *
 * @return
 * Status of the Tx operation.
 */
extern nss_tx_status_t nss_capwap_tx_buf(struct nss_ctx_instance *nss_ctx, struct sk_buff *os_buf, uint32_t if_num);

/**
 * nss_capwap_data_unregister
 *	Deregisters the CAPWAP tunnel interface from the NSS interface.
 *
 * @param[in] if_num  NSS interface number.
 *
 * @return
 * TRUE or FALSE
 *
 * @dependencies
 * The tunnel interface must have been previously registered.
 */
extern bool nss_capwap_data_unregister(uint32_t if_num);

/**
 * nss_capwap_notify_register
 *	Registers an event callback handler with the HLOS driver.
 *
 * @datatypes
 * nss_capwap_msg_callback_t
 *
 * @param[in] if_num    NSS interface number.
 * @param[in] cb        Callback function for the message.
 * @param[in] app_data  Pointer to the application context of the message.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_capwap_notify_register(uint32_t if_num, nss_capwap_msg_callback_t cb, void *app_data);

/**
 * nss_capwap_notify_unregister
 *	Deregisters a message notifier from the HLOS driver.
 *
 * @datatypes
 * nss_ctx_instance
 *
 * @param[in] ctx     Pointer to the context of the HLOS driver.
 * @param[in] if_num  NSS interface number.
 *
 * @return
 * None.
 *
 * @dependencies
 * The message notifier must have been previously registered.
 */
extern nss_tx_status_t nss_capwap_notify_unregister(struct nss_ctx_instance *ctx, uint32_t if_num);

/**
 * nss_capwap_get_ctx
 *	Gets the NSS context.
 *
 * @return
 * Pointer to the NSS core context.
 */
extern struct nss_ctx_instance *nss_capwap_get_ctx(void);

/**
 * nss_capwap_ifnum_with_core_id
 *	Gets the CAPWAP interface number with the core ID.
 *
 * @param[in] if_num  NSS interface number.
 *
 * @return
 * Interface number with the core ID.
 */
extern int nss_capwap_ifnum_with_core_id(int if_num);

/**
 * nss_capwap_get_max_buf_size
 *	Gets the NSS maximum buffer size.
 *
 * @param[in] nss_ctx  Pointer to the NSS context.
 *
 * @return
 * Maximum buffer size of this NSS core.
 */
extern uint32_t nss_capwap_get_max_buf_size(struct nss_ctx_instance *nss_ctx);

/**
 * nss_capwap_get_stats
 *	Gets per-tunnel statistics.
 *
 * @datatypes
 * nss_capwap_tunnel_stats
 *
 * @param[in]  if_num  NSS interface number.
 * @param[out] stats   Pointer to the CAPWAP tunnel statistics.
 *
 * @return
 * TRUE or FALSE.
 */
extern bool nss_capwap_get_stats(uint32_t if_num, struct nss_capwap_tunnel_stats *stats);

/**
 * nss_capwap_init
 *	Initializes the CAPWAP interface.
 *
 * @return
 * None.
 */
extern void nss_capwap_init(void);

/**
 * nss_capwap_msg_init
 *	Initializes a CAPWAP message.
 *
 * @datatypes
 * nss_capwap_msg \n
 * nss_capwap_msg_callback_t
 *
 * @param[in,out] ncm       Pointer to the message.
 * @param[in]     if_num    NSS interface number.
 * @param[in]     type      Type of message.
 * @param[in]     len       Size of the payload.
 * @param[in]     cb        Callback function for the message.
 * @param[in]     app_data  Pointer to the application context of the message.
 *
 * @return
 * None.
 */
extern void nss_capwap_msg_init(struct nss_capwap_msg *ncm, uint16_t if_num, uint32_t type, uint32_t len,
								nss_capwap_msg_callback_t cb, void *app_data);
/**
 * nss_capwap_stats_register_notifier
 *	Registers a statistics notifier.
 *
 * @datatypes
 * notifier_block
 *
 * @param[in] nb Notifier block.
 *
 * @return
 * 0 on success or -2 on failure.
 */
extern int nss_capwap_stats_register_notifier(struct notifier_block *nb);

/**
 * nss_capwap_stats_unregister_notifier
 *	Deregisters a statistics notifier.
 *
 * @datatypes
 * notifier_block
 *
 * @param[in] nb Notifier block.
 *
 * @return
 * 0 on success or -2 on failure.
 */
extern int nss_capwap_stats_unregister_notifier(struct notifier_block *nb);

/**
 * @}
 */

#endif /* __KERNEL__ */
#endif /* __NSS_CAPWAP_H */
