| /* |
| ************************************************************************** |
| * Copyright (c) 2019-2020, 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. |
| ************************************************************************** |
| */ |
| |
| /* |
| * nss_pvxlanmgr_priv.h |
| * Pvxlan manager private defines |
| */ |
| #include <linux/types.h> |
| #include <linux/of.h> |
| #include <linux/module.h> |
| #include <linux/skbuff.h> |
| #include <linux/version.h> |
| #include <nss_api_if.h> |
| #include <linux/in.h> |
| #include <linux/etherdevice.h> |
| #include <nss_cmn.h> |
| #include <nss_pvxlan.h> |
| #include <nss_pvxlanmgr.h> |
| |
| #define NSS_PVXLANMGR_NETDEV_NAME "nsspvxlan" |
| |
| #if (NSS_PVXLANMGR_DEBUG_LEVEL < 1) |
| #define nss_pvxlanmgr_assert(fmt, args...) |
| #else |
| #define nss_pvxlanmgr_assert(c) if (!(c)) { BUG_ON(!(c)); } |
| #endif /* NSS_PVXLANMGR_DEBUG_LEVEL */ |
| |
| /* |
| * Compile messages for dynamic enable/disable |
| */ |
| #if defined(CONFIG_DYNAMIC_DEBUG) |
| #define nss_pvxlanmgr_warn(s, ...) pr_debug("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__) |
| #define nss_pvxlanmgr_info(s, ...) pr_debug("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__) |
| #define nss_pvxlanmgr_trace(s, ...) pr_debug("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__) |
| #else /* CONFIG_DYNAMIC_DEBUG */ |
| /* |
| * Statically compile messages at different levels |
| */ |
| #if (NSS_PVXLANMGR_DEBUG_LEVEL < 2) |
| #define nss_pvxlanmgr_warn(s, ...) |
| #else |
| #define nss_pvxlanmgr_warn(s, ...) pr_warn("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__) |
| #endif |
| |
| #if (NSS_PVXLANMGR_DEBUG_LEVEL < 3) |
| #define nss_pvxlanmgr_info(s, ...) |
| #else |
| #define nss_pvxlanmgr_info(s, ...) pr_notice("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__) |
| #endif |
| |
| #if (NSS_PVXLANMGR_DEBUG_LEVEL < 4) |
| #define nss_pvxlanmgr_trace(s, ...) |
| #else |
| #define nss_pvxlanmgr_trace(s, ...) pr_info("%s[%d]:" s, __FUNCTION__, __LINE__, ##__VA_ARGS__) |
| #endif |
| #endif /* CONFIG_DYNAMIC_DEBUG */ |
| |
| /* |
| * Mapping table from tunnel-id to rule. |
| */ |
| struct nss_pvxlanmgr_tunnel { |
| uint32_t tunnel_state; /* Tunnel state. */ |
| union { |
| struct nss_ipv4_rule_create_msg v4; /* IPv4 rule structure. */ |
| struct nss_ipv6_rule_create_msg v6; /* IPv6 rule struture. */ |
| } ip_rule; |
| struct nss_pvxlan_rule_msg pvxlan_rule; /* Copy of PVXLAN rule. */ |
| }; |
| |
| /* |
| * Private structure to store information needed by a nss_pvxlan net_device |
| */ |
| struct nss_pvxlanmgr_priv { |
| struct nss_ctx_instance *pvxlan_ctx; /* Pointer to NSS PVxLAN context. */ |
| struct nss_ctx_instance *ipv4_ctx; /* Pointer to NSS IPv4 context. */ |
| struct nss_ctx_instance *ipv6_ctx; /* Pointer to NSS IPv6 context. */ |
| struct nss_pvxlanmgr_tunnel *tunnel; /* Pointer to tunnel data. */ |
| struct nss_pvxlanmgr_response *resp; /* Response housekeeping. */ |
| struct rtnl_link_stats64 stats; /* NetDev stats. */ |
| uint32_t if_num_host_inner; /* Pvxlan inner interface number in NSS. */ |
| uint32_t if_num_outer; /* Pvxlan outer interface number in NSS. */ |
| }; |
| |
| /* |
| * Returns tunnel structure pointer from tunnel_id. |
| */ |
| struct nss_pvxlanmgr_tunnel *nss_pvxlanmgr_tunnel_get(struct net_device *dev, uint32_t tunnel_id); |
| |
| nss_tx_status_t nss_pvxlanmgr_tunnel_tx_msg_disable(struct nss_ctx_instance *ctx, uint32_t if_num); |
| |
| nss_tx_status_t nss_pvxlanmgr_tunnel_tx_msg_enable(struct nss_ctx_instance *ctx, |
| uint32_t if_num, uint32_t sibling_if_num); |