Line data Source code
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 : 13 : struct macvlan_port; 14 : 15 : #define MACVLAN_MC_FILTER_BITS 8 16 : #define MACVLAN_MC_FILTER_SZ (1 << MACVLAN_MC_FILTER_BITS) 17 : 18 : struct 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 : unsigned int macaddr_count; 33 : u32 bc_queue_len_req; 34 : #ifdef CONFIG_NET_POLL_CONTROLLER 35 : struct netpoll *netpoll; 36 : #endif 37 : }; 38 : 39 : static 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 : 58 : extern void macvlan_common_setup(struct net_device *dev); 59 : 60 : extern 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 : 64 : extern void macvlan_dellink(struct net_device *dev, struct list_head *head); 65 : 66 : extern int macvlan_link_register(struct rtnl_link_ops *ops); 67 : 68 : #if IS_ENABLED(CONFIG_MACVLAN) 69 : static inline struct net_device * 70 : macvlan_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 77 : static inline struct net_device * 78 0 : macvlan_dev_real_dev(const struct net_device *dev) 79 : { 80 0 : BUG(); 81 : return NULL; 82 : } 83 : #endif 84 : 85 : static 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 : 92 : static 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 : 101 : static 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 */