Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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");