1 #ifndef _LINUX_IF_MACVLAN_H 2 #define _LINUX_IF_MACVLAN_H 3 4 #include <linux/if_link.h> 5 #include <linux/list.h> 6 #include <linux/netdevice.h> 7 #include <linux/netlink.h> 8 #include <net/netlink.h> 9 #include <linux/u64_stats_sync.h> 10 11 #if defined(CONFIG_MACVTAP) || defined(CONFIG_MACVTAP_MODULE) 12 struct socket *macvtap_get_socket(struct file *); 13 #else 14 #include <linux/err.h> 15 #include <linux/errno.h> 16 struct file; 17 struct socket; 18 static inline struct socket *macvtap_get_socket(struct file *f) 19 { 20 return ERR_PTR(-EINVAL); 21 } 22 #endif /* CONFIG_MACVTAP */ 23 24 struct macvlan_port; 25 struct macvtap_queue; 26 27 /** 28 * struct macvlan_rx_stats - MACVLAN percpu rx stats 29 * @rx_packets: number of received packets 30 * @rx_bytes: number of received bytes 31 * @rx_multicast: number of received multicast packets 32 * @syncp: synchronization point for 64bit counters 33 * @rx_errors: number of errors 34 */ 35 struct macvlan_rx_stats { 36 u64 rx_packets; 37 u64 rx_bytes; 38 u64 rx_multicast; 39 struct u64_stats_sync syncp; 40 unsigned long rx_errors; 41 }; 42 43 struct macvlan_dev { 44 struct net_device *dev; 45 struct list_head list; 46 struct hlist_node hlist; 47 struct macvlan_port *port; 48 struct net_device *lowerdev; 49 struct macvlan_rx_stats __percpu *rx_stats; 50 enum macvlan_mode mode; 51 int (*receive)(struct sk_buff *skb); 52 int (*forward)(struct net_device *dev, struct sk_buff *skb); 53 struct macvtap_queue *tap; 54 }; 55 56 static inline void macvlan_count_rx(const struct macvlan_dev *vlan, 57 unsigned int len, bool success, 58 bool multicast) 59 { 60 struct macvlan_rx_stats *rx_stats; 61 62 rx_stats = this_cpu_ptr(vlan->rx_stats); 63 if (likely(success)) { 64 u64_stats_update_begin(&rx_stats->syncp); 65 rx_stats->rx_packets++;; 66 rx_stats->rx_bytes += len; 67 if (multicast) 68 rx_stats->rx_multicast++; 69 u64_stats_update_end(&rx_stats->syncp); 70 } else { 71 rx_stats->rx_errors++; 72 } 73 } 74 75 extern void macvlan_common_setup(struct net_device *dev); 76 77 extern int macvlan_common_newlink(struct net *src_net, struct net_device *dev, 78 struct nlattr *tb[], struct nlattr *data[], 79 int (*receive)(struct sk_buff *skb), 80 int (*forward)(struct net_device *dev, 81 struct sk_buff *skb)); 82 83 extern void macvlan_count_rx(const struct macvlan_dev *vlan, 84 unsigned int len, bool success, 85 bool multicast); 86 87 extern void macvlan_dellink(struct net_device *dev, struct list_head *head); 88 89 extern int macvlan_link_register(struct rtnl_link_ops *ops); 90 91 extern netdev_tx_t macvlan_start_xmit(struct sk_buff *skb, 92 struct net_device *dev); 93 94 #endif /* _LINUX_IF_MACVLAN_H */ 95