at v2.6.37 101 lines 2.8 kB view raw
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) 12struct socket *macvtap_get_socket(struct file *); 13#else 14#include <linux/err.h> 15#include <linux/errno.h> 16struct file; 17struct socket; 18static inline struct socket *macvtap_get_socket(struct file *f) 19{ 20 return ERR_PTR(-EINVAL); 21} 22#endif /* CONFIG_MACVTAP */ 23 24struct macvlan_port; 25struct 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 */ 35struct 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/* 44 * Maximum times a macvtap device can be opened. This can be used to 45 * configure the number of receive queue, e.g. for multiqueue virtio. 46 */ 47#define MAX_MACVTAP_QUEUES (NR_CPUS < 16 ? NR_CPUS : 16) 48 49struct macvlan_dev { 50 struct net_device *dev; 51 struct list_head list; 52 struct hlist_node hlist; 53 struct macvlan_port *port; 54 struct net_device *lowerdev; 55 struct macvlan_rx_stats __percpu *rx_stats; 56 enum macvlan_mode mode; 57 int (*receive)(struct sk_buff *skb); 58 int (*forward)(struct net_device *dev, struct sk_buff *skb); 59 struct macvtap_queue *taps[MAX_MACVTAP_QUEUES]; 60 int numvtaps; 61}; 62 63static inline void macvlan_count_rx(const struct macvlan_dev *vlan, 64 unsigned int len, bool success, 65 bool multicast) 66{ 67 struct macvlan_rx_stats *rx_stats; 68 69 rx_stats = this_cpu_ptr(vlan->rx_stats); 70 if (likely(success)) { 71 u64_stats_update_begin(&rx_stats->syncp); 72 rx_stats->rx_packets++;; 73 rx_stats->rx_bytes += len; 74 if (multicast) 75 rx_stats->rx_multicast++; 76 u64_stats_update_end(&rx_stats->syncp); 77 } else { 78 rx_stats->rx_errors++; 79 } 80} 81 82extern void macvlan_common_setup(struct net_device *dev); 83 84extern int macvlan_common_newlink(struct net *src_net, struct net_device *dev, 85 struct nlattr *tb[], struct nlattr *data[], 86 int (*receive)(struct sk_buff *skb), 87 int (*forward)(struct net_device *dev, 88 struct sk_buff *skb)); 89 90extern void macvlan_count_rx(const struct macvlan_dev *vlan, 91 unsigned int len, bool success, 92 bool multicast); 93 94extern void macvlan_dellink(struct net_device *dev, struct list_head *head); 95 96extern int macvlan_link_register(struct rtnl_link_ops *ops); 97 98extern netdev_tx_t macvlan_start_xmit(struct sk_buff *skb, 99 struct net_device *dev); 100 101#endif /* _LINUX_IF_MACVLAN_H */