^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * VXLAN: Virtual eXtensible Local Area Network
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2012-2013 Vyatta Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/udp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/igmp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/if_ether.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/ethtool.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <net/arp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <net/ndisc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <net/ipv6_stubs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <net/ip.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <net/icmp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <net/rtnetlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <net/inet_ecn.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <net/net_namespace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <net/netns/generic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <net/tun_proto.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <net/vxlan.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <net/nexthop.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <net/ip6_tunnel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <net/ip6_checksum.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define VXLAN_VERSION "0.1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define PORT_HASH_BITS 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define PORT_HASH_SIZE (1<<PORT_HASH_BITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define FDB_AGE_DEFAULT 300 /* 5 min */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define FDB_AGE_INTERVAL (10 * HZ) /* rescan interval */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) /* UDP port for VXLAN traffic.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * The IANA assigned port is 4789, but the Linux default is 8472
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * for compatibility with early adopters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) static unsigned short vxlan_port __read_mostly = 8472;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) module_param_named(udp_port, vxlan_port, ushort, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) MODULE_PARM_DESC(udp_port, "Destination UDP port");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) static bool log_ecn_error = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) module_param(log_ecn_error, bool, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static unsigned int vxlan_net_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) static struct rtnl_link_ops vxlan_link_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) static const u8 all_zeros_mac[ETH_ALEN + 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) static int vxlan_sock_add(struct vxlan_dev *vxlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) static void vxlan_vs_del_dev(struct vxlan_dev *vxlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /* per-network namespace private data for this module */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct vxlan_net {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct list_head vxlan_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct hlist_head sock_list[PORT_HASH_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) spinlock_t sock_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) /* Forwarding table entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) struct vxlan_fdb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) struct hlist_node hlist; /* linked list of entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) unsigned long updated; /* jiffies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) unsigned long used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct list_head remotes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u8 eth_addr[ETH_ALEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u16 state; /* see ndm_state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) __be32 vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u16 flags; /* see ndm_flags and below */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) struct list_head nh_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct nexthop __rcu *nh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) struct vxlan_dev __rcu *vdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define NTF_VXLAN_ADDED_BY_USER 0x100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) /* salt for hash table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) static u32 vxlan_salt __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) static inline bool vxlan_collect_metadata(struct vxlan_sock *vs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) return vs->flags & VXLAN_F_COLLECT_METADATA ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) ip_tunnel_collect_metadata();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) static inline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) bool vxlan_addr_equal(const union vxlan_addr *a, const union vxlan_addr *b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) if (a->sa.sa_family != b->sa.sa_family)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) if (a->sa.sa_family == AF_INET6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) return ipv6_addr_equal(&a->sin6.sin6_addr, &b->sin6.sin6_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) return a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr;
^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 int vxlan_nla_get_addr(union vxlan_addr *ip, struct nlattr *nla)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) if (nla_len(nla) >= sizeof(struct in6_addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) ip->sin6.sin6_addr = nla_get_in6_addr(nla);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) ip->sa.sa_family = AF_INET6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) } else if (nla_len(nla) >= sizeof(__be32)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) ip->sin.sin_addr.s_addr = nla_get_in_addr(nla);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) ip->sa.sa_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) return -EAFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) static int vxlan_nla_put_addr(struct sk_buff *skb, int attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) const union vxlan_addr *ip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) if (ip->sa.sa_family == AF_INET6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) return nla_put_in6_addr(skb, attr, &ip->sin6.sin6_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) return nla_put_in_addr(skb, attr, ip->sin.sin_addr.s_addr);
^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) #else /* !CONFIG_IPV6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) static inline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) bool vxlan_addr_equal(const union vxlan_addr *a, const union vxlan_addr *b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) return a->sin.sin_addr.s_addr == b->sin.sin_addr.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) static int vxlan_nla_get_addr(union vxlan_addr *ip, struct nlattr *nla)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) if (nla_len(nla) >= sizeof(struct in6_addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) return -EAFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) } else if (nla_len(nla) >= sizeof(__be32)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) ip->sin.sin_addr.s_addr = nla_get_in_addr(nla);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ip->sa.sa_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) return -EAFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) static int vxlan_nla_put_addr(struct sk_buff *skb, int attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) const union vxlan_addr *ip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) return nla_put_in_addr(skb, attr, ip->sin.sin_addr.s_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /* Virtual Network hash table head */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) static inline struct hlist_head *vni_head(struct vxlan_sock *vs, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) return &vs->vni_list[hash_32((__force u32)vni, VNI_HASH_BITS)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) /* Socket hash table head */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) static inline struct hlist_head *vs_head(struct net *net, __be16 port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) struct vxlan_net *vn = net_generic(net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) return &vn->sock_list[hash_32(ntohs(port), PORT_HASH_BITS)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) /* First remote destination for a forwarding entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) * Guaranteed to be non-NULL because remotes are never deleted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) static inline struct vxlan_rdst *first_remote_rcu(struct vxlan_fdb *fdb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) if (rcu_access_pointer(fdb->nh))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) return list_entry_rcu(fdb->remotes.next, struct vxlan_rdst, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) static inline struct vxlan_rdst *first_remote_rtnl(struct vxlan_fdb *fdb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) if (rcu_access_pointer(fdb->nh))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return list_first_entry(&fdb->remotes, struct vxlan_rdst, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) /* Find VXLAN socket based on network namespace, address family, UDP port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) * enabled unshareable flags and socket device binding (see l3mdev with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) * non-default VRF).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) static struct vxlan_sock *vxlan_find_sock(struct net *net, sa_family_t family,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) __be16 port, u32 flags, int ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) struct vxlan_sock *vs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) flags &= VXLAN_F_RCV_FLAGS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) hlist_for_each_entry_rcu(vs, vs_head(net, port), hlist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) if (inet_sk(vs->sock->sk)->inet_sport == port &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) vxlan_get_sk_family(vs) == family &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) vs->flags == flags &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) vs->sock->sk->sk_bound_dev_if == ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) return vs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) static struct vxlan_dev *vxlan_vs_find_vni(struct vxlan_sock *vs, int ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct vxlan_dev_node *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) /* For flow based devices, map all packets to VNI 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) if (vs->flags & VXLAN_F_COLLECT_METADATA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) vni = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) hlist_for_each_entry_rcu(node, vni_head(vs, vni), hlist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) if (node->vxlan->default_dst.remote_vni != vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if (IS_ENABLED(CONFIG_IPV6)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) const struct vxlan_config *cfg = &node->vxlan->cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) if ((cfg->flags & VXLAN_F_IPV6_LINKLOCAL) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) cfg->remote_ifindex != ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) return node->vxlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /* Look up VNI in a per net namespace table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) static struct vxlan_dev *vxlan_find_vni(struct net *net, int ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) __be32 vni, sa_family_t family,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) __be16 port, u32 flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) struct vxlan_sock *vs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) vs = vxlan_find_sock(net, family, port, flags, ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) if (!vs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) return vxlan_vs_find_vni(vs, ifindex, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) /* Fill in neighbour message in skbuff. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) static int vxlan_fdb_info(struct sk_buff *skb, struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) const struct vxlan_fdb *fdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) u32 portid, u32 seq, int type, unsigned int flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) const struct vxlan_rdst *rdst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) unsigned long now = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) struct nda_cacheinfo ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) bool send_ip, send_eth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) struct nlmsghdr *nlh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct nexthop *nh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) struct ndmsg *ndm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) int nh_family;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) u32 nh_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) nlh = nlmsg_put(skb, portid, seq, type, sizeof(*ndm), flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) if (nlh == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) return -EMSGSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) ndm = nlmsg_data(nlh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) memset(ndm, 0, sizeof(*ndm));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) send_eth = send_ip = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) nh = rcu_dereference(fdb->nh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) if (nh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) nh_family = nexthop_get_family(nh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) nh_id = nh->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if (type == RTM_GETNEIGH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) if (rdst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) send_ip = !vxlan_addr_any(&rdst->remote_ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) ndm->ndm_family = send_ip ? rdst->remote_ip.sa.sa_family : AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) } else if (nh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) ndm->ndm_family = nh_family;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) send_eth = !is_zero_ether_addr(fdb->eth_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) ndm->ndm_family = AF_BRIDGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) ndm->ndm_state = fdb->state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) ndm->ndm_ifindex = vxlan->dev->ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) ndm->ndm_flags = fdb->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) if (rdst && rdst->offloaded)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) ndm->ndm_flags |= NTF_OFFLOADED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) ndm->ndm_type = RTN_UNICAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) if (!net_eq(dev_net(vxlan->dev), vxlan->net) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) nla_put_s32(skb, NDA_LINK_NETNSID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) peernet2id(dev_net(vxlan->dev), vxlan->net)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (send_eth && nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->eth_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) if (nh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) if (nla_put_u32(skb, NDA_NH_ID, nh_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) } else if (rdst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) if (send_ip && vxlan_nla_put_addr(skb, NDA_DST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) &rdst->remote_ip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) if (rdst->remote_port &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) rdst->remote_port != vxlan->cfg.dst_port &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) nla_put_be16(skb, NDA_PORT, rdst->remote_port))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) if (rdst->remote_vni != vxlan->default_dst.remote_vni &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) nla_put_u32(skb, NDA_VNI, be32_to_cpu(rdst->remote_vni)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) if (rdst->remote_ifindex &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) nla_put_u32(skb, NDA_IFINDEX, rdst->remote_ifindex))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) if ((vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) && fdb->vni &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) nla_put_u32(skb, NDA_SRC_VNI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) be32_to_cpu(fdb->vni)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) ci.ndm_used = jiffies_to_clock_t(now - fdb->used);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) ci.ndm_confirmed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) ci.ndm_refcnt = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) if (nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) nlmsg_end(skb, nlh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) nla_put_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) nlmsg_cancel(skb, nlh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) return -EMSGSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) static inline size_t vxlan_nlmsg_size(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) return NLMSG_ALIGN(sizeof(struct ndmsg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) + nla_total_size(ETH_ALEN) /* NDA_LLADDR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) + nla_total_size(sizeof(struct in6_addr)) /* NDA_DST */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) + nla_total_size(sizeof(__be16)) /* NDA_PORT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) + nla_total_size(sizeof(__be32)) /* NDA_VNI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) + nla_total_size(sizeof(__u32)) /* NDA_IFINDEX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) + nla_total_size(sizeof(__s32)) /* NDA_LINK_NETNSID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) + nla_total_size(sizeof(struct nda_cacheinfo));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) static void __vxlan_fdb_notify(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) struct vxlan_rdst *rd, int type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) struct net *net = dev_net(vxlan->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) int err = -ENOBUFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) skb = nlmsg_new(vxlan_nlmsg_size(), GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) if (skb == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) goto errout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) err = vxlan_fdb_info(skb, vxlan, fdb, 0, 0, type, 0, rd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) /* -EMSGSIZE implies BUG in vxlan_nlmsg_size() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) WARN_ON(err == -EMSGSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) goto errout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) rtnl_notify(skb, net, 0, RTNLGRP_NEIGH, NULL, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) errout:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) rtnl_set_sk_err(net, RTNLGRP_NEIGH, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) static void vxlan_fdb_switchdev_notifier_info(const struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) const struct vxlan_fdb *fdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) const struct vxlan_rdst *rd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) struct netlink_ext_ack *extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) struct switchdev_notifier_vxlan_fdb_info *fdb_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) fdb_info->info.dev = vxlan->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) fdb_info->info.extack = extack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) fdb_info->remote_ip = rd->remote_ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) fdb_info->remote_port = rd->remote_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) fdb_info->remote_vni = rd->remote_vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) fdb_info->remote_ifindex = rd->remote_ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) memcpy(fdb_info->eth_addr, fdb->eth_addr, ETH_ALEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) fdb_info->vni = fdb->vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) fdb_info->offloaded = rd->offloaded;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) fdb_info->added_by_user = fdb->flags & NTF_VXLAN_ADDED_BY_USER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) static int vxlan_fdb_switchdev_call_notifiers(struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) struct vxlan_fdb *fdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) struct vxlan_rdst *rd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) bool adding,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) struct switchdev_notifier_vxlan_fdb_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) enum switchdev_notifier_type notifier_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) if (WARN_ON(!rd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) notifier_type = adding ? SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) : SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) vxlan_fdb_switchdev_notifier_info(vxlan, fdb, rd, NULL, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) ret = call_switchdev_notifiers(notifier_type, vxlan->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) &info.info, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) return notifier_to_errno(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) static int vxlan_fdb_notify(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) struct vxlan_rdst *rd, int type, bool swdev_notify,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) if (swdev_notify && rd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) case RTM_NEWNEIGH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) err = vxlan_fdb_switchdev_call_notifiers(vxlan, fdb, rd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) true, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) case RTM_DELNEIGH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) vxlan_fdb_switchdev_call_notifiers(vxlan, fdb, rd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) false, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) __vxlan_fdb_notify(vxlan, fdb, rd, type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) static void vxlan_ip_miss(struct net_device *dev, union vxlan_addr *ipa)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) struct vxlan_fdb f = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) .state = NUD_STALE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) struct vxlan_rdst remote = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) .remote_ip = *ipa, /* goes to NDA_DST */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) .remote_vni = cpu_to_be32(VXLAN_N_VID),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) vxlan_fdb_notify(vxlan, &f, &remote, RTM_GETNEIGH, true, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) static void vxlan_fdb_miss(struct vxlan_dev *vxlan, const u8 eth_addr[ETH_ALEN])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) struct vxlan_fdb f = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) .state = NUD_STALE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) struct vxlan_rdst remote = { };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) memcpy(f.eth_addr, eth_addr, ETH_ALEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) vxlan_fdb_notify(vxlan, &f, &remote, RTM_GETNEIGH, true, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) /* Hash Ethernet address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) static u32 eth_hash(const unsigned char *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) u64 value = get_unaligned((u64 *)addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) /* only want 6 bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) #ifdef __BIG_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) value >>= 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) value <<= 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) return hash_64(value, FDB_HASH_BITS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) static u32 eth_vni_hash(const unsigned char *addr, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) /* use 1 byte of OUI and 3 bytes of NIC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) u32 key = get_unaligned((u32 *)(addr + 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) return jhash_2words(key, vni, vxlan_salt) & (FDB_HASH_SIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) static u32 fdb_head_index(struct vxlan_dev *vxlan, const u8 *mac, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) return eth_vni_hash(mac, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) return eth_hash(mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) /* Hash chain to use given mac address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) static inline struct hlist_head *vxlan_fdb_head(struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) const u8 *mac, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) return &vxlan->fdb_head[fdb_head_index(vxlan, mac, vni)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) /* Look up Ethernet address in forwarding table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) static struct vxlan_fdb *__vxlan_find_mac(struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) const u8 *mac, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) struct hlist_head *head = vxlan_fdb_head(vxlan, mac, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) hlist_for_each_entry_rcu(f, head, hlist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) if (ether_addr_equal(mac, f->eth_addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) if (vni == f->vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) return f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) return f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) static struct vxlan_fdb *vxlan_find_mac(struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) const u8 *mac, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) f = __vxlan_find_mac(vxlan, mac, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) if (f && f->used != jiffies)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) f->used = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) return f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) /* caller should hold vxlan->hash_lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) static struct vxlan_rdst *vxlan_fdb_find_rdst(struct vxlan_fdb *f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) union vxlan_addr *ip, __be16 port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) __be32 vni, __u32 ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) struct vxlan_rdst *rd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) list_for_each_entry(rd, &f->remotes, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) if (vxlan_addr_equal(&rd->remote_ip, ip) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) rd->remote_port == port &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) rd->remote_vni == vni &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) rd->remote_ifindex == ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) return rd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) int vxlan_fdb_find_uc(struct net_device *dev, const u8 *mac, __be32 vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) struct switchdev_notifier_vxlan_fdb_info *fdb_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) u8 eth_addr[ETH_ALEN + 2] = { 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) struct vxlan_rdst *rdst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) if (is_multicast_ether_addr(mac) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) is_zero_ether_addr(mac))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) ether_addr_copy(eth_addr, mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) f = __vxlan_find_mac(vxlan, eth_addr, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) if (!f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) rc = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) rdst = first_remote_rcu(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) vxlan_fdb_switchdev_notifier_info(vxlan, f, rdst, NULL, fdb_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) EXPORT_SYMBOL_GPL(vxlan_fdb_find_uc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) static int vxlan_fdb_notify_one(struct notifier_block *nb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) const struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) const struct vxlan_fdb *f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) const struct vxlan_rdst *rdst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) struct switchdev_notifier_vxlan_fdb_info fdb_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) vxlan_fdb_switchdev_notifier_info(vxlan, f, rdst, extack, &fdb_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) rc = nb->notifier_call(nb, SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) &fdb_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) return notifier_to_errno(rc);
^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) int vxlan_fdb_replay(const struct net_device *dev, __be32 vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) struct notifier_block *nb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) struct vxlan_dev *vxlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) struct vxlan_rdst *rdst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) unsigned int h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) if (!netif_is_vxlan(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) for (h = 0; h < FDB_HASH_SIZE; ++h) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) spin_lock_bh(&vxlan->hash_lock[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) hlist_for_each_entry(f, &vxlan->fdb_head[h], hlist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) if (f->vni == vni) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) list_for_each_entry(rdst, &f->remotes, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) rc = vxlan_fdb_notify_one(nb, vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) f, rdst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) }
^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) spin_unlock_bh(&vxlan->hash_lock[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) spin_unlock_bh(&vxlan->hash_lock[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) EXPORT_SYMBOL_GPL(vxlan_fdb_replay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) void vxlan_fdb_clear_offload(const struct net_device *dev, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) struct vxlan_dev *vxlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) struct vxlan_rdst *rdst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) unsigned int h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) if (!netif_is_vxlan(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) for (h = 0; h < FDB_HASH_SIZE; ++h) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) spin_lock_bh(&vxlan->hash_lock[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) hlist_for_each_entry(f, &vxlan->fdb_head[h], hlist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) if (f->vni == vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) list_for_each_entry(rdst, &f->remotes, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) rdst->offloaded = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) spin_unlock_bh(&vxlan->hash_lock[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) EXPORT_SYMBOL_GPL(vxlan_fdb_clear_offload);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) /* Replace destination of unicast mac */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) static int vxlan_fdb_replace(struct vxlan_fdb *f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) union vxlan_addr *ip, __be16 port, __be32 vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) __u32 ifindex, struct vxlan_rdst *oldrd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) struct vxlan_rdst *rd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) rd = vxlan_fdb_find_rdst(f, ip, port, vni, ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) if (rd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) rd = list_first_entry_or_null(&f->remotes, struct vxlan_rdst, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) if (!rd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) *oldrd = *rd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) dst_cache_reset(&rd->dst_cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) rd->remote_ip = *ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) rd->remote_port = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) rd->remote_vni = vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) rd->remote_ifindex = ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) rd->offloaded = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) return 1;
^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) /* Add/update destinations for multicast */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) static int vxlan_fdb_append(struct vxlan_fdb *f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) union vxlan_addr *ip, __be16 port, __be32 vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) __u32 ifindex, struct vxlan_rdst **rdp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) struct vxlan_rdst *rd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) rd = vxlan_fdb_find_rdst(f, ip, port, vni, ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) if (rd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) rd = kmalloc(sizeof(*rd), GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) if (rd == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) return -ENOBUFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) if (dst_cache_init(&rd->dst_cache, GFP_ATOMIC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) kfree(rd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) return -ENOBUFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) rd->remote_ip = *ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) rd->remote_port = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) rd->offloaded = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) rd->remote_vni = vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) rd->remote_ifindex = ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) list_add_tail_rcu(&rd->list, &f->remotes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) *rdp = rd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) static struct vxlanhdr *vxlan_gro_remcsum(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) unsigned int off,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) struct vxlanhdr *vh, size_t hdrlen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) __be32 vni_field,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) struct gro_remcsum *grc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) bool nopartial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) size_t start, offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) if (skb->remcsum_offload)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) return vh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) if (!NAPI_GRO_CB(skb)->csum_valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) start = vxlan_rco_start(vni_field);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) offset = start + vxlan_rco_offset(vni_field);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) vh = skb_gro_remcsum_process(skb, (void *)vh, off, hdrlen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) start, offset, grc, nopartial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) skb->remcsum_offload = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) return vh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) static struct sk_buff *vxlan_gro_receive(struct sock *sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) struct list_head *head,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) struct sk_buff *pp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) struct sk_buff *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) struct vxlanhdr *vh, *vh2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) unsigned int hlen, off_vx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) int flush = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) struct vxlan_sock *vs = rcu_dereference_sk_user_data(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) __be32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) struct gro_remcsum grc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) skb_gro_remcsum_init(&grc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) off_vx = skb_gro_offset(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) hlen = off_vx + sizeof(*vh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) vh = skb_gro_header_fast(skb, off_vx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) if (skb_gro_header_hard(skb, hlen)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) vh = skb_gro_header_slow(skb, hlen, off_vx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) if (unlikely(!vh))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) skb_gro_postpull_rcsum(skb, vh, sizeof(struct vxlanhdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) flags = vh->vx_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) if ((flags & VXLAN_HF_RCO) && (vs->flags & VXLAN_F_REMCSUM_RX)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) vh = vxlan_gro_remcsum(skb, off_vx, vh, sizeof(struct vxlanhdr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) vh->vx_vni, &grc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) !!(vs->flags &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) VXLAN_F_REMCSUM_NOPARTIAL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) if (!vh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) goto out;
^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) skb_gro_pull(skb, sizeof(struct vxlanhdr)); /* pull vxlan header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) list_for_each_entry(p, head, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) if (!NAPI_GRO_CB(p)->same_flow)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) vh2 = (struct vxlanhdr *)(p->data + off_vx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) if (vh->vx_flags != vh2->vx_flags ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) vh->vx_vni != vh2->vx_vni) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) NAPI_GRO_CB(p)->same_flow = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) pp = call_gro_receive(eth_gro_receive, head, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) flush = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) skb_gro_flush_final_remcsum(skb, pp, flush, &grc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) return pp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) static int vxlan_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) /* Sets 'skb->inner_mac_header' since we are always called with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) * 'skb->encapsulation' set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) return eth_gro_complete(skb, nhoff + sizeof(struct vxlanhdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) static struct vxlan_fdb *vxlan_fdb_alloc(struct vxlan_dev *vxlan, const u8 *mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) __u16 state, __be32 src_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) __u16 ndm_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) f = kmalloc(sizeof(*f), GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) if (!f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) f->state = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) f->flags = ndm_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) f->updated = f->used = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) f->vni = src_vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) f->nh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) RCU_INIT_POINTER(f->vdev, vxlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) INIT_LIST_HEAD(&f->nh_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) INIT_LIST_HEAD(&f->remotes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) memcpy(f->eth_addr, mac, ETH_ALEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) return f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) static void vxlan_fdb_insert(struct vxlan_dev *vxlan, const u8 *mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) __be32 src_vni, struct vxlan_fdb *f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) ++vxlan->addrcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) hlist_add_head_rcu(&f->hlist,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) vxlan_fdb_head(vxlan, mac, src_vni));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) static int vxlan_fdb_nh_update(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) u32 nhid, struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) struct nexthop *old_nh = rtnl_dereference(fdb->nh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) struct nexthop *nh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) int err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) if (old_nh && old_nh->id == nhid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) nh = nexthop_find_by_id(vxlan->net, nhid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) if (!nh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) NL_SET_ERR_MSG(extack, "Nexthop id does not exist");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) goto err_inval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) if (nh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) if (!nexthop_get(nh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) NL_SET_ERR_MSG(extack, "Nexthop has been deleted");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) nh = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) goto err_inval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) if (!nexthop_is_fdb(nh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) NL_SET_ERR_MSG(extack, "Nexthop is not a fdb nexthop");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) goto err_inval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) if (!nexthop_is_multipath(nh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) NL_SET_ERR_MSG(extack, "Nexthop is not a multipath group");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) goto err_inval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) /* check nexthop group family */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) switch (vxlan->default_dst.remote_ip.sa.sa_family) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) case AF_INET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) if (!nexthop_has_v4(nh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) err = -EAFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) NL_SET_ERR_MSG(extack, "Nexthop group family not supported");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) goto err_inval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) case AF_INET6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) if (nexthop_has_v4(nh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) err = -EAFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) NL_SET_ERR_MSG(extack, "Nexthop group family not supported");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) goto err_inval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) if (old_nh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) list_del_rcu(&fdb->nh_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) nexthop_put(old_nh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) rcu_assign_pointer(fdb->nh, nh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) list_add_tail_rcu(&fdb->nh_list, &nh->fdb_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) err_inval:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) if (nh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) nexthop_put(nh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) static int vxlan_fdb_create(struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) const u8 *mac, union vxlan_addr *ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) __u16 state, __be16 port, __be32 src_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) __be32 vni, __u32 ifindex, __u16 ndm_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) u32 nhid, struct vxlan_fdb **fdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) struct vxlan_rdst *rd = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) if (vxlan->cfg.addrmax &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) vxlan->addrcnt >= vxlan->cfg.addrmax)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) return -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) f = vxlan_fdb_alloc(vxlan, mac, state, src_vni, ndm_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) if (!f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) if (nhid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) rc = vxlan_fdb_nh_update(vxlan, f, nhid, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) goto errout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) *fdb = f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) errout:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) kfree(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) static void __vxlan_fdb_free(struct vxlan_fdb *f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) struct vxlan_rdst *rd, *nd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) struct nexthop *nh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) nh = rcu_dereference_raw(f->nh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) if (nh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) rcu_assign_pointer(f->nh, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) rcu_assign_pointer(f->vdev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) nexthop_put(nh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) list_for_each_entry_safe(rd, nd, &f->remotes, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) dst_cache_destroy(&rd->dst_cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) kfree(rd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) kfree(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) static void vxlan_fdb_free(struct rcu_head *head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) struct vxlan_fdb *f = container_of(head, struct vxlan_fdb, rcu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) __vxlan_fdb_free(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) static void vxlan_fdb_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) bool do_notify, bool swdev_notify)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) struct vxlan_rdst *rd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) netdev_dbg(vxlan->dev, "delete %pM\n", f->eth_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) --vxlan->addrcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) if (do_notify) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) if (rcu_access_pointer(f->nh))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) vxlan_fdb_notify(vxlan, f, NULL, RTM_DELNEIGH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) swdev_notify, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) list_for_each_entry(rd, &f->remotes, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) vxlan_fdb_notify(vxlan, f, rd, RTM_DELNEIGH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) swdev_notify, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) hlist_del_rcu(&f->hlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) list_del_rcu(&f->nh_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) call_rcu(&f->rcu, vxlan_fdb_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) static void vxlan_dst_free(struct rcu_head *head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) struct vxlan_rdst *rd = container_of(head, struct vxlan_rdst, rcu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) dst_cache_destroy(&rd->dst_cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) kfree(rd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) union vxlan_addr *ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) __u16 state, __u16 flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) __be16 port, __be32 vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) __u32 ifindex, __u16 ndm_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) struct vxlan_fdb *f, u32 nhid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) bool swdev_notify,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) __u16 fdb_flags = (ndm_flags & ~NTF_USE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) struct vxlan_rdst *rd = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) struct vxlan_rdst oldrd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) int notify = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) if (nhid && !rcu_access_pointer(f->nh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) "Cannot replace an existing non nexthop fdb with a nexthop");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) if (nhid && (flags & NLM_F_APPEND)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) "Cannot append to a nexthop fdb");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) /* Do not allow an externally learned entry to take over an entry added
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) * by the user.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) if (!(fdb_flags & NTF_EXT_LEARNED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) !(f->flags & NTF_VXLAN_ADDED_BY_USER)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) if (f->state != state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) f->state = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) f->updated = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) notify = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) if (f->flags != fdb_flags) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) f->flags = fdb_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) f->updated = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) notify = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) if ((flags & NLM_F_REPLACE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) /* Only change unicasts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) if (!(is_multicast_ether_addr(f->eth_addr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) is_zero_ether_addr(f->eth_addr))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) if (nhid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) rc = vxlan_fdb_nh_update(vxlan, f, nhid, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) rc = vxlan_fdb_replace(f, ip, port, vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) ifindex, &oldrd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) notify |= rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) NL_SET_ERR_MSG(extack, "Cannot replace non-unicast fdb entries");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) if ((flags & NLM_F_APPEND) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) (is_multicast_ether_addr(f->eth_addr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) is_zero_ether_addr(f->eth_addr))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) notify |= rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) if (ndm_flags & NTF_USE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) f->used = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) if (notify) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) if (rd == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) rd = first_remote_rtnl(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) err = vxlan_fdb_notify(vxlan, f, rd, RTM_NEWNEIGH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) swdev_notify, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) goto err_notify;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) err_notify:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) if (nhid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) if ((flags & NLM_F_REPLACE) && rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) *rd = oldrd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) else if ((flags & NLM_F_APPEND) && rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) list_del_rcu(&rd->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) call_rcu(&rd->rcu, vxlan_dst_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) static int vxlan_fdb_update_create(struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) const u8 *mac, union vxlan_addr *ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) __u16 state, __u16 flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) __be16 port, __be32 src_vni, __be32 vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) __u32 ifindex, __u16 ndm_flags, u32 nhid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) bool swdev_notify,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) __u16 fdb_flags = (ndm_flags & ~NTF_USE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) /* Disallow replace to add a multicast entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) if ((flags & NLM_F_REPLACE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) (is_multicast_ether_addr(mac) || is_zero_ether_addr(mac)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) rc = vxlan_fdb_create(vxlan, mac, ip, state, port, src_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) vni, ifindex, fdb_flags, nhid, &f, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) vxlan_fdb_insert(vxlan, mac, src_vni, f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) rc = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_NEWNEIGH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) swdev_notify, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) goto err_notify;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) err_notify:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) vxlan_fdb_destroy(vxlan, f, false, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) /* Add new entry to forwarding table -- assumes lock held */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) static int vxlan_fdb_update(struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) const u8 *mac, union vxlan_addr *ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) __u16 state, __u16 flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) __be16 port, __be32 src_vni, __be32 vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) __u32 ifindex, __u16 ndm_flags, u32 nhid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) bool swdev_notify,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) f = __vxlan_find_mac(vxlan, mac, src_vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) if (f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) if (flags & NLM_F_EXCL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) netdev_dbg(vxlan->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) "lost race to create %pM\n", mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) return vxlan_fdb_update_existing(vxlan, ip, state, flags, port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) vni, ifindex, ndm_flags, f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) nhid, swdev_notify, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) if (!(flags & NLM_F_CREATE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) return vxlan_fdb_update_create(vxlan, mac, ip, state, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) port, src_vni, vni, ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) ndm_flags, nhid, swdev_notify,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) static void vxlan_fdb_dst_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) struct vxlan_rdst *rd, bool swdev_notify)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) list_del_rcu(&rd->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) vxlan_fdb_notify(vxlan, f, rd, RTM_DELNEIGH, swdev_notify, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) call_rcu(&rd->rcu, vxlan_dst_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) static int vxlan_fdb_parse(struct nlattr *tb[], struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) union vxlan_addr *ip, __be16 *port, __be32 *src_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) __be32 *vni, u32 *ifindex, u32 *nhid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) struct net *net = dev_net(vxlan->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) if (tb[NDA_NH_ID] && (tb[NDA_DST] || tb[NDA_VNI] || tb[NDA_IFINDEX] ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) tb[NDA_PORT]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) if (tb[NDA_DST]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) err = vxlan_nla_get_addr(ip, tb[NDA_DST]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) union vxlan_addr *remote = &vxlan->default_dst.remote_ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) if (remote->sa.sa_family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) ip->sin.sin_addr.s_addr = htonl(INADDR_ANY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) ip->sa.sa_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) ip->sin6.sin6_addr = in6addr_any;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) ip->sa.sa_family = AF_INET6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) if (tb[NDA_PORT]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) if (nla_len(tb[NDA_PORT]) != sizeof(__be16))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) *port = nla_get_be16(tb[NDA_PORT]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) *port = vxlan->cfg.dst_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) if (tb[NDA_VNI]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) if (nla_len(tb[NDA_VNI]) != sizeof(u32))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) *vni = cpu_to_be32(nla_get_u32(tb[NDA_VNI]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) *vni = vxlan->default_dst.remote_vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) if (tb[NDA_SRC_VNI]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) if (nla_len(tb[NDA_SRC_VNI]) != sizeof(u32))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) *src_vni = cpu_to_be32(nla_get_u32(tb[NDA_SRC_VNI]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) *src_vni = vxlan->default_dst.remote_vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) if (tb[NDA_IFINDEX]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) struct net_device *tdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) if (nla_len(tb[NDA_IFINDEX]) != sizeof(u32))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) *ifindex = nla_get_u32(tb[NDA_IFINDEX]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) tdev = __dev_get_by_index(net, *ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) if (!tdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) return -EADDRNOTAVAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) *ifindex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) if (tb[NDA_NH_ID])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) *nhid = nla_get_u32(tb[NDA_NH_ID]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) *nhid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) /* Add static entry (via netlink) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) static int vxlan_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) const unsigned char *addr, u16 vid, u16 flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) /* struct net *net = dev_net(vxlan->dev); */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) union vxlan_addr ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) __be16 port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) __be32 src_vni, vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) u32 ifindex, nhid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) u32 hash_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) if (!(ndm->ndm_state & (NUD_PERMANENT|NUD_REACHABLE))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) pr_info("RTM_NEWNEIGH with invalid state %#x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) ndm->ndm_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) if (!tb || (!tb[NDA_DST] && !tb[NDA_NH_ID]))
^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) err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) &nhid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) if (vxlan->default_dst.remote_ip.sa.sa_family != ip.sa.sa_family)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) return -EAFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) hash_index = fdb_head_index(vxlan, addr, src_vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) spin_lock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) err = vxlan_fdb_update(vxlan, addr, &ip, ndm->ndm_state, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) port, src_vni, vni, ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) ndm->ndm_flags | NTF_VXLAN_ADDED_BY_USER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) nhid, true, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) spin_unlock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) static int __vxlan_fdb_delete(struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) const unsigned char *addr, union vxlan_addr ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) __be16 port, __be32 src_vni, __be32 vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) u32 ifindex, bool swdev_notify)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) struct vxlan_rdst *rd = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) int err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) f = vxlan_find_mac(vxlan, addr, src_vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) if (!f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) if (!vxlan_addr_any(&ip)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) rd = vxlan_fdb_find_rdst(f, &ip, port, vni, ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) if (!rd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) /* remove a destination if it's not the only one on the list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) * otherwise destroy the fdb entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) if (rd && !list_is_singular(&f->remotes)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) vxlan_fdb_dst_destroy(vxlan, f, rd, swdev_notify);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) goto out;
^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) vxlan_fdb_destroy(vxlan, f, true, swdev_notify);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) /* Delete entry (via netlink) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) static int vxlan_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) const unsigned char *addr, u16 vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) union vxlan_addr ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) __be32 src_vni, vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) u32 ifindex, nhid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) u32 hash_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) __be16 port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) &nhid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) hash_index = fdb_head_index(vxlan, addr, src_vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) spin_lock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) err = __vxlan_fdb_delete(vxlan, addr, ip, port, src_vni, vni, ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) spin_unlock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) /* Dump forwarding table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) static int vxlan_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) struct net_device *filter_dev, int *idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) unsigned int h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) for (h = 0; h < FDB_HASH_SIZE; ++h) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) hlist_for_each_entry_rcu(f, &vxlan->fdb_head[h], hlist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) struct vxlan_rdst *rd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) if (rcu_access_pointer(f->nh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) if (*idx < cb->args[2])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) goto skip_nh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) err = vxlan_fdb_info(skb, vxlan, f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) NETLINK_CB(cb->skb).portid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) cb->nlh->nlmsg_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) RTM_NEWNEIGH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) NLM_F_MULTI, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) skip_nh:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) *idx += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) continue;
^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) list_for_each_entry_rcu(rd, &f->remotes, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) if (*idx < cb->args[2])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) goto skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) err = vxlan_fdb_info(skb, vxlan, f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) NETLINK_CB(cb->skb).portid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) cb->nlh->nlmsg_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) RTM_NEWNEIGH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) NLM_F_MULTI, rd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) skip:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) *idx += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) static int vxlan_fdb_get(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) struct nlattr *tb[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) const unsigned char *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) u16 vid, u32 portid, u32 seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) __be32 vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) if (tb[NDA_VNI])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) vni = cpu_to_be32(nla_get_u32(tb[NDA_VNI]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) vni = vxlan->default_dst.remote_vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) f = __vxlan_find_mac(vxlan, addr, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) if (!f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) NL_SET_ERR_MSG(extack, "Fdb entry not found");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) goto errout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) err = vxlan_fdb_info(skb, vxlan, f, portid, seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) RTM_NEWNEIGH, 0, first_remote_rcu(f));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) errout:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) return err;
^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) /* Watch incoming packets to learn mapping between Ethernet address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) * and Tunnel endpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) * Return true if packet is bogus and should be dropped.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) static bool vxlan_snoop(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) union vxlan_addr *src_ip, const u8 *src_mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) u32 src_ifindex, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) u32 ifindex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) if (src_ip->sa.sa_family == AF_INET6 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) (ipv6_addr_type(&src_ip->sin6.sin6_addr) & IPV6_ADDR_LINKLOCAL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) ifindex = src_ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) f = vxlan_find_mac(vxlan, src_mac, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) if (likely(f)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) struct vxlan_rdst *rdst = first_remote_rcu(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) if (likely(vxlan_addr_equal(&rdst->remote_ip, src_ip) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) rdst->remote_ifindex == ifindex))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) /* Don't migrate static entries, drop packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) if (f->state & (NUD_PERMANENT | NUD_NOARP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) /* Don't override an fdb with nexthop with a learnt entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) if (rcu_access_pointer(f->nh))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) if (net_ratelimit())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) netdev_info(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) "%pM migrated from %pIS to %pIS\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) src_mac, &rdst->remote_ip.sa, &src_ip->sa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) rdst->remote_ip = *src_ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) f->updated = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) vxlan_fdb_notify(vxlan, f, rdst, RTM_NEWNEIGH, true, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) u32 hash_index = fdb_head_index(vxlan, src_mac, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) /* learned new entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) spin_lock(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) /* close off race between vxlan_flush and incoming packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) if (netif_running(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) vxlan_fdb_update(vxlan, src_mac, src_ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) NUD_REACHABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) NLM_F_EXCL|NLM_F_CREATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) vxlan->cfg.dst_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) vxlan->default_dst.remote_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) ifindex, NTF_SELF, 0, true, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) spin_unlock(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) /* See if multicast group is already in use by other ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) static bool vxlan_group_used(struct vxlan_net *vn, struct vxlan_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) struct vxlan_dev *vxlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) struct vxlan_sock *sock4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) struct vxlan_sock *sock6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) unsigned short family = dev->default_dst.remote_ip.sa.sa_family;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) sock4 = rtnl_dereference(dev->vn4_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) /* The vxlan_sock is only used by dev, leaving group has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) * no effect on other vxlan devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) if (family == AF_INET && sock4 && refcount_read(&sock4->refcnt) == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) sock6 = rtnl_dereference(dev->vn6_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) if (family == AF_INET6 && sock6 && refcount_read(&sock6->refcnt) == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) list_for_each_entry(vxlan, &vn->vxlan_list, next) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) if (!netif_running(vxlan->dev) || vxlan == dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) if (family == AF_INET &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) rtnl_dereference(vxlan->vn4_sock) != sock4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) if (family == AF_INET6 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) rtnl_dereference(vxlan->vn6_sock) != sock6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) if (!vxlan_addr_equal(&vxlan->default_dst.remote_ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) &dev->default_dst.remote_ip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) if (vxlan->default_dst.remote_ifindex !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) dev->default_dst.remote_ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) static bool __vxlan_sock_release_prep(struct vxlan_sock *vs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) struct vxlan_net *vn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) if (!vs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) if (!refcount_dec_and_test(&vs->refcnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) vn = net_generic(sock_net(vs->sock->sk), vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) spin_lock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) hlist_del_rcu(&vs->hlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) udp_tunnel_notify_del_rx_port(vs->sock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) (vs->flags & VXLAN_F_GPE) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) UDP_TUNNEL_TYPE_VXLAN_GPE :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) UDP_TUNNEL_TYPE_VXLAN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) spin_unlock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) static void vxlan_sock_release(struct vxlan_dev *vxlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) struct vxlan_sock *sock4 = rtnl_dereference(vxlan->vn4_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) struct vxlan_sock *sock6 = rtnl_dereference(vxlan->vn6_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) RCU_INIT_POINTER(vxlan->vn6_sock, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) RCU_INIT_POINTER(vxlan->vn4_sock, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) synchronize_net();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) vxlan_vs_del_dev(vxlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) if (__vxlan_sock_release_prep(sock4)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) udp_tunnel_sock_release(sock4->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) kfree(sock4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) if (__vxlan_sock_release_prep(sock6)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) udp_tunnel_sock_release(sock6->sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) kfree(sock6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) /* Update multicast group membership when first VNI on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) * multicast address is brought up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) static int vxlan_igmp_join(struct vxlan_dev *vxlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) struct sock *sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) union vxlan_addr *ip = &vxlan->default_dst.remote_ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) int ifindex = vxlan->default_dst.remote_ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) int ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) if (ip->sa.sa_family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) struct vxlan_sock *sock4 = rtnl_dereference(vxlan->vn4_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) struct ip_mreqn mreq = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) .imr_multiaddr.s_addr = ip->sin.sin_addr.s_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) .imr_ifindex = ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) sk = sock4->sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) ret = ip_mc_join_group(sk, &mreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) struct vxlan_sock *sock6 = rtnl_dereference(vxlan->vn6_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) sk = sock6->sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) ret = ipv6_stub->ipv6_sock_mc_join(sk, ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) &ip->sin6.sin6_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) return ret;
^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) /* Inverse of vxlan_igmp_join when last VNI is brought down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) static int vxlan_igmp_leave(struct vxlan_dev *vxlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) struct sock *sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) union vxlan_addr *ip = &vxlan->default_dst.remote_ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) int ifindex = vxlan->default_dst.remote_ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) int ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) if (ip->sa.sa_family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) struct vxlan_sock *sock4 = rtnl_dereference(vxlan->vn4_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) struct ip_mreqn mreq = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) .imr_multiaddr.s_addr = ip->sin.sin_addr.s_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) .imr_ifindex = ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) sk = sock4->sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) ret = ip_mc_leave_group(sk, &mreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) struct vxlan_sock *sock6 = rtnl_dereference(vxlan->vn6_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) sk = sock6->sock->sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) ret = ipv6_stub->ipv6_sock_mc_drop(sk, ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) &ip->sin6.sin6_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) release_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) static bool vxlan_remcsum(struct vxlanhdr *unparsed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) struct sk_buff *skb, u32 vxflags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) size_t start, offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) if (!(unparsed->vx_flags & VXLAN_HF_RCO) || skb->remcsum_offload)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) start = vxlan_rco_start(unparsed->vx_vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) offset = start + vxlan_rco_offset(unparsed->vx_vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) if (!pskb_may_pull(skb, offset + sizeof(u16)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) skb_remcsum_process(skb, (void *)(vxlan_hdr(skb) + 1), start, offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) !!(vxflags & VXLAN_F_REMCSUM_NOPARTIAL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) unparsed->vx_flags &= ~VXLAN_HF_RCO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) unparsed->vx_vni &= VXLAN_VNI_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) static void vxlan_parse_gbp_hdr(struct vxlanhdr *unparsed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) struct sk_buff *skb, u32 vxflags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) struct vxlan_metadata *md)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) struct vxlanhdr_gbp *gbp = (struct vxlanhdr_gbp *)unparsed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) struct metadata_dst *tun_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) if (!(unparsed->vx_flags & VXLAN_HF_GBP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) md->gbp = ntohs(gbp->policy_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) tun_dst = (struct metadata_dst *)skb_dst(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) if (tun_dst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) tun_dst->u.tun_info.key.tun_flags |= TUNNEL_VXLAN_OPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) tun_dst->u.tun_info.options_len = sizeof(*md);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) if (gbp->dont_learn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) md->gbp |= VXLAN_GBP_DONT_LEARN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) if (gbp->policy_applied)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) md->gbp |= VXLAN_GBP_POLICY_APPLIED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) /* In flow-based mode, GBP is carried in dst_metadata */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) if (!(vxflags & VXLAN_F_COLLECT_METADATA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) skb->mark = md->gbp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) unparsed->vx_flags &= ~VXLAN_GBP_USED_BITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) static bool vxlan_parse_gpe_hdr(struct vxlanhdr *unparsed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) __be16 *protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) struct sk_buff *skb, u32 vxflags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) struct vxlanhdr_gpe *gpe = (struct vxlanhdr_gpe *)unparsed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) /* Need to have Next Protocol set for interfaces in GPE mode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) if (!gpe->np_applied)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) /* "The initial version is 0. If a receiver does not support the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) * version indicated it MUST drop the packet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) if (gpe->version != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) /* "When the O bit is set to 1, the packet is an OAM packet and OAM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) * processing MUST occur." However, we don't implement OAM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) * processing, thus drop the packet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) if (gpe->oam_flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) *protocol = tun_p_to_eth_p(gpe->next_protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) if (!*protocol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) unparsed->vx_flags &= ~VXLAN_GPE_USED_BITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) static bool vxlan_set_mac(struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) struct vxlan_sock *vs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) struct sk_buff *skb, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) union vxlan_addr saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) u32 ifindex = skb->dev->ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) skb_reset_mac_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) skb->protocol = eth_type_trans(skb, vxlan->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) /* Ignore packet loops (and multicast echo) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) if (ether_addr_equal(eth_hdr(skb)->h_source, vxlan->dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) /* Get address from the outer IP header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) if (vxlan_get_sk_family(vs) == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) saddr.sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) saddr.sa.sa_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) saddr.sin6.sin6_addr = ipv6_hdr(skb)->saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) saddr.sa.sa_family = AF_INET6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) if ((vxlan->cfg.flags & VXLAN_F_LEARN) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) vxlan_snoop(skb->dev, &saddr, eth_hdr(skb)->h_source, ifindex, vni))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) static bool vxlan_ecn_decapsulate(struct vxlan_sock *vs, void *oiph,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) if (vxlan_get_sk_family(vs) == AF_INET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) err = IP_ECN_decapsulate(oiph, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) err = IP6_ECN_decapsulate(oiph, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) if (unlikely(err) && log_ecn_error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) if (vxlan_get_sk_family(vs) == AF_INET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) net_info_ratelimited("non-ECT from %pI4 with TOS=%#x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) &((struct iphdr *)oiph)->saddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) ((struct iphdr *)oiph)->tos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) net_info_ratelimited("non-ECT from %pI6\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) &((struct ipv6hdr *)oiph)->saddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) return err <= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) /* Callback from net/ipv4/udp.c to receive packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) struct vxlan_dev *vxlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) struct vxlan_sock *vs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) struct vxlanhdr unparsed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) struct vxlan_metadata _md;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) struct vxlan_metadata *md = &_md;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) __be16 protocol = htons(ETH_P_TEB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) bool raw_proto = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) void *oiph;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) __be32 vni = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) /* Need UDP and VXLAN header to be present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) if (!pskb_may_pull(skb, VXLAN_HLEN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) unparsed = *vxlan_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) /* VNI flag always required to be set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) if (!(unparsed.vx_flags & VXLAN_HF_VNI)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) netdev_dbg(skb->dev, "invalid vxlan flags=%#x vni=%#x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) ntohl(vxlan_hdr(skb)->vx_flags),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) ntohl(vxlan_hdr(skb)->vx_vni));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) /* Return non vxlan pkt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) unparsed.vx_flags &= ~VXLAN_HF_VNI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) unparsed.vx_vni &= ~VXLAN_VNI_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) vs = rcu_dereference_sk_user_data(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) if (!vs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) vni = vxlan_vni(vxlan_hdr(skb)->vx_vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) vxlan = vxlan_vs_find_vni(vs, skb->dev->ifindex, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) if (!vxlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) /* For backwards compatibility, only allow reserved fields to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) * used by VXLAN extensions if explicitly requested.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) if (vs->flags & VXLAN_F_GPE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) if (!vxlan_parse_gpe_hdr(&unparsed, &protocol, skb, vs->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) raw_proto = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) if (__iptunnel_pull_header(skb, VXLAN_HLEN, protocol, raw_proto,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) !net_eq(vxlan->net, dev_net(vxlan->dev))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) if (vs->flags & VXLAN_F_REMCSUM_RX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) if (unlikely(!vxlan_remcsum(&unparsed, skb, vs->flags)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) if (vxlan_collect_metadata(vs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) struct metadata_dst *tun_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) tun_dst = udp_tun_rx_dst(skb, vxlan_get_sk_family(vs), TUNNEL_KEY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) key32_to_tunnel_id(vni), sizeof(*md));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) if (!tun_dst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) md = ip_tunnel_info_opts(&tun_dst->u.tun_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) skb_dst_set(skb, (struct dst_entry *)tun_dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) memset(md, 0, sizeof(*md));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) if (vs->flags & VXLAN_F_GBP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) vxlan_parse_gbp_hdr(&unparsed, skb, vs->flags, md);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) /* Note that GBP and GPE can never be active together. This is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) * ensured in vxlan_dev_configure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) if (unparsed.vx_flags || unparsed.vx_vni) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) /* If there are any unprocessed flags remaining treat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) * this as a malformed packet. This behavior diverges from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) * VXLAN RFC (RFC7348) which stipulates that bits in reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) * in reserved fields are to be ignored. The approach here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) * maintains compatibility with previous stack code, and also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) * is more robust and provides a little more security in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) * adding extensions to VXLAN.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) if (!raw_proto) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) if (!vxlan_set_mac(vxlan, vs, skb, vni))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) skb_reset_mac_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) skb->dev = vxlan->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) skb->pkt_type = PACKET_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) oiph = skb_network_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) skb_reset_network_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) if (!vxlan_ecn_decapsulate(vs, oiph, skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) ++vxlan->dev->stats.rx_frame_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) ++vxlan->dev->stats.rx_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) if (unlikely(!(vxlan->dev->flags & IFF_UP))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) atomic_long_inc(&vxlan->dev->rx_dropped);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) dev_sw_netstats_rx_add(vxlan->dev, skb->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) gro_cells_receive(&vxlan->gro_cells, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) drop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) /* Consume bad packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) /* Callback from net/ipv{4,6}/udp.c to check that we have a VNI for errors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) static int vxlan_err_lookup(struct sock *sk, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) struct vxlan_dev *vxlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) struct vxlan_sock *vs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) struct vxlanhdr *hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) __be32 vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) if (!pskb_may_pull(skb, skb_transport_offset(skb) + VXLAN_HLEN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) hdr = vxlan_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) if (!(hdr->vx_flags & VXLAN_HF_VNI))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) vs = rcu_dereference_sk_user_data(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) if (!vs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) vni = vxlan_vni(hdr->vx_vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) vxlan = vxlan_vs_find_vni(vs, skb->dev->ifindex, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) if (!vxlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) static int arp_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) struct arphdr *parp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) u8 *arpptr, *sha;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) __be32 sip, tip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) struct neighbour *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) if (dev->flags & IFF_NOARP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) if (!pskb_may_pull(skb, arp_hdr_len(dev))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) dev->stats.tx_dropped++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) parp = arp_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) if ((parp->ar_hrd != htons(ARPHRD_ETHER) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) parp->ar_hrd != htons(ARPHRD_IEEE802)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) parp->ar_pro != htons(ETH_P_IP) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) parp->ar_op != htons(ARPOP_REQUEST) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) parp->ar_hln != dev->addr_len ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) parp->ar_pln != 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) arpptr = (u8 *)parp + sizeof(struct arphdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) sha = arpptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) arpptr += dev->addr_len; /* sha */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) memcpy(&sip, arpptr, sizeof(sip));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) arpptr += sizeof(sip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) arpptr += dev->addr_len; /* tha */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) memcpy(&tip, arpptr, sizeof(tip));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) if (ipv4_is_loopback(tip) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) ipv4_is_multicast(tip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) n = neigh_lookup(&arp_tbl, &tip, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) if (n) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) struct sk_buff *reply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) if (!(n->nud_state & NUD_CONNECTED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) neigh_release(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) f = vxlan_find_mac(vxlan, n->ha, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) if (f && vxlan_addr_any(&(first_remote_rcu(f)->remote_ip))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) /* bridge-local neighbor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) neigh_release(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) reply = arp_create(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) n->ha, sha);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) neigh_release(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) if (reply == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) skb_reset_mac_header(reply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) __skb_pull(reply, skb_network_offset(reply));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) reply->ip_summed = CHECKSUM_UNNECESSARY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) reply->pkt_type = PACKET_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) if (netif_rx_ni(reply) == NET_RX_DROP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) dev->stats.rx_dropped++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) } else if (vxlan->cfg.flags & VXLAN_F_L3MISS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) union vxlan_addr ipa = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) .sin.sin_addr.s_addr = tip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) .sin.sin_family = AF_INET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) vxlan_ip_miss(dev, &ipa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) consume_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) return NETDEV_TX_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) static struct sk_buff *vxlan_na_create(struct sk_buff *request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) struct neighbour *n, bool isrouter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) struct net_device *dev = request->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) struct sk_buff *reply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) struct nd_msg *ns, *na;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) struct ipv6hdr *pip6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) u8 *daddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) int na_olen = 8; /* opt hdr + ETH_ALEN for target */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) int ns_olen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) int i, len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) if (dev == NULL || !pskb_may_pull(request, request->len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) len = LL_RESERVED_SPACE(dev) + sizeof(struct ipv6hdr) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) sizeof(*na) + na_olen + dev->needed_tailroom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) reply = alloc_skb(len, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) if (reply == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) reply->protocol = htons(ETH_P_IPV6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) reply->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) skb_reserve(reply, LL_RESERVED_SPACE(request->dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) skb_push(reply, sizeof(struct ethhdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) skb_reset_mac_header(reply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) ns = (struct nd_msg *)(ipv6_hdr(request) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) daddr = eth_hdr(request)->h_source;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) ns_olen = request->len - skb_network_offset(request) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) sizeof(struct ipv6hdr) - sizeof(*ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) for (i = 0; i < ns_olen-1; i += (ns->opt[i+1]<<3)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) if (!ns->opt[i + 1]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) kfree_skb(reply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) if (ns->opt[i] == ND_OPT_SOURCE_LL_ADDR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) daddr = ns->opt + i + sizeof(struct nd_opt_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) /* Ethernet header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) ether_addr_copy(eth_hdr(reply)->h_dest, daddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) ether_addr_copy(eth_hdr(reply)->h_source, n->ha);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) eth_hdr(reply)->h_proto = htons(ETH_P_IPV6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) reply->protocol = htons(ETH_P_IPV6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) skb_pull(reply, sizeof(struct ethhdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) skb_reset_network_header(reply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) skb_put(reply, sizeof(struct ipv6hdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) /* IPv6 header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) pip6 = ipv6_hdr(reply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) memset(pip6, 0, sizeof(struct ipv6hdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) pip6->version = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) pip6->priority = ipv6_hdr(request)->priority;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) pip6->nexthdr = IPPROTO_ICMPV6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) pip6->hop_limit = 255;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) pip6->daddr = ipv6_hdr(request)->saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) pip6->saddr = *(struct in6_addr *)n->primary_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) skb_pull(reply, sizeof(struct ipv6hdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) skb_reset_transport_header(reply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) /* Neighbor Advertisement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) na = skb_put_zero(reply, sizeof(*na) + na_olen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) na->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) na->icmph.icmp6_router = isrouter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) na->icmph.icmp6_override = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) na->icmph.icmp6_solicited = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) na->target = ns->target;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) ether_addr_copy(&na->opt[2], n->ha);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) na->opt[0] = ND_OPT_TARGET_LL_ADDR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) na->opt[1] = na_olen >> 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) na->icmph.icmp6_cksum = csum_ipv6_magic(&pip6->saddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) &pip6->daddr, sizeof(*na)+na_olen, IPPROTO_ICMPV6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) csum_partial(na, sizeof(*na)+na_olen, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) pip6->payload_len = htons(sizeof(*na)+na_olen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) skb_push(reply, sizeof(struct ipv6hdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) reply->ip_summed = CHECKSUM_UNNECESSARY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) return reply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) static int neigh_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) const struct in6_addr *daddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) const struct ipv6hdr *iphdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) struct inet6_dev *in6_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) struct neighbour *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) struct nd_msg *msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) in6_dev = __in6_dev_get(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) if (!in6_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) iphdr = ipv6_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) daddr = &iphdr->daddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) msg = (struct nd_msg *)(iphdr + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) if (ipv6_addr_loopback(daddr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) ipv6_addr_is_multicast(&msg->target))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) n = neigh_lookup(ipv6_stub->nd_tbl, &msg->target, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) if (n) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) struct sk_buff *reply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) if (!(n->nud_state & NUD_CONNECTED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) neigh_release(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) f = vxlan_find_mac(vxlan, n->ha, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) if (f && vxlan_addr_any(&(first_remote_rcu(f)->remote_ip))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) /* bridge-local neighbor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) neigh_release(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) reply = vxlan_na_create(skb, n,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) !!(f ? f->flags & NTF_ROUTER : 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) neigh_release(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) if (reply == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) if (netif_rx_ni(reply) == NET_RX_DROP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) dev->stats.rx_dropped++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) } else if (vxlan->cfg.flags & VXLAN_F_L3MISS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) union vxlan_addr ipa = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) .sin6.sin6_addr = msg->target,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) .sin6.sin6_family = AF_INET6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) vxlan_ip_miss(dev, &ipa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) consume_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) return NETDEV_TX_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) struct neighbour *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) if (is_multicast_ether_addr(eth_hdr(skb)->h_dest))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) n = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) switch (ntohs(eth_hdr(skb)->h_proto)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) case ETH_P_IP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) struct iphdr *pip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) if (!pskb_may_pull(skb, sizeof(struct iphdr)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) pip = ip_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) n = neigh_lookup(&arp_tbl, &pip->daddr, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) if (!n && (vxlan->cfg.flags & VXLAN_F_L3MISS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) union vxlan_addr ipa = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) .sin.sin_addr.s_addr = pip->daddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) .sin.sin_family = AF_INET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) vxlan_ip_miss(dev, &ipa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) case ETH_P_IPV6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) struct ipv6hdr *pip6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) pip6 = ipv6_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) n = neigh_lookup(ipv6_stub->nd_tbl, &pip6->daddr, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) if (!n && (vxlan->cfg.flags & VXLAN_F_L3MISS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) union vxlan_addr ipa = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) .sin6.sin6_addr = pip6->daddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) .sin6.sin6_family = AF_INET6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) vxlan_ip_miss(dev, &ipa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) if (n) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) bool diff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) diff = !ether_addr_equal(eth_hdr(skb)->h_dest, n->ha);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) if (diff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) memcpy(eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) dev->addr_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) memcpy(eth_hdr(skb)->h_dest, n->ha, dev->addr_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) neigh_release(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) return diff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) static void vxlan_build_gbp_hdr(struct vxlanhdr *vxh, u32 vxflags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) struct vxlan_metadata *md)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) struct vxlanhdr_gbp *gbp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) if (!md->gbp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) gbp = (struct vxlanhdr_gbp *)vxh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) vxh->vx_flags |= VXLAN_HF_GBP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) if (md->gbp & VXLAN_GBP_DONT_LEARN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) gbp->dont_learn = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) if (md->gbp & VXLAN_GBP_POLICY_APPLIED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) gbp->policy_applied = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) gbp->policy_id = htons(md->gbp & VXLAN_GBP_ID_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) static int vxlan_build_gpe_hdr(struct vxlanhdr *vxh, u32 vxflags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) __be16 protocol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) struct vxlanhdr_gpe *gpe = (struct vxlanhdr_gpe *)vxh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) gpe->np_applied = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) gpe->next_protocol = tun_p_from_eth_p(protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) if (!gpe->next_protocol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) return -EPFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) static int vxlan_build_skb(struct sk_buff *skb, struct dst_entry *dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) int iphdr_len, __be32 vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) struct vxlan_metadata *md, u32 vxflags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) bool udp_sum)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) struct vxlanhdr *vxh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) int min_headroom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) int type = udp_sum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) __be16 inner_protocol = htons(ETH_P_TEB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) if ((vxflags & VXLAN_F_REMCSUM_TX) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) skb->ip_summed == CHECKSUM_PARTIAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) int csum_start = skb_checksum_start_offset(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) if (csum_start <= VXLAN_MAX_REMCSUM_START &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) !(csum_start & VXLAN_RCO_SHIFT_MASK) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) (skb->csum_offset == offsetof(struct udphdr, check) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) skb->csum_offset == offsetof(struct tcphdr, check)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) type |= SKB_GSO_TUNNEL_REMCSUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) + VXLAN_HLEN + iphdr_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) /* Need space for new headers (invalidates iph ptr) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) err = skb_cow_head(skb, min_headroom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) if (unlikely(err))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) err = iptunnel_handle_offloads(skb, type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) vxh = __skb_push(skb, sizeof(*vxh));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) vxh->vx_flags = VXLAN_HF_VNI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) vxh->vx_vni = vxlan_vni_field(vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) if (type & SKB_GSO_TUNNEL_REMCSUM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) unsigned int start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) start = skb_checksum_start_offset(skb) - sizeof(struct vxlanhdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) vxh->vx_vni |= vxlan_compute_rco(start, skb->csum_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) vxh->vx_flags |= VXLAN_HF_RCO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) if (!skb_is_gso(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) skb->ip_summed = CHECKSUM_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) skb->encapsulation = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) if (vxflags & VXLAN_F_GBP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) vxlan_build_gbp_hdr(vxh, vxflags, md);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) if (vxflags & VXLAN_F_GPE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) err = vxlan_build_gpe_hdr(vxh, vxflags, skb->protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) inner_protocol = skb->protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) skb_set_inner_protocol(skb, inner_protocol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) struct vxlan_sock *sock4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) struct sk_buff *skb, int oif, u8 tos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) __be32 daddr, __be32 *saddr, __be16 dport, __be16 sport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) struct dst_cache *dst_cache,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) const struct ip_tunnel_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) bool use_cache = ip_tunnel_dst_cache_usable(skb, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) struct rtable *rt = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) struct flowi4 fl4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) if (!sock4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) return ERR_PTR(-EIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) if (tos && !info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) use_cache = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) if (use_cache) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) rt = dst_cache_get_ip4(dst_cache, saddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) if (rt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) return rt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) memset(&fl4, 0, sizeof(fl4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) fl4.flowi4_oif = oif;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) fl4.flowi4_tos = RT_TOS(tos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) fl4.flowi4_mark = skb->mark;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) fl4.flowi4_proto = IPPROTO_UDP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) fl4.daddr = daddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) fl4.saddr = *saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) fl4.fl4_dport = dport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) fl4.fl4_sport = sport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) rt = ip_route_output_key(vxlan->net, &fl4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) if (!IS_ERR(rt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) if (rt->dst.dev == dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) netdev_dbg(dev, "circular route to %pI4\n", &daddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) ip_rt_put(rt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) return ERR_PTR(-ELOOP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) *saddr = fl4.saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) if (use_cache)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) dst_cache_set_ip4(dst_cache, &rt->dst, fl4.saddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) netdev_dbg(dev, "no route to %pI4\n", &daddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) return ERR_PTR(-ENETUNREACH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) return rt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) struct vxlan_sock *sock6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) struct sk_buff *skb, int oif, u8 tos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) __be32 label,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) const struct in6_addr *daddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) struct in6_addr *saddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) __be16 dport, __be16 sport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) struct dst_cache *dst_cache,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) const struct ip_tunnel_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) bool use_cache = ip_tunnel_dst_cache_usable(skb, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) struct dst_entry *ndst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) struct flowi6 fl6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) if (!sock6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) return ERR_PTR(-EIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) if (tos && !info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) use_cache = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) if (use_cache) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) ndst = dst_cache_get_ip6(dst_cache, saddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) if (ndst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) return ndst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) memset(&fl6, 0, sizeof(fl6));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) fl6.flowi6_oif = oif;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) fl6.daddr = *daddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) fl6.saddr = *saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) fl6.flowlabel = ip6_make_flowinfo(RT_TOS(tos), label);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) fl6.flowi6_mark = skb->mark;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) fl6.flowi6_proto = IPPROTO_UDP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) fl6.fl6_dport = dport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) fl6.fl6_sport = sport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) ndst = ipv6_stub->ipv6_dst_lookup_flow(vxlan->net, sock6->sock->sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) &fl6, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) if (unlikely(IS_ERR(ndst))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) netdev_dbg(dev, "no route to %pI6\n", daddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) return ERR_PTR(-ENETUNREACH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) if (unlikely(ndst->dev == dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) netdev_dbg(dev, "circular route to %pI6\n", daddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) dst_release(ndst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) return ERR_PTR(-ELOOP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) *saddr = fl6.saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) if (use_cache)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) dst_cache_set_ip6(dst_cache, ndst, saddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) return ndst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) /* Bypass encapsulation if the destination is local */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) struct vxlan_dev *dst_vxlan, __be32 vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) bool snoop)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) struct pcpu_sw_netstats *tx_stats, *rx_stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) union vxlan_addr loopback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) union vxlan_addr *remote_ip = &dst_vxlan->default_dst.remote_ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) int len = skb->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) tx_stats = this_cpu_ptr(src_vxlan->dev->tstats);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) rx_stats = this_cpu_ptr(dst_vxlan->dev->tstats);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) skb->pkt_type = PACKET_HOST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) skb->encapsulation = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) skb->dev = dst_vxlan->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) __skb_pull(skb, skb_network_offset(skb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) if (remote_ip->sa.sa_family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) loopback.sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) loopback.sa.sa_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) loopback.sin6.sin6_addr = in6addr_loopback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) loopback.sa.sa_family = AF_INET6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) dev = skb->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) if (unlikely(!(dev->flags & IFF_UP))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) if ((dst_vxlan->cfg.flags & VXLAN_F_LEARN) && snoop)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) vxlan_snoop(dev, &loopback, eth_hdr(skb)->h_source, 0, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) u64_stats_update_begin(&tx_stats->syncp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) tx_stats->tx_packets++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) tx_stats->tx_bytes += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) u64_stats_update_end(&tx_stats->syncp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) if (netif_rx(skb) == NET_RX_SUCCESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) u64_stats_update_begin(&rx_stats->syncp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) rx_stats->rx_packets++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) rx_stats->rx_bytes += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) u64_stats_update_end(&rx_stats->syncp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) drop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) dev->stats.rx_dropped++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) static int encap_bypass_if_local(struct sk_buff *skb, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) union vxlan_addr *daddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) __be16 dst_port, int dst_ifindex, __be32 vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) struct dst_entry *dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) u32 rt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) /* IPv6 rt-flags are checked against RTF_LOCAL, but the value of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) * RTF_LOCAL is equal to RTCF_LOCAL. So to keep code simple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) * we can use RTCF_LOCAL which works for ipv4 and ipv6 route entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) BUILD_BUG_ON(RTCF_LOCAL != RTF_LOCAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) /* Bypass encapsulation if the destination is local */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) if (rt_flags & RTCF_LOCAL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) !(rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) struct vxlan_dev *dst_vxlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) dst_release(dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) dst_vxlan = vxlan_find_vni(vxlan->net, dst_ifindex, vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) daddr->sa.sa_family, dst_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) vxlan->cfg.flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) if (!dst_vxlan) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) dev->stats.tx_errors++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) vxlan_encap_bypass(skb, vxlan, dst_vxlan, vni, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) __be32 default_vni, struct vxlan_rdst *rdst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) bool did_rsc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) struct dst_cache *dst_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) struct ip_tunnel_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) const struct iphdr *old_iph = ip_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) union vxlan_addr *dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) union vxlan_addr remote_ip, local_ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) struct vxlan_metadata _md;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) struct vxlan_metadata *md = &_md;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) __be16 src_port = 0, dst_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) struct dst_entry *ndst = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) __be32 vni, label;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) __u8 tos, ttl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) int ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) u32 flags = vxlan->cfg.flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) bool udp_sum = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) bool xnet = !net_eq(vxlan->net, dev_net(vxlan->dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) info = skb_tunnel_info(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) if (rdst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) dst = &rdst->remote_ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) if (vxlan_addr_any(dst)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) if (did_rsc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) /* short-circuited back to local bridge */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) vxlan_encap_bypass(skb, vxlan, vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) default_vni, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) dst_port = rdst->remote_port ? rdst->remote_port : vxlan->cfg.dst_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) vni = (rdst->remote_vni) ? : default_vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) ifindex = rdst->remote_ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) local_ip = vxlan->cfg.saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) dst_cache = &rdst->dst_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) md->gbp = skb->mark;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) if (flags & VXLAN_F_TTL_INHERIT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) ttl = ip_tunnel_get_ttl(old_iph, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) ttl = vxlan->cfg.ttl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) if (!ttl && vxlan_addr_multicast(dst))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) ttl = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) tos = vxlan->cfg.tos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) if (tos == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) tos = ip_tunnel_get_dsfield(old_iph, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) if (dst->sa.sa_family == AF_INET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) udp_sum = !(flags & VXLAN_F_UDP_ZERO_CSUM_TX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) udp_sum = !(flags & VXLAN_F_UDP_ZERO_CSUM6_TX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) label = vxlan->cfg.label;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) if (!info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) WARN_ONCE(1, "%s: Missing encapsulation instructions\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) dev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) remote_ip.sa.sa_family = ip_tunnel_info_af(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) if (remote_ip.sa.sa_family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) remote_ip.sin.sin_addr.s_addr = info->key.u.ipv4.dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) local_ip.sin.sin_addr.s_addr = info->key.u.ipv4.src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) remote_ip.sin6.sin6_addr = info->key.u.ipv6.dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) local_ip.sin6.sin6_addr = info->key.u.ipv6.src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) dst = &remote_ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) dst_port = info->key.tp_dst ? : vxlan->cfg.dst_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) vni = tunnel_id_to_key32(info->key.tun_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) ifindex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) dst_cache = &info->dst_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) if (info->key.tun_flags & TUNNEL_VXLAN_OPT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) if (info->options_len < sizeof(*md))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) md = ip_tunnel_info_opts(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) ttl = info->key.ttl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) tos = info->key.tos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) label = info->key.label;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) udp_sum = !!(info->key.tun_flags & TUNNEL_CSUM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) src_port = udp_flow_src_port(dev_net(dev), skb, vxlan->cfg.port_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) vxlan->cfg.port_max, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) if (dst->sa.sa_family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) struct vxlan_sock *sock4 = rcu_dereference(vxlan->vn4_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) struct rtable *rt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) __be16 df = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) if (!ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) ifindex = sock4->sock->sk->sk_bound_dev_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) rt = vxlan_get_route(vxlan, dev, sock4, skb, ifindex, tos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) dst->sin.sin_addr.s_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) &local_ip.sin.sin_addr.s_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) dst_port, src_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) dst_cache, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) if (IS_ERR(rt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) err = PTR_ERR(rt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) goto tx_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) if (!info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) /* Bypass encapsulation if the destination is local */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) err = encap_bypass_if_local(skb, dev, vxlan, dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) dst_port, ifindex, vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) &rt->dst, rt->rt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) if (vxlan->cfg.df == VXLAN_DF_SET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) df = htons(IP_DF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) } else if (vxlan->cfg.df == VXLAN_DF_INHERIT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) struct ethhdr *eth = eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) if (ntohs(eth->h_proto) == ETH_P_IPV6 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) (ntohs(eth->h_proto) == ETH_P_IP &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) old_iph->frag_off & htons(IP_DF)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) df = htons(IP_DF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) } else if (info->key.tun_flags & TUNNEL_DONT_FRAGMENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) df = htons(IP_DF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) ndst = &rt->dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) err = skb_tunnel_check_pmtu(skb, ndst, VXLAN_HEADROOM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) netif_is_any_bridge_port(dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) goto tx_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) } else if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) if (info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) struct ip_tunnel_info *unclone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) struct in_addr src, dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) unclone = skb_tunnel_info_unclone(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) if (unlikely(!unclone))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) goto tx_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) src = remote_ip.sin.sin_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) dst = local_ip.sin.sin_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) unclone->key.u.ipv4.src = src.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) unclone->key.u.ipv4.dst = dst.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) vxlan_encap_bypass(skb, vxlan, vxlan, vni, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) dst_release(ndst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) err = vxlan_build_skb(skb, ndst, sizeof(struct iphdr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) vni, md, flags, udp_sum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) goto tx_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) udp_tunnel_xmit_skb(rt, sock4->sock->sk, skb, local_ip.sin.sin_addr.s_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) dst->sin.sin_addr.s_addr, tos, ttl, df,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) src_port, dst_port, xnet, !udp_sum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) if (!ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) ifindex = sock6->sock->sk->sk_bound_dev_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) ndst = vxlan6_get_route(vxlan, dev, sock6, skb, ifindex, tos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) label, &dst->sin6.sin6_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) &local_ip.sin6.sin6_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) dst_port, src_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) dst_cache, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) if (IS_ERR(ndst)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) err = PTR_ERR(ndst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) ndst = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) goto tx_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) if (!info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) u32 rt6i_flags = ((struct rt6_info *)ndst)->rt6i_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) err = encap_bypass_if_local(skb, dev, vxlan, dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) dst_port, ifindex, vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) ndst, rt6i_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) err = skb_tunnel_check_pmtu(skb, ndst, VXLAN6_HEADROOM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) netif_is_any_bridge_port(dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) goto tx_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) } else if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) if (info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) struct ip_tunnel_info *unclone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) struct in6_addr src, dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) unclone = skb_tunnel_info_unclone(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) if (unlikely(!unclone))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) goto tx_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) src = remote_ip.sin6.sin6_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) dst = local_ip.sin6.sin6_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) unclone->key.u.ipv6.src = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) unclone->key.u.ipv6.dst = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) vxlan_encap_bypass(skb, vxlan, vxlan, vni, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) dst_release(ndst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) ttl = ttl ? : ip6_dst_hoplimit(ndst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) skb_scrub_packet(skb, xnet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) vni, md, flags, udp_sum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) goto tx_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) udp_tunnel6_xmit_skb(ndst, sock6->sock->sk, skb, dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) &local_ip.sin6.sin6_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) &dst->sin6.sin6_addr, tos, ttl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) label, src_port, dst_port, !udp_sum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) drop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) dev->stats.tx_dropped++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) dev_kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) tx_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) if (err == -ELOOP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) dev->stats.collisions++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) else if (err == -ENETUNREACH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) dev->stats.tx_carrier_errors++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) dst_release(ndst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) dev->stats.tx_errors++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) static void vxlan_xmit_nh(struct sk_buff *skb, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) struct vxlan_fdb *f, __be32 vni, bool did_rsc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) struct vxlan_rdst nh_rdst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) struct nexthop *nh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) bool do_xmit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) u32 hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) memset(&nh_rdst, 0, sizeof(struct vxlan_rdst));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) hash = skb_get_hash(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) nh = rcu_dereference(f->nh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) if (!nh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) do_xmit = vxlan_fdb_nh_path_select(nh, hash, &nh_rdst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) if (likely(do_xmit))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) vxlan_xmit_one(skb, dev, vni, &nh_rdst, did_rsc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) goto drop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) drop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) dev->stats.tx_dropped++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) dev_kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) /* Transmit local packets over Vxlan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) * Outer IP header inherits ECN and DF from inner header.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) * Outer UDP destination is the VXLAN assigned port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) * source port is based on hash of flow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) struct vxlan_rdst *rdst, *fdst = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) const struct ip_tunnel_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) bool did_rsc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) struct ethhdr *eth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) __be32 vni = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) info = skb_tunnel_info(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) skb_reset_mac_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) if (info && info->mode & IP_TUNNEL_INFO_BRIDGE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) info->mode & IP_TUNNEL_INFO_TX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) vni = tunnel_id_to_key32(info->key.tun_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) if (info && info->mode & IP_TUNNEL_INFO_TX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) vxlan_xmit_one(skb, dev, vni, NULL, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) return NETDEV_TX_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) if (vxlan->cfg.flags & VXLAN_F_PROXY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) eth = eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) if (ntohs(eth->h_proto) == ETH_P_ARP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) return arp_reduce(dev, skb, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) else if (ntohs(eth->h_proto) == ETH_P_IPV6 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) pskb_may_pull(skb, sizeof(struct ipv6hdr) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) sizeof(struct nd_msg)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) ipv6_hdr(skb)->nexthdr == IPPROTO_ICMPV6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) struct nd_msg *m = (struct nd_msg *)(ipv6_hdr(skb) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) if (m->icmph.icmp6_code == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) m->icmph.icmp6_type == NDISC_NEIGHBOUR_SOLICITATION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) return neigh_reduce(dev, skb, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) eth = eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) f = vxlan_find_mac(vxlan, eth->h_dest, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) did_rsc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) if (f && (f->flags & NTF_ROUTER) && (vxlan->cfg.flags & VXLAN_F_RSC) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) (ntohs(eth->h_proto) == ETH_P_IP ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) ntohs(eth->h_proto) == ETH_P_IPV6)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) did_rsc = route_shortcircuit(dev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) if (did_rsc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) f = vxlan_find_mac(vxlan, eth->h_dest, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) if (f == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) f = vxlan_find_mac(vxlan, all_zeros_mac, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) if (f == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) if ((vxlan->cfg.flags & VXLAN_F_L2MISS) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) !is_multicast_ether_addr(eth->h_dest))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) vxlan_fdb_miss(vxlan, eth->h_dest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) dev->stats.tx_dropped++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) return NETDEV_TX_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) if (rcu_access_pointer(f->nh)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) vxlan_xmit_nh(skb, dev, f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) (vni ? : vxlan->default_dst.remote_vni), did_rsc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) list_for_each_entry_rcu(rdst, &f->remotes, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) struct sk_buff *skb1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) if (!fdst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) fdst = rdst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) skb1 = skb_clone(skb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) if (skb1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) vxlan_xmit_one(skb1, dev, vni, rdst, did_rsc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) if (fdst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) vxlan_xmit_one(skb, dev, vni, fdst, did_rsc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) return NETDEV_TX_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) /* Walk the forwarding table and purge stale entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) static void vxlan_cleanup(struct timer_list *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) struct vxlan_dev *vxlan = from_timer(vxlan, t, age_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) unsigned long next_timer = jiffies + FDB_AGE_INTERVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) unsigned int h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) if (!netif_running(vxlan->dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) for (h = 0; h < FDB_HASH_SIZE; ++h) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) struct hlist_node *p, *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) spin_lock(&vxlan->hash_lock[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) hlist_for_each_safe(p, n, &vxlan->fdb_head[h]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) struct vxlan_fdb *f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) = container_of(p, struct vxlan_fdb, hlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) if (f->state & (NUD_PERMANENT | NUD_NOARP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) if (f->flags & NTF_EXT_LEARNED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) timeout = f->used + vxlan->cfg.age_interval * HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) if (time_before_eq(timeout, jiffies)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) netdev_dbg(vxlan->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) "garbage collect %pM\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) f->eth_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) f->state = NUD_STALE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) vxlan_fdb_destroy(vxlan, f, true, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) } else if (time_before(timeout, next_timer))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) next_timer = timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) spin_unlock(&vxlan->hash_lock[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) mod_timer(&vxlan->age_timer, next_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) static void vxlan_vs_del_dev(struct vxlan_dev *vxlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) spin_lock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) hlist_del_init_rcu(&vxlan->hlist4.hlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) hlist_del_init_rcu(&vxlan->hlist6.hlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) spin_unlock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) static void vxlan_vs_add_dev(struct vxlan_sock *vs, struct vxlan_dev *vxlan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) struct vxlan_dev_node *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) __be32 vni = vxlan->default_dst.remote_vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) node->vxlan = vxlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) spin_lock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) hlist_add_head_rcu(&node->hlist, vni_head(vs, vni));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) spin_unlock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) /* Setup stats when device is created */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) static int vxlan_init(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) if (!dev->tstats)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) err = gro_cells_init(&vxlan->gro_cells, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) free_percpu(dev->tstats);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) static void vxlan_fdb_delete_default(struct vxlan_dev *vxlan, __be32 vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) u32 hash_index = fdb_head_index(vxlan, all_zeros_mac, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) spin_lock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) f = __vxlan_find_mac(vxlan, all_zeros_mac, vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) if (f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) vxlan_fdb_destroy(vxlan, f, true, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) spin_unlock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) static void vxlan_uninit(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) gro_cells_destroy(&vxlan->gro_cells);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) vxlan_fdb_delete_default(vxlan, vxlan->cfg.vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) free_percpu(dev->tstats);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) /* Start ageing timer and join group when device is brought up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) static int vxlan_open(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) ret = vxlan_sock_add(vxlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) if (vxlan_addr_multicast(&vxlan->default_dst.remote_ip)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) ret = vxlan_igmp_join(vxlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) if (ret == -EADDRINUSE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) vxlan_sock_release(vxlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) if (vxlan->cfg.age_interval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) mod_timer(&vxlan->age_timer, jiffies + FDB_AGE_INTERVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) /* Purge the forwarding table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) static void vxlan_flush(struct vxlan_dev *vxlan, bool do_all)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) unsigned int h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) for (h = 0; h < FDB_HASH_SIZE; ++h) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) struct hlist_node *p, *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) spin_lock_bh(&vxlan->hash_lock[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) hlist_for_each_safe(p, n, &vxlan->fdb_head[h]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) struct vxlan_fdb *f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) = container_of(p, struct vxlan_fdb, hlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) if (!do_all && (f->state & (NUD_PERMANENT | NUD_NOARP)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) /* the all_zeros_mac entry is deleted at vxlan_uninit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) if (is_zero_ether_addr(f->eth_addr) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) f->vni == vxlan->cfg.vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) vxlan_fdb_destroy(vxlan, f, true, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) spin_unlock_bh(&vxlan->hash_lock[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) /* Cleanup timer and forwarding table on shutdown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) static int vxlan_stop(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) if (vxlan_addr_multicast(&vxlan->default_dst.remote_ip) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) !vxlan_group_used(vn, vxlan))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) ret = vxlan_igmp_leave(vxlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) del_timer_sync(&vxlan->age_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) vxlan_flush(vxlan, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) vxlan_sock_release(vxlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) /* Stub, nothing needs to be done. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) static void vxlan_set_multicast_list(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) static int vxlan_change_mtu(struct net_device *dev, int new_mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) struct vxlan_rdst *dst = &vxlan->default_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) struct net_device *lowerdev = __dev_get_by_index(vxlan->net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) dst->remote_ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) bool use_ipv6 = !!(vxlan->cfg.flags & VXLAN_F_IPV6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) /* This check is different than dev->max_mtu, because it looks at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) * the lowerdev->mtu, rather than the static dev->max_mtu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) if (lowerdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) int max_mtu = lowerdev->mtu -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) if (new_mtu > max_mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) dev->mtu = new_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) struct ip_tunnel_info *info = skb_tunnel_info(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) __be16 sport, dport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) sport = udp_flow_src_port(dev_net(dev), skb, vxlan->cfg.port_min,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) vxlan->cfg.port_max, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) dport = info->key.tp_dst ? : vxlan->cfg.dst_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) if (ip_tunnel_info_af(info) == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) struct vxlan_sock *sock4 = rcu_dereference(vxlan->vn4_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) struct rtable *rt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) rt = vxlan_get_route(vxlan, dev, sock4, skb, 0, info->key.tos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) info->key.u.ipv4.dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) &info->key.u.ipv4.src, dport, sport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) &info->dst_cache, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) if (IS_ERR(rt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) return PTR_ERR(rt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) ip_rt_put(rt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) struct dst_entry *ndst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) ndst = vxlan6_get_route(vxlan, dev, sock6, skb, 0, info->key.tos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) info->key.label, &info->key.u.ipv6.dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) &info->key.u.ipv6.src, dport, sport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) &info->dst_cache, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) if (IS_ERR(ndst))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) return PTR_ERR(ndst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) dst_release(ndst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) #else /* !CONFIG_IPV6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) return -EPFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) info->key.tp_src = sport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) info->key.tp_dst = dport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) static const struct net_device_ops vxlan_netdev_ether_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) .ndo_init = vxlan_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) .ndo_uninit = vxlan_uninit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) .ndo_open = vxlan_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) .ndo_stop = vxlan_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) .ndo_start_xmit = vxlan_xmit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) .ndo_get_stats64 = ip_tunnel_get_stats64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) .ndo_set_rx_mode = vxlan_set_multicast_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) .ndo_change_mtu = vxlan_change_mtu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) .ndo_validate_addr = eth_validate_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) .ndo_set_mac_address = eth_mac_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) .ndo_fdb_add = vxlan_fdb_add,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) .ndo_fdb_del = vxlan_fdb_delete,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) .ndo_fdb_dump = vxlan_fdb_dump,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) .ndo_fdb_get = vxlan_fdb_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) .ndo_fill_metadata_dst = vxlan_fill_metadata_dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) .ndo_change_proto_down = dev_change_proto_down_generic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) static const struct net_device_ops vxlan_netdev_raw_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) .ndo_init = vxlan_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) .ndo_uninit = vxlan_uninit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) .ndo_open = vxlan_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) .ndo_stop = vxlan_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) .ndo_start_xmit = vxlan_xmit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) .ndo_get_stats64 = ip_tunnel_get_stats64,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) .ndo_change_mtu = vxlan_change_mtu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) .ndo_fill_metadata_dst = vxlan_fill_metadata_dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) /* Info for udev, that this is a virtual tunnel endpoint */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) static struct device_type vxlan_type = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) .name = "vxlan",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) /* Calls the ndo_udp_tunnel_add of the caller in order to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) * supply the listening VXLAN udp ports. Callers are expected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) * to implement the ndo_udp_tunnel_add.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) static void vxlan_offload_rx_ports(struct net_device *dev, bool push)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) struct vxlan_sock *vs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) struct net *net = dev_net(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) struct vxlan_net *vn = net_generic(net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) spin_lock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) for (i = 0; i < PORT_HASH_SIZE; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) hlist_for_each_entry_rcu(vs, &vn->sock_list[i], hlist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) unsigned short type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) if (vs->flags & VXLAN_F_GPE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) type = UDP_TUNNEL_TYPE_VXLAN_GPE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) type = UDP_TUNNEL_TYPE_VXLAN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) if (push)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) udp_tunnel_push_rx_port(dev, vs->sock, type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) udp_tunnel_drop_rx_port(dev, vs->sock, type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) spin_unlock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) /* Initialize the device structure. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) static void vxlan_setup(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) unsigned int h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) eth_hw_addr_random(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) ether_setup(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) dev->needs_free_netdev = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) SET_NETDEV_DEVTYPE(dev, &vxlan_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) dev->features |= NETIF_F_LLTX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) dev->features |= NETIF_F_RXCSUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) dev->features |= NETIF_F_GSO_SOFTWARE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) dev->vlan_features = dev->features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_RXCSUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) dev->hw_features |= NETIF_F_GSO_SOFTWARE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) netif_keep_dst(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) dev->priv_flags |= IFF_NO_QUEUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) /* MTU range: 68 - 65535 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) dev->min_mtu = ETH_MIN_MTU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) dev->max_mtu = ETH_MAX_MTU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) INIT_LIST_HEAD(&vxlan->next);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) timer_setup(&vxlan->age_timer, vxlan_cleanup, TIMER_DEFERRABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) vxlan->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) for (h = 0; h < FDB_HASH_SIZE; ++h) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) spin_lock_init(&vxlan->hash_lock[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) INIT_HLIST_HEAD(&vxlan->fdb_head[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) static void vxlan_ether_setup(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) dev->priv_flags &= ~IFF_TX_SKB_SHARING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) dev->netdev_ops = &vxlan_netdev_ether_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) static void vxlan_raw_setup(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) dev->header_ops = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) dev->type = ARPHRD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) dev->hard_header_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) dev->addr_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) dev->netdev_ops = &vxlan_netdev_raw_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) static const struct nla_policy vxlan_policy[IFLA_VXLAN_MAX + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) [IFLA_VXLAN_ID] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) [IFLA_VXLAN_GROUP] = { .len = sizeof_field(struct iphdr, daddr) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) [IFLA_VXLAN_GROUP6] = { .len = sizeof(struct in6_addr) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) [IFLA_VXLAN_LINK] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) [IFLA_VXLAN_LOCAL] = { .len = sizeof_field(struct iphdr, saddr) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) [IFLA_VXLAN_LOCAL6] = { .len = sizeof(struct in6_addr) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) [IFLA_VXLAN_TOS] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) [IFLA_VXLAN_TTL] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) [IFLA_VXLAN_LABEL] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) [IFLA_VXLAN_LEARNING] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) [IFLA_VXLAN_AGEING] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) [IFLA_VXLAN_LIMIT] = { .type = NLA_U32 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) [IFLA_VXLAN_PORT_RANGE] = { .len = sizeof(struct ifla_vxlan_port_range) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) [IFLA_VXLAN_PROXY] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) [IFLA_VXLAN_RSC] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) [IFLA_VXLAN_L2MISS] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) [IFLA_VXLAN_L3MISS] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) [IFLA_VXLAN_COLLECT_METADATA] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) [IFLA_VXLAN_PORT] = { .type = NLA_U16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) [IFLA_VXLAN_UDP_CSUM] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) [IFLA_VXLAN_UDP_ZERO_CSUM6_TX] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) [IFLA_VXLAN_UDP_ZERO_CSUM6_RX] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) [IFLA_VXLAN_REMCSUM_TX] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) [IFLA_VXLAN_REMCSUM_RX] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) [IFLA_VXLAN_GBP] = { .type = NLA_FLAG, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) [IFLA_VXLAN_GPE] = { .type = NLA_FLAG, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) [IFLA_VXLAN_REMCSUM_NOPARTIAL] = { .type = NLA_FLAG },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) [IFLA_VXLAN_TTL_INHERIT] = { .type = NLA_FLAG },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) [IFLA_VXLAN_DF] = { .type = NLA_U8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) static int vxlan_validate(struct nlattr *tb[], struct nlattr *data[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) if (tb[IFLA_ADDRESS]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_ADDRESS],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) "Provided link layer address is not Ethernet");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS]))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_ADDRESS],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) "Provided Ethernet address is not unicast");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) return -EADDRNOTAVAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) if (tb[IFLA_MTU]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) u32 mtu = nla_get_u32(tb[IFLA_MTU]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) if (mtu < ETH_MIN_MTU || mtu > ETH_MAX_MTU) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_MTU],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) "MTU must be between 68 and 65535");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) if (!data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) "Required attributes not provided to perform the operation");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405) if (data[IFLA_VXLAN_ID]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) u32 id = nla_get_u32(data[IFLA_VXLAN_ID]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) if (id >= VXLAN_N_VID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) NL_SET_ERR_MSG_ATTR(extack, data[IFLA_VXLAN_ID],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) "VXLAN ID must be lower than 16777216");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) return -ERANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) if (data[IFLA_VXLAN_PORT_RANGE]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) const struct ifla_vxlan_port_range *p
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) = nla_data(data[IFLA_VXLAN_PORT_RANGE]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) if (ntohs(p->high) < ntohs(p->low)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) NL_SET_ERR_MSG_ATTR(extack, data[IFLA_VXLAN_PORT_RANGE],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) "Invalid source port range");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) if (data[IFLA_VXLAN_DF]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) enum ifla_vxlan_df df = nla_get_u8(data[IFLA_VXLAN_DF]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) if (df < 0 || df > VXLAN_DF_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) NL_SET_ERR_MSG_ATTR(extack, data[IFLA_VXLAN_DF],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) "Invalid DF attribute");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) static void vxlan_get_drvinfo(struct net_device *netdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) struct ethtool_drvinfo *drvinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) strlcpy(drvinfo->version, VXLAN_VERSION, sizeof(drvinfo->version));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) strlcpy(drvinfo->driver, "vxlan", sizeof(drvinfo->driver));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) static int vxlan_get_link_ksettings(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) struct ethtool_link_ksettings *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) struct vxlan_rdst *dst = &vxlan->default_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) struct net_device *lowerdev = __dev_get_by_index(vxlan->net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) dst->remote_ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) if (!lowerdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) cmd->base.duplex = DUPLEX_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) cmd->base.port = PORT_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) cmd->base.speed = SPEED_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) return __ethtool_get_link_ksettings(lowerdev, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) static const struct ethtool_ops vxlan_ethtool_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) .get_drvinfo = vxlan_get_drvinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) .get_link = ethtool_op_get_link,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468) .get_link_ksettings = vxlan_get_link_ksettings,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) static struct socket *vxlan_create_sock(struct net *net, bool ipv6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) __be16 port, u32 flags, int ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474) struct socket *sock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) struct udp_port_cfg udp_conf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) memset(&udp_conf, 0, sizeof(udp_conf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) if (ipv6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) udp_conf.family = AF_INET6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482) udp_conf.use_udp6_rx_checksums =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) !(flags & VXLAN_F_UDP_ZERO_CSUM6_RX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484) udp_conf.ipv6_v6only = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) udp_conf.family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) udp_conf.local_udp_port = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) udp_conf.bind_ifindex = ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) /* Open UDP socket */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) err = udp_sock_create(net, &udp_conf, &sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495) return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) return sock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) /* Create new listen socket if needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) static struct vxlan_sock *vxlan_socket_create(struct net *net, bool ipv6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) __be16 port, u32 flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) int ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) struct vxlan_net *vn = net_generic(net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) struct vxlan_sock *vs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) struct socket *sock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) unsigned int h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) struct udp_tunnel_sock_cfg tunnel_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) vs = kzalloc(sizeof(*vs), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) if (!vs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) for (h = 0; h < VNI_HASH_SIZE; ++h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516) INIT_HLIST_HEAD(&vs->vni_list[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518) sock = vxlan_create_sock(net, ipv6, port, flags, ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) if (IS_ERR(sock)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) kfree(vs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) return ERR_CAST(sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) vs->sock = sock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) refcount_set(&vs->refcnt, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) vs->flags = (flags & VXLAN_F_RCV_FLAGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) spin_lock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) hlist_add_head_rcu(&vs->hlist, vs_head(net, port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) udp_tunnel_notify_add_rx_port(sock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) (vs->flags & VXLAN_F_GPE) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) UDP_TUNNEL_TYPE_VXLAN_GPE :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) UDP_TUNNEL_TYPE_VXLAN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534) spin_unlock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) /* Mark socket as an encapsulation socket. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) memset(&tunnel_cfg, 0, sizeof(tunnel_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) tunnel_cfg.sk_user_data = vs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) tunnel_cfg.encap_type = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) tunnel_cfg.encap_rcv = vxlan_rcv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) tunnel_cfg.encap_err_lookup = vxlan_err_lookup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) tunnel_cfg.encap_destroy = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) tunnel_cfg.gro_receive = vxlan_gro_receive;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) tunnel_cfg.gro_complete = vxlan_gro_complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) setup_udp_tunnel_sock(net, sock, &tunnel_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) return vs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) static int __vxlan_sock_add(struct vxlan_dev *vxlan, bool ipv6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554) struct vxlan_sock *vs = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) struct vxlan_dev_node *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) int l3mdev_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) if (vxlan->cfg.remote_ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) l3mdev_index = l3mdev_master_upper_ifindex_by_index(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) vxlan->net, vxlan->cfg.remote_ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) if (!vxlan->cfg.no_share) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563) spin_lock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) vs = vxlan_find_sock(vxlan->net, ipv6 ? AF_INET6 : AF_INET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) vxlan->cfg.dst_port, vxlan->cfg.flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) l3mdev_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567) if (vs && !refcount_inc_not_zero(&vs->refcnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) spin_unlock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) spin_unlock(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573) if (!vs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) vs = vxlan_socket_create(vxlan->net, ipv6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575) vxlan->cfg.dst_port, vxlan->cfg.flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576) l3mdev_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) if (IS_ERR(vs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) return PTR_ERR(vs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580) if (ipv6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) rcu_assign_pointer(vxlan->vn6_sock, vs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) node = &vxlan->hlist6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586) rcu_assign_pointer(vxlan->vn4_sock, vs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) node = &vxlan->hlist4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589) vxlan_vs_add_dev(vs, vxlan, node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) static int vxlan_sock_add(struct vxlan_dev *vxlan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) bool metadata = vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596) bool ipv6 = vxlan->cfg.flags & VXLAN_F_IPV6 || metadata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) bool ipv4 = !ipv6 || metadata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) RCU_INIT_POINTER(vxlan->vn4_sock, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602) RCU_INIT_POINTER(vxlan->vn6_sock, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603) if (ipv6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604) ret = __vxlan_sock_add(vxlan, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605) if (ret < 0 && ret != -EAFNOSUPPORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606) ipv4 = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609) if (ipv4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610) ret = __vxlan_sock_add(vxlan, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3612) vxlan_sock_release(vxlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3613) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3616) static int vxlan_config_validate(struct net *src_net, struct vxlan_config *conf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3617) struct net_device **lower,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3618) struct vxlan_dev *old,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3619) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3620) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3621) struct vxlan_net *vn = net_generic(src_net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3622) struct vxlan_dev *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3623) bool use_ipv6 = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3625) if (conf->flags & VXLAN_F_GPE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3626) /* For now, allow GPE only together with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3627) * COLLECT_METADATA. This can be relaxed later; in such
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3628) * case, the other side of the PtP link will have to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3629) * provided.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3630) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3631) if ((conf->flags & ~VXLAN_F_ALLOWED_GPE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3632) !(conf->flags & VXLAN_F_COLLECT_METADATA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3633) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3634) "VXLAN GPE does not support this combination of attributes");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3635) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3636) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3639) if (!conf->remote_ip.sa.sa_family && !conf->saddr.sa.sa_family) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3640) /* Unless IPv6 is explicitly requested, assume IPv4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3641) conf->remote_ip.sa.sa_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3642) conf->saddr.sa.sa_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3643) } else if (!conf->remote_ip.sa.sa_family) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3644) conf->remote_ip.sa.sa_family = conf->saddr.sa.sa_family;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3645) } else if (!conf->saddr.sa.sa_family) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3646) conf->saddr.sa.sa_family = conf->remote_ip.sa.sa_family;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3649) if (conf->saddr.sa.sa_family != conf->remote_ip.sa.sa_family) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3650) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3651) "Local and remote address must be from the same family");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3652) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3653) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3655) if (vxlan_addr_multicast(&conf->saddr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3656) NL_SET_ERR_MSG(extack, "Local address cannot be multicast");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3657) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3658) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3660) if (conf->saddr.sa.sa_family == AF_INET6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3661) if (!IS_ENABLED(CONFIG_IPV6)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3662) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3663) "IPv6 support not enabled in the kernel");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3664) return -EPFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3665) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3666) use_ipv6 = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3667) conf->flags |= VXLAN_F_IPV6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3669) if (!(conf->flags & VXLAN_F_COLLECT_METADATA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3670) int local_type =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3671) ipv6_addr_type(&conf->saddr.sin6.sin6_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3672) int remote_type =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3673) ipv6_addr_type(&conf->remote_ip.sin6.sin6_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3675) if (local_type & IPV6_ADDR_LINKLOCAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3676) if (!(remote_type & IPV6_ADDR_LINKLOCAL) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3677) (remote_type != IPV6_ADDR_ANY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3678) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3679) "Invalid combination of local and remote address scopes");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3680) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3683) conf->flags |= VXLAN_F_IPV6_LINKLOCAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3684) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3685) if (remote_type ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3686) (IPV6_ADDR_UNICAST | IPV6_ADDR_LINKLOCAL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3687) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3688) "Invalid combination of local and remote address scopes");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3689) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3692) conf->flags &= ~VXLAN_F_IPV6_LINKLOCAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3693) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3694) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3695) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3697) if (conf->label && !use_ipv6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3698) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3699) "Label attribute only applies to IPv6 VXLAN devices");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3700) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3701) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3703) if (conf->remote_ifindex) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3704) struct net_device *lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3706) lowerdev = __dev_get_by_index(src_net, conf->remote_ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3707) if (!lowerdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3708) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3709) "Invalid local interface, device not found");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3710) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3711) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3713) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3714) if (use_ipv6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3715) struct inet6_dev *idev = __in6_dev_get(lowerdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3716) if (idev && idev->cnf.disable_ipv6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3717) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3718) "IPv6 support disabled by administrator");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3719) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3722) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3724) *lower = lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3725) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3726) if (vxlan_addr_multicast(&conf->remote_ip)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3727) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3728) "Local interface required for multicast remote destination");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3730) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3733) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3734) if (conf->flags & VXLAN_F_IPV6_LINKLOCAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3735) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3736) "Local interface required for link-local local/remote addresses");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3737) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3739) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3741) *lower = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3744) if (!conf->dst_port) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3745) if (conf->flags & VXLAN_F_GPE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3746) conf->dst_port = htons(4790); /* IANA VXLAN-GPE port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3747) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3748) conf->dst_port = htons(vxlan_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3751) if (!conf->age_interval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3752) conf->age_interval = FDB_AGE_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3754) list_for_each_entry(tmp, &vn->vxlan_list, next) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3755) if (tmp == old)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3756) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3758) if (tmp->cfg.vni != conf->vni)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3759) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3760) if (tmp->cfg.dst_port != conf->dst_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3761) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3762) if ((tmp->cfg.flags & (VXLAN_F_RCV_FLAGS | VXLAN_F_IPV6)) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3763) (conf->flags & (VXLAN_F_RCV_FLAGS | VXLAN_F_IPV6)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3764) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3766) if ((conf->flags & VXLAN_F_IPV6_LINKLOCAL) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3767) tmp->cfg.remote_ifindex != conf->remote_ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3768) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3770) NL_SET_ERR_MSG(extack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3771) "A VXLAN device with the specified VNI already exists");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3772) return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3773) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3775) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3776) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3778) static void vxlan_config_apply(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3779) struct vxlan_config *conf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3780) struct net_device *lowerdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3781) struct net *src_net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3782) bool changelink)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3783) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3784) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3785) struct vxlan_rdst *dst = &vxlan->default_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3786) unsigned short needed_headroom = ETH_HLEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3787) bool use_ipv6 = !!(conf->flags & VXLAN_F_IPV6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3788) int max_mtu = ETH_MAX_MTU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3790) if (!changelink) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3791) if (conf->flags & VXLAN_F_GPE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3792) vxlan_raw_setup(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3793) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3794) vxlan_ether_setup(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3796) if (conf->mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3797) dev->mtu = conf->mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3799) vxlan->net = src_net;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3800) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3802) dst->remote_vni = conf->vni;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3804) memcpy(&dst->remote_ip, &conf->remote_ip, sizeof(conf->remote_ip));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3806) if (lowerdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3807) dst->remote_ifindex = conf->remote_ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3809) dev->gso_max_size = lowerdev->gso_max_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3810) dev->gso_max_segs = lowerdev->gso_max_segs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3812) needed_headroom = lowerdev->hard_header_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3813) needed_headroom += lowerdev->needed_headroom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3815) dev->needed_tailroom = lowerdev->needed_tailroom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3817) max_mtu = lowerdev->mtu - (use_ipv6 ? VXLAN6_HEADROOM :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3818) VXLAN_HEADROOM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3819) if (max_mtu < ETH_MIN_MTU)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3820) max_mtu = ETH_MIN_MTU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3822) if (!changelink && !conf->mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3823) dev->mtu = max_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3826) if (dev->mtu > max_mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3827) dev->mtu = max_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3829) if (use_ipv6 || conf->flags & VXLAN_F_COLLECT_METADATA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3830) needed_headroom += VXLAN6_HEADROOM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3831) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3832) needed_headroom += VXLAN_HEADROOM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3833) dev->needed_headroom = needed_headroom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3835) memcpy(&vxlan->cfg, conf, sizeof(*conf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3838) static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3839) struct vxlan_config *conf, bool changelink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3840) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3841) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3842) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3843) struct net_device *lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3844) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3846) ret = vxlan_config_validate(src_net, conf, &lowerdev, vxlan, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3847) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3848) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3850) vxlan_config_apply(dev, conf, lowerdev, src_net, changelink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3852) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3855) static int __vxlan_dev_create(struct net *net, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3856) struct vxlan_config *conf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3857) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3858) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3859) struct vxlan_net *vn = net_generic(net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3860) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3861) struct net_device *remote_dev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3862) struct vxlan_fdb *f = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3863) bool unregister = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3864) struct vxlan_rdst *dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3865) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3867) dst = &vxlan->default_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3868) err = vxlan_dev_configure(net, dev, conf, false, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3869) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3870) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3872) dev->ethtool_ops = &vxlan_ethtool_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3874) /* create an fdb entry for a valid default destination */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3875) if (!vxlan_addr_any(&dst->remote_ip)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3876) err = vxlan_fdb_create(vxlan, all_zeros_mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3877) &dst->remote_ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3878) NUD_REACHABLE | NUD_PERMANENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3879) vxlan->cfg.dst_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3880) dst->remote_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3881) dst->remote_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3882) dst->remote_ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3883) NTF_SELF, 0, &f, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3884) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3885) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3888) err = register_netdevice(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3889) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3890) goto errout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3891) unregister = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3893) if (dst->remote_ifindex) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3894) remote_dev = __dev_get_by_index(net, dst->remote_ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3895) if (!remote_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3896) err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3897) goto errout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3898) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3900) err = netdev_upper_dev_link(remote_dev, dev, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3901) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3902) goto errout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3903) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3905) err = rtnl_configure_link(dev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3906) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3907) goto unlink;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3909) if (f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3910) vxlan_fdb_insert(vxlan, all_zeros_mac, dst->remote_vni, f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3912) /* notify default fdb entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3913) err = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3914) RTM_NEWNEIGH, true, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3915) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3916) vxlan_fdb_destroy(vxlan, f, false, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3917) if (remote_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3918) netdev_upper_dev_unlink(remote_dev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3919) goto unregister;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3923) list_add(&vxlan->next, &vn->vxlan_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3924) if (remote_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3925) dst->remote_dev = remote_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3926) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3927) unlink:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3928) if (remote_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3929) netdev_upper_dev_unlink(remote_dev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3930) errout:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3931) /* unregister_netdevice() destroys the default FDB entry with deletion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3932) * notification. But the addition notification was not sent yet, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3933) * destroy the entry by hand here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3934) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3935) if (f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3936) __vxlan_fdb_free(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3937) unregister:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3938) if (unregister)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3939) unregister_netdevice(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3940) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3943) /* Set/clear flags based on attribute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3944) static int vxlan_nl2flag(struct vxlan_config *conf, struct nlattr *tb[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3945) int attrtype, unsigned long mask, bool changelink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3946) bool changelink_supported,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3947) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3948) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3949) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3951) if (!tb[attrtype])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3952) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3954) if (changelink && !changelink_supported) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3955) vxlan_flag_attr_error(attrtype, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3956) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3959) if (vxlan_policy[attrtype].type == NLA_FLAG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3960) flags = conf->flags | mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3961) else if (nla_get_u8(tb[attrtype]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3962) flags = conf->flags | mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3963) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3964) flags = conf->flags & ~mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3966) conf->flags = flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3968) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3969) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3971) static int vxlan_nl2conf(struct nlattr *tb[], struct nlattr *data[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3972) struct net_device *dev, struct vxlan_config *conf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3973) bool changelink, struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3974) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3975) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3976) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3978) memset(conf, 0, sizeof(*conf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3980) /* if changelink operation, start with old existing cfg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3981) if (changelink)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3982) memcpy(conf, &vxlan->cfg, sizeof(*conf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3984) if (data[IFLA_VXLAN_ID]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3985) __be32 vni = cpu_to_be32(nla_get_u32(data[IFLA_VXLAN_ID]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3987) if (changelink && (vni != conf->vni)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3988) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_ID], "Cannot change VNI");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3989) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3990) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3991) conf->vni = cpu_to_be32(nla_get_u32(data[IFLA_VXLAN_ID]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3994) if (data[IFLA_VXLAN_GROUP]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3995) if (changelink && (conf->remote_ip.sa.sa_family != AF_INET)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3996) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_GROUP], "New group address family does not match old group");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3997) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3998) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4000) conf->remote_ip.sin.sin_addr.s_addr = nla_get_in_addr(data[IFLA_VXLAN_GROUP]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4001) conf->remote_ip.sa.sa_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4002) } else if (data[IFLA_VXLAN_GROUP6]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4003) if (!IS_ENABLED(CONFIG_IPV6)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4004) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_GROUP6], "IPv6 support not enabled in the kernel");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4005) return -EPFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4006) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4008) if (changelink && (conf->remote_ip.sa.sa_family != AF_INET6)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4009) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_GROUP6], "New group address family does not match old group");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4010) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4013) conf->remote_ip.sin6.sin6_addr = nla_get_in6_addr(data[IFLA_VXLAN_GROUP6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4014) conf->remote_ip.sa.sa_family = AF_INET6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4015) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4017) if (data[IFLA_VXLAN_LOCAL]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4018) if (changelink && (conf->saddr.sa.sa_family != AF_INET)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4019) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LOCAL], "New local address family does not match old");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4020) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4023) conf->saddr.sin.sin_addr.s_addr = nla_get_in_addr(data[IFLA_VXLAN_LOCAL]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4024) conf->saddr.sa.sa_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4025) } else if (data[IFLA_VXLAN_LOCAL6]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4026) if (!IS_ENABLED(CONFIG_IPV6)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4027) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LOCAL6], "IPv6 support not enabled in the kernel");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4028) return -EPFNOSUPPORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4029) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4031) if (changelink && (conf->saddr.sa.sa_family != AF_INET6)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4032) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LOCAL6], "New local address family does not match old");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4033) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4036) /* TODO: respect scope id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4037) conf->saddr.sin6.sin6_addr = nla_get_in6_addr(data[IFLA_VXLAN_LOCAL6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4038) conf->saddr.sa.sa_family = AF_INET6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4039) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4041) if (data[IFLA_VXLAN_LINK])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4042) conf->remote_ifindex = nla_get_u32(data[IFLA_VXLAN_LINK]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4044) if (data[IFLA_VXLAN_TOS])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4045) conf->tos = nla_get_u8(data[IFLA_VXLAN_TOS]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4047) if (data[IFLA_VXLAN_TTL])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4048) conf->ttl = nla_get_u8(data[IFLA_VXLAN_TTL]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4050) if (data[IFLA_VXLAN_TTL_INHERIT]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4051) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_TTL_INHERIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4052) VXLAN_F_TTL_INHERIT, changelink, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4053) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4054) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4055) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4059) if (data[IFLA_VXLAN_LABEL])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4060) conf->label = nla_get_be32(data[IFLA_VXLAN_LABEL]) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4061) IPV6_FLOWLABEL_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4063) if (data[IFLA_VXLAN_LEARNING]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4064) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_LEARNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4065) VXLAN_F_LEARN, changelink, true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4066) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4067) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4068) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4069) } else if (!changelink) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4070) /* default to learn on a new device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4071) conf->flags |= VXLAN_F_LEARN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4072) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4074) if (data[IFLA_VXLAN_AGEING])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4075) conf->age_interval = nla_get_u32(data[IFLA_VXLAN_AGEING]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4077) if (data[IFLA_VXLAN_PROXY]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4078) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_PROXY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4079) VXLAN_F_PROXY, changelink, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4080) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4081) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4082) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4085) if (data[IFLA_VXLAN_RSC]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4086) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_RSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4087) VXLAN_F_RSC, changelink, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4088) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4089) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4090) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4091) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4093) if (data[IFLA_VXLAN_L2MISS]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4094) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_L2MISS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4095) VXLAN_F_L2MISS, changelink, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4096) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4097) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4098) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4099) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4101) if (data[IFLA_VXLAN_L3MISS]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4102) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_L3MISS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4103) VXLAN_F_L3MISS, changelink, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4104) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4105) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4106) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4109) if (data[IFLA_VXLAN_LIMIT]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4110) if (changelink) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4111) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LIMIT],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4112) "Cannot change limit");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4113) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4115) conf->addrmax = nla_get_u32(data[IFLA_VXLAN_LIMIT]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4118) if (data[IFLA_VXLAN_COLLECT_METADATA]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4119) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_COLLECT_METADATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4120) VXLAN_F_COLLECT_METADATA, changelink, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4121) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4122) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4123) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4126) if (data[IFLA_VXLAN_PORT_RANGE]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4127) if (!changelink) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4128) const struct ifla_vxlan_port_range *p
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4129) = nla_data(data[IFLA_VXLAN_PORT_RANGE]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4130) conf->port_min = ntohs(p->low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4131) conf->port_max = ntohs(p->high);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4132) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4133) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_PORT_RANGE],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4134) "Cannot change port range");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4135) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4139) if (data[IFLA_VXLAN_PORT]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4140) if (changelink) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4141) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_PORT],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4142) "Cannot change port");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4143) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4145) conf->dst_port = nla_get_be16(data[IFLA_VXLAN_PORT]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4148) if (data[IFLA_VXLAN_UDP_CSUM]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4149) if (changelink) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4150) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_UDP_CSUM],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4151) "Cannot change UDP_CSUM flag");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4152) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4154) if (!nla_get_u8(data[IFLA_VXLAN_UDP_CSUM]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4155) conf->flags |= VXLAN_F_UDP_ZERO_CSUM_TX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4158) if (data[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4159) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_UDP_ZERO_CSUM6_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4160) VXLAN_F_UDP_ZERO_CSUM6_TX, changelink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4161) false, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4162) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4163) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4166) if (data[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4167) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_UDP_ZERO_CSUM6_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4168) VXLAN_F_UDP_ZERO_CSUM6_RX, changelink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4169) false, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4170) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4171) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4174) if (data[IFLA_VXLAN_REMCSUM_TX]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4175) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_REMCSUM_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4176) VXLAN_F_REMCSUM_TX, changelink, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4177) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4178) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4179) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4182) if (data[IFLA_VXLAN_REMCSUM_RX]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4183) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_REMCSUM_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4184) VXLAN_F_REMCSUM_RX, changelink, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4185) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4186) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4187) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4190) if (data[IFLA_VXLAN_GBP]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4191) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_GBP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4192) VXLAN_F_GBP, changelink, false, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4193) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4194) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4197) if (data[IFLA_VXLAN_GPE]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4198) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_GPE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4199) VXLAN_F_GPE, changelink, false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4200) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4201) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4202) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4205) if (data[IFLA_VXLAN_REMCSUM_NOPARTIAL]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4206) err = vxlan_nl2flag(conf, data, IFLA_VXLAN_REMCSUM_NOPARTIAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4207) VXLAN_F_REMCSUM_NOPARTIAL, changelink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4208) false, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4209) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4210) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4213) if (tb[IFLA_MTU]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4214) if (changelink) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4215) NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_MTU],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4216) "Cannot change mtu");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4217) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4219) conf->mtu = nla_get_u32(tb[IFLA_MTU]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4222) if (data[IFLA_VXLAN_DF])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4223) conf->df = nla_get_u8(data[IFLA_VXLAN_DF]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4225) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4228) static int vxlan_newlink(struct net *src_net, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4229) struct nlattr *tb[], struct nlattr *data[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4230) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4231) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4232) struct vxlan_config conf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4233) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4235) err = vxlan_nl2conf(tb, data, dev, &conf, false, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4236) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4237) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4239) return __vxlan_dev_create(src_net, dev, &conf, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4242) static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4243) struct nlattr *data[],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4244) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4246) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4247) struct net_device *lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4248) struct vxlan_config conf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4249) struct vxlan_rdst *dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4250) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4252) dst = &vxlan->default_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4253) err = vxlan_nl2conf(tb, data, dev, &conf, true, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4254) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4255) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4257) err = vxlan_config_validate(vxlan->net, &conf, &lowerdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4258) vxlan, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4259) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4260) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4262) if (dst->remote_dev == lowerdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4263) lowerdev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4265) err = netdev_adjacent_change_prepare(dst->remote_dev, lowerdev, dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4266) extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4267) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4268) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4270) /* handle default dst entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4271) if (!vxlan_addr_equal(&conf.remote_ip, &dst->remote_ip)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4272) u32 hash_index = fdb_head_index(vxlan, all_zeros_mac, conf.vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4274) spin_lock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4275) if (!vxlan_addr_any(&conf.remote_ip)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4276) err = vxlan_fdb_update(vxlan, all_zeros_mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4277) &conf.remote_ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4278) NUD_REACHABLE | NUD_PERMANENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4279) NLM_F_APPEND | NLM_F_CREATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4280) vxlan->cfg.dst_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4281) conf.vni, conf.vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4282) conf.remote_ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4283) NTF_SELF, 0, true, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4284) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4285) spin_unlock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4286) netdev_adjacent_change_abort(dst->remote_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4287) lowerdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4288) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4291) if (!vxlan_addr_any(&dst->remote_ip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4292) __vxlan_fdb_delete(vxlan, all_zeros_mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4293) dst->remote_ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4294) vxlan->cfg.dst_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4295) dst->remote_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4296) dst->remote_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4297) dst->remote_ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4298) true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4299) spin_unlock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4300) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4302) if (conf.age_interval != vxlan->cfg.age_interval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4303) mod_timer(&vxlan->age_timer, jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4305) netdev_adjacent_change_commit(dst->remote_dev, lowerdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4306) if (lowerdev && lowerdev != dst->remote_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4307) dst->remote_dev = lowerdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4308) vxlan_config_apply(dev, &conf, lowerdev, vxlan->net, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4309) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4312) static void vxlan_dellink(struct net_device *dev, struct list_head *head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4314) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4316) vxlan_flush(vxlan, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4318) list_del(&vxlan->next);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4319) unregister_netdevice_queue(dev, head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4320) if (vxlan->default_dst.remote_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4321) netdev_upper_dev_unlink(vxlan->default_dst.remote_dev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4324) static size_t vxlan_get_size(const struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4327) return nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_ID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4328) nla_total_size(sizeof(struct in6_addr)) + /* IFLA_VXLAN_GROUP{6} */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4329) nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_LINK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4330) nla_total_size(sizeof(struct in6_addr)) + /* IFLA_VXLAN_LOCAL{6} */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4331) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_TTL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4332) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_TTL_INHERIT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4333) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_TOS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4334) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_DF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4335) nla_total_size(sizeof(__be32)) + /* IFLA_VXLAN_LABEL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4336) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_LEARNING */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4337) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_PROXY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4338) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_RSC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4339) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_L2MISS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4340) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_L3MISS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4341) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_COLLECT_METADATA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4342) nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_AGEING */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4343) nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_LIMIT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4344) nla_total_size(sizeof(struct ifla_vxlan_port_range)) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4345) nla_total_size(sizeof(__be16)) + /* IFLA_VXLAN_PORT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4346) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_UDP_CSUM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4347) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_UDP_ZERO_CSUM6_TX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4348) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_UDP_ZERO_CSUM6_RX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4349) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_REMCSUM_TX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4350) nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_REMCSUM_RX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4351) 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4354) static int vxlan_fill_info(struct sk_buff *skb, const struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4355) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4356) const struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4357) const struct vxlan_rdst *dst = &vxlan->default_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4358) struct ifla_vxlan_port_range ports = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4359) .low = htons(vxlan->cfg.port_min),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4360) .high = htons(vxlan->cfg.port_max),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4361) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4363) if (nla_put_u32(skb, IFLA_VXLAN_ID, be32_to_cpu(dst->remote_vni)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4364) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4366) if (!vxlan_addr_any(&dst->remote_ip)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4367) if (dst->remote_ip.sa.sa_family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4368) if (nla_put_in_addr(skb, IFLA_VXLAN_GROUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4369) dst->remote_ip.sin.sin_addr.s_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4370) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4371) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4372) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4373) if (nla_put_in6_addr(skb, IFLA_VXLAN_GROUP6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4374) &dst->remote_ip.sin6.sin6_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4375) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4376) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4380) if (dst->remote_ifindex && nla_put_u32(skb, IFLA_VXLAN_LINK, dst->remote_ifindex))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4381) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4383) if (!vxlan_addr_any(&vxlan->cfg.saddr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4384) if (vxlan->cfg.saddr.sa.sa_family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4385) if (nla_put_in_addr(skb, IFLA_VXLAN_LOCAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4386) vxlan->cfg.saddr.sin.sin_addr.s_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4387) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4388) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4389) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4390) if (nla_put_in6_addr(skb, IFLA_VXLAN_LOCAL6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4391) &vxlan->cfg.saddr.sin6.sin6_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4392) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4393) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4397) if (nla_put_u8(skb, IFLA_VXLAN_TTL, vxlan->cfg.ttl) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4398) nla_put_u8(skb, IFLA_VXLAN_TTL_INHERIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4399) !!(vxlan->cfg.flags & VXLAN_F_TTL_INHERIT)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4400) nla_put_u8(skb, IFLA_VXLAN_TOS, vxlan->cfg.tos) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4401) nla_put_u8(skb, IFLA_VXLAN_DF, vxlan->cfg.df) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4402) nla_put_be32(skb, IFLA_VXLAN_LABEL, vxlan->cfg.label) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4403) nla_put_u8(skb, IFLA_VXLAN_LEARNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4404) !!(vxlan->cfg.flags & VXLAN_F_LEARN)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4405) nla_put_u8(skb, IFLA_VXLAN_PROXY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4406) !!(vxlan->cfg.flags & VXLAN_F_PROXY)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4407) nla_put_u8(skb, IFLA_VXLAN_RSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4408) !!(vxlan->cfg.flags & VXLAN_F_RSC)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4409) nla_put_u8(skb, IFLA_VXLAN_L2MISS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4410) !!(vxlan->cfg.flags & VXLAN_F_L2MISS)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4411) nla_put_u8(skb, IFLA_VXLAN_L3MISS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4412) !!(vxlan->cfg.flags & VXLAN_F_L3MISS)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4413) nla_put_u8(skb, IFLA_VXLAN_COLLECT_METADATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4414) !!(vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4415) nla_put_u32(skb, IFLA_VXLAN_AGEING, vxlan->cfg.age_interval) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4416) nla_put_u32(skb, IFLA_VXLAN_LIMIT, vxlan->cfg.addrmax) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4417) nla_put_be16(skb, IFLA_VXLAN_PORT, vxlan->cfg.dst_port) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4418) nla_put_u8(skb, IFLA_VXLAN_UDP_CSUM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4419) !(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM_TX)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4420) nla_put_u8(skb, IFLA_VXLAN_UDP_ZERO_CSUM6_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4421) !!(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM6_TX)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4422) nla_put_u8(skb, IFLA_VXLAN_UDP_ZERO_CSUM6_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4423) !!(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM6_RX)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4424) nla_put_u8(skb, IFLA_VXLAN_REMCSUM_TX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4425) !!(vxlan->cfg.flags & VXLAN_F_REMCSUM_TX)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4426) nla_put_u8(skb, IFLA_VXLAN_REMCSUM_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4427) !!(vxlan->cfg.flags & VXLAN_F_REMCSUM_RX)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4428) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4430) if (nla_put(skb, IFLA_VXLAN_PORT_RANGE, sizeof(ports), &ports))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4431) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4433) if (vxlan->cfg.flags & VXLAN_F_GBP &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4434) nla_put_flag(skb, IFLA_VXLAN_GBP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4435) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4437) if (vxlan->cfg.flags & VXLAN_F_GPE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4438) nla_put_flag(skb, IFLA_VXLAN_GPE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4439) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4441) if (vxlan->cfg.flags & VXLAN_F_REMCSUM_NOPARTIAL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4442) nla_put_flag(skb, IFLA_VXLAN_REMCSUM_NOPARTIAL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4443) goto nla_put_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4445) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4447) nla_put_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4448) return -EMSGSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4451) static struct net *vxlan_get_link_net(const struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4452) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4453) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4455) return vxlan->net;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4458) static struct rtnl_link_ops vxlan_link_ops __read_mostly = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4459) .kind = "vxlan",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4460) .maxtype = IFLA_VXLAN_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4461) .policy = vxlan_policy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4462) .priv_size = sizeof(struct vxlan_dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4463) .setup = vxlan_setup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4464) .validate = vxlan_validate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4465) .newlink = vxlan_newlink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4466) .changelink = vxlan_changelink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4467) .dellink = vxlan_dellink,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4468) .get_size = vxlan_get_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4469) .fill_info = vxlan_fill_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4470) .get_link_net = vxlan_get_link_net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4471) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4473) struct net_device *vxlan_dev_create(struct net *net, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4474) u8 name_assign_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4475) struct vxlan_config *conf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4476) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4477) struct nlattr *tb[IFLA_MAX + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4478) struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4479) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4481) memset(&tb, 0, sizeof(tb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4483) dev = rtnl_create_link(net, name, name_assign_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4484) &vxlan_link_ops, tb, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4485) if (IS_ERR(dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4486) return dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4488) err = __vxlan_dev_create(net, dev, conf, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4489) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4490) free_netdev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4491) return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4494) err = rtnl_configure_link(dev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4495) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4496) LIST_HEAD(list_kill);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4498) vxlan_dellink(dev, &list_kill);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4499) unregister_netdevice_many(&list_kill);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4500) return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4501) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4503) return dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4505) EXPORT_SYMBOL_GPL(vxlan_dev_create);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4507) static void vxlan_handle_lowerdev_unregister(struct vxlan_net *vn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4508) struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4509) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4510) struct vxlan_dev *vxlan, *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4511) LIST_HEAD(list_kill);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4513) list_for_each_entry_safe(vxlan, next, &vn->vxlan_list, next) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4514) struct vxlan_rdst *dst = &vxlan->default_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4516) /* In case we created vxlan device with carrier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4517) * and we loose the carrier due to module unload
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4518) * we also need to remove vxlan device. In other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4519) * cases, it's not necessary and remote_ifindex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4520) * is 0 here, so no matches.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4521) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4522) if (dst->remote_ifindex == dev->ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4523) vxlan_dellink(vxlan->dev, &list_kill);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4526) unregister_netdevice_many(&list_kill);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4527) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4529) static int vxlan_netdevice_event(struct notifier_block *unused,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4530) unsigned long event, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4531) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4532) struct net_device *dev = netdev_notifier_info_to_dev(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4533) struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4535) if (event == NETDEV_UNREGISTER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4536) if (!dev->udp_tunnel_nic_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4537) vxlan_offload_rx_ports(dev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4538) vxlan_handle_lowerdev_unregister(vn, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4539) } else if (event == NETDEV_REGISTER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4540) if (!dev->udp_tunnel_nic_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4541) vxlan_offload_rx_ports(dev, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4542) } else if (event == NETDEV_UDP_TUNNEL_PUSH_INFO ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4543) event == NETDEV_UDP_TUNNEL_DROP_INFO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4544) vxlan_offload_rx_ports(dev, event == NETDEV_UDP_TUNNEL_PUSH_INFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4547) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4548) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4550) static struct notifier_block vxlan_notifier_block __read_mostly = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4551) .notifier_call = vxlan_netdevice_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4552) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4554) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4555) vxlan_fdb_offloaded_set(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4556) struct switchdev_notifier_vxlan_fdb_info *fdb_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4557) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4558) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4559) struct vxlan_rdst *rdst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4560) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4561) u32 hash_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4563) hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4565) spin_lock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4567) f = vxlan_find_mac(vxlan, fdb_info->eth_addr, fdb_info->vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4568) if (!f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4569) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4571) rdst = vxlan_fdb_find_rdst(f, &fdb_info->remote_ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4572) fdb_info->remote_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4573) fdb_info->remote_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4574) fdb_info->remote_ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4575) if (!rdst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4576) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4578) rdst->offloaded = fdb_info->offloaded;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4580) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4581) spin_unlock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4584) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4585) vxlan_fdb_external_learn_add(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4586) struct switchdev_notifier_vxlan_fdb_info *fdb_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4587) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4588) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4589) struct netlink_ext_ack *extack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4590) u32 hash_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4591) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4593) hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4594) extack = switchdev_notifier_info_to_extack(&fdb_info->info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4596) spin_lock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4597) err = vxlan_fdb_update(vxlan, fdb_info->eth_addr, &fdb_info->remote_ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4598) NUD_REACHABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4599) NLM_F_CREATE | NLM_F_REPLACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4600) fdb_info->remote_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4601) fdb_info->vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4602) fdb_info->remote_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4603) fdb_info->remote_ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4604) NTF_USE | NTF_SELF | NTF_EXT_LEARNED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4605) 0, false, extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4606) spin_unlock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4608) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4611) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4612) vxlan_fdb_external_learn_del(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4613) struct switchdev_notifier_vxlan_fdb_info *fdb_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4614) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4615) struct vxlan_dev *vxlan = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4616) struct vxlan_fdb *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4617) u32 hash_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4618) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4620) hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4621) spin_lock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4623) f = vxlan_find_mac(vxlan, fdb_info->eth_addr, fdb_info->vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4624) if (!f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4625) err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4626) else if (f->flags & NTF_EXT_LEARNED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4627) err = __vxlan_fdb_delete(vxlan, fdb_info->eth_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4628) fdb_info->remote_ip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4629) fdb_info->remote_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4630) fdb_info->vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4631) fdb_info->remote_vni,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4632) fdb_info->remote_ifindex,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4633) false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4635) spin_unlock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4637) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4640) static int vxlan_switchdev_event(struct notifier_block *unused,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4641) unsigned long event, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4642) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4643) struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4644) struct switchdev_notifier_vxlan_fdb_info *fdb_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4645) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4647) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4648) case SWITCHDEV_VXLAN_FDB_OFFLOADED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4649) vxlan_fdb_offloaded_set(dev, ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4650) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4651) case SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4652) fdb_info = ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4653) err = vxlan_fdb_external_learn_add(dev, fdb_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4654) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4655) err = notifier_from_errno(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4656) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4658) fdb_info->offloaded = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4659) vxlan_fdb_offloaded_set(dev, fdb_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4660) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4661) case SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4662) fdb_info = ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4663) err = vxlan_fdb_external_learn_del(dev, fdb_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4664) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4665) err = notifier_from_errno(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4666) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4667) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4668) fdb_info->offloaded = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4669) vxlan_fdb_offloaded_set(dev, fdb_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4670) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4671) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4673) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4676) static struct notifier_block vxlan_switchdev_notifier_block __read_mostly = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4677) .notifier_call = vxlan_switchdev_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4678) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4680) static void vxlan_fdb_nh_flush(struct nexthop *nh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4681) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4682) struct vxlan_fdb *fdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4683) struct vxlan_dev *vxlan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4684) u32 hash_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4686) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4687) list_for_each_entry_rcu(fdb, &nh->fdb_list, nh_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4688) vxlan = rcu_dereference(fdb->vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4689) WARN_ON(!vxlan);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4690) hash_index = fdb_head_index(vxlan, fdb->eth_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4691) vxlan->default_dst.remote_vni);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4692) spin_lock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4693) if (!hlist_unhashed(&fdb->hlist))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4694) vxlan_fdb_destroy(vxlan, fdb, false, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4695) spin_unlock_bh(&vxlan->hash_lock[hash_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4696) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4697) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4700) static int vxlan_nexthop_event(struct notifier_block *nb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4701) unsigned long event, void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4702) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4703) struct nexthop *nh = ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4705) if (!nh || event != NEXTHOP_EVENT_DEL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4706) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4708) vxlan_fdb_nh_flush(nh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4710) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4711) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4713) static struct notifier_block vxlan_nexthop_notifier_block __read_mostly = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4714) .notifier_call = vxlan_nexthop_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4715) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4717) static __net_init int vxlan_init_net(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4718) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4719) struct vxlan_net *vn = net_generic(net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4720) unsigned int h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4722) INIT_LIST_HEAD(&vn->vxlan_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4723) spin_lock_init(&vn->sock_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4725) for (h = 0; h < PORT_HASH_SIZE; ++h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4726) INIT_HLIST_HEAD(&vn->sock_list[h]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4728) return register_nexthop_notifier(net, &vxlan_nexthop_notifier_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4729) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4731) static void vxlan_destroy_tunnels(struct net *net, struct list_head *head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4732) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4733) struct vxlan_net *vn = net_generic(net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4734) struct vxlan_dev *vxlan, *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4735) struct net_device *dev, *aux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4737) for_each_netdev_safe(net, dev, aux)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4738) if (dev->rtnl_link_ops == &vxlan_link_ops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4739) unregister_netdevice_queue(dev, head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4741) list_for_each_entry_safe(vxlan, next, &vn->vxlan_list, next) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4742) /* If vxlan->dev is in the same netns, it has already been added
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4743) * to the list by the previous loop.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4744) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4745) if (!net_eq(dev_net(vxlan->dev), net))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4746) unregister_netdevice_queue(vxlan->dev, head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4747) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4751) static void __net_exit vxlan_exit_batch_net(struct list_head *net_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4752) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4753) struct net *net;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4754) LIST_HEAD(list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4755) unsigned int h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4757) rtnl_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4758) list_for_each_entry(net, net_list, exit_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4759) unregister_nexthop_notifier(net, &vxlan_nexthop_notifier_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4760) list_for_each_entry(net, net_list, exit_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4761) vxlan_destroy_tunnels(net, &list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4763) unregister_netdevice_many(&list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4764) rtnl_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4766) list_for_each_entry(net, net_list, exit_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4767) struct vxlan_net *vn = net_generic(net, vxlan_net_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4769) for (h = 0; h < PORT_HASH_SIZE; ++h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4770) WARN_ON_ONCE(!hlist_empty(&vn->sock_list[h]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4772) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4774) static struct pernet_operations vxlan_net_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4775) .init = vxlan_init_net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4776) .exit_batch = vxlan_exit_batch_net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4777) .id = &vxlan_net_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4778) .size = sizeof(struct vxlan_net),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4779) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4781) static int __init vxlan_init_module(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4782) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4783) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4785) get_random_bytes(&vxlan_salt, sizeof(vxlan_salt));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4787) rc = register_pernet_subsys(&vxlan_net_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4788) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4789) goto out1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4791) rc = register_netdevice_notifier(&vxlan_notifier_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4792) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4793) goto out2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4795) rc = register_switchdev_notifier(&vxlan_switchdev_notifier_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4796) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4797) goto out3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4799) rc = rtnl_link_register(&vxlan_link_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4800) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4801) goto out4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4803) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4804) out4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4805) unregister_switchdev_notifier(&vxlan_switchdev_notifier_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4806) out3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4807) unregister_netdevice_notifier(&vxlan_notifier_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4808) out2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4809) unregister_pernet_subsys(&vxlan_net_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4810) out1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4811) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4813) late_initcall(vxlan_init_module);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4815) static void __exit vxlan_cleanup_module(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4816) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4817) rtnl_link_unregister(&vxlan_link_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4818) unregister_switchdev_notifier(&vxlan_switchdev_notifier_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4819) unregister_netdevice_notifier(&vxlan_notifier_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4820) unregister_pernet_subsys(&vxlan_net_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4821) /* rcu_barrier() is called by netns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4823) module_exit(vxlan_cleanup_module);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4825) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4826) MODULE_VERSION(VXLAN_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4827) MODULE_AUTHOR("Stephen Hemminger <stephen@networkplumber.org>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4828) MODULE_DESCRIPTION("Driver for VXLAN encapsulated traffic");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4829) MODULE_ALIAS_RTNL_LINK("vxlan");