linux/include/linux/if_macvlan.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _LINUX_IF_MACVLAN_H
   3#define _LINUX_IF_MACVLAN_H
   4
   5#include <linux/if_link.h>
   6#include <linux/if_vlan.h>
   7#include <linux/list.h>
   8#include <linux/netdevice.h>
   9#include <linux/netlink.h>
  10#include <net/netlink.h>
  11#include <linux/u64_stats_sync.h>
  12
  13struct macvlan_port;
  14
  15#define MACVLAN_MC_FILTER_BITS  8
  16#define MACVLAN_MC_FILTER_SZ    (1 << MACVLAN_MC_FILTER_BITS)
  17
  18struct macvlan_dev {
  19        struct net_device       *dev;
  20        struct list_head        list;
  21        struct hlist_node       hlist;
  22        struct macvlan_port     *port;
  23        struct net_device       *lowerdev;
  24        void                    *accel_priv;
  25        struct vlan_pcpu_stats __percpu *pcpu_stats;
  26
  27        DECLARE_BITMAP(mc_filter, MACVLAN_MC_FILTER_SZ);
  28
  29        netdev_features_t       set_features;
  30        enum macvlan_mode       mode;
  31        u16                     flags;
  32        int                     nest_level;
  33        unsigned int            macaddr_count;
  34#ifdef CONFIG_NET_POLL_CONTROLLER
  35        struct netpoll          *netpoll;
  36#endif
  37};
  38
  39static inline void macvlan_count_rx(const struct macvlan_dev *vlan,
  40                                    unsigned int len, bool success,
  41                                    bool multicast)
  42{
  43        if (likely(success)) {
  44                struct vlan_pcpu_stats *pcpu_stats;
  45
  46                pcpu_stats = this_cpu_ptr(vlan->pcpu_stats);
  47                u64_stats_update_begin(&pcpu_stats->syncp);
  48                pcpu_stats->rx_packets++;
  49                pcpu_stats->rx_bytes += len;
  50                if (multicast)
  51                        pcpu_stats->rx_multicast++;
  52                u64_stats_update_end(&pcpu_stats->syncp);
  53        } else {
  54                this_cpu_inc(vlan->pcpu_stats->rx_errors);
  55        }
  56}
  57
  58extern void macvlan_common_setup(struct net_device *dev);
  59
  60extern int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
  61                                  struct nlattr *tb[], struct nlattr *data[],
  62                                  struct netlink_ext_ack *extack);
  63
  64extern void macvlan_dellink(struct net_device *dev, struct list_head *head);
  65
  66extern int macvlan_link_register(struct rtnl_link_ops *ops);
  67
  68#if IS_ENABLED(CONFIG_MACVLAN)
  69static inline struct net_device *
  70macvlan_dev_real_dev(const struct net_device *dev)
  71{
  72        struct macvlan_dev *macvlan = netdev_priv(dev);
  73
  74        return macvlan->lowerdev;
  75}
  76#else
  77static inline struct net_device *
  78macvlan_dev_real_dev(const struct net_device *dev)
  79{
  80        BUG();
  81        return NULL;
  82}
  83#endif
  84
  85static inline void *macvlan_accel_priv(struct net_device *dev)
  86{
  87        struct macvlan_dev *macvlan = netdev_priv(dev);
  88
  89        return macvlan->accel_priv;
  90}
  91
  92static inline bool macvlan_supports_dest_filter(struct net_device *dev)
  93{
  94        struct macvlan_dev *macvlan = netdev_priv(dev);
  95
  96        return macvlan->mode == MACVLAN_MODE_PRIVATE ||
  97               macvlan->mode == MACVLAN_MODE_VEPA ||
  98               macvlan->mode == MACVLAN_MODE_BRIDGE;
  99}
 100
 101static inline int macvlan_release_l2fw_offload(struct net_device *dev)
 102{
 103        struct macvlan_dev *macvlan = netdev_priv(dev);
 104
 105        macvlan->accel_priv = NULL;
 106        return dev_uc_add(macvlan->lowerdev, dev->dev_addr);
 107}
 108#endif /* _LINUX_IF_MACVLAN_H */
 109