linux/include/linux/if_macvlan.h
<<
>>
Prefs
   1#ifndef _LINUX_IF_MACVLAN_H
   2#define _LINUX_IF_MACVLAN_H
   3
   4#include <linux/if_link.h>
   5#include <linux/if_vlan.h>
   6#include <linux/list.h>
   7#include <linux/netdevice.h>
   8#include <linux/netlink.h>
   9#include <net/netlink.h>
  10#include <linux/u64_stats_sync.h>
  11
  12#if IS_ENABLED(CONFIG_MACVTAP)
  13struct socket *macvtap_get_socket(struct file *);
  14#else
  15#include <linux/err.h>
  16#include <linux/errno.h>
  17struct file;
  18struct socket;
  19static inline struct socket *macvtap_get_socket(struct file *f)
  20{
  21        return ERR_PTR(-EINVAL);
  22}
  23#endif /* CONFIG_MACVTAP */
  24
  25struct macvlan_port;
  26struct macvtap_queue;
  27
  28/*
  29 * Maximum times a macvtap device can be opened. This can be used to
  30 * configure the number of receive queue, e.g. for multiqueue virtio.
  31 */
  32#define MAX_MACVTAP_QUEUES      256
  33
  34#define MACVLAN_MC_FILTER_BITS  8
  35#define MACVLAN_MC_FILTER_SZ    (1 << MACVLAN_MC_FILTER_BITS)
  36
  37struct macvlan_dev {
  38        struct net_device       *dev;
  39        struct list_head        list;
  40        struct hlist_node       hlist;
  41        struct macvlan_port     *port;
  42        struct net_device       *lowerdev;
  43        void                    *fwd_priv;
  44        struct vlan_pcpu_stats __percpu *pcpu_stats;
  45
  46        DECLARE_BITMAP(mc_filter, MACVLAN_MC_FILTER_SZ);
  47
  48        netdev_features_t       set_features;
  49        enum macvlan_mode       mode;
  50        u16                     flags;
  51        /* This array tracks active taps. */
  52        struct macvtap_queue    __rcu *taps[MAX_MACVTAP_QUEUES];
  53        /* This list tracks all taps (both enabled and disabled) */
  54        struct list_head        queue_list;
  55        int                     numvtaps;
  56        int                     numqueues;
  57        netdev_features_t       tap_features;
  58        int                     minor;
  59        int                     nest_level;
  60#ifdef CONFIG_NET_POLL_CONTROLLER
  61        struct netpoll          *netpoll;
  62#endif
  63        unsigned int            macaddr_count;
  64};
  65
  66static inline void macvlan_count_rx(const struct macvlan_dev *vlan,
  67                                    unsigned int len, bool success,
  68                                    bool multicast)
  69{
  70        if (likely(success)) {
  71                struct vlan_pcpu_stats *pcpu_stats;
  72
  73                pcpu_stats = this_cpu_ptr(vlan->pcpu_stats);
  74                u64_stats_update_begin(&pcpu_stats->syncp);
  75                pcpu_stats->rx_packets++;
  76                pcpu_stats->rx_bytes += len;
  77                if (multicast)
  78                        pcpu_stats->rx_multicast++;
  79                u64_stats_update_end(&pcpu_stats->syncp);
  80        } else {
  81                this_cpu_inc(vlan->pcpu_stats->rx_errors);
  82        }
  83}
  84
  85extern void macvlan_common_setup(struct net_device *dev);
  86
  87extern int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
  88                                  struct nlattr *tb[], struct nlattr *data[]);
  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
  98#if IS_ENABLED(CONFIG_MACVLAN)
  99static inline struct net_device *
 100macvlan_dev_real_dev(const struct net_device *dev)
 101{
 102        struct macvlan_dev *macvlan = netdev_priv(dev);
 103
 104        return macvlan->lowerdev;
 105}
 106#else
 107static inline struct net_device *
 108macvlan_dev_real_dev(const struct net_device *dev)
 109{
 110        BUG();
 111        return NULL;
 112}
 113#endif
 114
 115#endif /* _LINUX_IF_MACVLAN_H */
 116