^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2007 Patrick McHardy <kaber@trash.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * The code this is based on carried the following copyright notice:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * ---
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * (C) Copyright 2001-2006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Alex Zeffertt, Cambridge Broadband Ltd, ajz@cambridgebroadband.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Re-worked by Ben Greear <greearb@candelatech.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * ---
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/rculist.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/notifier.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/netdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/etherdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/net_tstamp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/ethtool.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/if_arp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/if_vlan.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/if_link.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/if_macvlan.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/hash.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <net/rtnetlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <net/xfrm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/netpoll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/phy.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define MACVLAN_HASH_BITS 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define MACVLAN_HASH_SIZE (1<<MACVLAN_HASH_BITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define MACVLAN_BC_QUEUE_LEN 1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define MACVLAN_F_PASSTHRU 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define MACVLAN_F_ADDRCHANGE 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct macvlan_port {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct hlist_head vlan_hash[MACVLAN_HASH_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) struct list_head vlans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct sk_buff_head bc_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct work_struct bc_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) u32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct hlist_head vlan_source_hash[MACVLAN_HASH_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) DECLARE_BITMAP(mc_filter, MACVLAN_MC_FILTER_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) unsigned char perm_addr[ETH_ALEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct macvlan_source_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct hlist_node hlist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct macvlan_dev *vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) unsigned char addr[6+2] __aligned(sizeof(u16));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct macvlan_skb_cb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) const struct macvlan_dev *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define MACVLAN_SKB_CB(__skb) ((struct macvlan_skb_cb *)&((__skb)->cb[0]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) static void macvlan_port_destroy(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) static inline bool macvlan_passthru(const struct macvlan_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) return port->flags & MACVLAN_F_PASSTHRU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) static inline void macvlan_set_passthru(struct macvlan_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) port->flags |= MACVLAN_F_PASSTHRU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) static inline bool macvlan_addr_change(const struct macvlan_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) return port->flags & MACVLAN_F_ADDRCHANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) static inline void macvlan_set_addr_change(struct macvlan_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) port->flags |= MACVLAN_F_ADDRCHANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) static inline void macvlan_clear_addr_change(struct macvlan_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) port->flags &= ~MACVLAN_F_ADDRCHANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) /* Hash Ethernet address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) static u32 macvlan_eth_hash(const unsigned char *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) u64 value = get_unaligned((u64 *)addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) /* only want 6 bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #ifdef __BIG_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) value >>= 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) value <<= 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) return hash_64(value, MACVLAN_HASH_BITS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) static struct macvlan_port *macvlan_port_get_rcu(const struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) return rcu_dereference(dev->rx_handler_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) static struct macvlan_port *macvlan_port_get_rtnl(const struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) return rtnl_dereference(dev->rx_handler_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) static struct macvlan_dev *macvlan_hash_lookup(const struct macvlan_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) const unsigned char *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) struct macvlan_dev *vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) u32 idx = macvlan_eth_hash(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) hlist_for_each_entry_rcu(vlan, &port->vlan_hash[idx], hlist,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) lockdep_rtnl_is_held()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) if (ether_addr_equal_64bits(vlan->dev->dev_addr, addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) return vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static struct macvlan_source_entry *macvlan_hash_lookup_source(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) const struct macvlan_dev *vlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) const unsigned char *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) struct macvlan_source_entry *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) u32 idx = macvlan_eth_hash(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) struct hlist_head *h = &vlan->port->vlan_source_hash[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) hlist_for_each_entry_rcu(entry, h, hlist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) if (ether_addr_equal_64bits(entry->addr, addr) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) entry->vlan == vlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) return entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) static int macvlan_hash_add_source(struct macvlan_dev *vlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) const unsigned char *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) struct macvlan_port *port = vlan->port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) struct macvlan_source_entry *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) struct hlist_head *h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) entry = macvlan_hash_lookup_source(vlan, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) if (entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) entry = kmalloc(sizeof(*entry), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) if (!entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) ether_addr_copy(entry->addr, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) entry->vlan = vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) h = &port->vlan_source_hash[macvlan_eth_hash(addr)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) hlist_add_head_rcu(&entry->hlist, h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) vlan->macaddr_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) static void macvlan_hash_add(struct macvlan_dev *vlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) struct macvlan_port *port = vlan->port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) const unsigned char *addr = vlan->dev->dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) u32 idx = macvlan_eth_hash(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) hlist_add_head_rcu(&vlan->hlist, &port->vlan_hash[idx]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) static void macvlan_hash_del_source(struct macvlan_source_entry *entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) hlist_del_rcu(&entry->hlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) kfree_rcu(entry, rcu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) static void macvlan_hash_del(struct macvlan_dev *vlan, bool sync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) hlist_del_rcu(&vlan->hlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) if (sync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) synchronize_rcu();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static void macvlan_hash_change_addr(struct macvlan_dev *vlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) const unsigned char *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) macvlan_hash_del(vlan, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) /* Now that we are unhashed it is safe to change the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) * address without confusing packet delivery.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) memcpy(vlan->dev->dev_addr, addr, ETH_ALEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) macvlan_hash_add(vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) static bool macvlan_addr_busy(const struct macvlan_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) const unsigned char *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) /* Test to see if the specified address is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) * currently in use by the underlying device or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) * another macvlan.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) if (!macvlan_passthru(port) && !macvlan_addr_change(port) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) ether_addr_equal_64bits(port->dev->dev_addr, addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) if (macvlan_hash_lookup(port, addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) static int macvlan_broadcast_one(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) const struct macvlan_dev *vlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) const struct ethhdr *eth, bool local)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) struct net_device *dev = vlan->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (local)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) return __dev_forward_skb(dev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) skb->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) if (ether_addr_equal_64bits(eth->h_dest, dev->broadcast))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) skb->pkt_type = PACKET_BROADCAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) skb->pkt_type = PACKET_MULTICAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static u32 macvlan_hash_mix(const struct macvlan_dev *vlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) return (u32)(((unsigned long)vlan) >> L1_CACHE_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) static unsigned int mc_hash(const struct macvlan_dev *vlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) const unsigned char *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) u32 val = __get_unaligned_cpu32(addr + 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) val ^= macvlan_hash_mix(vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) return hash_32(val, MACVLAN_MC_FILTER_BITS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) static void macvlan_broadcast(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) const struct macvlan_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) struct net_device *src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) enum macvlan_mode mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) const struct ethhdr *eth = eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) const struct macvlan_dev *vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct sk_buff *nskb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) unsigned int hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if (skb->protocol == htons(ETH_P_PAUSE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) for (i = 0; i < MACVLAN_HASH_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) hlist_for_each_entry_rcu(vlan, &port->vlan_hash[i], hlist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) if (vlan->dev == src || !(vlan->mode & mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) hash = mc_hash(vlan, eth->h_dest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) if (!test_bit(hash, vlan->mc_filter))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) err = NET_RX_DROP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) nskb = skb_clone(skb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) if (likely(nskb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) err = macvlan_broadcast_one(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) nskb, vlan, eth,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) mode == MACVLAN_MODE_BRIDGE) ?:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) netif_rx_ni(nskb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) macvlan_count_rx(vlan, skb->len + ETH_HLEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) err == NET_RX_SUCCESS, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) static void macvlan_process_broadcast(struct work_struct *w)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) struct macvlan_port *port = container_of(w, struct macvlan_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) bc_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) struct sk_buff_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) __skb_queue_head_init(&list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) spin_lock_bh(&port->bc_queue.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) skb_queue_splice_tail_init(&port->bc_queue, &list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) spin_unlock_bh(&port->bc_queue.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) while ((skb = __skb_dequeue(&list))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) const struct macvlan_dev *src = MACVLAN_SKB_CB(skb)->src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) if (!src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) /* frame comes from an external address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) macvlan_broadcast(skb, port, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) MACVLAN_MODE_PRIVATE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) MACVLAN_MODE_VEPA |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) MACVLAN_MODE_PASSTHRU|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) MACVLAN_MODE_BRIDGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) else if (src->mode == MACVLAN_MODE_VEPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) /* flood to everyone except source */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) macvlan_broadcast(skb, port, src->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) MACVLAN_MODE_VEPA |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) MACVLAN_MODE_BRIDGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) * flood only to VEPA ports, bridge ports
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) * already saw the frame on the way out.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) macvlan_broadcast(skb, port, src->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) MACVLAN_MODE_VEPA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) if (src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) dev_put(src->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) consume_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) cond_resched();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) static void macvlan_broadcast_enqueue(struct macvlan_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) const struct macvlan_dev *src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) struct sk_buff *nskb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) int err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) nskb = skb_clone(skb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) if (!nskb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) MACVLAN_SKB_CB(nskb)->src = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) spin_lock(&port->bc_queue.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) if (skb_queue_len(&port->bc_queue) < MACVLAN_BC_QUEUE_LEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) if (src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) dev_hold(src->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) __skb_queue_tail(&port->bc_queue, nskb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) spin_unlock(&port->bc_queue.lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) schedule_work(&port->bc_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) goto free_nskb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) free_nskb:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) kfree_skb(nskb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) atomic_long_inc(&skb->dev->rx_dropped);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) static void macvlan_flush_sources(struct macvlan_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) struct macvlan_dev *vlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) for (i = 0; i < MACVLAN_HASH_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct hlist_node *h, *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) hlist_for_each_safe(h, n, &port->vlan_source_hash[i]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) struct macvlan_source_entry *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) entry = hlist_entry(h, struct macvlan_source_entry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) hlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) if (entry->vlan == vlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) macvlan_hash_del_source(entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) vlan->macaddr_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) static void macvlan_forward_source_one(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) struct macvlan_dev *vlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) struct sk_buff *nskb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) dev = vlan->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) if (unlikely(!(dev->flags & IFF_UP)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) nskb = skb_clone(skb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) if (!nskb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) len = nskb->len + ETH_HLEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) nskb->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) if (ether_addr_equal_64bits(eth_hdr(skb)->h_dest, dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) nskb->pkt_type = PACKET_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) ret = netif_rx(nskb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) macvlan_count_rx(vlan, len, ret == NET_RX_SUCCESS, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) static void macvlan_forward_source(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) struct macvlan_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) const unsigned char *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) struct macvlan_source_entry *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) u32 idx = macvlan_eth_hash(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) struct hlist_head *h = &port->vlan_source_hash[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) hlist_for_each_entry_rcu(entry, h, hlist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) if (ether_addr_equal_64bits(entry->addr, addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) macvlan_forward_source_one(skb, entry->vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /* called under rcu_read_lock() from netif_receive_skb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) struct macvlan_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) struct sk_buff *skb = *pskb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) const struct ethhdr *eth = eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) const struct macvlan_dev *vlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) const struct macvlan_dev *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) unsigned int len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) rx_handler_result_t handle_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) /* Packets from dev_loopback_xmit() do not have L2 header, bail out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) if (unlikely(skb->pkt_type == PACKET_LOOPBACK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) return RX_HANDLER_PASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) port = macvlan_port_get_rcu(skb->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) if (is_multicast_ether_addr(eth->h_dest)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) unsigned int hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) skb = ip_check_defrag(dev_net(skb->dev), skb, IP_DEFRAG_MACVLAN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) return RX_HANDLER_CONSUMED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) *pskb = skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) eth = eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) macvlan_forward_source(skb, port, eth->h_source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) src = macvlan_hash_lookup(port, eth->h_source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (src && src->mode != MACVLAN_MODE_VEPA &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) src->mode != MACVLAN_MODE_BRIDGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) /* forward to original port. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) vlan = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) ret = macvlan_broadcast_one(skb, vlan, eth, 0) ?:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) netif_rx(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) handle_res = RX_HANDLER_CONSUMED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) hash = mc_hash(NULL, eth->h_dest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) if (test_bit(hash, port->mc_filter))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) macvlan_broadcast_enqueue(port, src, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) return RX_HANDLER_PASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) macvlan_forward_source(skb, port, eth->h_source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) if (macvlan_passthru(port))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) vlan = list_first_or_null_rcu(&port->vlans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) struct macvlan_dev, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) vlan = macvlan_hash_lookup(port, eth->h_dest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) if (!vlan || vlan->mode == MACVLAN_MODE_SOURCE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) return RX_HANDLER_PASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) dev = vlan->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) if (unlikely(!(dev->flags & IFF_UP))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) return RX_HANDLER_CONSUMED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) len = skb->len + ETH_HLEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) skb = skb_share_check(skb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) ret = NET_RX_DROP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) handle_res = RX_HANDLER_CONSUMED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) *pskb = skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) skb->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) skb->pkt_type = PACKET_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) ret = NET_RX_SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) handle_res = RX_HANDLER_ANOTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) macvlan_count_rx(vlan, len, ret == NET_RX_SUCCESS, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) return handle_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) const struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) const struct macvlan_port *port = vlan->port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) const struct macvlan_dev *dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) if (vlan->mode == MACVLAN_MODE_BRIDGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) const struct ethhdr *eth = skb_eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) /* send to other bridge ports directly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) if (is_multicast_ether_addr(eth->h_dest)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) skb_reset_mac_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) macvlan_broadcast(skb, port, dev, MACVLAN_MODE_BRIDGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) goto xmit_world;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) dest = macvlan_hash_lookup(port, eth->h_dest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) if (dest && dest->mode == MACVLAN_MODE_BRIDGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) /* send to lowerdev first for its network taps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) dev_forward_skb(vlan->lowerdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) return NET_XMIT_SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) xmit_world:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) skb->dev = vlan->lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) return dev_queue_xmit_accel(skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) netdev_get_sb_channel(dev) ? dev : NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) static inline netdev_tx_t macvlan_netpoll_send_skb(struct macvlan_dev *vlan, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) #ifdef CONFIG_NET_POLL_CONTROLLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) return netpoll_send_skb(vlan->netpoll, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) return NETDEV_TX_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) static netdev_tx_t macvlan_start_xmit(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) unsigned int len = skb->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) if (unlikely(netpoll_tx_running(dev)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) return macvlan_netpoll_send_skb(vlan, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) ret = macvlan_queue_xmit(skb, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) struct vlan_pcpu_stats *pcpu_stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) pcpu_stats = this_cpu_ptr(vlan->pcpu_stats);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) u64_stats_update_begin(&pcpu_stats->syncp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) pcpu_stats->tx_packets++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) pcpu_stats->tx_bytes += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) u64_stats_update_end(&pcpu_stats->syncp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) this_cpu_inc(vlan->pcpu_stats->tx_dropped);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) static int macvlan_hard_header(struct sk_buff *skb, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) unsigned short type, const void *daddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) const void *saddr, unsigned len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) const struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) struct net_device *lowerdev = vlan->lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) return dev_hard_header(skb, lowerdev, type, daddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) saddr ? : dev->dev_addr, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) static const struct header_ops macvlan_hard_header_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) .create = macvlan_hard_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) .parse = eth_header_parse,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) .cache = eth_header_cache,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) .cache_update = eth_header_cache_update,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) static int macvlan_open(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) struct net_device *lowerdev = vlan->lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) if (macvlan_passthru(vlan->port)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) if (!(vlan->flags & MACVLAN_FLAG_NOPROMISC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) err = dev_set_promiscuity(lowerdev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) goto hash_add;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) err = -EADDRINUSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) if (macvlan_addr_busy(vlan->port, dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) /* Attempt to populate accel_priv which is used to offload the L2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) * forwarding requests for unicast packets.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) if (lowerdev->features & NETIF_F_HW_L2FW_DOFFLOAD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) vlan->accel_priv =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) lowerdev->netdev_ops->ndo_dfwd_add_station(lowerdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) /* If earlier attempt to offload failed, or accel_priv is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) * populated we must add the unicast address to the lower device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) if (IS_ERR_OR_NULL(vlan->accel_priv)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) vlan->accel_priv = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) err = dev_uc_add(lowerdev, dev->dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) if (dev->flags & IFF_ALLMULTI) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) err = dev_set_allmulti(lowerdev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) goto del_unicast;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) if (dev->flags & IFF_PROMISC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) err = dev_set_promiscuity(lowerdev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) goto clear_multi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) hash_add:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) macvlan_hash_add(vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) clear_multi:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) if (dev->flags & IFF_ALLMULTI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) dev_set_allmulti(lowerdev, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) del_unicast:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) if (vlan->accel_priv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) lowerdev->netdev_ops->ndo_dfwd_del_station(lowerdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) vlan->accel_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) vlan->accel_priv = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) dev_uc_del(lowerdev, dev->dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) static int macvlan_stop(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) struct net_device *lowerdev = vlan->lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) if (vlan->accel_priv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) lowerdev->netdev_ops->ndo_dfwd_del_station(lowerdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) vlan->accel_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) vlan->accel_priv = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) dev_uc_unsync(lowerdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) dev_mc_unsync(lowerdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) if (macvlan_passthru(vlan->port)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) if (!(vlan->flags & MACVLAN_FLAG_NOPROMISC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) dev_set_promiscuity(lowerdev, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) goto hash_del;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) if (dev->flags & IFF_ALLMULTI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) dev_set_allmulti(lowerdev, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) if (dev->flags & IFF_PROMISC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) dev_set_promiscuity(lowerdev, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) dev_uc_del(lowerdev, dev->dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) hash_del:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) macvlan_hash_del(vlan, !dev->dismantle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) static int macvlan_sync_address(struct net_device *dev, unsigned char *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) struct net_device *lowerdev = vlan->lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) struct macvlan_port *port = vlan->port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) if (!(dev->flags & IFF_UP)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) /* Just copy in the new address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) ether_addr_copy(dev->dev_addr, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) /* Rehash and update the device filters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) if (macvlan_addr_busy(vlan->port, addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) return -EADDRINUSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) if (!macvlan_passthru(port)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) err = dev_uc_add(lowerdev, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) dev_uc_del(lowerdev, dev->dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) macvlan_hash_change_addr(vlan, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) if (macvlan_passthru(port) && !macvlan_addr_change(port)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) /* Since addr_change isn't set, we are here due to lower
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) * device change. Save the lower-dev address so we can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) * restore it later.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) ether_addr_copy(vlan->port->perm_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) lowerdev->dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) macvlan_clear_addr_change(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) static int macvlan_set_mac_address(struct net_device *dev, void *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) struct sockaddr *addr = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) if (!is_valid_ether_addr(addr->sa_data))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) return -EADDRNOTAVAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) /* If the addresses are the same, this is a no-op */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) if (ether_addr_equal(dev->dev_addr, addr->sa_data))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) if (vlan->mode == MACVLAN_MODE_PASSTHRU) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) macvlan_set_addr_change(vlan->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) return dev_set_mac_address(vlan->lowerdev, addr, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) if (macvlan_addr_busy(vlan->port, addr->sa_data))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) return -EADDRINUSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) return macvlan_sync_address(dev, addr->sa_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) static void macvlan_change_rx_flags(struct net_device *dev, int change)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) struct net_device *lowerdev = vlan->lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) if (dev->flags & IFF_UP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) if (change & IFF_ALLMULTI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) dev_set_allmulti(lowerdev, dev->flags & IFF_ALLMULTI ? 1 : -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) if (change & IFF_PROMISC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) dev_set_promiscuity(lowerdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) dev->flags & IFF_PROMISC ? 1 : -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) static void macvlan_compute_filter(unsigned long *mc_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) struct macvlan_dev *vlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) if (dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) bitmap_fill(mc_filter, MACVLAN_MC_FILTER_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) struct netdev_hw_addr *ha;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) DECLARE_BITMAP(filter, MACVLAN_MC_FILTER_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) bitmap_zero(filter, MACVLAN_MC_FILTER_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) netdev_for_each_mc_addr(ha, dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) __set_bit(mc_hash(vlan, ha->addr), filter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) __set_bit(mc_hash(vlan, dev->broadcast), filter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) bitmap_copy(mc_filter, filter, MACVLAN_MC_FILTER_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) static void macvlan_set_mac_lists(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) macvlan_compute_filter(vlan->mc_filter, dev, vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) dev_uc_sync(vlan->lowerdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) dev_mc_sync(vlan->lowerdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) /* This is slightly inaccurate as we're including the subscription
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) * list of vlan->lowerdev too.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) * Bug alert: This only works if everyone has the same broadcast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) * address as lowerdev. As soon as someone changes theirs this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) * will break.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) * However, this is already broken as when you change your broadcast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) * address we don't get called.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) * The solution is to maintain a list of broadcast addresses like
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) * we do for uc/mc, if you care.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) macvlan_compute_filter(vlan->port->mc_filter, vlan->lowerdev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) static int macvlan_change_mtu(struct net_device *dev, int new_mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) if (vlan->lowerdev->mtu < new_mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) dev->mtu = new_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) static int macvlan_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) struct net_device *real_dev = macvlan_dev_real_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) const struct net_device_ops *ops = real_dev->netdev_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) struct ifreq ifrr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) int err = -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) strscpy(ifrr.ifr_name, real_dev->name, IFNAMSIZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) ifrr.ifr_ifru = ifr->ifr_ifru;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) case SIOCSHWTSTAMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) if (!net_eq(dev_net(dev), &init_net))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) case SIOCGHWTSTAMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) ifr->ifr_ifru = ifrr.ifr_ifru;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) * macvlan network devices have devices nesting below it and are a special
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) * "super class" of normal network devices; split their locks off into a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) * separate class since they always nest.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) static struct lock_class_key macvlan_netdev_addr_lock_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) #define ALWAYS_ON_OFFLOADS \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) (NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) NETIF_F_GSO_ROBUST | NETIF_F_GSO_ENCAP_ALL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) #define ALWAYS_ON_FEATURES (ALWAYS_ON_OFFLOADS | NETIF_F_LLTX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) #define MACVLAN_FEATURES \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) (NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) NETIF_F_GSO | NETIF_F_TSO | NETIF_F_LRO | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) NETIF_F_TSO_ECN | NETIF_F_TSO6 | NETIF_F_GRO | NETIF_F_RXCSUM | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_VLAN_STAG_FILTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) #define MACVLAN_STATE_MASK \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) ((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) static void macvlan_set_lockdep_class(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) netdev_lockdep_set_classes(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) lockdep_set_class(&dev->addr_list_lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) &macvlan_netdev_addr_lock_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) static int macvlan_init(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) const struct net_device *lowerdev = vlan->lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) struct macvlan_port *port = vlan->port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) dev->state = (dev->state & ~MACVLAN_STATE_MASK) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) (lowerdev->state & MACVLAN_STATE_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) dev->features = lowerdev->features & MACVLAN_FEATURES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) dev->features |= ALWAYS_ON_FEATURES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) dev->hw_features |= NETIF_F_LRO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) dev->vlan_features = lowerdev->vlan_features & MACVLAN_FEATURES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) dev->vlan_features |= ALWAYS_ON_OFFLOADS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) dev->hw_enc_features |= dev->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) dev->gso_max_size = lowerdev->gso_max_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) dev->gso_max_segs = lowerdev->gso_max_segs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) dev->hard_header_len = lowerdev->hard_header_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) macvlan_set_lockdep_class(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) vlan->pcpu_stats = netdev_alloc_pcpu_stats(struct vlan_pcpu_stats);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) if (!vlan->pcpu_stats)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) port->count += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) static void macvlan_uninit(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) struct macvlan_port *port = vlan->port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) free_percpu(vlan->pcpu_stats);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) macvlan_flush_sources(port, vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) port->count -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) if (!port->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) macvlan_port_destroy(port->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) static void macvlan_dev_get_stats64(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) struct rtnl_link_stats64 *stats)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) if (vlan->pcpu_stats) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) struct vlan_pcpu_stats *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) u64 rx_packets, rx_bytes, rx_multicast, tx_packets, tx_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) u32 rx_errors = 0, tx_dropped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) unsigned int start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) for_each_possible_cpu(i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) p = per_cpu_ptr(vlan->pcpu_stats, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) start = u64_stats_fetch_begin_irq(&p->syncp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) rx_packets = p->rx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) rx_bytes = p->rx_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) rx_multicast = p->rx_multicast;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) tx_packets = p->tx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) tx_bytes = p->tx_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) } while (u64_stats_fetch_retry_irq(&p->syncp, start));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) stats->rx_packets += rx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) stats->rx_bytes += rx_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) stats->multicast += rx_multicast;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) stats->tx_packets += tx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) stats->tx_bytes += tx_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) /* rx_errors & tx_dropped are u32, updated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) * without syncp protection.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) rx_errors += p->rx_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) tx_dropped += p->tx_dropped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) stats->rx_errors = rx_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) stats->rx_dropped = rx_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) stats->tx_dropped = tx_dropped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) static int macvlan_vlan_rx_add_vid(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) __be16 proto, u16 vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) struct net_device *lowerdev = vlan->lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) return vlan_vid_add(lowerdev, proto, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) static int macvlan_vlan_rx_kill_vid(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) __be16 proto, u16 vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) struct net_device *lowerdev = vlan->lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) vlan_vid_del(lowerdev, proto, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) static int macvlan_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) const unsigned char *addr, u16 vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) u16 flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) int err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) /* Support unicast filter only on passthru devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) * Multicast filter should be allowed on all devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) if (!macvlan_passthru(vlan->port) && is_unicast_ether_addr(addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) if (flags & NLM_F_REPLACE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) if (is_unicast_ether_addr(addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) err = dev_uc_add_excl(dev, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) else if (is_multicast_ether_addr(addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) err = dev_mc_add_excl(dev, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) static int macvlan_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) const unsigned char *addr, u16 vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) int err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) /* Support unicast filter only on passthru devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) * Multicast filter should be allowed on all devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) if (!macvlan_passthru(vlan->port) && is_unicast_ether_addr(addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) if (is_unicast_ether_addr(addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) err = dev_uc_del(dev, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) else if (is_multicast_ether_addr(addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) err = dev_mc_del(dev, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) static void macvlan_ethtool_get_drvinfo(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) struct ethtool_drvinfo *drvinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) strlcpy(drvinfo->driver, "macvlan", sizeof(drvinfo->driver));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) strlcpy(drvinfo->version, "0.1", sizeof(drvinfo->version));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) static int macvlan_ethtool_get_link_ksettings(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) struct ethtool_link_ksettings *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) const struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) return __ethtool_get_link_ksettings(vlan->lowerdev, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) static int macvlan_ethtool_get_ts_info(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) struct ethtool_ts_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) struct net_device *real_dev = macvlan_dev_real_dev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) const struct ethtool_ops *ops = real_dev->ethtool_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) struct phy_device *phydev = real_dev->phydev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) if (phy_has_tsinfo(phydev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) return phy_ts_info(phydev, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) } else if (ops->get_ts_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) return ops->get_ts_info(real_dev, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) SOF_TIMESTAMPING_SOFTWARE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) info->phc_index = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) static netdev_features_t macvlan_fix_features(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) netdev_features_t features)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) netdev_features_t lowerdev_features = vlan->lowerdev->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) netdev_features_t mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) features |= NETIF_F_ALL_FOR_ALL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) features &= (vlan->set_features | ~MACVLAN_FEATURES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) mask = features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) lowerdev_features &= (features | ~NETIF_F_LRO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) features = netdev_increment_features(lowerdev_features, features, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) features |= ALWAYS_ON_FEATURES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) features &= (ALWAYS_ON_FEATURES | MACVLAN_FEATURES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) return features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) #ifdef CONFIG_NET_POLL_CONTROLLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) static void macvlan_dev_poll_controller(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) static int macvlan_dev_netpoll_setup(struct net_device *dev, struct netpoll_info *npinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) struct net_device *real_dev = vlan->lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) struct netpoll *netpoll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) netpoll = kzalloc(sizeof(*netpoll), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) if (!netpoll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) err = __netpoll_setup(netpoll, real_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) kfree(netpoll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) vlan->netpoll = netpoll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) static void macvlan_dev_netpoll_cleanup(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) struct netpoll *netpoll = vlan->netpoll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) if (!netpoll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) vlan->netpoll = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) __netpoll_free(netpoll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) #endif /* CONFIG_NET_POLL_CONTROLLER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) static int macvlan_dev_get_iflink(const struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) return vlan->lowerdev->ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) static const struct ethtool_ops macvlan_ethtool_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) .get_link = ethtool_op_get_link,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) .get_link_ksettings = macvlan_ethtool_get_link_ksettings,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) .get_drvinfo = macvlan_ethtool_get_drvinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) .get_ts_info = macvlan_ethtool_get_ts_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) static const struct net_device_ops macvlan_netdev_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) .ndo_init = macvlan_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) .ndo_uninit = macvlan_uninit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) .ndo_open = macvlan_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) .ndo_stop = macvlan_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) .ndo_start_xmit = macvlan_start_xmit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) .ndo_change_mtu = macvlan_change_mtu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) .ndo_do_ioctl = macvlan_do_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) .ndo_fix_features = macvlan_fix_features,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) .ndo_change_rx_flags = macvlan_change_rx_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) .ndo_set_mac_address = macvlan_set_mac_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) .ndo_set_rx_mode = macvlan_set_mac_lists,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) .ndo_get_stats64 = macvlan_dev_get_stats64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) .ndo_validate_addr = eth_validate_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) .ndo_vlan_rx_add_vid = macvlan_vlan_rx_add_vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) .ndo_vlan_rx_kill_vid = macvlan_vlan_rx_kill_vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) .ndo_fdb_add = macvlan_fdb_add,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) .ndo_fdb_del = macvlan_fdb_del,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) .ndo_fdb_dump = ndo_dflt_fdb_dump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) #ifdef CONFIG_NET_POLL_CONTROLLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) .ndo_poll_controller = macvlan_dev_poll_controller,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) .ndo_netpoll_setup = macvlan_dev_netpoll_setup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) .ndo_netpoll_cleanup = macvlan_dev_netpoll_cleanup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) .ndo_get_iflink = macvlan_dev_get_iflink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) .ndo_features_check = passthru_features_check,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) .ndo_change_proto_down = dev_change_proto_down_generic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) void macvlan_common_setup(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) ether_setup(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) dev->min_mtu = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) dev->max_mtu = ETH_MAX_MTU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) dev->priv_flags &= ~IFF_TX_SKB_SHARING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) netif_keep_dst(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) dev->priv_flags |= IFF_UNICAST_FLT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) dev->netdev_ops = &macvlan_netdev_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) dev->needs_free_netdev = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) dev->header_ops = &macvlan_hard_header_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) dev->ethtool_ops = &macvlan_ethtool_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) EXPORT_SYMBOL_GPL(macvlan_common_setup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) static void macvlan_setup(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) macvlan_common_setup(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) dev->priv_flags |= IFF_NO_QUEUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) static int macvlan_port_create(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) struct macvlan_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) if (dev->type != ARPHRD_ETHER || dev->flags & IFF_LOOPBACK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) if (netdev_is_rx_handler_busy(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) port = kzalloc(sizeof(*port), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) if (port == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) port->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) ether_addr_copy(port->perm_addr, dev->dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) INIT_LIST_HEAD(&port->vlans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) for (i = 0; i < MACVLAN_HASH_SIZE; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) INIT_HLIST_HEAD(&port->vlan_hash[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) for (i = 0; i < MACVLAN_HASH_SIZE; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) INIT_HLIST_HEAD(&port->vlan_source_hash[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) skb_queue_head_init(&port->bc_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) INIT_WORK(&port->bc_work, macvlan_process_broadcast);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) err = netdev_rx_handler_register(dev, macvlan_handle_frame, port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) kfree(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) dev->priv_flags |= IFF_MACVLAN_PORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) static void macvlan_port_destroy(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) struct macvlan_port *port = macvlan_port_get_rtnl(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) dev->priv_flags &= ~IFF_MACVLAN_PORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) netdev_rx_handler_unregister(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) /* After this point, no packet can schedule bc_work anymore,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) * but we need to cancel it and purge left skbs if any.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) cancel_work_sync(&port->bc_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) while ((skb = __skb_dequeue(&port->bc_queue))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) const struct macvlan_dev *src = MACVLAN_SKB_CB(skb)->src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) if (src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) dev_put(src->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) /* If the lower device address has been changed by passthru
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) * macvlan, put it back.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) if (macvlan_passthru(port) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) !ether_addr_equal(port->dev->dev_addr, port->perm_addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) struct sockaddr sa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) sa.sa_family = port->dev->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) memcpy(&sa.sa_data, port->perm_addr, port->dev->addr_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) dev_set_mac_address(port->dev, &sa, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) kfree(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) static int macvlan_validate(struct nlattr *tb[], struct nlattr *data[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) struct nlattr *nla, *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) int rem, len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) if (tb[IFLA_ADDRESS]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS])))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) return -EADDRNOTAVAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) if (data[IFLA_MACVLAN_FLAGS] &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) nla_get_u16(data[IFLA_MACVLAN_FLAGS]) & ~MACVLAN_FLAG_NOPROMISC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) if (data[IFLA_MACVLAN_MODE]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) switch (nla_get_u32(data[IFLA_MACVLAN_MODE])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) case MACVLAN_MODE_PRIVATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) case MACVLAN_MODE_VEPA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) case MACVLAN_MODE_BRIDGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) case MACVLAN_MODE_PASSTHRU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) case MACVLAN_MODE_SOURCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) if (data[IFLA_MACVLAN_MACADDR_MODE]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) switch (nla_get_u32(data[IFLA_MACVLAN_MACADDR_MODE])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) case MACVLAN_MACADDR_ADD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) case MACVLAN_MACADDR_DEL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) case MACVLAN_MACADDR_FLUSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) case MACVLAN_MACADDR_SET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) if (data[IFLA_MACVLAN_MACADDR]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) if (nla_len(data[IFLA_MACVLAN_MACADDR]) != ETH_ALEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) if (!is_valid_ether_addr(nla_data(data[IFLA_MACVLAN_MACADDR])))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) return -EADDRNOTAVAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) if (data[IFLA_MACVLAN_MACADDR_DATA]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) head = nla_data(data[IFLA_MACVLAN_MACADDR_DATA]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) len = nla_len(data[IFLA_MACVLAN_MACADDR_DATA]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) nla_for_each_attr(nla, head, len, rem) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) if (nla_type(nla) != IFLA_MACVLAN_MACADDR ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) nla_len(nla) != ETH_ALEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) if (!is_valid_ether_addr(nla_data(nla)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) return -EADDRNOTAVAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) if (data[IFLA_MACVLAN_MACADDR_COUNT])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) * reconfigure list of remote source mac address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) * (only for macvlan devices in source mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) * Note regarding alignment: all netlink data is aligned to 4 Byte, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) * suffices for both ether_addr_copy and ether_addr_equal_64bits usage.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) static int macvlan_changelink_sources(struct macvlan_dev *vlan, u32 mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) struct nlattr *data[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) char *addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) int ret, rem, len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) struct nlattr *nla, *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) struct macvlan_source_entry *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) if (data[IFLA_MACVLAN_MACADDR])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) addr = nla_data(data[IFLA_MACVLAN_MACADDR]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) if (mode == MACVLAN_MACADDR_ADD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) if (!addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) return macvlan_hash_add_source(vlan, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) } else if (mode == MACVLAN_MACADDR_DEL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) if (!addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) entry = macvlan_hash_lookup_source(vlan, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) if (entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) macvlan_hash_del_source(entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) vlan->macaddr_count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) } else if (mode == MACVLAN_MACADDR_FLUSH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) macvlan_flush_sources(vlan->port, vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) } else if (mode == MACVLAN_MACADDR_SET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) macvlan_flush_sources(vlan->port, vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) if (addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) ret = macvlan_hash_add_source(vlan, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) if (!data || !data[IFLA_MACVLAN_MACADDR_DATA])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) head = nla_data(data[IFLA_MACVLAN_MACADDR_DATA]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) len = nla_len(data[IFLA_MACVLAN_MACADDR_DATA]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) nla_for_each_attr(nla, head, len, rem) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) addr = nla_data(nla);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) ret = macvlan_hash_add_source(vlan, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) struct nlattr *tb[], struct nlattr *data[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) struct macvlan_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) struct net_device *lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) int macmode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) bool create = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) if (!tb[IFLA_LINK])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) lowerdev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) if (lowerdev == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) /* When creating macvlans or macvtaps on top of other macvlans - use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) * the real device as the lowerdev.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) if (netif_is_macvlan(lowerdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) lowerdev = macvlan_dev_real_dev(lowerdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) if (!tb[IFLA_MTU])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) dev->mtu = lowerdev->mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) else if (dev->mtu > lowerdev->mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) /* MTU range: 68 - lowerdev->max_mtu */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) dev->min_mtu = ETH_MIN_MTU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) dev->max_mtu = lowerdev->max_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) if (!tb[IFLA_ADDRESS])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) eth_hw_addr_random(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) if (!netif_is_macvlan_port(lowerdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) err = macvlan_port_create(lowerdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) create = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) port = macvlan_port_get_rtnl(lowerdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) /* Only 1 macvlan device can be created in passthru mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) if (macvlan_passthru(port)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) /* The macvlan port must be not created this time,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) * still goto destroy_macvlan_port for readability.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) goto destroy_macvlan_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) vlan->lowerdev = lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) vlan->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) vlan->port = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) vlan->set_features = MACVLAN_FEATURES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) vlan->mode = MACVLAN_MODE_VEPA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) if (data && data[IFLA_MACVLAN_MODE])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) vlan->mode = nla_get_u32(data[IFLA_MACVLAN_MODE]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) if (data && data[IFLA_MACVLAN_FLAGS])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) vlan->flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) if (vlan->mode == MACVLAN_MODE_PASSTHRU) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) if (port->count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) goto destroy_macvlan_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) macvlan_set_passthru(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) eth_hw_addr_inherit(dev, lowerdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) if (data && data[IFLA_MACVLAN_MACADDR_MODE]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) if (vlan->mode != MACVLAN_MODE_SOURCE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) goto destroy_macvlan_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) macmode = nla_get_u32(data[IFLA_MACVLAN_MACADDR_MODE]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) err = macvlan_changelink_sources(vlan, macmode, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) goto destroy_macvlan_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) err = register_netdevice(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) goto destroy_macvlan_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) dev->priv_flags |= IFF_MACVLAN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) err = netdev_upper_dev_link(lowerdev, dev, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) goto unregister_netdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) list_add_tail_rcu(&vlan->list, &port->vlans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) netif_stacked_transfer_operstate(lowerdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) linkwatch_fire_event(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) unregister_netdev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) /* macvlan_uninit would free the macvlan port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) unregister_netdevice(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) destroy_macvlan_port:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) /* the macvlan port may be freed by macvlan_uninit when fail to register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) * so we destroy the macvlan port only when it's valid.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) if (create && macvlan_port_get_rtnl(lowerdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) macvlan_port_destroy(port->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) EXPORT_SYMBOL_GPL(macvlan_common_newlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) static int macvlan_newlink(struct net *src_net, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) struct nlattr *tb[], struct nlattr *data[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) return macvlan_common_newlink(src_net, dev, tb, data, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) void macvlan_dellink(struct net_device *dev, struct list_head *head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) if (vlan->mode == MACVLAN_MODE_SOURCE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) macvlan_flush_sources(vlan->port, vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) list_del_rcu(&vlan->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) unregister_netdevice_queue(dev, head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) netdev_upper_dev_unlink(vlan->lowerdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) EXPORT_SYMBOL_GPL(macvlan_dellink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) static int macvlan_changelink(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) struct nlattr *tb[], struct nlattr *data[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) enum macvlan_mode mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) bool set_mode = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) enum macvlan_macaddr_mode macmode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) /* Validate mode, but don't set yet: setting flags may fail. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) if (data && data[IFLA_MACVLAN_MODE]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) set_mode = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) mode = nla_get_u32(data[IFLA_MACVLAN_MODE]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) /* Passthrough mode can't be set or cleared dynamically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) if ((mode == MACVLAN_MODE_PASSTHRU) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) (vlan->mode == MACVLAN_MODE_PASSTHRU))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) if (vlan->mode == MACVLAN_MODE_SOURCE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) vlan->mode != mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) macvlan_flush_sources(vlan->port, vlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) if (data && data[IFLA_MACVLAN_FLAGS]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) __u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) bool promisc = (flags ^ vlan->flags) & MACVLAN_FLAG_NOPROMISC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) if (macvlan_passthru(vlan->port) && promisc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) if (flags & MACVLAN_FLAG_NOPROMISC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) err = dev_set_promiscuity(vlan->lowerdev, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) err = dev_set_promiscuity(vlan->lowerdev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) vlan->flags = flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) if (set_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) vlan->mode = mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) if (data && data[IFLA_MACVLAN_MACADDR_MODE]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) if (vlan->mode != MACVLAN_MODE_SOURCE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) macmode = nla_get_u32(data[IFLA_MACVLAN_MACADDR_MODE]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) ret = macvlan_changelink_sources(vlan, macmode, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) static size_t macvlan_get_size_mac(const struct macvlan_dev *vlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) if (vlan->macaddr_count == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) return nla_total_size(0) /* IFLA_MACVLAN_MACADDR_DATA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) + vlan->macaddr_count * nla_total_size(sizeof(u8) * ETH_ALEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) static size_t macvlan_get_size(const struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) return (0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) + nla_total_size(4) /* IFLA_MACVLAN_MODE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) + nla_total_size(2) /* IFLA_MACVLAN_FLAGS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) + nla_total_size(4) /* IFLA_MACVLAN_MACADDR_COUNT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) + macvlan_get_size_mac(vlan) /* IFLA_MACVLAN_MACADDR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) static int macvlan_fill_info_macaddr(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) const struct macvlan_dev *vlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) const int i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) struct hlist_head *h = &vlan->port->vlan_source_hash[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) struct macvlan_source_entry *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) hlist_for_each_entry_rcu(entry, h, hlist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) if (entry->vlan != vlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) if (nla_put(skb, IFLA_MACVLAN_MACADDR, ETH_ALEN, entry->addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) static int macvlan_fill_info(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) const struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) struct macvlan_dev *vlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) struct nlattr *nest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) if (nla_put_u32(skb, IFLA_MACVLAN_MODE, vlan->mode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) if (nla_put_u16(skb, IFLA_MACVLAN_FLAGS, vlan->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) if (nla_put_u32(skb, IFLA_MACVLAN_MACADDR_COUNT, vlan->macaddr_count))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) if (vlan->macaddr_count > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) nest = nla_nest_start_noflag(skb, IFLA_MACVLAN_MACADDR_DATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) if (nest == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) for (i = 0; i < MACVLAN_HASH_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) if (macvlan_fill_info_macaddr(skb, vlan, i))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) nla_nest_end(skb, nest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) nla_put_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) return -EMSGSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) static const struct nla_policy macvlan_policy[IFLA_MACVLAN_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) [IFLA_MACVLAN_MODE] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) [IFLA_MACVLAN_FLAGS] = { .type = NLA_U16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) [IFLA_MACVLAN_MACADDR_MODE] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) [IFLA_MACVLAN_MACADDR] = { .type = NLA_BINARY, .len = MAX_ADDR_LEN },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) [IFLA_MACVLAN_MACADDR_DATA] = { .type = NLA_NESTED },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) [IFLA_MACVLAN_MACADDR_COUNT] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) int macvlan_link_register(struct rtnl_link_ops *ops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) /* common fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) ops->validate = macvlan_validate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) ops->maxtype = IFLA_MACVLAN_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) ops->policy = macvlan_policy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) ops->changelink = macvlan_changelink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) ops->get_size = macvlan_get_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) ops->fill_info = macvlan_fill_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) return rtnl_link_register(ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) EXPORT_SYMBOL_GPL(macvlan_link_register);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) static struct net *macvlan_get_link_net(const struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) return dev_net(macvlan_dev_real_dev(dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) static struct rtnl_link_ops macvlan_link_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) .kind = "macvlan",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) .setup = macvlan_setup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) .newlink = macvlan_newlink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) .dellink = macvlan_dellink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) .get_link_net = macvlan_get_link_net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) .priv_size = sizeof(struct macvlan_dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) static int macvlan_device_event(struct notifier_block *unused,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) unsigned long event, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) struct net_device *dev = netdev_notifier_info_to_dev(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) struct macvlan_dev *vlan, *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) struct macvlan_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) LIST_HEAD(list_kill);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) if (!netif_is_macvlan_port(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) port = macvlan_port_get_rtnl(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) case NETDEV_UP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) case NETDEV_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) case NETDEV_CHANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) list_for_each_entry(vlan, &port->vlans, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) netif_stacked_transfer_operstate(vlan->lowerdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) vlan->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) case NETDEV_FEAT_CHANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) list_for_each_entry(vlan, &port->vlans, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) vlan->dev->gso_max_size = dev->gso_max_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) vlan->dev->gso_max_segs = dev->gso_max_segs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) netdev_update_features(vlan->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) case NETDEV_CHANGEMTU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) list_for_each_entry(vlan, &port->vlans, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) if (vlan->dev->mtu <= dev->mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) dev_set_mtu(vlan->dev, dev->mtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) case NETDEV_CHANGEADDR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) if (!macvlan_passthru(port))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) vlan = list_first_entry_or_null(&port->vlans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) struct macvlan_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) if (vlan && macvlan_sync_address(vlan->dev, dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) return NOTIFY_BAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) case NETDEV_UNREGISTER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) /* twiddle thumbs on netns device moves */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) if (dev->reg_state != NETREG_UNREGISTERING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) list_for_each_entry_safe(vlan, next, &port->vlans, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) vlan->dev->rtnl_link_ops->dellink(vlan->dev, &list_kill);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) unregister_netdevice_many(&list_kill);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) case NETDEV_PRE_TYPE_CHANGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) /* Forbid underlaying device to change its type. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) return NOTIFY_BAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) case NETDEV_NOTIFY_PEERS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) case NETDEV_BONDING_FAILOVER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) case NETDEV_RESEND_IGMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) /* Propagate to all vlans */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) list_for_each_entry(vlan, &port->vlans, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) call_netdevice_notifiers(event, vlan->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) static struct notifier_block macvlan_notifier_block __read_mostly = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) .notifier_call = macvlan_device_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) static int __init macvlan_init_module(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) register_netdevice_notifier(&macvlan_notifier_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) err = macvlan_link_register(&macvlan_link_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) goto err1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) err1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) unregister_netdevice_notifier(&macvlan_notifier_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) static void __exit macvlan_cleanup_module(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) rtnl_link_unregister(&macvlan_link_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) unregister_netdevice_notifier(&macvlan_notifier_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) module_init(macvlan_init_module);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) module_exit(macvlan_cleanup_module);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) MODULE_DESCRIPTION("Driver for MAC address based VLANs");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) MODULE_ALIAS_RTNL_LINK("macvlan");