| /* |
| ************************************************************************** |
| * Copyright (c) 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. |
| ************************************************************************** |
| */ |
| |
| /* |
| * ovsmgr_priv.h |
| */ |
| #ifndef __OVSMGR_PRIV__H |
| #define __OVSMGR_PRIV__H |
| |
| #include <linux/version.h> |
| |
| #define OVSMGR_DEBUG_LVL_ERROR 1 /* Turn on debug for an error. */ |
| #define OVSMGR_DEBUG_LVL_WARN 2 /* Turn on debug for a warning. */ |
| #define OVSMGR_DEBUG_LVL_INFO 3 /* Turn on debug for information. */ |
| #define OVSMGR_DEBUG_LVL_TRACE 4 /* Turn on debug for trace. */ |
| |
| /* |
| * Maximum number of VLAN's per port |
| */ |
| #define OVSMGR_PORT_VLAN_MAX_CNT 32 |
| |
| /* |
| * Compile messages for dynamic enable/disable |
| */ |
| #define ovsmgr_error(s, ...) do { \ |
| if (net_ratelimit()) { \ |
| pr_alert("%s[%d]:" s, __func__, __LINE__, ##__VA_ARGS__); \ |
| } \ |
| } while (0) |
| |
| #if defined(CONFIG_DYNAMIC_DEBUG) |
| /* |
| * Compile messages for dynamic enable/disable |
| */ |
| #define ovsmgr_info(s, ...) pr_debug("%s[%d]:" s, __func__, __LINE__, ##__VA_ARGS__) |
| #define ovsmgr_trace(s, ...) pr_debug("%s[%d]:" s, __func__, __LINE__, ##__VA_ARGS__) |
| #define ovsmgr_warn(s, ...) pr_debug("%s[%d]:" s, __func__, __LINE__, ##__VA_ARGS__) |
| |
| #else |
| /* |
| * Statically compile messages at different levels |
| */ |
| #if (OVSMGR_DEBUG_LEVEL >= OVSMGR_DEBUG_LVL_INFO) |
| #define ovsmgr_info(s, ...) pr_notice("%s[%d]:" s, __func__, __LINE__, ##__VA_ARGS__); |
| #else |
| #define ovsmgr_info(s, ...) |
| #endif |
| |
| #if (OVSMGR_DEBUG_LEVEL >= OVSMGR_DEBUG_LVL_TRACE) |
| #define ovsmgr_trace(s, ...) pr_info("%s[%d]:" s, __func__, __LINE__, ##__VA_ARGS__); |
| #else |
| #define ovsmgr_trace(s, ...) |
| #endif |
| |
| #if (OVSMGR_DEBUG_LEVEL >= OVSMGR_DEBUG_LVL_WARN) |
| #define ovsmgr_warn(s, ...) pr_warn("%s[%d]:" s, __func__, __LINE__, ##__VA_ARGS__); |
| #else |
| #define ovsmgr_warn(s, ...) |
| #endif |
| #endif /* !CONFIG_DYNAMIC_DEBUG */ |
| |
| #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)) |
| #define OVSMGR_KEY_VLAN_TCI(key) (key)->eth.tci |
| #else |
| #define OVSMGR_KEY_VLAN_TCI(key) (key)->eth.vlan.tci |
| #define OVSMGR_KEY_CVLAN_TCI(key) (key)->eth.cvlan.tci |
| #endif |
| |
| #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)) |
| #define VLAN_TAG_PRESENT VLAN_CFI_MASK |
| #endif |
| |
| /* |
| * ovsmgr_stats |
| * Datapath statistics maintained by OVS manager |
| */ |
| struct ovsmgr_stats { |
| atomic64_t pkts_from_ovs_dp; /* Number of packets received from OVS datapath */ |
| atomic64_t pkts_fwd_pre_flow; /* Number of packets forwarded to pre flow hook functions*/ |
| atomic64_t pkts_fwd_post_flow; /* Number of packets forwarded to post flow hook functions*/ |
| }; |
| |
| /* |
| * ovsmgr_ctx |
| * OVS manager context |
| */ |
| struct ovsmgr_ctx { |
| struct list_head dp_list; /* List of data paths */ |
| struct list_head dp_hooks; /* List of registered hooks */ |
| rwlock_t lock; /* Lock to access datapath list */ |
| struct dentry *dentry; /* Debugfs entry for OVS */ |
| struct dentry *dentry_file; /* Debugfs file entry for OVS */ |
| struct ovsmgr_stats stats; /* Pakcet processing statistics. */ |
| }; |
| |
| /* |
| * ovsmgr_dp_port |
| * Datapath port details |
| */ |
| struct ovsmgr_dp_port { |
| struct list_head node; /* To add to port_list */ |
| struct net_device *dev; /* Port netdev */ |
| struct net_device *master_dev; /* Master netdev */ |
| struct vlan_hdr vlan[OVSMGR_PORT_VLAN_MAX_CNT]; /* VLAN configuration for this port */ |
| char master_name[IFNAMSIZ]; /* Master device name */ |
| void *vport; /* OVS datapath port context */ |
| int vport_num; /* OVS datapath port number */ |
| enum ovs_vport_type vport_type; /* OVS datapath port type */ |
| bool add_notified; /* Set to true if port add notifier is sent */ |
| }; |
| |
| /* |
| * ovsmgr_dp |
| * Datapath details |
| */ |
| struct ovsmgr_dp { |
| struct list_head node; /* To add to dp_list */ |
| struct list_head port_list; /* List of bridge ports */ |
| struct net_device *dev; /* netdev representing data path */ |
| void *dp; /* OVS data path context */ |
| }; |
| |
| /* |
| * ovsmgr_dp_ctx |
| * OVS manager context |
| */ |
| struct ovsmgr_dp_ctx { |
| struct list_head dp_list; /* List of data paths */ |
| rwlock_t lock; /* Lock to access dp_list */ |
| }; |
| |
| extern struct ovsmgr_ctx ovsmgr_ctx; |
| |
| int ovsmgr_dp_init(void); |
| void ovsmgr_dp_exit(void); |
| int ovsmgr_notifiers_call(struct ovsmgr_notifiers_info *info, unsigned long val); |
| void ovsmgr_dp_bridge_interface_stats_update(struct net_device *dev, |
| uint32_t rx_packets, uint32_t rx_bytes, |
| uint32_t tx_packets, uint32_t tx_bytes); |
| void ovsmgr_dp_flow_stats_update(struct ovsmgr_dp_flow *flow, struct ovsmgr_dp_flow_stats *stats); |
| struct net_device *ovsmgr_dp_port_dev_find(struct sk_buff *skb, |
| struct net_device *dev, struct ovsmgr_dp_flow *flow); |
| struct net_device *ovsmgr_dp_port_dev_find_by_mac(struct sk_buff *skb, struct net_device *dev, |
| struct ovsmgr_dp_flow *flow); |
| struct net_device *ovsmgr_dp_dev_get_master(struct net_device *dev); |
| bool ovsmgr_dp_dev_is_master(struct net_device *dev); |
| enum ovsmgr_flow_status ovsmgr_dp_flow_info_get(struct ovsmgr_dp_flow *flow, |
| struct sk_buff *skb, struct ovsmgr_flow_info *ofi); |
| |
| #endif /* __OVSMGR_PRIV__H */ |