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