brintos

brintos / linux-shallow public Read only

0
0
Text · 125.0 KiB · 6e9a379 Raw
4950 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * VXLAN: Virtual eXtensible Local Area Network4 *5 * Copyright (c) 2012-2013 Vyatta Inc.6 */7 8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt9 10#include <linux/kernel.h>11#include <linux/module.h>12#include <linux/errno.h>13#include <linux/slab.h>14#include <linux/udp.h>15#include <linux/igmp.h>16#include <linux/if_ether.h>17#include <linux/ethtool.h>18#include <net/arp.h>19#include <net/ndisc.h>20#include <net/gro.h>21#include <net/ipv6_stubs.h>22#include <net/ip.h>23#include <net/icmp.h>24#include <net/rtnetlink.h>25#include <net/inet_ecn.h>26#include <net/net_namespace.h>27#include <net/netns/generic.h>28#include <net/tun_proto.h>29#include <net/vxlan.h>30#include <net/nexthop.h>31 32#if IS_ENABLED(CONFIG_IPV6)33#include <net/ip6_tunnel.h>34#include <net/ip6_checksum.h>35#endif36 37#include "vxlan_private.h"38 39#define VXLAN_VERSION	"0.1"40 41#define FDB_AGE_DEFAULT 300 /* 5 min */42#define FDB_AGE_INTERVAL (10 * HZ)	/* rescan interval */43 44/* UDP port for VXLAN traffic.45 * The IANA assigned port is 4789, but the Linux default is 847246 * for compatibility with early adopters.47 */48static unsigned short vxlan_port __read_mostly = 8472;49module_param_named(udp_port, vxlan_port, ushort, 0444);50MODULE_PARM_DESC(udp_port, "Destination UDP port");51 52static bool log_ecn_error = true;53module_param(log_ecn_error, bool, 0644);54MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN");55 56unsigned int vxlan_net_id;57 58const u8 all_zeros_mac[ETH_ALEN + 2];59static struct rtnl_link_ops vxlan_link_ops;60 61static int vxlan_sock_add(struct vxlan_dev *vxlan);62 63static void vxlan_vs_del_dev(struct vxlan_dev *vxlan);64 65/* salt for hash table */66static u32 vxlan_salt __read_mostly;67 68static inline bool vxlan_collect_metadata(struct vxlan_sock *vs)69{70	return vs->flags & VXLAN_F_COLLECT_METADATA ||71	       ip_tunnel_collect_metadata();72}73 74/* Find VXLAN socket based on network namespace, address family, UDP port,75 * enabled unshareable flags and socket device binding (see l3mdev with76 * non-default VRF).77 */78static struct vxlan_sock *vxlan_find_sock(struct net *net, sa_family_t family,79					  __be16 port, u32 flags, int ifindex)80{81	struct vxlan_sock *vs;82 83	flags &= VXLAN_F_RCV_FLAGS;84 85	hlist_for_each_entry_rcu(vs, vs_head(net, port), hlist) {86		if (inet_sk(vs->sock->sk)->inet_sport == port &&87		    vxlan_get_sk_family(vs) == family &&88		    vs->flags == flags &&89		    vs->sock->sk->sk_bound_dev_if == ifindex)90			return vs;91	}92	return NULL;93}94 95static struct vxlan_dev *vxlan_vs_find_vni(struct vxlan_sock *vs,96					   int ifindex, __be32 vni,97					   struct vxlan_vni_node **vninode)98{99	struct vxlan_vni_node *vnode;100	struct vxlan_dev_node *node;101 102	/* For flow based devices, map all packets to VNI 0 */103	if (vs->flags & VXLAN_F_COLLECT_METADATA &&104	    !(vs->flags & VXLAN_F_VNIFILTER))105		vni = 0;106 107	hlist_for_each_entry_rcu(node, vni_head(vs, vni), hlist) {108		if (!node->vxlan)109			continue;110		vnode = NULL;111		if (node->vxlan->cfg.flags & VXLAN_F_VNIFILTER) {112			vnode = vxlan_vnifilter_lookup(node->vxlan, vni);113			if (!vnode)114				continue;115		} else if (node->vxlan->default_dst.remote_vni != vni) {116			continue;117		}118 119		if (IS_ENABLED(CONFIG_IPV6)) {120			const struct vxlan_config *cfg = &node->vxlan->cfg;121 122			if ((cfg->flags & VXLAN_F_IPV6_LINKLOCAL) &&123			    cfg->remote_ifindex != ifindex)124				continue;125		}126 127		if (vninode)128			*vninode = vnode;129		return node->vxlan;130	}131 132	return NULL;133}134 135/* Look up VNI in a per net namespace table */136static struct vxlan_dev *vxlan_find_vni(struct net *net, int ifindex,137					__be32 vni, sa_family_t family,138					__be16 port, u32 flags)139{140	struct vxlan_sock *vs;141 142	vs = vxlan_find_sock(net, family, port, flags, ifindex);143	if (!vs)144		return NULL;145 146	return vxlan_vs_find_vni(vs, ifindex, vni, NULL);147}148 149/* Fill in neighbour message in skbuff. */150static int vxlan_fdb_info(struct sk_buff *skb, struct vxlan_dev *vxlan,151			  const struct vxlan_fdb *fdb,152			  u32 portid, u32 seq, int type, unsigned int flags,153			  const struct vxlan_rdst *rdst)154{155	unsigned long now = jiffies;156	struct nda_cacheinfo ci;157	bool send_ip, send_eth;158	struct nlmsghdr *nlh;159	struct nexthop *nh;160	struct ndmsg *ndm;161	int nh_family;162	u32 nh_id;163 164	nlh = nlmsg_put(skb, portid, seq, type, sizeof(*ndm), flags);165	if (nlh == NULL)166		return -EMSGSIZE;167 168	ndm = nlmsg_data(nlh);169	memset(ndm, 0, sizeof(*ndm));170 171	send_eth = send_ip = true;172 173	rcu_read_lock();174	nh = rcu_dereference(fdb->nh);175	if (nh) {176		nh_family = nexthop_get_family(nh);177		nh_id = nh->id;178	}179	rcu_read_unlock();180 181	if (type == RTM_GETNEIGH) {182		if (rdst) {183			send_ip = !vxlan_addr_any(&rdst->remote_ip);184			ndm->ndm_family = send_ip ? rdst->remote_ip.sa.sa_family : AF_INET;185		} else if (nh) {186			ndm->ndm_family = nh_family;187		}188		send_eth = !is_zero_ether_addr(fdb->eth_addr);189	} else190		ndm->ndm_family	= AF_BRIDGE;191	ndm->ndm_state = fdb->state;192	ndm->ndm_ifindex = vxlan->dev->ifindex;193	ndm->ndm_flags = fdb->flags;194	if (rdst && rdst->offloaded)195		ndm->ndm_flags |= NTF_OFFLOADED;196	ndm->ndm_type = RTN_UNICAST;197 198	if (!net_eq(dev_net(vxlan->dev), vxlan->net) &&199	    nla_put_s32(skb, NDA_LINK_NETNSID,200			peernet2id(dev_net(vxlan->dev), vxlan->net)))201		goto nla_put_failure;202 203	if (send_eth && nla_put(skb, NDA_LLADDR, ETH_ALEN, &fdb->eth_addr))204		goto nla_put_failure;205	if (nh) {206		if (nla_put_u32(skb, NDA_NH_ID, nh_id))207			goto nla_put_failure;208	} else if (rdst) {209		if (send_ip && vxlan_nla_put_addr(skb, NDA_DST,210						  &rdst->remote_ip))211			goto nla_put_failure;212 213		if (rdst->remote_port &&214		    rdst->remote_port != vxlan->cfg.dst_port &&215		    nla_put_be16(skb, NDA_PORT, rdst->remote_port))216			goto nla_put_failure;217		if (rdst->remote_vni != vxlan->default_dst.remote_vni &&218		    nla_put_u32(skb, NDA_VNI, be32_to_cpu(rdst->remote_vni)))219			goto nla_put_failure;220		if (rdst->remote_ifindex &&221		    nla_put_u32(skb, NDA_IFINDEX, rdst->remote_ifindex))222			goto nla_put_failure;223	}224 225	if ((vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) && fdb->vni &&226	    nla_put_u32(skb, NDA_SRC_VNI,227			be32_to_cpu(fdb->vni)))228		goto nla_put_failure;229 230	ci.ndm_used	 = jiffies_to_clock_t(now - fdb->used);231	ci.ndm_confirmed = 0;232	ci.ndm_updated	 = jiffies_to_clock_t(now - fdb->updated);233	ci.ndm_refcnt	 = 0;234 235	if (nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci))236		goto nla_put_failure;237 238	nlmsg_end(skb, nlh);239	return 0;240 241nla_put_failure:242	nlmsg_cancel(skb, nlh);243	return -EMSGSIZE;244}245 246static inline size_t vxlan_nlmsg_size(void)247{248	return NLMSG_ALIGN(sizeof(struct ndmsg))249		+ nla_total_size(ETH_ALEN) /* NDA_LLADDR */250		+ nla_total_size(sizeof(struct in6_addr)) /* NDA_DST */251		+ nla_total_size(sizeof(__be16)) /* NDA_PORT */252		+ nla_total_size(sizeof(__be32)) /* NDA_VNI */253		+ nla_total_size(sizeof(__u32)) /* NDA_IFINDEX */254		+ nla_total_size(sizeof(__s32)) /* NDA_LINK_NETNSID */255		+ nla_total_size(sizeof(struct nda_cacheinfo));256}257 258static void __vxlan_fdb_notify(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb,259			       struct vxlan_rdst *rd, int type)260{261	struct net *net = dev_net(vxlan->dev);262	struct sk_buff *skb;263	int err = -ENOBUFS;264 265	skb = nlmsg_new(vxlan_nlmsg_size(), GFP_ATOMIC);266	if (skb == NULL)267		goto errout;268 269	err = vxlan_fdb_info(skb, vxlan, fdb, 0, 0, type, 0, rd);270	if (err < 0) {271		/* -EMSGSIZE implies BUG in vxlan_nlmsg_size() */272		WARN_ON(err == -EMSGSIZE);273		kfree_skb(skb);274		goto errout;275	}276 277	rtnl_notify(skb, net, 0, RTNLGRP_NEIGH, NULL, GFP_ATOMIC);278	return;279errout:280	rtnl_set_sk_err(net, RTNLGRP_NEIGH, err);281}282 283static void vxlan_fdb_switchdev_notifier_info(const struct vxlan_dev *vxlan,284			    const struct vxlan_fdb *fdb,285			    const struct vxlan_rdst *rd,286			    struct netlink_ext_ack *extack,287			    struct switchdev_notifier_vxlan_fdb_info *fdb_info)288{289	fdb_info->info.dev = vxlan->dev;290	fdb_info->info.extack = extack;291	fdb_info->remote_ip = rd->remote_ip;292	fdb_info->remote_port = rd->remote_port;293	fdb_info->remote_vni = rd->remote_vni;294	fdb_info->remote_ifindex = rd->remote_ifindex;295	memcpy(fdb_info->eth_addr, fdb->eth_addr, ETH_ALEN);296	fdb_info->vni = fdb->vni;297	fdb_info->offloaded = rd->offloaded;298	fdb_info->added_by_user = fdb->flags & NTF_VXLAN_ADDED_BY_USER;299}300 301static int vxlan_fdb_switchdev_call_notifiers(struct vxlan_dev *vxlan,302					      struct vxlan_fdb *fdb,303					      struct vxlan_rdst *rd,304					      bool adding,305					      struct netlink_ext_ack *extack)306{307	struct switchdev_notifier_vxlan_fdb_info info;308	enum switchdev_notifier_type notifier_type;309	int ret;310 311	if (WARN_ON(!rd))312		return 0;313 314	notifier_type = adding ? SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE315			       : SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE;316	vxlan_fdb_switchdev_notifier_info(vxlan, fdb, rd, NULL, &info);317	ret = call_switchdev_notifiers(notifier_type, vxlan->dev,318				       &info.info, extack);319	return notifier_to_errno(ret);320}321 322static int vxlan_fdb_notify(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb,323			    struct vxlan_rdst *rd, int type, bool swdev_notify,324			    struct netlink_ext_ack *extack)325{326	int err;327 328	if (swdev_notify && rd) {329		switch (type) {330		case RTM_NEWNEIGH:331			err = vxlan_fdb_switchdev_call_notifiers(vxlan, fdb, rd,332								 true, extack);333			if (err)334				return err;335			break;336		case RTM_DELNEIGH:337			vxlan_fdb_switchdev_call_notifiers(vxlan, fdb, rd,338							   false, extack);339			break;340		}341	}342 343	__vxlan_fdb_notify(vxlan, fdb, rd, type);344	return 0;345}346 347static void vxlan_ip_miss(struct net_device *dev, union vxlan_addr *ipa)348{349	struct vxlan_dev *vxlan = netdev_priv(dev);350	struct vxlan_fdb f = {351		.state = NUD_STALE,352	};353	struct vxlan_rdst remote = {354		.remote_ip = *ipa, /* goes to NDA_DST */355		.remote_vni = cpu_to_be32(VXLAN_N_VID),356	};357 358	vxlan_fdb_notify(vxlan, &f, &remote, RTM_GETNEIGH, true, NULL);359}360 361static void vxlan_fdb_miss(struct vxlan_dev *vxlan, const u8 eth_addr[ETH_ALEN])362{363	struct vxlan_fdb f = {364		.state = NUD_STALE,365	};366	struct vxlan_rdst remote = { };367 368	memcpy(f.eth_addr, eth_addr, ETH_ALEN);369 370	vxlan_fdb_notify(vxlan, &f, &remote, RTM_GETNEIGH, true, NULL);371}372 373/* Hash Ethernet address */374static u32 eth_hash(const unsigned char *addr)375{376	u64 value = get_unaligned((u64 *)addr);377 378	/* only want 6 bytes */379#ifdef __BIG_ENDIAN380	value >>= 16;381#else382	value <<= 16;383#endif384	return hash_64(value, FDB_HASH_BITS);385}386 387u32 eth_vni_hash(const unsigned char *addr, __be32 vni)388{389	/* use 1 byte of OUI and 3 bytes of NIC */390	u32 key = get_unaligned((u32 *)(addr + 2));391 392	return jhash_2words(key, vni, vxlan_salt) & (FDB_HASH_SIZE - 1);393}394 395u32 fdb_head_index(struct vxlan_dev *vxlan, const u8 *mac, __be32 vni)396{397	if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA)398		return eth_vni_hash(mac, vni);399	else400		return eth_hash(mac);401}402 403/* Hash chain to use given mac address */404static inline struct hlist_head *vxlan_fdb_head(struct vxlan_dev *vxlan,405						const u8 *mac, __be32 vni)406{407	return &vxlan->fdb_head[fdb_head_index(vxlan, mac, vni)];408}409 410/* Look up Ethernet address in forwarding table */411static struct vxlan_fdb *__vxlan_find_mac(struct vxlan_dev *vxlan,412					  const u8 *mac, __be32 vni)413{414	struct hlist_head *head = vxlan_fdb_head(vxlan, mac, vni);415	struct vxlan_fdb *f;416 417	hlist_for_each_entry_rcu(f, head, hlist) {418		if (ether_addr_equal(mac, f->eth_addr)) {419			if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) {420				if (vni == f->vni)421					return f;422			} else {423				return f;424			}425		}426	}427 428	return NULL;429}430 431static struct vxlan_fdb *vxlan_find_mac(struct vxlan_dev *vxlan,432					const u8 *mac, __be32 vni)433{434	struct vxlan_fdb *f;435 436	f = __vxlan_find_mac(vxlan, mac, vni);437	if (f && f->used != jiffies)438		f->used = jiffies;439 440	return f;441}442 443/* caller should hold vxlan->hash_lock */444static struct vxlan_rdst *vxlan_fdb_find_rdst(struct vxlan_fdb *f,445					      union vxlan_addr *ip, __be16 port,446					      __be32 vni, __u32 ifindex)447{448	struct vxlan_rdst *rd;449 450	list_for_each_entry(rd, &f->remotes, list) {451		if (vxlan_addr_equal(&rd->remote_ip, ip) &&452		    rd->remote_port == port &&453		    rd->remote_vni == vni &&454		    rd->remote_ifindex == ifindex)455			return rd;456	}457 458	return NULL;459}460 461int vxlan_fdb_find_uc(struct net_device *dev, const u8 *mac, __be32 vni,462		      struct switchdev_notifier_vxlan_fdb_info *fdb_info)463{464	struct vxlan_dev *vxlan = netdev_priv(dev);465	u8 eth_addr[ETH_ALEN + 2] = { 0 };466	struct vxlan_rdst *rdst;467	struct vxlan_fdb *f;468	int rc = 0;469 470	if (is_multicast_ether_addr(mac) ||471	    is_zero_ether_addr(mac))472		return -EINVAL;473 474	ether_addr_copy(eth_addr, mac);475 476	rcu_read_lock();477 478	f = __vxlan_find_mac(vxlan, eth_addr, vni);479	if (!f) {480		rc = -ENOENT;481		goto out;482	}483 484	rdst = first_remote_rcu(f);485	vxlan_fdb_switchdev_notifier_info(vxlan, f, rdst, NULL, fdb_info);486 487out:488	rcu_read_unlock();489	return rc;490}491EXPORT_SYMBOL_GPL(vxlan_fdb_find_uc);492 493static int vxlan_fdb_notify_one(struct notifier_block *nb,494				const struct vxlan_dev *vxlan,495				const struct vxlan_fdb *f,496				const struct vxlan_rdst *rdst,497				struct netlink_ext_ack *extack)498{499	struct switchdev_notifier_vxlan_fdb_info fdb_info;500	int rc;501 502	vxlan_fdb_switchdev_notifier_info(vxlan, f, rdst, extack, &fdb_info);503	rc = nb->notifier_call(nb, SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE,504			       &fdb_info);505	return notifier_to_errno(rc);506}507 508int vxlan_fdb_replay(const struct net_device *dev, __be32 vni,509		     struct notifier_block *nb,510		     struct netlink_ext_ack *extack)511{512	struct vxlan_dev *vxlan;513	struct vxlan_rdst *rdst;514	struct vxlan_fdb *f;515	unsigned int h;516	int rc = 0;517 518	if (!netif_is_vxlan(dev))519		return -EINVAL;520	vxlan = netdev_priv(dev);521 522	for (h = 0; h < FDB_HASH_SIZE; ++h) {523		spin_lock_bh(&vxlan->hash_lock[h]);524		hlist_for_each_entry(f, &vxlan->fdb_head[h], hlist) {525			if (f->vni == vni) {526				list_for_each_entry(rdst, &f->remotes, list) {527					rc = vxlan_fdb_notify_one(nb, vxlan,528								  f, rdst,529								  extack);530					if (rc)531						goto unlock;532				}533			}534		}535		spin_unlock_bh(&vxlan->hash_lock[h]);536	}537	return 0;538 539unlock:540	spin_unlock_bh(&vxlan->hash_lock[h]);541	return rc;542}543EXPORT_SYMBOL_GPL(vxlan_fdb_replay);544 545void vxlan_fdb_clear_offload(const struct net_device *dev, __be32 vni)546{547	struct vxlan_dev *vxlan;548	struct vxlan_rdst *rdst;549	struct vxlan_fdb *f;550	unsigned int h;551 552	if (!netif_is_vxlan(dev))553		return;554	vxlan = netdev_priv(dev);555 556	for (h = 0; h < FDB_HASH_SIZE; ++h) {557		spin_lock_bh(&vxlan->hash_lock[h]);558		hlist_for_each_entry(f, &vxlan->fdb_head[h], hlist)559			if (f->vni == vni)560				list_for_each_entry(rdst, &f->remotes, list)561					rdst->offloaded = false;562		spin_unlock_bh(&vxlan->hash_lock[h]);563	}564 565}566EXPORT_SYMBOL_GPL(vxlan_fdb_clear_offload);567 568/* Replace destination of unicast mac */569static int vxlan_fdb_replace(struct vxlan_fdb *f,570			     union vxlan_addr *ip, __be16 port, __be32 vni,571			     __u32 ifindex, struct vxlan_rdst *oldrd)572{573	struct vxlan_rdst *rd;574 575	rd = vxlan_fdb_find_rdst(f, ip, port, vni, ifindex);576	if (rd)577		return 0;578 579	rd = list_first_entry_or_null(&f->remotes, struct vxlan_rdst, list);580	if (!rd)581		return 0;582 583	*oldrd = *rd;584	dst_cache_reset(&rd->dst_cache);585	rd->remote_ip = *ip;586	rd->remote_port = port;587	rd->remote_vni = vni;588	rd->remote_ifindex = ifindex;589	rd->offloaded = false;590	return 1;591}592 593/* Add/update destinations for multicast */594static int vxlan_fdb_append(struct vxlan_fdb *f,595			    union vxlan_addr *ip, __be16 port, __be32 vni,596			    __u32 ifindex, struct vxlan_rdst **rdp)597{598	struct vxlan_rdst *rd;599 600	rd = vxlan_fdb_find_rdst(f, ip, port, vni, ifindex);601	if (rd)602		return 0;603 604	rd = kmalloc(sizeof(*rd), GFP_ATOMIC);605	if (rd == NULL)606		return -ENOMEM;607 608	if (dst_cache_init(&rd->dst_cache, GFP_ATOMIC)) {609		kfree(rd);610		return -ENOMEM;611	}612 613	rd->remote_ip = *ip;614	rd->remote_port = port;615	rd->offloaded = false;616	rd->remote_vni = vni;617	rd->remote_ifindex = ifindex;618 619	list_add_tail_rcu(&rd->list, &f->remotes);620 621	*rdp = rd;622	return 1;623}624 625static bool vxlan_parse_gpe_proto(struct vxlanhdr *hdr, __be16 *protocol)626{627	struct vxlanhdr_gpe *gpe = (struct vxlanhdr_gpe *)hdr;628 629	/* Need to have Next Protocol set for interfaces in GPE mode. */630	if (!gpe->np_applied)631		return false;632	/* "The initial version is 0. If a receiver does not support the633	 * version indicated it MUST drop the packet.634	 */635	if (gpe->version != 0)636		return false;637	/* "When the O bit is set to 1, the packet is an OAM packet and OAM638	 * processing MUST occur." However, we don't implement OAM639	 * processing, thus drop the packet.640	 */641	if (gpe->oam_flag)642		return false;643 644	*protocol = tun_p_to_eth_p(gpe->next_protocol);645	if (!*protocol)646		return false;647 648	return true;649}650 651static struct vxlanhdr *vxlan_gro_remcsum(struct sk_buff *skb,652					  unsigned int off,653					  struct vxlanhdr *vh, size_t hdrlen,654					  __be32 vni_field,655					  struct gro_remcsum *grc,656					  bool nopartial)657{658	size_t start, offset;659 660	if (skb->remcsum_offload)661		return vh;662 663	if (!NAPI_GRO_CB(skb)->csum_valid)664		return NULL;665 666	start = vxlan_rco_start(vni_field);667	offset = start + vxlan_rco_offset(vni_field);668 669	vh = skb_gro_remcsum_process(skb, (void *)vh, off, hdrlen,670				     start, offset, grc, nopartial);671 672	skb->remcsum_offload = 1;673 674	return vh;675}676 677static struct vxlanhdr *vxlan_gro_prepare_receive(struct sock *sk,678						  struct list_head *head,679						  struct sk_buff *skb,680						  struct gro_remcsum *grc)681{682	struct sk_buff *p;683	struct vxlanhdr *vh, *vh2;684	unsigned int hlen, off_vx;685	struct vxlan_sock *vs = rcu_dereference_sk_user_data(sk);686	__be32 flags;687 688	skb_gro_remcsum_init(grc);689 690	off_vx = skb_gro_offset(skb);691	hlen = off_vx + sizeof(*vh);692	vh = skb_gro_header(skb, hlen, off_vx);693	if (unlikely(!vh))694		return NULL;695 696	skb_gro_postpull_rcsum(skb, vh, sizeof(struct vxlanhdr));697 698	flags = vh->vx_flags;699 700	if ((flags & VXLAN_HF_RCO) && (vs->flags & VXLAN_F_REMCSUM_RX)) {701		vh = vxlan_gro_remcsum(skb, off_vx, vh, sizeof(struct vxlanhdr),702				       vh->vx_vni, grc,703				       !!(vs->flags &704					  VXLAN_F_REMCSUM_NOPARTIAL));705 706		if (!vh)707			return NULL;708	}709 710	skb_gro_pull(skb, sizeof(struct vxlanhdr)); /* pull vxlan header */711 712	list_for_each_entry(p, head, list) {713		if (!NAPI_GRO_CB(p)->same_flow)714			continue;715 716		vh2 = (struct vxlanhdr *)(p->data + off_vx);717		if (vh->vx_flags != vh2->vx_flags ||718		    vh->vx_vni != vh2->vx_vni) {719			NAPI_GRO_CB(p)->same_flow = 0;720			continue;721		}722	}723 724	return vh;725}726 727static struct sk_buff *vxlan_gro_receive(struct sock *sk,728					 struct list_head *head,729					 struct sk_buff *skb)730{731	struct sk_buff *pp = NULL;732	struct gro_remcsum grc;733	int flush = 1;734 735	if (vxlan_gro_prepare_receive(sk, head, skb, &grc)) {736		pp = call_gro_receive(eth_gro_receive, head, skb);737		flush = 0;738	}739	skb_gro_flush_final_remcsum(skb, pp, flush, &grc);740	return pp;741}742 743static struct sk_buff *vxlan_gpe_gro_receive(struct sock *sk,744					     struct list_head *head,745					     struct sk_buff *skb)746{747	const struct packet_offload *ptype;748	struct sk_buff *pp = NULL;749	struct gro_remcsum grc;750	struct vxlanhdr *vh;751	__be16 protocol;752	int flush = 1;753 754	vh = vxlan_gro_prepare_receive(sk, head, skb, &grc);755	if (vh) {756		if (!vxlan_parse_gpe_proto(vh, &protocol))757			goto out;758		ptype = gro_find_receive_by_type(protocol);759		if (!ptype)760			goto out;761		pp = call_gro_receive(ptype->callbacks.gro_receive, head, skb);762		flush = 0;763	}764out:765	skb_gro_flush_final_remcsum(skb, pp, flush, &grc);766	return pp;767}768 769static int vxlan_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff)770{771	/* Sets 'skb->inner_mac_header' since we are always called with772	 * 'skb->encapsulation' set.773	 */774	return eth_gro_complete(skb, nhoff + sizeof(struct vxlanhdr));775}776 777static int vxlan_gpe_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff)778{779	struct vxlanhdr *vh = (struct vxlanhdr *)(skb->data + nhoff);780	const struct packet_offload *ptype;781	int err = -ENOSYS;782	__be16 protocol;783 784	if (!vxlan_parse_gpe_proto(vh, &protocol))785		return err;786	ptype = gro_find_complete_by_type(protocol);787	if (ptype)788		err = ptype->callbacks.gro_complete(skb, nhoff + sizeof(struct vxlanhdr));789	return err;790}791 792static struct vxlan_fdb *vxlan_fdb_alloc(struct vxlan_dev *vxlan, const u8 *mac,793					 __u16 state, __be32 src_vni,794					 __u16 ndm_flags)795{796	struct vxlan_fdb *f;797 798	f = kmalloc(sizeof(*f), GFP_ATOMIC);799	if (!f)800		return NULL;801	f->state = state;802	f->flags = ndm_flags;803	f->updated = f->used = jiffies;804	f->vni = src_vni;805	f->nh = NULL;806	RCU_INIT_POINTER(f->vdev, vxlan);807	INIT_LIST_HEAD(&f->nh_list);808	INIT_LIST_HEAD(&f->remotes);809	memcpy(f->eth_addr, mac, ETH_ALEN);810 811	return f;812}813 814static void vxlan_fdb_insert(struct vxlan_dev *vxlan, const u8 *mac,815			     __be32 src_vni, struct vxlan_fdb *f)816{817	++vxlan->addrcnt;818	hlist_add_head_rcu(&f->hlist,819			   vxlan_fdb_head(vxlan, mac, src_vni));820}821 822static int vxlan_fdb_nh_update(struct vxlan_dev *vxlan, struct vxlan_fdb *fdb,823			       u32 nhid, struct netlink_ext_ack *extack)824{825	struct nexthop *old_nh = rtnl_dereference(fdb->nh);826	struct nexthop *nh;827	int err = -EINVAL;828 829	if (old_nh && old_nh->id == nhid)830		return 0;831 832	nh = nexthop_find_by_id(vxlan->net, nhid);833	if (!nh) {834		NL_SET_ERR_MSG(extack, "Nexthop id does not exist");835		goto err_inval;836	}837 838	if (!nexthop_get(nh)) {839		NL_SET_ERR_MSG(extack, "Nexthop has been deleted");840		nh = NULL;841		goto err_inval;842	}843	if (!nexthop_is_fdb(nh)) {844		NL_SET_ERR_MSG(extack, "Nexthop is not a fdb nexthop");845		goto err_inval;846	}847 848	if (!nexthop_is_multipath(nh)) {849		NL_SET_ERR_MSG(extack, "Nexthop is not a multipath group");850		goto err_inval;851	}852 853	/* check nexthop group family */854	switch (vxlan->default_dst.remote_ip.sa.sa_family) {855	case AF_INET:856		if (!nexthop_has_v4(nh)) {857			err = -EAFNOSUPPORT;858			NL_SET_ERR_MSG(extack, "Nexthop group family not supported");859			goto err_inval;860		}861		break;862	case AF_INET6:863		if (nexthop_has_v4(nh)) {864			err = -EAFNOSUPPORT;865			NL_SET_ERR_MSG(extack, "Nexthop group family not supported");866			goto err_inval;867		}868	}869 870	if (old_nh) {871		list_del_rcu(&fdb->nh_list);872		nexthop_put(old_nh);873	}874	rcu_assign_pointer(fdb->nh, nh);875	list_add_tail_rcu(&fdb->nh_list, &nh->fdb_list);876	return 1;877 878err_inval:879	if (nh)880		nexthop_put(nh);881	return err;882}883 884int vxlan_fdb_create(struct vxlan_dev *vxlan,885		     const u8 *mac, union vxlan_addr *ip,886		     __u16 state, __be16 port, __be32 src_vni,887		     __be32 vni, __u32 ifindex, __u16 ndm_flags,888		     u32 nhid, struct vxlan_fdb **fdb,889		     struct netlink_ext_ack *extack)890{891	struct vxlan_rdst *rd = NULL;892	struct vxlan_fdb *f;893	int rc;894 895	if (vxlan->cfg.addrmax &&896	    vxlan->addrcnt >= vxlan->cfg.addrmax)897		return -ENOSPC;898 899	netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip);900	f = vxlan_fdb_alloc(vxlan, mac, state, src_vni, ndm_flags);901	if (!f)902		return -ENOMEM;903 904	if (nhid)905		rc = vxlan_fdb_nh_update(vxlan, f, nhid, extack);906	else907		rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd);908	if (rc < 0)909		goto errout;910 911	*fdb = f;912 913	return 0;914 915errout:916	kfree(f);917	return rc;918}919 920static void __vxlan_fdb_free(struct vxlan_fdb *f)921{922	struct vxlan_rdst *rd, *nd;923	struct nexthop *nh;924 925	nh = rcu_dereference_raw(f->nh);926	if (nh) {927		rcu_assign_pointer(f->nh, NULL);928		rcu_assign_pointer(f->vdev, NULL);929		nexthop_put(nh);930	}931 932	list_for_each_entry_safe(rd, nd, &f->remotes, list) {933		dst_cache_destroy(&rd->dst_cache);934		kfree(rd);935	}936	kfree(f);937}938 939static void vxlan_fdb_free(struct rcu_head *head)940{941	struct vxlan_fdb *f = container_of(head, struct vxlan_fdb, rcu);942 943	__vxlan_fdb_free(f);944}945 946static void vxlan_fdb_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f,947			      bool do_notify, bool swdev_notify)948{949	struct vxlan_rdst *rd;950 951	netdev_dbg(vxlan->dev, "delete %pM\n", f->eth_addr);952 953	--vxlan->addrcnt;954	if (do_notify) {955		if (rcu_access_pointer(f->nh))956			vxlan_fdb_notify(vxlan, f, NULL, RTM_DELNEIGH,957					 swdev_notify, NULL);958		else959			list_for_each_entry(rd, &f->remotes, list)960				vxlan_fdb_notify(vxlan, f, rd, RTM_DELNEIGH,961						 swdev_notify, NULL);962	}963 964	hlist_del_rcu(&f->hlist);965	list_del_rcu(&f->nh_list);966	call_rcu(&f->rcu, vxlan_fdb_free);967}968 969static void vxlan_dst_free(struct rcu_head *head)970{971	struct vxlan_rdst *rd = container_of(head, struct vxlan_rdst, rcu);972 973	dst_cache_destroy(&rd->dst_cache);974	kfree(rd);975}976 977static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan,978				     union vxlan_addr *ip,979				     __u16 state, __u16 flags,980				     __be16 port, __be32 vni,981				     __u32 ifindex, __u16 ndm_flags,982				     struct vxlan_fdb *f, u32 nhid,983				     bool swdev_notify,984				     struct netlink_ext_ack *extack)985{986	__u16 fdb_flags = (ndm_flags & ~NTF_USE);987	struct vxlan_rdst *rd = NULL;988	struct vxlan_rdst oldrd;989	int notify = 0;990	int rc = 0;991	int err;992 993	if (nhid && !rcu_access_pointer(f->nh)) {994		NL_SET_ERR_MSG(extack,995			       "Cannot replace an existing non nexthop fdb with a nexthop");996		return -EOPNOTSUPP;997	}998 999	if (nhid && (flags & NLM_F_APPEND)) {1000		NL_SET_ERR_MSG(extack,1001			       "Cannot append to a nexthop fdb");1002		return -EOPNOTSUPP;1003	}1004 1005	/* Do not allow an externally learned entry to take over an entry added1006	 * by the user.1007	 */1008	if (!(fdb_flags & NTF_EXT_LEARNED) ||1009	    !(f->flags & NTF_VXLAN_ADDED_BY_USER)) {1010		if (f->state != state) {1011			f->state = state;1012			f->updated = jiffies;1013			notify = 1;1014		}1015		if (f->flags != fdb_flags) {1016			f->flags = fdb_flags;1017			f->updated = jiffies;1018			notify = 1;1019		}1020	}1021 1022	if ((flags & NLM_F_REPLACE)) {1023		/* Only change unicasts */1024		if (!(is_multicast_ether_addr(f->eth_addr) ||1025		      is_zero_ether_addr(f->eth_addr))) {1026			if (nhid) {1027				rc = vxlan_fdb_nh_update(vxlan, f, nhid, extack);1028				if (rc < 0)1029					return rc;1030			} else {1031				rc = vxlan_fdb_replace(f, ip, port, vni,1032						       ifindex, &oldrd);1033			}1034			notify |= rc;1035		} else {1036			NL_SET_ERR_MSG(extack, "Cannot replace non-unicast fdb entries");1037			return -EOPNOTSUPP;1038		}1039	}1040	if ((flags & NLM_F_APPEND) &&1041	    (is_multicast_ether_addr(f->eth_addr) ||1042	     is_zero_ether_addr(f->eth_addr))) {1043		rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd);1044 1045		if (rc < 0)1046			return rc;1047		notify |= rc;1048	}1049 1050	if (ndm_flags & NTF_USE)1051		f->used = jiffies;1052 1053	if (notify) {1054		if (rd == NULL)1055			rd = first_remote_rtnl(f);1056 1057		err = vxlan_fdb_notify(vxlan, f, rd, RTM_NEWNEIGH,1058				       swdev_notify, extack);1059		if (err)1060			goto err_notify;1061	}1062 1063	return 0;1064 1065err_notify:1066	if (nhid)1067		return err;1068	if ((flags & NLM_F_REPLACE) && rc)1069		*rd = oldrd;1070	else if ((flags & NLM_F_APPEND) && rc) {1071		list_del_rcu(&rd->list);1072		call_rcu(&rd->rcu, vxlan_dst_free);1073	}1074	return err;1075}1076 1077static int vxlan_fdb_update_create(struct vxlan_dev *vxlan,1078				   const u8 *mac, union vxlan_addr *ip,1079				   __u16 state, __u16 flags,1080				   __be16 port, __be32 src_vni, __be32 vni,1081				   __u32 ifindex, __u16 ndm_flags, u32 nhid,1082				   bool swdev_notify,1083				   struct netlink_ext_ack *extack)1084{1085	__u16 fdb_flags = (ndm_flags & ~NTF_USE);1086	struct vxlan_fdb *f;1087	int rc;1088 1089	/* Disallow replace to add a multicast entry */1090	if ((flags & NLM_F_REPLACE) &&1091	    (is_multicast_ether_addr(mac) || is_zero_ether_addr(mac)))1092		return -EOPNOTSUPP;1093 1094	netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip);1095	rc = vxlan_fdb_create(vxlan, mac, ip, state, port, src_vni,1096			      vni, ifindex, fdb_flags, nhid, &f, extack);1097	if (rc < 0)1098		return rc;1099 1100	vxlan_fdb_insert(vxlan, mac, src_vni, f);1101	rc = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_NEWNEIGH,1102			      swdev_notify, extack);1103	if (rc)1104		goto err_notify;1105 1106	return 0;1107 1108err_notify:1109	vxlan_fdb_destroy(vxlan, f, false, false);1110	return rc;1111}1112 1113/* Add new entry to forwarding table -- assumes lock held */1114int vxlan_fdb_update(struct vxlan_dev *vxlan,1115		     const u8 *mac, union vxlan_addr *ip,1116		     __u16 state, __u16 flags,1117		     __be16 port, __be32 src_vni, __be32 vni,1118		     __u32 ifindex, __u16 ndm_flags, u32 nhid,1119		     bool swdev_notify,1120		     struct netlink_ext_ack *extack)1121{1122	struct vxlan_fdb *f;1123 1124	f = __vxlan_find_mac(vxlan, mac, src_vni);1125	if (f) {1126		if (flags & NLM_F_EXCL) {1127			netdev_dbg(vxlan->dev,1128				   "lost race to create %pM\n", mac);1129			return -EEXIST;1130		}1131 1132		return vxlan_fdb_update_existing(vxlan, ip, state, flags, port,1133						 vni, ifindex, ndm_flags, f,1134						 nhid, swdev_notify, extack);1135	} else {1136		if (!(flags & NLM_F_CREATE))1137			return -ENOENT;1138 1139		return vxlan_fdb_update_create(vxlan, mac, ip, state, flags,1140					       port, src_vni, vni, ifindex,1141					       ndm_flags, nhid, swdev_notify,1142					       extack);1143	}1144}1145 1146static void vxlan_fdb_dst_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f,1147				  struct vxlan_rdst *rd, bool swdev_notify)1148{1149	list_del_rcu(&rd->list);1150	vxlan_fdb_notify(vxlan, f, rd, RTM_DELNEIGH, swdev_notify, NULL);1151	call_rcu(&rd->rcu, vxlan_dst_free);1152}1153 1154static int vxlan_fdb_parse(struct nlattr *tb[], struct vxlan_dev *vxlan,1155			   union vxlan_addr *ip, __be16 *port, __be32 *src_vni,1156			   __be32 *vni, u32 *ifindex, u32 *nhid,1157			   struct netlink_ext_ack *extack)1158{1159	struct net *net = dev_net(vxlan->dev);1160	int err;1161 1162	if (tb[NDA_NH_ID] &&1163	    (tb[NDA_DST] || tb[NDA_VNI] || tb[NDA_IFINDEX] || tb[NDA_PORT])) {1164		NL_SET_ERR_MSG(extack, "DST, VNI, ifindex and port are mutually exclusive with NH_ID");1165		return -EINVAL;1166	}1167 1168	if (tb[NDA_DST]) {1169		err = vxlan_nla_get_addr(ip, tb[NDA_DST]);1170		if (err) {1171			NL_SET_ERR_MSG(extack, "Unsupported address family");1172			return err;1173		}1174	} else {1175		union vxlan_addr *remote = &vxlan->default_dst.remote_ip;1176 1177		if (remote->sa.sa_family == AF_INET) {1178			ip->sin.sin_addr.s_addr = htonl(INADDR_ANY);1179			ip->sa.sa_family = AF_INET;1180#if IS_ENABLED(CONFIG_IPV6)1181		} else {1182			ip->sin6.sin6_addr = in6addr_any;1183			ip->sa.sa_family = AF_INET6;1184#endif1185		}1186	}1187 1188	if (tb[NDA_PORT]) {1189		if (nla_len(tb[NDA_PORT]) != sizeof(__be16)) {1190			NL_SET_ERR_MSG(extack, "Invalid vxlan port");1191			return -EINVAL;1192		}1193		*port = nla_get_be16(tb[NDA_PORT]);1194	} else {1195		*port = vxlan->cfg.dst_port;1196	}1197 1198	if (tb[NDA_VNI]) {1199		if (nla_len(tb[NDA_VNI]) != sizeof(u32)) {1200			NL_SET_ERR_MSG(extack, "Invalid vni");1201			return -EINVAL;1202		}1203		*vni = cpu_to_be32(nla_get_u32(tb[NDA_VNI]));1204	} else {1205		*vni = vxlan->default_dst.remote_vni;1206	}1207 1208	if (tb[NDA_SRC_VNI]) {1209		if (nla_len(tb[NDA_SRC_VNI]) != sizeof(u32)) {1210			NL_SET_ERR_MSG(extack, "Invalid src vni");1211			return -EINVAL;1212		}1213		*src_vni = cpu_to_be32(nla_get_u32(tb[NDA_SRC_VNI]));1214	} else {1215		*src_vni = vxlan->default_dst.remote_vni;1216	}1217 1218	if (tb[NDA_IFINDEX]) {1219		struct net_device *tdev;1220 1221		if (nla_len(tb[NDA_IFINDEX]) != sizeof(u32)) {1222			NL_SET_ERR_MSG(extack, "Invalid ifindex");1223			return -EINVAL;1224		}1225		*ifindex = nla_get_u32(tb[NDA_IFINDEX]);1226		tdev = __dev_get_by_index(net, *ifindex);1227		if (!tdev) {1228			NL_SET_ERR_MSG(extack, "Device not found");1229			return -EADDRNOTAVAIL;1230		}1231	} else {1232		*ifindex = 0;1233	}1234 1235	if (tb[NDA_NH_ID])1236		*nhid = nla_get_u32(tb[NDA_NH_ID]);1237	else1238		*nhid = 0;1239 1240	return 0;1241}1242 1243/* Add static entry (via netlink) */1244static int vxlan_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],1245			 struct net_device *dev,1246			 const unsigned char *addr, u16 vid, u16 flags,1247			 struct netlink_ext_ack *extack)1248{1249	struct vxlan_dev *vxlan = netdev_priv(dev);1250	/* struct net *net = dev_net(vxlan->dev); */1251	union vxlan_addr ip;1252	__be16 port;1253	__be32 src_vni, vni;1254	u32 ifindex, nhid;1255	u32 hash_index;1256	int err;1257 1258	if (!(ndm->ndm_state & (NUD_PERMANENT|NUD_REACHABLE))) {1259		pr_info("RTM_NEWNEIGH with invalid state %#x\n",1260			ndm->ndm_state);1261		return -EINVAL;1262	}1263 1264	if (!tb || (!tb[NDA_DST] && !tb[NDA_NH_ID]))1265		return -EINVAL;1266 1267	err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex,1268			      &nhid, extack);1269	if (err)1270		return err;1271 1272	if (vxlan->default_dst.remote_ip.sa.sa_family != ip.sa.sa_family)1273		return -EAFNOSUPPORT;1274 1275	hash_index = fdb_head_index(vxlan, addr, src_vni);1276	spin_lock_bh(&vxlan->hash_lock[hash_index]);1277	err = vxlan_fdb_update(vxlan, addr, &ip, ndm->ndm_state, flags,1278			       port, src_vni, vni, ifindex,1279			       ndm->ndm_flags | NTF_VXLAN_ADDED_BY_USER,1280			       nhid, true, extack);1281	spin_unlock_bh(&vxlan->hash_lock[hash_index]);1282 1283	return err;1284}1285 1286int __vxlan_fdb_delete(struct vxlan_dev *vxlan,1287		       const unsigned char *addr, union vxlan_addr ip,1288		       __be16 port, __be32 src_vni, __be32 vni,1289		       u32 ifindex, bool swdev_notify)1290{1291	struct vxlan_rdst *rd = NULL;1292	struct vxlan_fdb *f;1293	int err = -ENOENT;1294 1295	f = vxlan_find_mac(vxlan, addr, src_vni);1296	if (!f)1297		return err;1298 1299	if (!vxlan_addr_any(&ip)) {1300		rd = vxlan_fdb_find_rdst(f, &ip, port, vni, ifindex);1301		if (!rd)1302			goto out;1303	}1304 1305	/* remove a destination if it's not the only one on the list,1306	 * otherwise destroy the fdb entry1307	 */1308	if (rd && !list_is_singular(&f->remotes)) {1309		vxlan_fdb_dst_destroy(vxlan, f, rd, swdev_notify);1310		goto out;1311	}1312 1313	vxlan_fdb_destroy(vxlan, f, true, swdev_notify);1314 1315out:1316	return 0;1317}1318 1319/* Delete entry (via netlink) */1320static int vxlan_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],1321			    struct net_device *dev,1322			    const unsigned char *addr, u16 vid,1323			    struct netlink_ext_ack *extack)1324{1325	struct vxlan_dev *vxlan = netdev_priv(dev);1326	union vxlan_addr ip;1327	__be32 src_vni, vni;1328	u32 ifindex, nhid;1329	u32 hash_index;1330	__be16 port;1331	int err;1332 1333	err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex,1334			      &nhid, extack);1335	if (err)1336		return err;1337 1338	hash_index = fdb_head_index(vxlan, addr, src_vni);1339	spin_lock_bh(&vxlan->hash_lock[hash_index]);1340	err = __vxlan_fdb_delete(vxlan, addr, ip, port, src_vni, vni, ifindex,1341				 true);1342	spin_unlock_bh(&vxlan->hash_lock[hash_index]);1343 1344	return err;1345}1346 1347/* Dump forwarding table */1348static int vxlan_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,1349			  struct net_device *dev,1350			  struct net_device *filter_dev, int *idx)1351{1352	struct vxlan_dev *vxlan = netdev_priv(dev);1353	unsigned int h;1354	int err = 0;1355 1356	for (h = 0; h < FDB_HASH_SIZE; ++h) {1357		struct vxlan_fdb *f;1358 1359		rcu_read_lock();1360		hlist_for_each_entry_rcu(f, &vxlan->fdb_head[h], hlist) {1361			struct vxlan_rdst *rd;1362 1363			if (rcu_access_pointer(f->nh)) {1364				if (*idx < cb->args[2])1365					goto skip_nh;1366				err = vxlan_fdb_info(skb, vxlan, f,1367						     NETLINK_CB(cb->skb).portid,1368						     cb->nlh->nlmsg_seq,1369						     RTM_NEWNEIGH,1370						     NLM_F_MULTI, NULL);1371				if (err < 0) {1372					rcu_read_unlock();1373					goto out;1374				}1375skip_nh:1376				*idx += 1;1377				continue;1378			}1379 1380			list_for_each_entry_rcu(rd, &f->remotes, list) {1381				if (*idx < cb->args[2])1382					goto skip;1383 1384				err = vxlan_fdb_info(skb, vxlan, f,1385						     NETLINK_CB(cb->skb).portid,1386						     cb->nlh->nlmsg_seq,1387						     RTM_NEWNEIGH,1388						     NLM_F_MULTI, rd);1389				if (err < 0) {1390					rcu_read_unlock();1391					goto out;1392				}1393skip:1394				*idx += 1;1395			}1396		}1397		rcu_read_unlock();1398	}1399out:1400	return err;1401}1402 1403static int vxlan_fdb_get(struct sk_buff *skb,1404			 struct nlattr *tb[],1405			 struct net_device *dev,1406			 const unsigned char *addr,1407			 u16 vid, u32 portid, u32 seq,1408			 struct netlink_ext_ack *extack)1409{1410	struct vxlan_dev *vxlan = netdev_priv(dev);1411	struct vxlan_fdb *f;1412	__be32 vni;1413	int err;1414 1415	if (tb[NDA_VNI])1416		vni = cpu_to_be32(nla_get_u32(tb[NDA_VNI]));1417	else1418		vni = vxlan->default_dst.remote_vni;1419 1420	rcu_read_lock();1421 1422	f = __vxlan_find_mac(vxlan, addr, vni);1423	if (!f) {1424		NL_SET_ERR_MSG(extack, "Fdb entry not found");1425		err = -ENOENT;1426		goto errout;1427	}1428 1429	err = vxlan_fdb_info(skb, vxlan, f, portid, seq,1430			     RTM_NEWNEIGH, 0, first_remote_rcu(f));1431errout:1432	rcu_read_unlock();1433	return err;1434}1435 1436/* Watch incoming packets to learn mapping between Ethernet address1437 * and Tunnel endpoint.1438 * Return true if packet is bogus and should be dropped.1439 */1440static bool vxlan_snoop(struct net_device *dev,1441			union vxlan_addr *src_ip, const u8 *src_mac,1442			u32 src_ifindex, __be32 vni)1443{1444	struct vxlan_dev *vxlan = netdev_priv(dev);1445	struct vxlan_fdb *f;1446	u32 ifindex = 0;1447 1448	/* Ignore packets from invalid src-address */1449	if (!is_valid_ether_addr(src_mac))1450		return true;1451 1452#if IS_ENABLED(CONFIG_IPV6)1453	if (src_ip->sa.sa_family == AF_INET6 &&1454	    (ipv6_addr_type(&src_ip->sin6.sin6_addr) & IPV6_ADDR_LINKLOCAL))1455		ifindex = src_ifindex;1456#endif1457 1458	f = vxlan_find_mac(vxlan, src_mac, vni);1459	if (likely(f)) {1460		struct vxlan_rdst *rdst = first_remote_rcu(f);1461 1462		if (likely(vxlan_addr_equal(&rdst->remote_ip, src_ip) &&1463			   rdst->remote_ifindex == ifindex))1464			return false;1465 1466		/* Don't migrate static entries, drop packets */1467		if (f->state & (NUD_PERMANENT | NUD_NOARP))1468			return true;1469 1470		/* Don't override an fdb with nexthop with a learnt entry */1471		if (rcu_access_pointer(f->nh))1472			return true;1473 1474		if (net_ratelimit())1475			netdev_info(dev,1476				    "%pM migrated from %pIS to %pIS\n",1477				    src_mac, &rdst->remote_ip.sa, &src_ip->sa);1478 1479		rdst->remote_ip = *src_ip;1480		f->updated = jiffies;1481		vxlan_fdb_notify(vxlan, f, rdst, RTM_NEWNEIGH, true, NULL);1482	} else {1483		u32 hash_index = fdb_head_index(vxlan, src_mac, vni);1484 1485		/* learned new entry */1486		spin_lock(&vxlan->hash_lock[hash_index]);1487 1488		/* close off race between vxlan_flush and incoming packets */1489		if (netif_running(dev))1490			vxlan_fdb_update(vxlan, src_mac, src_ip,1491					 NUD_REACHABLE,1492					 NLM_F_EXCL|NLM_F_CREATE,1493					 vxlan->cfg.dst_port,1494					 vni,1495					 vxlan->default_dst.remote_vni,1496					 ifindex, NTF_SELF, 0, true, NULL);1497		spin_unlock(&vxlan->hash_lock[hash_index]);1498	}1499 1500	return false;1501}1502 1503static bool __vxlan_sock_release_prep(struct vxlan_sock *vs)1504{1505	struct vxlan_net *vn;1506 1507	if (!vs)1508		return false;1509	if (!refcount_dec_and_test(&vs->refcnt))1510		return false;1511 1512	vn = net_generic(sock_net(vs->sock->sk), vxlan_net_id);1513	spin_lock(&vn->sock_lock);1514	hlist_del_rcu(&vs->hlist);1515	udp_tunnel_notify_del_rx_port(vs->sock,1516				      (vs->flags & VXLAN_F_GPE) ?1517				      UDP_TUNNEL_TYPE_VXLAN_GPE :1518				      UDP_TUNNEL_TYPE_VXLAN);1519	spin_unlock(&vn->sock_lock);1520 1521	return true;1522}1523 1524static void vxlan_sock_release(struct vxlan_dev *vxlan)1525{1526	struct vxlan_sock *sock4 = rtnl_dereference(vxlan->vn4_sock);1527#if IS_ENABLED(CONFIG_IPV6)1528	struct vxlan_sock *sock6 = rtnl_dereference(vxlan->vn6_sock);1529 1530	RCU_INIT_POINTER(vxlan->vn6_sock, NULL);1531#endif1532 1533	RCU_INIT_POINTER(vxlan->vn4_sock, NULL);1534	synchronize_net();1535 1536	if (vxlan->cfg.flags & VXLAN_F_VNIFILTER)1537		vxlan_vs_del_vnigrp(vxlan);1538	else1539		vxlan_vs_del_dev(vxlan);1540 1541	if (__vxlan_sock_release_prep(sock4)) {1542		udp_tunnel_sock_release(sock4->sock);1543		kfree(sock4);1544	}1545 1546#if IS_ENABLED(CONFIG_IPV6)1547	if (__vxlan_sock_release_prep(sock6)) {1548		udp_tunnel_sock_release(sock6->sock);1549		kfree(sock6);1550	}1551#endif1552}1553 1554static bool vxlan_remcsum(struct vxlanhdr *unparsed,1555			  struct sk_buff *skb, u32 vxflags)1556{1557	size_t start, offset;1558 1559	if (!(unparsed->vx_flags & VXLAN_HF_RCO) || skb->remcsum_offload)1560		goto out;1561 1562	start = vxlan_rco_start(unparsed->vx_vni);1563	offset = start + vxlan_rco_offset(unparsed->vx_vni);1564 1565	if (!pskb_may_pull(skb, offset + sizeof(u16)))1566		return false;1567 1568	skb_remcsum_process(skb, (void *)(vxlan_hdr(skb) + 1), start, offset,1569			    !!(vxflags & VXLAN_F_REMCSUM_NOPARTIAL));1570out:1571	unparsed->vx_flags &= ~VXLAN_HF_RCO;1572	unparsed->vx_vni &= VXLAN_VNI_MASK;1573	return true;1574}1575 1576static void vxlan_parse_gbp_hdr(struct vxlanhdr *unparsed,1577				struct sk_buff *skb, u32 vxflags,1578				struct vxlan_metadata *md)1579{1580	struct vxlanhdr_gbp *gbp = (struct vxlanhdr_gbp *)unparsed;1581	struct metadata_dst *tun_dst;1582 1583	if (!(unparsed->vx_flags & VXLAN_HF_GBP))1584		goto out;1585 1586	md->gbp = ntohs(gbp->policy_id);1587 1588	tun_dst = (struct metadata_dst *)skb_dst(skb);1589	if (tun_dst) {1590		__set_bit(IP_TUNNEL_VXLAN_OPT_BIT,1591			  tun_dst->u.tun_info.key.tun_flags);1592		tun_dst->u.tun_info.options_len = sizeof(*md);1593	}1594	if (gbp->dont_learn)1595		md->gbp |= VXLAN_GBP_DONT_LEARN;1596 1597	if (gbp->policy_applied)1598		md->gbp |= VXLAN_GBP_POLICY_APPLIED;1599 1600	/* In flow-based mode, GBP is carried in dst_metadata */1601	if (!(vxflags & VXLAN_F_COLLECT_METADATA))1602		skb->mark = md->gbp;1603out:1604	unparsed->vx_flags &= ~VXLAN_GBP_USED_BITS;1605}1606 1607static bool vxlan_set_mac(struct vxlan_dev *vxlan,1608			  struct vxlan_sock *vs,1609			  struct sk_buff *skb, __be32 vni)1610{1611	union vxlan_addr saddr;1612	u32 ifindex = skb->dev->ifindex;1613 1614	skb_reset_mac_header(skb);1615	skb->protocol = eth_type_trans(skb, vxlan->dev);1616	skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);1617 1618	/* Ignore packet loops (and multicast echo) */1619	if (ether_addr_equal(eth_hdr(skb)->h_source, vxlan->dev->dev_addr))1620		return false;1621 1622	/* Get address from the outer IP header */1623	if (vxlan_get_sk_family(vs) == AF_INET) {1624		saddr.sin.sin_addr.s_addr = ip_hdr(skb)->saddr;1625		saddr.sa.sa_family = AF_INET;1626#if IS_ENABLED(CONFIG_IPV6)1627	} else {1628		saddr.sin6.sin6_addr = ipv6_hdr(skb)->saddr;1629		saddr.sa.sa_family = AF_INET6;1630#endif1631	}1632 1633	if ((vxlan->cfg.flags & VXLAN_F_LEARN) &&1634	    vxlan_snoop(skb->dev, &saddr, eth_hdr(skb)->h_source, ifindex, vni))1635		return false;1636 1637	return true;1638}1639 1640static bool vxlan_ecn_decapsulate(struct vxlan_sock *vs, void *oiph,1641				  struct sk_buff *skb)1642{1643	int err = 0;1644 1645	if (vxlan_get_sk_family(vs) == AF_INET)1646		err = IP_ECN_decapsulate(oiph, skb);1647#if IS_ENABLED(CONFIG_IPV6)1648	else1649		err = IP6_ECN_decapsulate(oiph, skb);1650#endif1651 1652	if (unlikely(err) && log_ecn_error) {1653		if (vxlan_get_sk_family(vs) == AF_INET)1654			net_info_ratelimited("non-ECT from %pI4 with TOS=%#x\n",1655					     &((struct iphdr *)oiph)->saddr,1656					     ((struct iphdr *)oiph)->tos);1657		else1658			net_info_ratelimited("non-ECT from %pI6\n",1659					     &((struct ipv6hdr *)oiph)->saddr);1660	}1661	return err <= 1;1662}1663 1664/* Callback from net/ipv4/udp.c to receive packets */1665static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)1666{1667	struct vxlan_vni_node *vninode = NULL;1668	struct vxlan_dev *vxlan;1669	struct vxlan_sock *vs;1670	struct vxlanhdr unparsed;1671	struct vxlan_metadata _md;1672	struct vxlan_metadata *md = &_md;1673	__be16 protocol = htons(ETH_P_TEB);1674	bool raw_proto = false;1675	void *oiph;1676	__be32 vni = 0;1677	int nh;1678 1679	/* Need UDP and VXLAN header to be present */1680	if (!pskb_may_pull(skb, VXLAN_HLEN))1681		goto drop;1682 1683	unparsed = *vxlan_hdr(skb);1684	/* VNI flag always required to be set */1685	if (!(unparsed.vx_flags & VXLAN_HF_VNI)) {1686		netdev_dbg(skb->dev, "invalid vxlan flags=%#x vni=%#x\n",1687			   ntohl(vxlan_hdr(skb)->vx_flags),1688			   ntohl(vxlan_hdr(skb)->vx_vni));1689		/* Return non vxlan pkt */1690		goto drop;1691	}1692	unparsed.vx_flags &= ~VXLAN_HF_VNI;1693	unparsed.vx_vni &= ~VXLAN_VNI_MASK;1694 1695	vs = rcu_dereference_sk_user_data(sk);1696	if (!vs)1697		goto drop;1698 1699	vni = vxlan_vni(vxlan_hdr(skb)->vx_vni);1700 1701	vxlan = vxlan_vs_find_vni(vs, skb->dev->ifindex, vni, &vninode);1702	if (!vxlan)1703		goto drop;1704 1705	/* For backwards compatibility, only allow reserved fields to be1706	 * used by VXLAN extensions if explicitly requested.1707	 */1708	if (vs->flags & VXLAN_F_GPE) {1709		if (!vxlan_parse_gpe_proto(&unparsed, &protocol))1710			goto drop;1711		unparsed.vx_flags &= ~VXLAN_GPE_USED_BITS;1712		raw_proto = true;1713	}1714 1715	if (__iptunnel_pull_header(skb, VXLAN_HLEN, protocol, raw_proto,1716				   !net_eq(vxlan->net, dev_net(vxlan->dev))))1717		goto drop;1718 1719	if (vs->flags & VXLAN_F_REMCSUM_RX)1720		if (unlikely(!vxlan_remcsum(&unparsed, skb, vs->flags)))1721			goto drop;1722 1723	if (vxlan_collect_metadata(vs)) {1724		IP_TUNNEL_DECLARE_FLAGS(flags) = { };1725		struct metadata_dst *tun_dst;1726 1727		__set_bit(IP_TUNNEL_KEY_BIT, flags);1728		tun_dst = udp_tun_rx_dst(skb, vxlan_get_sk_family(vs), flags,1729					 key32_to_tunnel_id(vni), sizeof(*md));1730 1731		if (!tun_dst)1732			goto drop;1733 1734		md = ip_tunnel_info_opts(&tun_dst->u.tun_info);1735 1736		skb_dst_set(skb, (struct dst_entry *)tun_dst);1737	} else {1738		memset(md, 0, sizeof(*md));1739	}1740 1741	if (vs->flags & VXLAN_F_GBP)1742		vxlan_parse_gbp_hdr(&unparsed, skb, vs->flags, md);1743	/* Note that GBP and GPE can never be active together. This is1744	 * ensured in vxlan_dev_configure.1745	 */1746 1747	if (unparsed.vx_flags || unparsed.vx_vni) {1748		/* If there are any unprocessed flags remaining treat1749		 * this as a malformed packet. This behavior diverges from1750		 * VXLAN RFC (RFC7348) which stipulates that bits in reserved1751		 * in reserved fields are to be ignored. The approach here1752		 * maintains compatibility with previous stack code, and also1753		 * is more robust and provides a little more security in1754		 * adding extensions to VXLAN.1755		 */1756		goto drop;1757	}1758 1759	if (!raw_proto) {1760		if (!vxlan_set_mac(vxlan, vs, skb, vni))1761			goto drop;1762	} else {1763		skb_reset_mac_header(skb);1764		skb->dev = vxlan->dev;1765		skb->pkt_type = PACKET_HOST;1766	}1767 1768	/* Save offset of outer header relative to skb->head,1769	 * because we are going to reset the network header to the inner header1770	 * and might change skb->head.1771	 */1772	nh = skb_network_header(skb) - skb->head;1773 1774	skb_reset_network_header(skb);1775 1776	if (!pskb_inet_may_pull(skb)) {1777		DEV_STATS_INC(vxlan->dev, rx_length_errors);1778		DEV_STATS_INC(vxlan->dev, rx_errors);1779		vxlan_vnifilter_count(vxlan, vni, vninode,1780				      VXLAN_VNI_STATS_RX_ERRORS, 0);1781		goto drop;1782	}1783 1784	/* Get the outer header. */1785	oiph = skb->head + nh;1786 1787	if (!vxlan_ecn_decapsulate(vs, oiph, skb)) {1788		DEV_STATS_INC(vxlan->dev, rx_frame_errors);1789		DEV_STATS_INC(vxlan->dev, rx_errors);1790		vxlan_vnifilter_count(vxlan, vni, vninode,1791				      VXLAN_VNI_STATS_RX_ERRORS, 0);1792		goto drop;1793	}1794 1795	rcu_read_lock();1796 1797	if (unlikely(!(vxlan->dev->flags & IFF_UP))) {1798		rcu_read_unlock();1799		dev_core_stats_rx_dropped_inc(vxlan->dev);1800		vxlan_vnifilter_count(vxlan, vni, vninode,1801				      VXLAN_VNI_STATS_RX_DROPS, 0);1802		goto drop;1803	}1804 1805	dev_sw_netstats_rx_add(vxlan->dev, skb->len);1806	vxlan_vnifilter_count(vxlan, vni, vninode, VXLAN_VNI_STATS_RX, skb->len);1807	gro_cells_receive(&vxlan->gro_cells, skb);1808 1809	rcu_read_unlock();1810 1811	return 0;1812 1813drop:1814	/* Consume bad packet */1815	kfree_skb(skb);1816	return 0;1817}1818 1819/* Callback from net/ipv{4,6}/udp.c to check that we have a VNI for errors */1820static int vxlan_err_lookup(struct sock *sk, struct sk_buff *skb)1821{1822	struct vxlan_dev *vxlan;1823	struct vxlan_sock *vs;1824	struct vxlanhdr *hdr;1825	__be32 vni;1826 1827	if (!pskb_may_pull(skb, skb_transport_offset(skb) + VXLAN_HLEN))1828		return -EINVAL;1829 1830	hdr = vxlan_hdr(skb);1831 1832	if (!(hdr->vx_flags & VXLAN_HF_VNI))1833		return -EINVAL;1834 1835	vs = rcu_dereference_sk_user_data(sk);1836	if (!vs)1837		return -ENOENT;1838 1839	vni = vxlan_vni(hdr->vx_vni);1840	vxlan = vxlan_vs_find_vni(vs, skb->dev->ifindex, vni, NULL);1841	if (!vxlan)1842		return -ENOENT;1843 1844	return 0;1845}1846 1847static int arp_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)1848{1849	struct vxlan_dev *vxlan = netdev_priv(dev);1850	struct arphdr *parp;1851	u8 *arpptr, *sha;1852	__be32 sip, tip;1853	struct neighbour *n;1854 1855	if (dev->flags & IFF_NOARP)1856		goto out;1857 1858	if (!pskb_may_pull(skb, arp_hdr_len(dev))) {1859		dev_core_stats_tx_dropped_inc(dev);1860		vxlan_vnifilter_count(vxlan, vni, NULL,1861				      VXLAN_VNI_STATS_TX_DROPS, 0);1862		goto out;1863	}1864	parp = arp_hdr(skb);1865 1866	if ((parp->ar_hrd != htons(ARPHRD_ETHER) &&1867	     parp->ar_hrd != htons(ARPHRD_IEEE802)) ||1868	    parp->ar_pro != htons(ETH_P_IP) ||1869	    parp->ar_op != htons(ARPOP_REQUEST) ||1870	    parp->ar_hln != dev->addr_len ||1871	    parp->ar_pln != 4)1872		goto out;1873	arpptr = (u8 *)parp + sizeof(struct arphdr);1874	sha = arpptr;1875	arpptr += dev->addr_len;	/* sha */1876	memcpy(&sip, arpptr, sizeof(sip));1877	arpptr += sizeof(sip);1878	arpptr += dev->addr_len;	/* tha */1879	memcpy(&tip, arpptr, sizeof(tip));1880 1881	if (ipv4_is_loopback(tip) ||1882	    ipv4_is_multicast(tip))1883		goto out;1884 1885	n = neigh_lookup(&arp_tbl, &tip, dev);1886 1887	if (n) {1888		struct vxlan_fdb *f;1889		struct sk_buff	*reply;1890 1891		if (!(READ_ONCE(n->nud_state) & NUD_CONNECTED)) {1892			neigh_release(n);1893			goto out;1894		}1895 1896		f = vxlan_find_mac(vxlan, n->ha, vni);1897		if (f && vxlan_addr_any(&(first_remote_rcu(f)->remote_ip))) {1898			/* bridge-local neighbor */1899			neigh_release(n);1900			goto out;1901		}1902 1903		reply = arp_create(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,1904				n->ha, sha);1905 1906		neigh_release(n);1907 1908		if (reply == NULL)1909			goto out;1910 1911		skb_reset_mac_header(reply);1912		__skb_pull(reply, skb_network_offset(reply));1913		reply->ip_summed = CHECKSUM_UNNECESSARY;1914		reply->pkt_type = PACKET_HOST;1915 1916		if (netif_rx(reply) == NET_RX_DROP) {1917			dev_core_stats_rx_dropped_inc(dev);1918			vxlan_vnifilter_count(vxlan, vni, NULL,1919					      VXLAN_VNI_STATS_RX_DROPS, 0);1920		}1921 1922	} else if (vxlan->cfg.flags & VXLAN_F_L3MISS) {1923		union vxlan_addr ipa = {1924			.sin.sin_addr.s_addr = tip,1925			.sin.sin_family = AF_INET,1926		};1927 1928		vxlan_ip_miss(dev, &ipa);1929	}1930out:1931	consume_skb(skb);1932	return NETDEV_TX_OK;1933}1934 1935#if IS_ENABLED(CONFIG_IPV6)1936static struct sk_buff *vxlan_na_create(struct sk_buff *request,1937	struct neighbour *n, bool isrouter)1938{1939	struct net_device *dev = request->dev;1940	struct sk_buff *reply;1941	struct nd_msg *ns, *na;1942	struct ipv6hdr *pip6;1943	u8 *daddr;1944	int na_olen = 8; /* opt hdr + ETH_ALEN for target */1945	int ns_olen;1946	int i, len;1947 1948	if (dev == NULL || !pskb_may_pull(request, request->len))1949		return NULL;1950 1951	len = LL_RESERVED_SPACE(dev) + sizeof(struct ipv6hdr) +1952		sizeof(*na) + na_olen + dev->needed_tailroom;1953	reply = alloc_skb(len, GFP_ATOMIC);1954	if (reply == NULL)1955		return NULL;1956 1957	reply->protocol = htons(ETH_P_IPV6);1958	reply->dev = dev;1959	skb_reserve(reply, LL_RESERVED_SPACE(request->dev));1960	skb_push(reply, sizeof(struct ethhdr));1961	skb_reset_mac_header(reply);1962 1963	ns = (struct nd_msg *)(ipv6_hdr(request) + 1);1964 1965	daddr = eth_hdr(request)->h_source;1966	ns_olen = request->len - skb_network_offset(request) -1967		sizeof(struct ipv6hdr) - sizeof(*ns);1968	for (i = 0; i < ns_olen-1; i += (ns->opt[i+1]<<3)) {1969		if (!ns->opt[i + 1]) {1970			kfree_skb(reply);1971			return NULL;1972		}1973		if (ns->opt[i] == ND_OPT_SOURCE_LL_ADDR) {1974			daddr = ns->opt + i + sizeof(struct nd_opt_hdr);1975			break;1976		}1977	}1978 1979	/* Ethernet header */1980	ether_addr_copy(eth_hdr(reply)->h_dest, daddr);1981	ether_addr_copy(eth_hdr(reply)->h_source, n->ha);1982	eth_hdr(reply)->h_proto = htons(ETH_P_IPV6);1983	reply->protocol = htons(ETH_P_IPV6);1984 1985	skb_pull(reply, sizeof(struct ethhdr));1986	skb_reset_network_header(reply);1987	skb_put(reply, sizeof(struct ipv6hdr));1988 1989	/* IPv6 header */1990 1991	pip6 = ipv6_hdr(reply);1992	memset(pip6, 0, sizeof(struct ipv6hdr));1993	pip6->version = 6;1994	pip6->priority = ipv6_hdr(request)->priority;1995	pip6->nexthdr = IPPROTO_ICMPV6;1996	pip6->hop_limit = 255;1997	pip6->daddr = ipv6_hdr(request)->saddr;1998	pip6->saddr = *(struct in6_addr *)n->primary_key;1999 2000	skb_pull(reply, sizeof(struct ipv6hdr));2001	skb_reset_transport_header(reply);2002 2003	/* Neighbor Advertisement */2004	na = skb_put_zero(reply, sizeof(*na) + na_olen);2005	na->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT;2006	na->icmph.icmp6_router = isrouter;2007	na->icmph.icmp6_override = 1;2008	na->icmph.icmp6_solicited = 1;2009	na->target = ns->target;2010	ether_addr_copy(&na->opt[2], n->ha);2011	na->opt[0] = ND_OPT_TARGET_LL_ADDR;2012	na->opt[1] = na_olen >> 3;2013 2014	na->icmph.icmp6_cksum = csum_ipv6_magic(&pip6->saddr,2015		&pip6->daddr, sizeof(*na)+na_olen, IPPROTO_ICMPV6,2016		csum_partial(na, sizeof(*na)+na_olen, 0));2017 2018	pip6->payload_len = htons(sizeof(*na)+na_olen);2019 2020	skb_push(reply, sizeof(struct ipv6hdr));2021 2022	reply->ip_summed = CHECKSUM_UNNECESSARY;2023 2024	return reply;2025}2026 2027static int neigh_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)2028{2029	struct vxlan_dev *vxlan = netdev_priv(dev);2030	const struct in6_addr *daddr;2031	const struct ipv6hdr *iphdr;2032	struct inet6_dev *in6_dev;2033	struct neighbour *n;2034	struct nd_msg *msg;2035 2036	rcu_read_lock();2037	in6_dev = __in6_dev_get(dev);2038	if (!in6_dev)2039		goto out;2040 2041	iphdr = ipv6_hdr(skb);2042	daddr = &iphdr->daddr;2043	msg = (struct nd_msg *)(iphdr + 1);2044 2045	if (ipv6_addr_loopback(daddr) ||2046	    ipv6_addr_is_multicast(&msg->target))2047		goto out;2048 2049	n = neigh_lookup(ipv6_stub->nd_tbl, &msg->target, dev);2050 2051	if (n) {2052		struct vxlan_fdb *f;2053		struct sk_buff *reply;2054 2055		if (!(READ_ONCE(n->nud_state) & NUD_CONNECTED)) {2056			neigh_release(n);2057			goto out;2058		}2059 2060		f = vxlan_find_mac(vxlan, n->ha, vni);2061		if (f && vxlan_addr_any(&(first_remote_rcu(f)->remote_ip))) {2062			/* bridge-local neighbor */2063			neigh_release(n);2064			goto out;2065		}2066 2067		reply = vxlan_na_create(skb, n,2068					!!(f ? f->flags & NTF_ROUTER : 0));2069 2070		neigh_release(n);2071 2072		if (reply == NULL)2073			goto out;2074 2075		if (netif_rx(reply) == NET_RX_DROP) {2076			dev_core_stats_rx_dropped_inc(dev);2077			vxlan_vnifilter_count(vxlan, vni, NULL,2078					      VXLAN_VNI_STATS_RX_DROPS, 0);2079		}2080	} else if (vxlan->cfg.flags & VXLAN_F_L3MISS) {2081		union vxlan_addr ipa = {2082			.sin6.sin6_addr = msg->target,2083			.sin6.sin6_family = AF_INET6,2084		};2085 2086		vxlan_ip_miss(dev, &ipa);2087	}2088 2089out:2090	rcu_read_unlock();2091	consume_skb(skb);2092	return NETDEV_TX_OK;2093}2094#endif2095 2096static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb)2097{2098	struct vxlan_dev *vxlan = netdev_priv(dev);2099	struct neighbour *n;2100 2101	if (is_multicast_ether_addr(eth_hdr(skb)->h_dest))2102		return false;2103 2104	n = NULL;2105	switch (ntohs(eth_hdr(skb)->h_proto)) {2106	case ETH_P_IP:2107	{2108		struct iphdr *pip;2109 2110		if (!pskb_may_pull(skb, sizeof(struct iphdr)))2111			return false;2112		pip = ip_hdr(skb);2113		n = neigh_lookup(&arp_tbl, &pip->daddr, dev);2114		if (!n && (vxlan->cfg.flags & VXLAN_F_L3MISS)) {2115			union vxlan_addr ipa = {2116				.sin.sin_addr.s_addr = pip->daddr,2117				.sin.sin_family = AF_INET,2118			};2119 2120			vxlan_ip_miss(dev, &ipa);2121			return false;2122		}2123 2124		break;2125	}2126#if IS_ENABLED(CONFIG_IPV6)2127	case ETH_P_IPV6:2128	{2129		struct ipv6hdr *pip6;2130 2131		if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))2132			return false;2133		pip6 = ipv6_hdr(skb);2134		n = neigh_lookup(ipv6_stub->nd_tbl, &pip6->daddr, dev);2135		if (!n && (vxlan->cfg.flags & VXLAN_F_L3MISS)) {2136			union vxlan_addr ipa = {2137				.sin6.sin6_addr = pip6->daddr,2138				.sin6.sin6_family = AF_INET6,2139			};2140 2141			vxlan_ip_miss(dev, &ipa);2142			return false;2143		}2144 2145		break;2146	}2147#endif2148	default:2149		return false;2150	}2151 2152	if (n) {2153		bool diff;2154 2155		diff = !ether_addr_equal(eth_hdr(skb)->h_dest, n->ha);2156		if (diff) {2157			memcpy(eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest,2158				dev->addr_len);2159			memcpy(eth_hdr(skb)->h_dest, n->ha, dev->addr_len);2160		}2161		neigh_release(n);2162		return diff;2163	}2164 2165	return false;2166}2167 2168static int vxlan_build_gpe_hdr(struct vxlanhdr *vxh, __be16 protocol)2169{2170	struct vxlanhdr_gpe *gpe = (struct vxlanhdr_gpe *)vxh;2171 2172	gpe->np_applied = 1;2173	gpe->next_protocol = tun_p_from_eth_p(protocol);2174	if (!gpe->next_protocol)2175		return -EPFNOSUPPORT;2176	return 0;2177}2178 2179static int vxlan_build_skb(struct sk_buff *skb, struct dst_entry *dst,2180			   int iphdr_len, __be32 vni,2181			   struct vxlan_metadata *md, u32 vxflags,2182			   bool udp_sum)2183{2184	struct vxlanhdr *vxh;2185	int min_headroom;2186	int err;2187	int type = udp_sum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL;2188	__be16 inner_protocol = htons(ETH_P_TEB);2189 2190	if ((vxflags & VXLAN_F_REMCSUM_TX) &&2191	    skb->ip_summed == CHECKSUM_PARTIAL) {2192		int csum_start = skb_checksum_start_offset(skb);2193 2194		if (csum_start <= VXLAN_MAX_REMCSUM_START &&2195		    !(csum_start & VXLAN_RCO_SHIFT_MASK) &&2196		    (skb->csum_offset == offsetof(struct udphdr, check) ||2197		     skb->csum_offset == offsetof(struct tcphdr, check)))2198			type |= SKB_GSO_TUNNEL_REMCSUM;2199	}2200 2201	min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len2202			+ VXLAN_HLEN + iphdr_len;2203 2204	/* Need space for new headers (invalidates iph ptr) */2205	err = skb_cow_head(skb, min_headroom);2206	if (unlikely(err))2207		return err;2208 2209	err = iptunnel_handle_offloads(skb, type);2210	if (err)2211		return err;2212 2213	vxh = __skb_push(skb, sizeof(*vxh));2214	vxh->vx_flags = VXLAN_HF_VNI;2215	vxh->vx_vni = vxlan_vni_field(vni);2216 2217	if (type & SKB_GSO_TUNNEL_REMCSUM) {2218		unsigned int start;2219 2220		start = skb_checksum_start_offset(skb) - sizeof(struct vxlanhdr);2221		vxh->vx_vni |= vxlan_compute_rco(start, skb->csum_offset);2222		vxh->vx_flags |= VXLAN_HF_RCO;2223 2224		if (!skb_is_gso(skb)) {2225			skb->ip_summed = CHECKSUM_NONE;2226			skb->encapsulation = 0;2227		}2228	}2229 2230	if (vxflags & VXLAN_F_GBP)2231		vxlan_build_gbp_hdr(vxh, md);2232	if (vxflags & VXLAN_F_GPE) {2233		err = vxlan_build_gpe_hdr(vxh, skb->protocol);2234		if (err < 0)2235			return err;2236		inner_protocol = skb->protocol;2237	}2238 2239	skb_set_inner_protocol(skb, inner_protocol);2240	return 0;2241}2242 2243/* Bypass encapsulation if the destination is local */2244static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan,2245			       struct vxlan_dev *dst_vxlan, __be32 vni,2246			       bool snoop)2247{2248	union vxlan_addr loopback;2249	union vxlan_addr *remote_ip = &dst_vxlan->default_dst.remote_ip;2250	struct net_device *dev;2251	int len = skb->len;2252 2253	skb->pkt_type = PACKET_HOST;2254	skb->encapsulation = 0;2255	skb->dev = dst_vxlan->dev;2256	__skb_pull(skb, skb_network_offset(skb));2257 2258	if (remote_ip->sa.sa_family == AF_INET) {2259		loopback.sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);2260		loopback.sa.sa_family =  AF_INET;2261#if IS_ENABLED(CONFIG_IPV6)2262	} else {2263		loopback.sin6.sin6_addr = in6addr_loopback;2264		loopback.sa.sa_family =  AF_INET6;2265#endif2266	}2267 2268	rcu_read_lock();2269	dev = skb->dev;2270	if (unlikely(!(dev->flags & IFF_UP))) {2271		kfree_skb(skb);2272		goto drop;2273	}2274 2275	if ((dst_vxlan->cfg.flags & VXLAN_F_LEARN) && snoop)2276		vxlan_snoop(dev, &loopback, eth_hdr(skb)->h_source, 0, vni);2277 2278	dev_sw_netstats_tx_add(src_vxlan->dev, 1, len);2279	vxlan_vnifilter_count(src_vxlan, vni, NULL, VXLAN_VNI_STATS_TX, len);2280 2281	if (__netif_rx(skb) == NET_RX_SUCCESS) {2282		dev_sw_netstats_rx_add(dst_vxlan->dev, len);2283		vxlan_vnifilter_count(dst_vxlan, vni, NULL, VXLAN_VNI_STATS_RX,2284				      len);2285	} else {2286drop:2287		dev_core_stats_rx_dropped_inc(dev);2288		vxlan_vnifilter_count(dst_vxlan, vni, NULL,2289				      VXLAN_VNI_STATS_RX_DROPS, 0);2290	}2291	rcu_read_unlock();2292}2293 2294static int encap_bypass_if_local(struct sk_buff *skb, struct net_device *dev,2295				 struct vxlan_dev *vxlan,2296				 int addr_family,2297				 __be16 dst_port, int dst_ifindex, __be32 vni,2298				 struct dst_entry *dst,2299				 u32 rt_flags)2300{2301#if IS_ENABLED(CONFIG_IPV6)2302	/* IPv6 rt-flags are checked against RTF_LOCAL, but the value of2303	 * RTF_LOCAL is equal to RTCF_LOCAL. So to keep code simple2304	 * we can use RTCF_LOCAL which works for ipv4 and ipv6 route entry.2305	 */2306	BUILD_BUG_ON(RTCF_LOCAL != RTF_LOCAL);2307#endif2308	/* Bypass encapsulation if the destination is local */2309	if (rt_flags & RTCF_LOCAL &&2310	    !(rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) &&2311	    vxlan->cfg.flags & VXLAN_F_LOCALBYPASS) {2312		struct vxlan_dev *dst_vxlan;2313 2314		dst_release(dst);2315		dst_vxlan = vxlan_find_vni(vxlan->net, dst_ifindex, vni,2316					   addr_family, dst_port,2317					   vxlan->cfg.flags);2318		if (!dst_vxlan) {2319			DEV_STATS_INC(dev, tx_errors);2320			vxlan_vnifilter_count(vxlan, vni, NULL,2321					      VXLAN_VNI_STATS_TX_ERRORS, 0);2322			kfree_skb(skb);2323 2324			return -ENOENT;2325		}2326		vxlan_encap_bypass(skb, vxlan, dst_vxlan, vni, true);2327		return 1;2328	}2329 2330	return 0;2331}2332 2333void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,2334		    __be32 default_vni, struct vxlan_rdst *rdst, bool did_rsc)2335{2336	struct dst_cache *dst_cache;2337	struct ip_tunnel_info *info;2338	struct ip_tunnel_key *pkey;2339	struct ip_tunnel_key key;2340	struct vxlan_dev *vxlan = netdev_priv(dev);2341	const struct iphdr *old_iph;2342	struct vxlan_metadata _md;2343	struct vxlan_metadata *md = &_md;2344	unsigned int pkt_len = skb->len;2345	__be16 src_port = 0, dst_port;2346	struct dst_entry *ndst = NULL;2347	int addr_family;2348	__u8 tos, ttl;2349	int ifindex;2350	int err;2351	u32 flags = vxlan->cfg.flags;2352	bool use_cache;2353	bool udp_sum = false;2354	bool xnet = !net_eq(vxlan->net, dev_net(vxlan->dev));2355	bool no_eth_encap;2356	__be32 vni = 0;2357 2358	no_eth_encap = flags & VXLAN_F_GPE && skb->protocol != htons(ETH_P_TEB);2359	if (!skb_vlan_inet_prepare(skb, no_eth_encap))2360		goto drop;2361 2362	old_iph = ip_hdr(skb);2363 2364	info = skb_tunnel_info(skb);2365	use_cache = ip_tunnel_dst_cache_usable(skb, info);2366 2367	if (rdst) {2368		memset(&key, 0, sizeof(key));2369		pkey = &key;2370 2371		if (vxlan_addr_any(&rdst->remote_ip)) {2372			if (did_rsc) {2373				/* short-circuited back to local bridge */2374				vxlan_encap_bypass(skb, vxlan, vxlan,2375						   default_vni, true);2376				return;2377			}2378			goto drop;2379		}2380 2381		addr_family = vxlan->cfg.saddr.sa.sa_family;2382		dst_port = rdst->remote_port ? rdst->remote_port : vxlan->cfg.dst_port;2383		vni = (rdst->remote_vni) ? : default_vni;2384		ifindex = rdst->remote_ifindex;2385 2386		if (addr_family == AF_INET) {2387			key.u.ipv4.src = vxlan->cfg.saddr.sin.sin_addr.s_addr;2388			key.u.ipv4.dst = rdst->remote_ip.sin.sin_addr.s_addr;2389		} else {2390			key.u.ipv6.src = vxlan->cfg.saddr.sin6.sin6_addr;2391			key.u.ipv6.dst = rdst->remote_ip.sin6.sin6_addr;2392		}2393 2394		dst_cache = &rdst->dst_cache;2395		md->gbp = skb->mark;2396		if (flags & VXLAN_F_TTL_INHERIT) {2397			ttl = ip_tunnel_get_ttl(old_iph, skb);2398		} else {2399			ttl = vxlan->cfg.ttl;2400			if (!ttl && vxlan_addr_multicast(&rdst->remote_ip))2401				ttl = 1;2402		}2403		tos = vxlan->cfg.tos;2404		if (tos == 1)2405			tos = ip_tunnel_get_dsfield(old_iph, skb);2406		if (tos && !info)2407			use_cache = false;2408 2409		if (addr_family == AF_INET)2410			udp_sum = !(flags & VXLAN_F_UDP_ZERO_CSUM_TX);2411		else2412			udp_sum = !(flags & VXLAN_F_UDP_ZERO_CSUM6_TX);2413#if IS_ENABLED(CONFIG_IPV6)2414		switch (vxlan->cfg.label_policy) {2415		case VXLAN_LABEL_FIXED:2416			key.label = vxlan->cfg.label;2417			break;2418		case VXLAN_LABEL_INHERIT:2419			key.label = ip_tunnel_get_flowlabel(old_iph, skb);2420			break;2421		default:2422			DEBUG_NET_WARN_ON_ONCE(1);2423			goto drop;2424		}2425#endif2426	} else {2427		if (!info) {2428			WARN_ONCE(1, "%s: Missing encapsulation instructions\n",2429				  dev->name);2430			goto drop;2431		}2432		pkey = &info->key;2433		addr_family = ip_tunnel_info_af(info);2434		dst_port = info->key.tp_dst ? : vxlan->cfg.dst_port;2435		vni = tunnel_id_to_key32(info->key.tun_id);2436		ifindex = 0;2437		dst_cache = &info->dst_cache;2438		if (test_bit(IP_TUNNEL_VXLAN_OPT_BIT, info->key.tun_flags)) {2439			if (info->options_len < sizeof(*md))2440				goto drop;2441			md = ip_tunnel_info_opts(info);2442		}2443		ttl = info->key.ttl;2444		tos = info->key.tos;2445		udp_sum = test_bit(IP_TUNNEL_CSUM_BIT, info->key.tun_flags);2446	}2447	src_port = udp_flow_src_port(dev_net(dev), skb, vxlan->cfg.port_min,2448				     vxlan->cfg.port_max, true);2449 2450	rcu_read_lock();2451	if (addr_family == AF_INET) {2452		struct vxlan_sock *sock4 = rcu_dereference(vxlan->vn4_sock);2453		struct rtable *rt;2454		__be16 df = 0;2455		__be32 saddr;2456 2457		if (!ifindex)2458			ifindex = sock4->sock->sk->sk_bound_dev_if;2459 2460		rt = udp_tunnel_dst_lookup(skb, dev, vxlan->net, ifindex,2461					   &saddr, pkey, src_port, dst_port,2462					   tos, use_cache ? dst_cache : NULL);2463		if (IS_ERR(rt)) {2464			err = PTR_ERR(rt);2465			goto tx_error;2466		}2467 2468		if (!info) {2469			/* Bypass encapsulation if the destination is local */2470			err = encap_bypass_if_local(skb, dev, vxlan, AF_INET,2471						    dst_port, ifindex, vni,2472						    &rt->dst, rt->rt_flags);2473			if (err)2474				goto out_unlock;2475 2476			if (vxlan->cfg.df == VXLAN_DF_SET) {2477				df = htons(IP_DF);2478			} else if (vxlan->cfg.df == VXLAN_DF_INHERIT) {2479				struct ethhdr *eth = eth_hdr(skb);2480 2481				if (ntohs(eth->h_proto) == ETH_P_IPV6 ||2482				    (ntohs(eth->h_proto) == ETH_P_IP &&2483				     old_iph->frag_off & htons(IP_DF)))2484					df = htons(IP_DF);2485			}2486		} else if (test_bit(IP_TUNNEL_DONT_FRAGMENT_BIT,2487				    info->key.tun_flags)) {2488			df = htons(IP_DF);2489		}2490 2491		ndst = &rt->dst;2492		err = skb_tunnel_check_pmtu(skb, ndst, vxlan_headroom(flags & VXLAN_F_GPE),2493					    netif_is_any_bridge_port(dev));2494		if (err < 0) {2495			goto tx_error;2496		} else if (err) {2497			if (info) {2498				struct ip_tunnel_info *unclone;2499 2500				unclone = skb_tunnel_info_unclone(skb);2501				if (unlikely(!unclone))2502					goto tx_error;2503 2504				unclone->key.u.ipv4.src = pkey->u.ipv4.dst;2505				unclone->key.u.ipv4.dst = saddr;2506			}2507			vxlan_encap_bypass(skb, vxlan, vxlan, vni, false);2508			dst_release(ndst);2509			goto out_unlock;2510		}2511 2512		tos = ip_tunnel_ecn_encap(tos, old_iph, skb);2513		ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);2514		err = vxlan_build_skb(skb, ndst, sizeof(struct iphdr),2515				      vni, md, flags, udp_sum);2516		if (err < 0)2517			goto tx_error;2518 2519		udp_tunnel_xmit_skb(rt, sock4->sock->sk, skb, saddr,2520				    pkey->u.ipv4.dst, tos, ttl, df,2521				    src_port, dst_port, xnet, !udp_sum);2522#if IS_ENABLED(CONFIG_IPV6)2523	} else {2524		struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock);2525		struct in6_addr saddr;2526 2527		if (!ifindex)2528			ifindex = sock6->sock->sk->sk_bound_dev_if;2529 2530		ndst = udp_tunnel6_dst_lookup(skb, dev, vxlan->net, sock6->sock,2531					      ifindex, &saddr, pkey,2532					      src_port, dst_port, tos,2533					      use_cache ? dst_cache : NULL);2534		if (IS_ERR(ndst)) {2535			err = PTR_ERR(ndst);2536			ndst = NULL;2537			goto tx_error;2538		}2539 2540		if (!info) {2541			u32 rt6i_flags = dst_rt6_info(ndst)->rt6i_flags;2542 2543			err = encap_bypass_if_local(skb, dev, vxlan, AF_INET6,2544						    dst_port, ifindex, vni,2545						    ndst, rt6i_flags);2546			if (err)2547				goto out_unlock;2548		}2549 2550		err = skb_tunnel_check_pmtu(skb, ndst,2551					    vxlan_headroom((flags & VXLAN_F_GPE) | VXLAN_F_IPV6),2552					    netif_is_any_bridge_port(dev));2553		if (err < 0) {2554			goto tx_error;2555		} else if (err) {2556			if (info) {2557				struct ip_tunnel_info *unclone;2558 2559				unclone = skb_tunnel_info_unclone(skb);2560				if (unlikely(!unclone))2561					goto tx_error;2562 2563				unclone->key.u.ipv6.src = pkey->u.ipv6.dst;2564				unclone->key.u.ipv6.dst = saddr;2565			}2566 2567			vxlan_encap_bypass(skb, vxlan, vxlan, vni, false);2568			dst_release(ndst);2569			goto out_unlock;2570		}2571 2572		tos = ip_tunnel_ecn_encap(tos, old_iph, skb);2573		ttl = ttl ? : ip6_dst_hoplimit(ndst);2574		skb_scrub_packet(skb, xnet);2575		err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr),2576				      vni, md, flags, udp_sum);2577		if (err < 0)2578			goto tx_error;2579 2580		udp_tunnel6_xmit_skb(ndst, sock6->sock->sk, skb, dev,2581				     &saddr, &pkey->u.ipv6.dst, tos, ttl,2582				     pkey->label, src_port, dst_port, !udp_sum);2583#endif2584	}2585	vxlan_vnifilter_count(vxlan, vni, NULL, VXLAN_VNI_STATS_TX, pkt_len);2586out_unlock:2587	rcu_read_unlock();2588	return;2589 2590drop:2591	dev_core_stats_tx_dropped_inc(dev);2592	vxlan_vnifilter_count(vxlan, vni, NULL, VXLAN_VNI_STATS_TX_DROPS, 0);2593	dev_kfree_skb(skb);2594	return;2595 2596tx_error:2597	rcu_read_unlock();2598	if (err == -ELOOP)2599		DEV_STATS_INC(dev, collisions);2600	else if (err == -ENETUNREACH)2601		DEV_STATS_INC(dev, tx_carrier_errors);2602	dst_release(ndst);2603	DEV_STATS_INC(dev, tx_errors);2604	vxlan_vnifilter_count(vxlan, vni, NULL, VXLAN_VNI_STATS_TX_ERRORS, 0);2605	kfree_skb(skb);2606}2607 2608static void vxlan_xmit_nh(struct sk_buff *skb, struct net_device *dev,2609			  struct vxlan_fdb *f, __be32 vni, bool did_rsc)2610{2611	struct vxlan_rdst nh_rdst;2612	struct nexthop *nh;2613	bool do_xmit;2614	u32 hash;2615 2616	memset(&nh_rdst, 0, sizeof(struct vxlan_rdst));2617	hash = skb_get_hash(skb);2618 2619	rcu_read_lock();2620	nh = rcu_dereference(f->nh);2621	if (!nh) {2622		rcu_read_unlock();2623		goto drop;2624	}2625	do_xmit = vxlan_fdb_nh_path_select(nh, hash, &nh_rdst);2626	rcu_read_unlock();2627 2628	if (likely(do_xmit))2629		vxlan_xmit_one(skb, dev, vni, &nh_rdst, did_rsc);2630	else2631		goto drop;2632 2633	return;2634 2635drop:2636	dev_core_stats_tx_dropped_inc(dev);2637	vxlan_vnifilter_count(netdev_priv(dev), vni, NULL,2638			      VXLAN_VNI_STATS_TX_DROPS, 0);2639	dev_kfree_skb(skb);2640}2641 2642static netdev_tx_t vxlan_xmit_nhid(struct sk_buff *skb, struct net_device *dev,2643				   u32 nhid, __be32 vni)2644{2645	struct vxlan_dev *vxlan = netdev_priv(dev);2646	struct vxlan_rdst nh_rdst;2647	struct nexthop *nh;2648	bool do_xmit;2649	u32 hash;2650 2651	memset(&nh_rdst, 0, sizeof(struct vxlan_rdst));2652	hash = skb_get_hash(skb);2653 2654	rcu_read_lock();2655	nh = nexthop_find_by_id(dev_net(dev), nhid);2656	if (unlikely(!nh || !nexthop_is_fdb(nh) || !nexthop_is_multipath(nh))) {2657		rcu_read_unlock();2658		goto drop;2659	}2660	do_xmit = vxlan_fdb_nh_path_select(nh, hash, &nh_rdst);2661	rcu_read_unlock();2662 2663	if (vxlan->cfg.saddr.sa.sa_family != nh_rdst.remote_ip.sa.sa_family)2664		goto drop;2665 2666	if (likely(do_xmit))2667		vxlan_xmit_one(skb, dev, vni, &nh_rdst, false);2668	else2669		goto drop;2670 2671	return NETDEV_TX_OK;2672 2673drop:2674	dev_core_stats_tx_dropped_inc(dev);2675	vxlan_vnifilter_count(netdev_priv(dev), vni, NULL,2676			      VXLAN_VNI_STATS_TX_DROPS, 0);2677	dev_kfree_skb(skb);2678	return NETDEV_TX_OK;2679}2680 2681/* Transmit local packets over Vxlan2682 *2683 * Outer IP header inherits ECN and DF from inner header.2684 * Outer UDP destination is the VXLAN assigned port.2685 *           source port is based on hash of flow2686 */2687static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)2688{2689	struct vxlan_dev *vxlan = netdev_priv(dev);2690	struct vxlan_rdst *rdst, *fdst = NULL;2691	const struct ip_tunnel_info *info;2692	struct vxlan_fdb *f;2693	struct ethhdr *eth;2694	__be32 vni = 0;2695	u32 nhid = 0;2696	bool did_rsc;2697 2698	info = skb_tunnel_info(skb);2699 2700	skb_reset_mac_header(skb);2701 2702	if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) {2703		if (info && info->mode & IP_TUNNEL_INFO_BRIDGE &&2704		    info->mode & IP_TUNNEL_INFO_TX) {2705			vni = tunnel_id_to_key32(info->key.tun_id);2706			nhid = info->key.nhid;2707		} else {2708			if (info && info->mode & IP_TUNNEL_INFO_TX)2709				vxlan_xmit_one(skb, dev, vni, NULL, false);2710			else2711				kfree_skb(skb);2712			return NETDEV_TX_OK;2713		}2714	}2715 2716	if (vxlan->cfg.flags & VXLAN_F_PROXY) {2717		eth = eth_hdr(skb);2718		if (ntohs(eth->h_proto) == ETH_P_ARP)2719			return arp_reduce(dev, skb, vni);2720#if IS_ENABLED(CONFIG_IPV6)2721		else if (ntohs(eth->h_proto) == ETH_P_IPV6 &&2722			 pskb_may_pull(skb, sizeof(struct ipv6hdr) +2723					    sizeof(struct nd_msg)) &&2724			 ipv6_hdr(skb)->nexthdr == IPPROTO_ICMPV6) {2725			struct nd_msg *m = (struct nd_msg *)(ipv6_hdr(skb) + 1);2726 2727			if (m->icmph.icmp6_code == 0 &&2728			    m->icmph.icmp6_type == NDISC_NEIGHBOUR_SOLICITATION)2729				return neigh_reduce(dev, skb, vni);2730		}2731#endif2732	}2733 2734	if (nhid)2735		return vxlan_xmit_nhid(skb, dev, nhid, vni);2736 2737	if (vxlan->cfg.flags & VXLAN_F_MDB) {2738		struct vxlan_mdb_entry *mdb_entry;2739 2740		rcu_read_lock();2741		mdb_entry = vxlan_mdb_entry_skb_get(vxlan, skb, vni);2742		if (mdb_entry) {2743			netdev_tx_t ret;2744 2745			ret = vxlan_mdb_xmit(vxlan, mdb_entry, skb);2746			rcu_read_unlock();2747			return ret;2748		}2749		rcu_read_unlock();2750	}2751 2752	eth = eth_hdr(skb);2753	f = vxlan_find_mac(vxlan, eth->h_dest, vni);2754	did_rsc = false;2755 2756	if (f && (f->flags & NTF_ROUTER) && (vxlan->cfg.flags & VXLAN_F_RSC) &&2757	    (ntohs(eth->h_proto) == ETH_P_IP ||2758	     ntohs(eth->h_proto) == ETH_P_IPV6)) {2759		did_rsc = route_shortcircuit(dev, skb);2760		if (did_rsc)2761			f = vxlan_find_mac(vxlan, eth->h_dest, vni);2762	}2763 2764	if (f == NULL) {2765		f = vxlan_find_mac(vxlan, all_zeros_mac, vni);2766		if (f == NULL) {2767			if ((vxlan->cfg.flags & VXLAN_F_L2MISS) &&2768			    !is_multicast_ether_addr(eth->h_dest))2769				vxlan_fdb_miss(vxlan, eth->h_dest);2770 2771			dev_core_stats_tx_dropped_inc(dev);2772			vxlan_vnifilter_count(vxlan, vni, NULL,2773					      VXLAN_VNI_STATS_TX_DROPS, 0);2774			kfree_skb(skb);2775			return NETDEV_TX_OK;2776		}2777	}2778 2779	if (rcu_access_pointer(f->nh)) {2780		vxlan_xmit_nh(skb, dev, f,2781			      (vni ? : vxlan->default_dst.remote_vni), did_rsc);2782	} else {2783		list_for_each_entry_rcu(rdst, &f->remotes, list) {2784			struct sk_buff *skb1;2785 2786			if (!fdst) {2787				fdst = rdst;2788				continue;2789			}2790			skb1 = skb_clone(skb, GFP_ATOMIC);2791			if (skb1)2792				vxlan_xmit_one(skb1, dev, vni, rdst, did_rsc);2793		}2794		if (fdst)2795			vxlan_xmit_one(skb, dev, vni, fdst, did_rsc);2796		else2797			kfree_skb(skb);2798	}2799 2800	return NETDEV_TX_OK;2801}2802 2803/* Walk the forwarding table and purge stale entries */2804static void vxlan_cleanup(struct timer_list *t)2805{2806	struct vxlan_dev *vxlan = from_timer(vxlan, t, age_timer);2807	unsigned long next_timer = jiffies + FDB_AGE_INTERVAL;2808	unsigned int h;2809 2810	if (!netif_running(vxlan->dev))2811		return;2812 2813	for (h = 0; h < FDB_HASH_SIZE; ++h) {2814		struct hlist_node *p, *n;2815 2816		spin_lock(&vxlan->hash_lock[h]);2817		hlist_for_each_safe(p, n, &vxlan->fdb_head[h]) {2818			struct vxlan_fdb *f2819				= container_of(p, struct vxlan_fdb, hlist);2820			unsigned long timeout;2821 2822			if (f->state & (NUD_PERMANENT | NUD_NOARP))2823				continue;2824 2825			if (f->flags & NTF_EXT_LEARNED)2826				continue;2827 2828			timeout = f->used + vxlan->cfg.age_interval * HZ;2829			if (time_before_eq(timeout, jiffies)) {2830				netdev_dbg(vxlan->dev,2831					   "garbage collect %pM\n",2832					   f->eth_addr);2833				f->state = NUD_STALE;2834				vxlan_fdb_destroy(vxlan, f, true, true);2835			} else if (time_before(timeout, next_timer))2836				next_timer = timeout;2837		}2838		spin_unlock(&vxlan->hash_lock[h]);2839	}2840 2841	mod_timer(&vxlan->age_timer, next_timer);2842}2843 2844static void vxlan_vs_del_dev(struct vxlan_dev *vxlan)2845{2846	struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id);2847 2848	spin_lock(&vn->sock_lock);2849	hlist_del_init_rcu(&vxlan->hlist4.hlist);2850#if IS_ENABLED(CONFIG_IPV6)2851	hlist_del_init_rcu(&vxlan->hlist6.hlist);2852#endif2853	spin_unlock(&vn->sock_lock);2854}2855 2856static void vxlan_vs_add_dev(struct vxlan_sock *vs, struct vxlan_dev *vxlan,2857			     struct vxlan_dev_node *node)2858{2859	struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id);2860	__be32 vni = vxlan->default_dst.remote_vni;2861 2862	node->vxlan = vxlan;2863	spin_lock(&vn->sock_lock);2864	hlist_add_head_rcu(&node->hlist, vni_head(vs, vni));2865	spin_unlock(&vn->sock_lock);2866}2867 2868/* Setup stats when device is created */2869static int vxlan_init(struct net_device *dev)2870{2871	struct vxlan_dev *vxlan = netdev_priv(dev);2872	int err;2873 2874	if (vxlan->cfg.flags & VXLAN_F_VNIFILTER)2875		vxlan_vnigroup_init(vxlan);2876 2877	err = gro_cells_init(&vxlan->gro_cells, dev);2878	if (err)2879		goto err_vnigroup_uninit;2880 2881	err = vxlan_mdb_init(vxlan);2882	if (err)2883		goto err_gro_cells_destroy;2884 2885	netdev_lockdep_set_classes(dev);2886	return 0;2887 2888err_gro_cells_destroy:2889	gro_cells_destroy(&vxlan->gro_cells);2890err_vnigroup_uninit:2891	if (vxlan->cfg.flags & VXLAN_F_VNIFILTER)2892		vxlan_vnigroup_uninit(vxlan);2893	return err;2894}2895 2896static void vxlan_fdb_delete_default(struct vxlan_dev *vxlan, __be32 vni)2897{2898	struct vxlan_fdb *f;2899	u32 hash_index = fdb_head_index(vxlan, all_zeros_mac, vni);2900 2901	spin_lock_bh(&vxlan->hash_lock[hash_index]);2902	f = __vxlan_find_mac(vxlan, all_zeros_mac, vni);2903	if (f)2904		vxlan_fdb_destroy(vxlan, f, true, true);2905	spin_unlock_bh(&vxlan->hash_lock[hash_index]);2906}2907 2908static void vxlan_uninit(struct net_device *dev)2909{2910	struct vxlan_dev *vxlan = netdev_priv(dev);2911 2912	vxlan_mdb_fini(vxlan);2913 2914	if (vxlan->cfg.flags & VXLAN_F_VNIFILTER)2915		vxlan_vnigroup_uninit(vxlan);2916 2917	gro_cells_destroy(&vxlan->gro_cells);2918 2919	vxlan_fdb_delete_default(vxlan, vxlan->cfg.vni);2920}2921 2922/* Start ageing timer and join group when device is brought up */2923static int vxlan_open(struct net_device *dev)2924{2925	struct vxlan_dev *vxlan = netdev_priv(dev);2926	int ret;2927 2928	ret = vxlan_sock_add(vxlan);2929	if (ret < 0)2930		return ret;2931 2932	ret = vxlan_multicast_join(vxlan);2933	if (ret) {2934		vxlan_sock_release(vxlan);2935		return ret;2936	}2937 2938	if (vxlan->cfg.age_interval)2939		mod_timer(&vxlan->age_timer, jiffies + FDB_AGE_INTERVAL);2940 2941	return ret;2942}2943 2944struct vxlan_fdb_flush_desc {2945	bool				ignore_default_entry;2946	unsigned long                   state;2947	unsigned long			state_mask;2948	unsigned long                   flags;2949	unsigned long			flags_mask;2950	__be32				src_vni;2951	u32				nhid;2952	__be32				vni;2953	__be16				port;2954	union vxlan_addr		dst_ip;2955};2956 2957static bool vxlan_fdb_is_default_entry(const struct vxlan_fdb *f,2958				       const struct vxlan_dev *vxlan)2959{2960	return is_zero_ether_addr(f->eth_addr) && f->vni == vxlan->cfg.vni;2961}2962 2963static bool vxlan_fdb_nhid_matches(const struct vxlan_fdb *f, u32 nhid)2964{2965	struct nexthop *nh = rtnl_dereference(f->nh);2966 2967	return nh && nh->id == nhid;2968}2969 2970static bool vxlan_fdb_flush_matches(const struct vxlan_fdb *f,2971				    const struct vxlan_dev *vxlan,2972				    const struct vxlan_fdb_flush_desc *desc)2973{2974	if (desc->state_mask && (f->state & desc->state_mask) != desc->state)2975		return false;2976 2977	if (desc->flags_mask && (f->flags & desc->flags_mask) != desc->flags)2978		return false;2979 2980	if (desc->ignore_default_entry && vxlan_fdb_is_default_entry(f, vxlan))2981		return false;2982 2983	if (desc->src_vni && f->vni != desc->src_vni)2984		return false;2985 2986	if (desc->nhid && !vxlan_fdb_nhid_matches(f, desc->nhid))2987		return false;2988 2989	return true;2990}2991 2992static bool2993vxlan_fdb_flush_should_match_remotes(const struct vxlan_fdb_flush_desc *desc)2994{2995	return desc->vni || desc->port || desc->dst_ip.sa.sa_family;2996}2997 2998static bool2999vxlan_fdb_flush_remote_matches(const struct vxlan_fdb_flush_desc *desc,3000			       const struct vxlan_rdst *rd)3001{3002	if (desc->vni && rd->remote_vni != desc->vni)3003		return false;3004 3005	if (desc->port && rd->remote_port != desc->port)3006		return false;3007 3008	if (desc->dst_ip.sa.sa_family &&3009	    !vxlan_addr_equal(&rd->remote_ip, &desc->dst_ip))3010		return false;3011 3012	return true;3013}3014 3015static void3016vxlan_fdb_flush_match_remotes(struct vxlan_fdb *f, struct vxlan_dev *vxlan,3017			      const struct vxlan_fdb_flush_desc *desc,3018			      bool *p_destroy_fdb)3019{3020	bool remotes_flushed = false;3021	struct vxlan_rdst *rd, *tmp;3022 3023	list_for_each_entry_safe(rd, tmp, &f->remotes, list) {3024		if (!vxlan_fdb_flush_remote_matches(desc, rd))3025			continue;3026 3027		vxlan_fdb_dst_destroy(vxlan, f, rd, true);3028		remotes_flushed = true;3029	}3030 3031	*p_destroy_fdb = remotes_flushed && list_empty(&f->remotes);3032}3033 3034/* Purge the forwarding table */3035static void vxlan_flush(struct vxlan_dev *vxlan,3036			const struct vxlan_fdb_flush_desc *desc)3037{3038	bool match_remotes = vxlan_fdb_flush_should_match_remotes(desc);3039	unsigned int h;3040 3041	for (h = 0; h < FDB_HASH_SIZE; ++h) {3042		struct hlist_node *p, *n;3043 3044		spin_lock_bh(&vxlan->hash_lock[h]);3045		hlist_for_each_safe(p, n, &vxlan->fdb_head[h]) {3046			struct vxlan_fdb *f3047				= container_of(p, struct vxlan_fdb, hlist);3048 3049			if (!vxlan_fdb_flush_matches(f, vxlan, desc))3050				continue;3051 3052			if (match_remotes) {3053				bool destroy_fdb = false;3054 3055				vxlan_fdb_flush_match_remotes(f, vxlan, desc,3056							      &destroy_fdb);3057 3058				if (!destroy_fdb)3059					continue;3060			}3061 3062			vxlan_fdb_destroy(vxlan, f, true, true);3063		}3064		spin_unlock_bh(&vxlan->hash_lock[h]);3065	}3066}3067 3068static const struct nla_policy vxlan_del_bulk_policy[NDA_MAX + 1] = {3069	[NDA_SRC_VNI]   = { .type = NLA_U32 },3070	[NDA_NH_ID]	= { .type = NLA_U32 },3071	[NDA_VNI]	= { .type = NLA_U32 },3072	[NDA_PORT]	= { .type = NLA_U16 },3073	[NDA_DST]	= NLA_POLICY_RANGE(NLA_BINARY, sizeof(struct in_addr),3074					   sizeof(struct in6_addr)),3075	[NDA_NDM_STATE_MASK]	= { .type = NLA_U16 },3076	[NDA_NDM_FLAGS_MASK]	= { .type = NLA_U8 },3077};3078 3079#define VXLAN_FDB_FLUSH_IGNORED_NDM_FLAGS (NTF_MASTER | NTF_SELF)3080#define VXLAN_FDB_FLUSH_ALLOWED_NDM_STATES (NUD_PERMANENT | NUD_NOARP)3081#define VXLAN_FDB_FLUSH_ALLOWED_NDM_FLAGS (NTF_EXT_LEARNED | NTF_OFFLOADED | \3082					   NTF_ROUTER)3083 3084static int vxlan_fdb_delete_bulk(struct nlmsghdr *nlh, struct net_device *dev,3085				 struct netlink_ext_ack *extack)3086{3087	struct vxlan_dev *vxlan = netdev_priv(dev);3088	struct vxlan_fdb_flush_desc desc = {};3089	struct ndmsg *ndm = nlmsg_data(nlh);3090	struct nlattr *tb[NDA_MAX + 1];3091	u8 ndm_flags;3092	int err;3093 3094	ndm_flags = ndm->ndm_flags & ~VXLAN_FDB_FLUSH_IGNORED_NDM_FLAGS;3095 3096	err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, vxlan_del_bulk_policy,3097			  extack);3098	if (err)3099		return err;3100 3101	if (ndm_flags & ~VXLAN_FDB_FLUSH_ALLOWED_NDM_FLAGS) {3102		NL_SET_ERR_MSG(extack, "Unsupported fdb flush ndm flag bits set");3103		return -EINVAL;3104	}3105	if (ndm->ndm_state & ~VXLAN_FDB_FLUSH_ALLOWED_NDM_STATES) {3106		NL_SET_ERR_MSG(extack, "Unsupported fdb flush ndm state bits set");3107		return -EINVAL;3108	}3109 3110	desc.state = ndm->ndm_state;3111	desc.flags = ndm_flags;3112 3113	if (tb[NDA_NDM_STATE_MASK])3114		desc.state_mask = nla_get_u16(tb[NDA_NDM_STATE_MASK]);3115 3116	if (tb[NDA_NDM_FLAGS_MASK])3117		desc.flags_mask = nla_get_u8(tb[NDA_NDM_FLAGS_MASK]);3118 3119	if (tb[NDA_SRC_VNI])3120		desc.src_vni = cpu_to_be32(nla_get_u32(tb[NDA_SRC_VNI]));3121 3122	if (tb[NDA_NH_ID])3123		desc.nhid = nla_get_u32(tb[NDA_NH_ID]);3124 3125	if (tb[NDA_VNI])3126		desc.vni = cpu_to_be32(nla_get_u32(tb[NDA_VNI]));3127 3128	if (tb[NDA_PORT])3129		desc.port = nla_get_be16(tb[NDA_PORT]);3130 3131	if (tb[NDA_DST]) {3132		union vxlan_addr ip;3133 3134		err = vxlan_nla_get_addr(&ip, tb[NDA_DST]);3135		if (err) {3136			NL_SET_ERR_MSG_ATTR(extack, tb[NDA_DST],3137					    "Unsupported address family");3138			return err;3139		}3140		desc.dst_ip = ip;3141	}3142 3143	vxlan_flush(vxlan, &desc);3144 3145	return 0;3146}3147 3148/* Cleanup timer and forwarding table on shutdown */3149static int vxlan_stop(struct net_device *dev)3150{3151	struct vxlan_dev *vxlan = netdev_priv(dev);3152	struct vxlan_fdb_flush_desc desc = {3153		/* Default entry is deleted at vxlan_uninit. */3154		.ignore_default_entry = true,3155		.state = 0,3156		.state_mask = NUD_PERMANENT | NUD_NOARP,3157	};3158 3159	vxlan_multicast_leave(vxlan);3160 3161	del_timer_sync(&vxlan->age_timer);3162 3163	vxlan_flush(vxlan, &desc);3164	vxlan_sock_release(vxlan);3165 3166	return 0;3167}3168 3169/* Stub, nothing needs to be done. */3170static void vxlan_set_multicast_list(struct net_device *dev)3171{3172}3173 3174static int vxlan_change_mtu(struct net_device *dev, int new_mtu)3175{3176	struct vxlan_dev *vxlan = netdev_priv(dev);3177	struct vxlan_rdst *dst = &vxlan->default_dst;3178	struct net_device *lowerdev = __dev_get_by_index(vxlan->net,3179							 dst->remote_ifindex);3180 3181	/* This check is different than dev->max_mtu, because it looks at3182	 * the lowerdev->mtu, rather than the static dev->max_mtu3183	 */3184	if (lowerdev) {3185		int max_mtu = lowerdev->mtu - vxlan_headroom(vxlan->cfg.flags);3186		if (new_mtu > max_mtu)3187			return -EINVAL;3188	}3189 3190	WRITE_ONCE(dev->mtu, new_mtu);3191	return 0;3192}3193 3194static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)3195{3196	struct vxlan_dev *vxlan = netdev_priv(dev);3197	struct ip_tunnel_info *info = skb_tunnel_info(skb);3198	__be16 sport, dport;3199 3200	sport = udp_flow_src_port(dev_net(dev), skb, vxlan->cfg.port_min,3201				  vxlan->cfg.port_max, true);3202	dport = info->key.tp_dst ? : vxlan->cfg.dst_port;3203 3204	if (ip_tunnel_info_af(info) == AF_INET) {3205		struct vxlan_sock *sock4 = rcu_dereference(vxlan->vn4_sock);3206		struct rtable *rt;3207 3208		if (!sock4)3209			return -EIO;3210 3211		rt = udp_tunnel_dst_lookup(skb, dev, vxlan->net, 0,3212					   &info->key.u.ipv4.src,3213					   &info->key,3214					   sport, dport, info->key.tos,3215					   &info->dst_cache);3216		if (IS_ERR(rt))3217			return PTR_ERR(rt);3218		ip_rt_put(rt);3219	} else {3220#if IS_ENABLED(CONFIG_IPV6)3221		struct vxlan_sock *sock6 = rcu_dereference(vxlan->vn6_sock);3222		struct dst_entry *ndst;3223 3224		if (!sock6)3225			return -EIO;3226 3227		ndst = udp_tunnel6_dst_lookup(skb, dev, vxlan->net, sock6->sock,3228					      0, &info->key.u.ipv6.src,3229					      &info->key,3230					      sport, dport, info->key.tos,3231					      &info->dst_cache);3232		if (IS_ERR(ndst))3233			return PTR_ERR(ndst);3234		dst_release(ndst);3235#else /* !CONFIG_IPV6 */3236		return -EPFNOSUPPORT;3237#endif3238	}3239	info->key.tp_src = sport;3240	info->key.tp_dst = dport;3241	return 0;3242}3243 3244static const struct net_device_ops vxlan_netdev_ether_ops = {3245	.ndo_init		= vxlan_init,3246	.ndo_uninit		= vxlan_uninit,3247	.ndo_open		= vxlan_open,3248	.ndo_stop		= vxlan_stop,3249	.ndo_start_xmit		= vxlan_xmit,3250	.ndo_set_rx_mode	= vxlan_set_multicast_list,3251	.ndo_change_mtu		= vxlan_change_mtu,3252	.ndo_validate_addr	= eth_validate_addr,3253	.ndo_set_mac_address	= eth_mac_addr,3254	.ndo_fdb_add		= vxlan_fdb_add,3255	.ndo_fdb_del		= vxlan_fdb_delete,3256	.ndo_fdb_del_bulk	= vxlan_fdb_delete_bulk,3257	.ndo_fdb_dump		= vxlan_fdb_dump,3258	.ndo_fdb_get		= vxlan_fdb_get,3259	.ndo_mdb_add		= vxlan_mdb_add,3260	.ndo_mdb_del		= vxlan_mdb_del,3261	.ndo_mdb_del_bulk	= vxlan_mdb_del_bulk,3262	.ndo_mdb_dump		= vxlan_mdb_dump,3263	.ndo_mdb_get		= vxlan_mdb_get,3264	.ndo_fill_metadata_dst	= vxlan_fill_metadata_dst,3265};3266 3267static const struct net_device_ops vxlan_netdev_raw_ops = {3268	.ndo_init		= vxlan_init,3269	.ndo_uninit		= vxlan_uninit,3270	.ndo_open		= vxlan_open,3271	.ndo_stop		= vxlan_stop,3272	.ndo_start_xmit		= vxlan_xmit,3273	.ndo_change_mtu		= vxlan_change_mtu,3274	.ndo_fill_metadata_dst	= vxlan_fill_metadata_dst,3275};3276 3277/* Info for udev, that this is a virtual tunnel endpoint */3278static const struct device_type vxlan_type = {3279	.name = "vxlan",3280};3281 3282/* Calls the ndo_udp_tunnel_add of the caller in order to3283 * supply the listening VXLAN udp ports. Callers are expected3284 * to implement the ndo_udp_tunnel_add.3285 */3286static void vxlan_offload_rx_ports(struct net_device *dev, bool push)3287{3288	struct vxlan_sock *vs;3289	struct net *net = dev_net(dev);3290	struct vxlan_net *vn = net_generic(net, vxlan_net_id);3291	unsigned int i;3292 3293	spin_lock(&vn->sock_lock);3294	for (i = 0; i < PORT_HASH_SIZE; ++i) {3295		hlist_for_each_entry_rcu(vs, &vn->sock_list[i], hlist) {3296			unsigned short type;3297 3298			if (vs->flags & VXLAN_F_GPE)3299				type = UDP_TUNNEL_TYPE_VXLAN_GPE;3300			else3301				type = UDP_TUNNEL_TYPE_VXLAN;3302 3303			if (push)3304				udp_tunnel_push_rx_port(dev, vs->sock, type);3305			else3306				udp_tunnel_drop_rx_port(dev, vs->sock, type);3307		}3308	}3309	spin_unlock(&vn->sock_lock);3310}3311 3312/* Initialize the device structure. */3313static void vxlan_setup(struct net_device *dev)3314{3315	struct vxlan_dev *vxlan = netdev_priv(dev);3316	unsigned int h;3317 3318	eth_hw_addr_random(dev);3319	ether_setup(dev);3320 3321	dev->needs_free_netdev = true;3322	SET_NETDEV_DEVTYPE(dev, &vxlan_type);3323 3324	dev->features	|= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;3325	dev->features   |= NETIF_F_RXCSUM;3326	dev->features   |= NETIF_F_GSO_SOFTWARE;3327 3328	dev->vlan_features = dev->features;3329	dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;3330	dev->hw_features |= NETIF_F_RXCSUM;3331	dev->hw_features |= NETIF_F_GSO_SOFTWARE;3332	netif_keep_dst(dev);3333	dev->priv_flags |= IFF_NO_QUEUE;3334	dev->change_proto_down = true;3335	dev->lltx = true;3336 3337	/* MTU range: 68 - 65535 */3338	dev->min_mtu = ETH_MIN_MTU;3339	dev->max_mtu = ETH_MAX_MTU;3340 3341	dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;3342	INIT_LIST_HEAD(&vxlan->next);3343 3344	timer_setup(&vxlan->age_timer, vxlan_cleanup, TIMER_DEFERRABLE);3345 3346	vxlan->dev = dev;3347 3348	for (h = 0; h < FDB_HASH_SIZE; ++h) {3349		spin_lock_init(&vxlan->hash_lock[h]);3350		INIT_HLIST_HEAD(&vxlan->fdb_head[h]);3351	}3352}3353 3354static void vxlan_ether_setup(struct net_device *dev)3355{3356	dev->priv_flags &= ~IFF_TX_SKB_SHARING;3357	dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;3358	dev->netdev_ops = &vxlan_netdev_ether_ops;3359}3360 3361static void vxlan_raw_setup(struct net_device *dev)3362{3363	dev->header_ops = NULL;3364	dev->type = ARPHRD_NONE;3365	dev->hard_header_len = 0;3366	dev->addr_len = 0;3367	dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;3368	dev->netdev_ops = &vxlan_netdev_raw_ops;3369}3370 3371static const struct nla_policy vxlan_policy[IFLA_VXLAN_MAX + 1] = {3372	[IFLA_VXLAN_UNSPEC]     = { .strict_start_type = IFLA_VXLAN_LOCALBYPASS },3373	[IFLA_VXLAN_ID]		= { .type = NLA_U32 },3374	[IFLA_VXLAN_GROUP]	= { .len = sizeof_field(struct iphdr, daddr) },3375	[IFLA_VXLAN_GROUP6]	= { .len = sizeof(struct in6_addr) },3376	[IFLA_VXLAN_LINK]	= { .type = NLA_U32 },3377	[IFLA_VXLAN_LOCAL]	= { .len = sizeof_field(struct iphdr, saddr) },3378	[IFLA_VXLAN_LOCAL6]	= { .len = sizeof(struct in6_addr) },3379	[IFLA_VXLAN_TOS]	= { .type = NLA_U8 },3380	[IFLA_VXLAN_TTL]	= { .type = NLA_U8 },3381	[IFLA_VXLAN_LABEL]	= { .type = NLA_U32 },3382	[IFLA_VXLAN_LEARNING]	= { .type = NLA_U8 },3383	[IFLA_VXLAN_AGEING]	= { .type = NLA_U32 },3384	[IFLA_VXLAN_LIMIT]	= { .type = NLA_U32 },3385	[IFLA_VXLAN_PORT_RANGE] = { .len  = sizeof(struct ifla_vxlan_port_range) },3386	[IFLA_VXLAN_PROXY]	= { .type = NLA_U8 },3387	[IFLA_VXLAN_RSC]	= { .type = NLA_U8 },3388	[IFLA_VXLAN_L2MISS]	= { .type = NLA_U8 },3389	[IFLA_VXLAN_L3MISS]	= { .type = NLA_U8 },3390	[IFLA_VXLAN_COLLECT_METADATA]	= { .type = NLA_U8 },3391	[IFLA_VXLAN_PORT]	= { .type = NLA_U16 },3392	[IFLA_VXLAN_UDP_CSUM]	= { .type = NLA_U8 },3393	[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]	= { .type = NLA_U8 },3394	[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]	= { .type = NLA_U8 },3395	[IFLA_VXLAN_REMCSUM_TX]	= { .type = NLA_U8 },3396	[IFLA_VXLAN_REMCSUM_RX]	= { .type = NLA_U8 },3397	[IFLA_VXLAN_GBP]	= { .type = NLA_FLAG, },3398	[IFLA_VXLAN_GPE]	= { .type = NLA_FLAG, },3399	[IFLA_VXLAN_REMCSUM_NOPARTIAL]	= { .type = NLA_FLAG },3400	[IFLA_VXLAN_TTL_INHERIT]	= { .type = NLA_FLAG },3401	[IFLA_VXLAN_DF]		= { .type = NLA_U8 },3402	[IFLA_VXLAN_VNIFILTER]	= { .type = NLA_U8 },3403	[IFLA_VXLAN_LOCALBYPASS]	= NLA_POLICY_MAX(NLA_U8, 1),3404	[IFLA_VXLAN_LABEL_POLICY]       = NLA_POLICY_MAX(NLA_U32, VXLAN_LABEL_MAX),3405};3406 3407static int vxlan_validate(struct nlattr *tb[], struct nlattr *data[],3408			  struct netlink_ext_ack *extack)3409{3410	if (tb[IFLA_ADDRESS]) {3411		if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN) {3412			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_ADDRESS],3413					    "Provided link layer address is not Ethernet");3414			return -EINVAL;3415		}3416 3417		if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS]))) {3418			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_ADDRESS],3419					    "Provided Ethernet address is not unicast");3420			return -EADDRNOTAVAIL;3421		}3422	}3423 3424	if (tb[IFLA_MTU]) {3425		u32 mtu = nla_get_u32(tb[IFLA_MTU]);3426 3427		if (mtu < ETH_MIN_MTU || mtu > ETH_MAX_MTU) {3428			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_MTU],3429					    "MTU must be between 68 and 65535");3430			return -EINVAL;3431		}3432	}3433 3434	if (!data) {3435		NL_SET_ERR_MSG(extack,3436			       "Required attributes not provided to perform the operation");3437		return -EINVAL;3438	}3439 3440	if (data[IFLA_VXLAN_ID]) {3441		u32 id = nla_get_u32(data[IFLA_VXLAN_ID]);3442 3443		if (id >= VXLAN_N_VID) {3444			NL_SET_ERR_MSG_ATTR(extack, data[IFLA_VXLAN_ID],3445					    "VXLAN ID must be lower than 16777216");3446			return -ERANGE;3447		}3448	}3449 3450	if (data[IFLA_VXLAN_PORT_RANGE]) {3451		const struct ifla_vxlan_port_range *p3452			= nla_data(data[IFLA_VXLAN_PORT_RANGE]);3453 3454		if (ntohs(p->high) < ntohs(p->low)) {3455			NL_SET_ERR_MSG_ATTR(extack, data[IFLA_VXLAN_PORT_RANGE],3456					    "Invalid source port range");3457			return -EINVAL;3458		}3459	}3460 3461	if (data[IFLA_VXLAN_DF]) {3462		enum ifla_vxlan_df df = nla_get_u8(data[IFLA_VXLAN_DF]);3463 3464		if (df < 0 || df > VXLAN_DF_MAX) {3465			NL_SET_ERR_MSG_ATTR(extack, data[IFLA_VXLAN_DF],3466					    "Invalid DF attribute");3467			return -EINVAL;3468		}3469	}3470 3471	return 0;3472}3473 3474static void vxlan_get_drvinfo(struct net_device *netdev,3475			      struct ethtool_drvinfo *drvinfo)3476{3477	strscpy(drvinfo->version, VXLAN_VERSION, sizeof(drvinfo->version));3478	strscpy(drvinfo->driver, "vxlan", sizeof(drvinfo->driver));3479}3480 3481static int vxlan_get_link_ksettings(struct net_device *dev,3482				    struct ethtool_link_ksettings *cmd)3483{3484	struct vxlan_dev *vxlan = netdev_priv(dev);3485	struct vxlan_rdst *dst = &vxlan->default_dst;3486	struct net_device *lowerdev = __dev_get_by_index(vxlan->net,3487							 dst->remote_ifindex);3488 3489	if (!lowerdev) {3490		cmd->base.duplex = DUPLEX_UNKNOWN;3491		cmd->base.port = PORT_OTHER;3492		cmd->base.speed = SPEED_UNKNOWN;3493 3494		return 0;3495	}3496 3497	return __ethtool_get_link_ksettings(lowerdev, cmd);3498}3499 3500static const struct ethtool_ops vxlan_ethtool_ops = {3501	.get_drvinfo		= vxlan_get_drvinfo,3502	.get_link		= ethtool_op_get_link,3503	.get_link_ksettings	= vxlan_get_link_ksettings,3504};3505 3506static struct socket *vxlan_create_sock(struct net *net, bool ipv6,3507					__be16 port, u32 flags, int ifindex)3508{3509	struct socket *sock;3510	struct udp_port_cfg udp_conf;3511	int err;3512 3513	memset(&udp_conf, 0, sizeof(udp_conf));3514 3515	if (ipv6) {3516		udp_conf.family = AF_INET6;3517		udp_conf.use_udp6_rx_checksums =3518		    !(flags & VXLAN_F_UDP_ZERO_CSUM6_RX);3519		udp_conf.ipv6_v6only = 1;3520	} else {3521		udp_conf.family = AF_INET;3522	}3523 3524	udp_conf.local_udp_port = port;3525	udp_conf.bind_ifindex = ifindex;3526 3527	/* Open UDP socket */3528	err = udp_sock_create(net, &udp_conf, &sock);3529	if (err < 0)3530		return ERR_PTR(err);3531 3532	udp_allow_gso(sock->sk);3533	return sock;3534}3535 3536/* Create new listen socket if needed */3537static struct vxlan_sock *vxlan_socket_create(struct net *net, bool ipv6,3538					      __be16 port, u32 flags,3539					      int ifindex)3540{3541	struct vxlan_net *vn = net_generic(net, vxlan_net_id);3542	struct vxlan_sock *vs;3543	struct socket *sock;3544	unsigned int h;3545	struct udp_tunnel_sock_cfg tunnel_cfg;3546 3547	vs = kzalloc(sizeof(*vs), GFP_KERNEL);3548	if (!vs)3549		return ERR_PTR(-ENOMEM);3550 3551	for (h = 0; h < VNI_HASH_SIZE; ++h)3552		INIT_HLIST_HEAD(&vs->vni_list[h]);3553 3554	sock = vxlan_create_sock(net, ipv6, port, flags, ifindex);3555	if (IS_ERR(sock)) {3556		kfree(vs);3557		return ERR_CAST(sock);3558	}3559 3560	vs->sock = sock;3561	refcount_set(&vs->refcnt, 1);3562	vs->flags = (flags & VXLAN_F_RCV_FLAGS);3563 3564	spin_lock(&vn->sock_lock);3565	hlist_add_head_rcu(&vs->hlist, vs_head(net, port));3566	udp_tunnel_notify_add_rx_port(sock,3567				      (vs->flags & VXLAN_F_GPE) ?3568				      UDP_TUNNEL_TYPE_VXLAN_GPE :3569				      UDP_TUNNEL_TYPE_VXLAN);3570	spin_unlock(&vn->sock_lock);3571 3572	/* Mark socket as an encapsulation socket. */3573	memset(&tunnel_cfg, 0, sizeof(tunnel_cfg));3574	tunnel_cfg.sk_user_data = vs;3575	tunnel_cfg.encap_type = 1;3576	tunnel_cfg.encap_rcv = vxlan_rcv;3577	tunnel_cfg.encap_err_lookup = vxlan_err_lookup;3578	tunnel_cfg.encap_destroy = NULL;3579	if (vs->flags & VXLAN_F_GPE) {3580		tunnel_cfg.gro_receive = vxlan_gpe_gro_receive;3581		tunnel_cfg.gro_complete = vxlan_gpe_gro_complete;3582	} else {3583		tunnel_cfg.gro_receive = vxlan_gro_receive;3584		tunnel_cfg.gro_complete = vxlan_gro_complete;3585	}3586 3587	setup_udp_tunnel_sock(net, sock, &tunnel_cfg);3588 3589	return vs;3590}3591 3592static int __vxlan_sock_add(struct vxlan_dev *vxlan, bool ipv6)3593{3594	struct vxlan_net *vn = net_generic(vxlan->net, vxlan_net_id);3595	bool metadata = vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA;3596	struct vxlan_sock *vs = NULL;3597	struct vxlan_dev_node *node;3598	int l3mdev_index = 0;3599 3600	if (vxlan->cfg.remote_ifindex)3601		l3mdev_index = l3mdev_master_upper_ifindex_by_index(3602			vxlan->net, vxlan->cfg.remote_ifindex);3603 3604	if (!vxlan->cfg.no_share) {3605		spin_lock(&vn->sock_lock);3606		vs = vxlan_find_sock(vxlan->net, ipv6 ? AF_INET6 : AF_INET,3607				     vxlan->cfg.dst_port, vxlan->cfg.flags,3608				     l3mdev_index);3609		if (vs && !refcount_inc_not_zero(&vs->refcnt)) {3610			spin_unlock(&vn->sock_lock);3611			return -EBUSY;3612		}3613		spin_unlock(&vn->sock_lock);3614	}3615	if (!vs)3616		vs = vxlan_socket_create(vxlan->net, ipv6,3617					 vxlan->cfg.dst_port, vxlan->cfg.flags,3618					 l3mdev_index);3619	if (IS_ERR(vs))3620		return PTR_ERR(vs);3621#if IS_ENABLED(CONFIG_IPV6)3622	if (ipv6) {3623		rcu_assign_pointer(vxlan->vn6_sock, vs);3624		node = &vxlan->hlist6;3625	} else3626#endif3627	{3628		rcu_assign_pointer(vxlan->vn4_sock, vs);3629		node = &vxlan->hlist4;3630	}3631 3632	if (metadata && (vxlan->cfg.flags & VXLAN_F_VNIFILTER))3633		vxlan_vs_add_vnigrp(vxlan, vs, ipv6);3634	else3635		vxlan_vs_add_dev(vs, vxlan, node);3636 3637	return 0;3638}3639 3640static int vxlan_sock_add(struct vxlan_dev *vxlan)3641{3642	bool metadata = vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA;3643	bool ipv6 = vxlan->cfg.flags & VXLAN_F_IPV6 || metadata;3644	bool ipv4 = !ipv6 || metadata;3645	int ret = 0;3646 3647	RCU_INIT_POINTER(vxlan->vn4_sock, NULL);3648#if IS_ENABLED(CONFIG_IPV6)3649	RCU_INIT_POINTER(vxlan->vn6_sock, NULL);3650	if (ipv6) {3651		ret = __vxlan_sock_add(vxlan, true);3652		if (ret < 0 && ret != -EAFNOSUPPORT)3653			ipv4 = false;3654	}3655#endif3656	if (ipv4)3657		ret = __vxlan_sock_add(vxlan, false);3658	if (ret < 0)3659		vxlan_sock_release(vxlan);3660	return ret;3661}3662 3663int vxlan_vni_in_use(struct net *src_net, struct vxlan_dev *vxlan,3664		     struct vxlan_config *conf, __be32 vni)3665{3666	struct vxlan_net *vn = net_generic(src_net, vxlan_net_id);3667	struct vxlan_dev *tmp;3668 3669	list_for_each_entry(tmp, &vn->vxlan_list, next) {3670		if (tmp == vxlan)3671			continue;3672		if (tmp->cfg.flags & VXLAN_F_VNIFILTER) {3673			if (!vxlan_vnifilter_lookup(tmp, vni))3674				continue;3675		} else if (tmp->cfg.vni != vni) {3676			continue;3677		}3678		if (tmp->cfg.dst_port != conf->dst_port)3679			continue;3680		if ((tmp->cfg.flags & (VXLAN_F_RCV_FLAGS | VXLAN_F_IPV6)) !=3681		    (conf->flags & (VXLAN_F_RCV_FLAGS | VXLAN_F_IPV6)))3682			continue;3683 3684		if ((conf->flags & VXLAN_F_IPV6_LINKLOCAL) &&3685		    tmp->cfg.remote_ifindex != conf->remote_ifindex)3686			continue;3687 3688		return -EEXIST;3689	}3690 3691	return 0;3692}3693 3694static int vxlan_config_validate(struct net *src_net, struct vxlan_config *conf,3695				 struct net_device **lower,3696				 struct vxlan_dev *old,3697				 struct netlink_ext_ack *extack)3698{3699	bool use_ipv6 = false;3700 3701	if (conf->flags & VXLAN_F_GPE) {3702		/* For now, allow GPE only together with3703		 * COLLECT_METADATA. This can be relaxed later; in such3704		 * case, the other side of the PtP link will have to be3705		 * provided.3706		 */3707		if ((conf->flags & ~VXLAN_F_ALLOWED_GPE) ||3708		    !(conf->flags & VXLAN_F_COLLECT_METADATA)) {3709			NL_SET_ERR_MSG(extack,3710				       "VXLAN GPE does not support this combination of attributes");3711			return -EINVAL;3712		}3713	}3714 3715	if (!conf->remote_ip.sa.sa_family && !conf->saddr.sa.sa_family) {3716		/* Unless IPv6 is explicitly requested, assume IPv4 */3717		conf->remote_ip.sa.sa_family = AF_INET;3718		conf->saddr.sa.sa_family = AF_INET;3719	} else if (!conf->remote_ip.sa.sa_family) {3720		conf->remote_ip.sa.sa_family = conf->saddr.sa.sa_family;3721	} else if (!conf->saddr.sa.sa_family) {3722		conf->saddr.sa.sa_family = conf->remote_ip.sa.sa_family;3723	}3724 3725	if (conf->saddr.sa.sa_family != conf->remote_ip.sa.sa_family) {3726		NL_SET_ERR_MSG(extack,3727			       "Local and remote address must be from the same family");3728		return -EINVAL;3729	}3730 3731	if (vxlan_addr_multicast(&conf->saddr)) {3732		NL_SET_ERR_MSG(extack, "Local address cannot be multicast");3733		return -EINVAL;3734	}3735 3736	if (conf->saddr.sa.sa_family == AF_INET6) {3737		if (!IS_ENABLED(CONFIG_IPV6)) {3738			NL_SET_ERR_MSG(extack,3739				       "IPv6 support not enabled in the kernel");3740			return -EPFNOSUPPORT;3741		}3742		use_ipv6 = true;3743		conf->flags |= VXLAN_F_IPV6;3744 3745		if (!(conf->flags & VXLAN_F_COLLECT_METADATA)) {3746			int local_type =3747				ipv6_addr_type(&conf->saddr.sin6.sin6_addr);3748			int remote_type =3749				ipv6_addr_type(&conf->remote_ip.sin6.sin6_addr);3750 3751			if (local_type & IPV6_ADDR_LINKLOCAL) {3752				if (!(remote_type & IPV6_ADDR_LINKLOCAL) &&3753				    (remote_type != IPV6_ADDR_ANY)) {3754					NL_SET_ERR_MSG(extack,3755						       "Invalid combination of local and remote address scopes");3756					return -EINVAL;3757				}3758 3759				conf->flags |= VXLAN_F_IPV6_LINKLOCAL;3760			} else {3761				if (remote_type ==3762				    (IPV6_ADDR_UNICAST | IPV6_ADDR_LINKLOCAL)) {3763					NL_SET_ERR_MSG(extack,3764						       "Invalid combination of local and remote address scopes");3765					return -EINVAL;3766				}3767 3768				conf->flags &= ~VXLAN_F_IPV6_LINKLOCAL;3769			}3770		}3771	}3772 3773	if (conf->label && !use_ipv6) {3774		NL_SET_ERR_MSG(extack,3775			       "Label attribute only applies to IPv6 VXLAN devices");3776		return -EINVAL;3777	}3778 3779	if (conf->label_policy && !use_ipv6) {3780		NL_SET_ERR_MSG(extack,3781			       "Label policy only applies to IPv6 VXLAN devices");3782		return -EINVAL;3783	}3784 3785	if (conf->remote_ifindex) {3786		struct net_device *lowerdev;3787 3788		lowerdev = __dev_get_by_index(src_net, conf->remote_ifindex);3789		if (!lowerdev) {3790			NL_SET_ERR_MSG(extack,3791				       "Invalid local interface, device not found");3792			return -ENODEV;3793		}3794 3795#if IS_ENABLED(CONFIG_IPV6)3796		if (use_ipv6) {3797			struct inet6_dev *idev = __in6_dev_get(lowerdev);3798 3799			if (idev && idev->cnf.disable_ipv6) {3800				NL_SET_ERR_MSG(extack,3801					       "IPv6 support disabled by administrator");3802				return -EPERM;3803			}3804		}3805#endif3806 3807		*lower = lowerdev;3808	} else {3809		if (vxlan_addr_multicast(&conf->remote_ip)) {3810			NL_SET_ERR_MSG(extack,3811				       "Local interface required for multicast remote destination");3812 3813			return -EINVAL;3814		}3815 3816#if IS_ENABLED(CONFIG_IPV6)3817		if (conf->flags & VXLAN_F_IPV6_LINKLOCAL) {3818			NL_SET_ERR_MSG(extack,3819				       "Local interface required for link-local local/remote addresses");3820			return -EINVAL;3821		}3822#endif3823 3824		*lower = NULL;3825	}3826 3827	if (!conf->dst_port) {3828		if (conf->flags & VXLAN_F_GPE)3829			conf->dst_port = htons(IANA_VXLAN_GPE_UDP_PORT);3830		else3831			conf->dst_port = htons(vxlan_port);3832	}3833 3834	if (!conf->age_interval)3835		conf->age_interval = FDB_AGE_DEFAULT;3836 3837	if (vxlan_vni_in_use(src_net, old, conf, conf->vni)) {3838		NL_SET_ERR_MSG(extack,3839			       "A VXLAN device with the specified VNI already exists");3840		return -EEXIST;3841	}3842 3843	return 0;3844}3845 3846static void vxlan_config_apply(struct net_device *dev,3847			       struct vxlan_config *conf,3848			       struct net_device *lowerdev,3849			       struct net *src_net,3850			       bool changelink)3851{3852	struct vxlan_dev *vxlan = netdev_priv(dev);3853	struct vxlan_rdst *dst = &vxlan->default_dst;3854	unsigned short needed_headroom = ETH_HLEN;3855	int max_mtu = ETH_MAX_MTU;3856	u32 flags = conf->flags;3857 3858	if (!changelink) {3859		if (flags & VXLAN_F_GPE)3860			vxlan_raw_setup(dev);3861		else3862			vxlan_ether_setup(dev);3863 3864		if (conf->mtu)3865			dev->mtu = conf->mtu;3866 3867		vxlan->net = src_net;3868	}3869 3870	dst->remote_vni = conf->vni;3871 3872	memcpy(&dst->remote_ip, &conf->remote_ip, sizeof(conf->remote_ip));3873 3874	if (lowerdev) {3875		dst->remote_ifindex = conf->remote_ifindex;3876 3877		netif_inherit_tso_max(dev, lowerdev);3878 3879		needed_headroom = lowerdev->hard_header_len;3880		needed_headroom += lowerdev->needed_headroom;3881 3882		dev->needed_tailroom = lowerdev->needed_tailroom;3883 3884		max_mtu = lowerdev->mtu - vxlan_headroom(flags);3885		if (max_mtu < ETH_MIN_MTU)3886			max_mtu = ETH_MIN_MTU;3887 3888		if (!changelink && !conf->mtu)3889			dev->mtu = max_mtu;3890	}3891 3892	if (dev->mtu > max_mtu)3893		dev->mtu = max_mtu;3894 3895	if (flags & VXLAN_F_COLLECT_METADATA)3896		flags |= VXLAN_F_IPV6;3897	needed_headroom += vxlan_headroom(flags);3898	dev->needed_headroom = needed_headroom;3899 3900	memcpy(&vxlan->cfg, conf, sizeof(*conf));3901}3902 3903static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,3904			       struct vxlan_config *conf, bool changelink,3905			       struct netlink_ext_ack *extack)3906{3907	struct vxlan_dev *vxlan = netdev_priv(dev);3908	struct net_device *lowerdev;3909	int ret;3910 3911	ret = vxlan_config_validate(src_net, conf, &lowerdev, vxlan, extack);3912	if (ret)3913		return ret;3914 3915	vxlan_config_apply(dev, conf, lowerdev, src_net, changelink);3916 3917	return 0;3918}3919 3920static int __vxlan_dev_create(struct net *net, struct net_device *dev,3921			      struct vxlan_config *conf,3922			      struct netlink_ext_ack *extack)3923{3924	struct vxlan_net *vn = net_generic(net, vxlan_net_id);3925	struct vxlan_dev *vxlan = netdev_priv(dev);3926	struct net_device *remote_dev = NULL;3927	struct vxlan_fdb *f = NULL;3928	bool unregister = false;3929	struct vxlan_rdst *dst;3930	int err;3931 3932	dst = &vxlan->default_dst;3933	err = vxlan_dev_configure(net, dev, conf, false, extack);3934	if (err)3935		return err;3936 3937	dev->ethtool_ops = &vxlan_ethtool_ops;3938 3939	/* create an fdb entry for a valid default destination */3940	if (!vxlan_addr_any(&dst->remote_ip)) {3941		err = vxlan_fdb_create(vxlan, all_zeros_mac,3942				       &dst->remote_ip,3943				       NUD_REACHABLE | NUD_PERMANENT,3944				       vxlan->cfg.dst_port,3945				       dst->remote_vni,3946				       dst->remote_vni,3947				       dst->remote_ifindex,3948				       NTF_SELF, 0, &f, extack);3949		if (err)3950			return err;3951	}3952 3953	err = register_netdevice(dev);3954	if (err)3955		goto errout;3956	unregister = true;3957 3958	if (dst->remote_ifindex) {3959		remote_dev = __dev_get_by_index(net, dst->remote_ifindex);3960		if (!remote_dev) {3961			err = -ENODEV;3962			goto errout;3963		}3964 3965		err = netdev_upper_dev_link(remote_dev, dev, extack);3966		if (err)3967			goto errout;3968	}3969 3970	err = rtnl_configure_link(dev, NULL, 0, NULL);3971	if (err < 0)3972		goto unlink;3973 3974	if (f) {3975		vxlan_fdb_insert(vxlan, all_zeros_mac, dst->remote_vni, f);3976 3977		/* notify default fdb entry */3978		err = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f),3979				       RTM_NEWNEIGH, true, extack);3980		if (err) {3981			vxlan_fdb_destroy(vxlan, f, false, false);3982			if (remote_dev)3983				netdev_upper_dev_unlink(remote_dev, dev);3984			goto unregister;3985		}3986	}3987 3988	list_add(&vxlan->next, &vn->vxlan_list);3989	if (remote_dev)3990		dst->remote_dev = remote_dev;3991	return 0;3992unlink:3993	if (remote_dev)3994		netdev_upper_dev_unlink(remote_dev, dev);3995errout:3996	/* unregister_netdevice() destroys the default FDB entry with deletion3997	 * notification. But the addition notification was not sent yet, so3998	 * destroy the entry by hand here.3999	 */4000	if (f)4001		__vxlan_fdb_free(f);4002unregister:4003	if (unregister)4004		unregister_netdevice(dev);4005	return err;4006}4007 4008/* Set/clear flags based on attribute */4009static int vxlan_nl2flag(struct vxlan_config *conf, struct nlattr *tb[],4010			  int attrtype, unsigned long mask, bool changelink,4011			  bool changelink_supported,4012			  struct netlink_ext_ack *extack)4013{4014	unsigned long flags;4015 4016	if (!tb[attrtype])4017		return 0;4018 4019	if (changelink && !changelink_supported) {4020		vxlan_flag_attr_error(attrtype, extack);4021		return -EOPNOTSUPP;4022	}4023 4024	if (vxlan_policy[attrtype].type == NLA_FLAG)4025		flags = conf->flags | mask;4026	else if (nla_get_u8(tb[attrtype]))4027		flags = conf->flags | mask;4028	else4029		flags = conf->flags & ~mask;4030 4031	conf->flags = flags;4032 4033	return 0;4034}4035 4036static int vxlan_nl2conf(struct nlattr *tb[], struct nlattr *data[],4037			 struct net_device *dev, struct vxlan_config *conf,4038			 bool changelink, struct netlink_ext_ack *extack)4039{4040	struct vxlan_dev *vxlan = netdev_priv(dev);4041	int err = 0;4042 4043	memset(conf, 0, sizeof(*conf));4044 4045	/* if changelink operation, start with old existing cfg */4046	if (changelink)4047		memcpy(conf, &vxlan->cfg, sizeof(*conf));4048 4049	if (data[IFLA_VXLAN_ID]) {4050		__be32 vni = cpu_to_be32(nla_get_u32(data[IFLA_VXLAN_ID]));4051 4052		if (changelink && (vni != conf->vni)) {4053			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_ID], "Cannot change VNI");4054			return -EOPNOTSUPP;4055		}4056		conf->vni = cpu_to_be32(nla_get_u32(data[IFLA_VXLAN_ID]));4057	}4058 4059	if (data[IFLA_VXLAN_GROUP]) {4060		if (changelink && (conf->remote_ip.sa.sa_family != AF_INET)) {4061			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_GROUP], "New group address family does not match old group");4062			return -EOPNOTSUPP;4063		}4064 4065		conf->remote_ip.sin.sin_addr.s_addr = nla_get_in_addr(data[IFLA_VXLAN_GROUP]);4066		conf->remote_ip.sa.sa_family = AF_INET;4067	} else if (data[IFLA_VXLAN_GROUP6]) {4068		if (!IS_ENABLED(CONFIG_IPV6)) {4069			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_GROUP6], "IPv6 support not enabled in the kernel");4070			return -EPFNOSUPPORT;4071		}4072 4073		if (changelink && (conf->remote_ip.sa.sa_family != AF_INET6)) {4074			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_GROUP6], "New group address family does not match old group");4075			return -EOPNOTSUPP;4076		}4077 4078		conf->remote_ip.sin6.sin6_addr = nla_get_in6_addr(data[IFLA_VXLAN_GROUP6]);4079		conf->remote_ip.sa.sa_family = AF_INET6;4080	}4081 4082	if (data[IFLA_VXLAN_LOCAL]) {4083		if (changelink && (conf->saddr.sa.sa_family != AF_INET)) {4084			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LOCAL], "New local address family does not match old");4085			return -EOPNOTSUPP;4086		}4087 4088		conf->saddr.sin.sin_addr.s_addr = nla_get_in_addr(data[IFLA_VXLAN_LOCAL]);4089		conf->saddr.sa.sa_family = AF_INET;4090	} else if (data[IFLA_VXLAN_LOCAL6]) {4091		if (!IS_ENABLED(CONFIG_IPV6)) {4092			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LOCAL6], "IPv6 support not enabled in the kernel");4093			return -EPFNOSUPPORT;4094		}4095 4096		if (changelink && (conf->saddr.sa.sa_family != AF_INET6)) {4097			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LOCAL6], "New local address family does not match old");4098			return -EOPNOTSUPP;4099		}4100 4101		/* TODO: respect scope id */4102		conf->saddr.sin6.sin6_addr = nla_get_in6_addr(data[IFLA_VXLAN_LOCAL6]);4103		conf->saddr.sa.sa_family = AF_INET6;4104	}4105 4106	if (data[IFLA_VXLAN_LINK])4107		conf->remote_ifindex = nla_get_u32(data[IFLA_VXLAN_LINK]);4108 4109	if (data[IFLA_VXLAN_TOS])4110		conf->tos  = nla_get_u8(data[IFLA_VXLAN_TOS]);4111 4112	if (data[IFLA_VXLAN_TTL])4113		conf->ttl = nla_get_u8(data[IFLA_VXLAN_TTL]);4114 4115	if (data[IFLA_VXLAN_TTL_INHERIT]) {4116		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_TTL_INHERIT,4117				    VXLAN_F_TTL_INHERIT, changelink, false,4118				    extack);4119		if (err)4120			return err;4121 4122	}4123 4124	if (data[IFLA_VXLAN_LABEL])4125		conf->label = nla_get_be32(data[IFLA_VXLAN_LABEL]) &4126			     IPV6_FLOWLABEL_MASK;4127	if (data[IFLA_VXLAN_LABEL_POLICY])4128		conf->label_policy = nla_get_u32(data[IFLA_VXLAN_LABEL_POLICY]);4129 4130	if (data[IFLA_VXLAN_LEARNING]) {4131		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_LEARNING,4132				    VXLAN_F_LEARN, changelink, true,4133				    extack);4134		if (err)4135			return err;4136	} else if (!changelink) {4137		/* default to learn on a new device */4138		conf->flags |= VXLAN_F_LEARN;4139	}4140 4141	if (data[IFLA_VXLAN_AGEING])4142		conf->age_interval = nla_get_u32(data[IFLA_VXLAN_AGEING]);4143 4144	if (data[IFLA_VXLAN_PROXY]) {4145		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_PROXY,4146				    VXLAN_F_PROXY, changelink, false,4147				    extack);4148		if (err)4149			return err;4150	}4151 4152	if (data[IFLA_VXLAN_RSC]) {4153		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_RSC,4154				    VXLAN_F_RSC, changelink, false,4155				    extack);4156		if (err)4157			return err;4158	}4159 4160	if (data[IFLA_VXLAN_L2MISS]) {4161		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_L2MISS,4162				    VXLAN_F_L2MISS, changelink, false,4163				    extack);4164		if (err)4165			return err;4166	}4167 4168	if (data[IFLA_VXLAN_L3MISS]) {4169		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_L3MISS,4170				    VXLAN_F_L3MISS, changelink, false,4171				    extack);4172		if (err)4173			return err;4174	}4175 4176	if (data[IFLA_VXLAN_LIMIT]) {4177		if (changelink) {4178			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_LIMIT],4179					    "Cannot change limit");4180			return -EOPNOTSUPP;4181		}4182		conf->addrmax = nla_get_u32(data[IFLA_VXLAN_LIMIT]);4183	}4184 4185	if (data[IFLA_VXLAN_COLLECT_METADATA]) {4186		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_COLLECT_METADATA,4187				    VXLAN_F_COLLECT_METADATA, changelink, false,4188				    extack);4189		if (err)4190			return err;4191	}4192 4193	if (data[IFLA_VXLAN_PORT_RANGE]) {4194		if (!changelink) {4195			const struct ifla_vxlan_port_range *p4196				= nla_data(data[IFLA_VXLAN_PORT_RANGE]);4197			conf->port_min = ntohs(p->low);4198			conf->port_max = ntohs(p->high);4199		} else {4200			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_PORT_RANGE],4201					    "Cannot change port range");4202			return -EOPNOTSUPP;4203		}4204	}4205 4206	if (data[IFLA_VXLAN_PORT]) {4207		if (changelink) {4208			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_PORT],4209					    "Cannot change port");4210			return -EOPNOTSUPP;4211		}4212		conf->dst_port = nla_get_be16(data[IFLA_VXLAN_PORT]);4213	}4214 4215	if (data[IFLA_VXLAN_UDP_CSUM]) {4216		if (changelink) {4217			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_VXLAN_UDP_CSUM],4218					    "Cannot change UDP_CSUM flag");4219			return -EOPNOTSUPP;4220		}4221		if (!nla_get_u8(data[IFLA_VXLAN_UDP_CSUM]))4222			conf->flags |= VXLAN_F_UDP_ZERO_CSUM_TX;4223	}4224 4225	if (data[IFLA_VXLAN_LOCALBYPASS]) {4226		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_LOCALBYPASS,4227				    VXLAN_F_LOCALBYPASS, changelink,4228				    true, extack);4229		if (err)4230			return err;4231	} else if (!changelink) {4232		/* default to local bypass on a new device */4233		conf->flags |= VXLAN_F_LOCALBYPASS;4234	}4235 4236	if (data[IFLA_VXLAN_UDP_ZERO_CSUM6_TX]) {4237		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_UDP_ZERO_CSUM6_TX,4238				    VXLAN_F_UDP_ZERO_CSUM6_TX, changelink,4239				    false, extack);4240		if (err)4241			return err;4242	}4243 4244	if (data[IFLA_VXLAN_UDP_ZERO_CSUM6_RX]) {4245		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_UDP_ZERO_CSUM6_RX,4246				    VXLAN_F_UDP_ZERO_CSUM6_RX, changelink,4247				    false, extack);4248		if (err)4249			return err;4250	}4251 4252	if (data[IFLA_VXLAN_REMCSUM_TX]) {4253		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_REMCSUM_TX,4254				    VXLAN_F_REMCSUM_TX, changelink, false,4255				    extack);4256		if (err)4257			return err;4258	}4259 4260	if (data[IFLA_VXLAN_REMCSUM_RX]) {4261		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_REMCSUM_RX,4262				    VXLAN_F_REMCSUM_RX, changelink, false,4263				    extack);4264		if (err)4265			return err;4266	}4267 4268	if (data[IFLA_VXLAN_GBP]) {4269		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_GBP,4270				    VXLAN_F_GBP, changelink, false, extack);4271		if (err)4272			return err;4273	}4274 4275	if (data[IFLA_VXLAN_GPE]) {4276		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_GPE,4277				    VXLAN_F_GPE, changelink, false,4278				    extack);4279		if (err)4280			return err;4281	}4282 4283	if (data[IFLA_VXLAN_REMCSUM_NOPARTIAL]) {4284		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_REMCSUM_NOPARTIAL,4285				    VXLAN_F_REMCSUM_NOPARTIAL, changelink,4286				    false, extack);4287		if (err)4288			return err;4289	}4290 4291	if (tb[IFLA_MTU]) {4292		if (changelink) {4293			NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_MTU],4294					    "Cannot change mtu");4295			return -EOPNOTSUPP;4296		}4297		conf->mtu = nla_get_u32(tb[IFLA_MTU]);4298	}4299 4300	if (data[IFLA_VXLAN_DF])4301		conf->df = nla_get_u8(data[IFLA_VXLAN_DF]);4302 4303	if (data[IFLA_VXLAN_VNIFILTER]) {4304		err = vxlan_nl2flag(conf, data, IFLA_VXLAN_VNIFILTER,4305				    VXLAN_F_VNIFILTER, changelink, false,4306				    extack);4307		if (err)4308			return err;4309 4310		if ((conf->flags & VXLAN_F_VNIFILTER) &&4311		    !(conf->flags & VXLAN_F_COLLECT_METADATA)) {4312			NL_SET_ERR_MSG_ATTR(extack, data[IFLA_VXLAN_VNIFILTER],4313					    "vxlan vnifilter only valid in collect metadata mode");4314			return -EINVAL;4315		}4316	}4317 4318	return 0;4319}4320 4321static int vxlan_newlink(struct net *src_net, struct net_device *dev,4322			 struct nlattr *tb[], struct nlattr *data[],4323			 struct netlink_ext_ack *extack)4324{4325	struct vxlan_config conf;4326	int err;4327 4328	err = vxlan_nl2conf(tb, data, dev, &conf, false, extack);4329	if (err)4330		return err;4331 4332	return __vxlan_dev_create(src_net, dev, &conf, extack);4333}4334 4335static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],4336			    struct nlattr *data[],4337			    struct netlink_ext_ack *extack)4338{4339	struct vxlan_dev *vxlan = netdev_priv(dev);4340	struct net_device *lowerdev;4341	struct vxlan_config conf;4342	struct vxlan_rdst *dst;4343	int err;4344 4345	dst = &vxlan->default_dst;4346	err = vxlan_nl2conf(tb, data, dev, &conf, true, extack);4347	if (err)4348		return err;4349 4350	err = vxlan_config_validate(vxlan->net, &conf, &lowerdev,4351				    vxlan, extack);4352	if (err)4353		return err;4354 4355	if (dst->remote_dev == lowerdev)4356		lowerdev = NULL;4357 4358	err = netdev_adjacent_change_prepare(dst->remote_dev, lowerdev, dev,4359					     extack);4360	if (err)4361		return err;4362 4363	/* handle default dst entry */4364	if (!vxlan_addr_equal(&conf.remote_ip, &dst->remote_ip)) {4365		u32 hash_index = fdb_head_index(vxlan, all_zeros_mac, conf.vni);4366 4367		spin_lock_bh(&vxlan->hash_lock[hash_index]);4368		if (!vxlan_addr_any(&conf.remote_ip)) {4369			err = vxlan_fdb_update(vxlan, all_zeros_mac,4370					       &conf.remote_ip,4371					       NUD_REACHABLE | NUD_PERMANENT,4372					       NLM_F_APPEND | NLM_F_CREATE,4373					       vxlan->cfg.dst_port,4374					       conf.vni, conf.vni,4375					       conf.remote_ifindex,4376					       NTF_SELF, 0, true, extack);4377			if (err) {4378				spin_unlock_bh(&vxlan->hash_lock[hash_index]);4379				netdev_adjacent_change_abort(dst->remote_dev,4380							     lowerdev, dev);4381				return err;4382			}4383		}4384		if (!vxlan_addr_any(&dst->remote_ip))4385			__vxlan_fdb_delete(vxlan, all_zeros_mac,4386					   dst->remote_ip,4387					   vxlan->cfg.dst_port,4388					   dst->remote_vni,4389					   dst->remote_vni,4390					   dst->remote_ifindex,4391					   true);4392		spin_unlock_bh(&vxlan->hash_lock[hash_index]);4393 4394		/* If vni filtering device, also update fdb entries of4395		 * all vnis that were using default remote ip4396		 */4397		if (vxlan->cfg.flags & VXLAN_F_VNIFILTER) {4398			err = vxlan_vnilist_update_group(vxlan, &dst->remote_ip,4399							 &conf.remote_ip, extack);4400			if (err) {4401				netdev_adjacent_change_abort(dst->remote_dev,4402							     lowerdev, dev);4403				return err;4404			}4405		}4406	}4407 4408	if (conf.age_interval != vxlan->cfg.age_interval)4409		mod_timer(&vxlan->age_timer, jiffies);4410 4411	netdev_adjacent_change_commit(dst->remote_dev, lowerdev, dev);4412	if (lowerdev && lowerdev != dst->remote_dev)4413		dst->remote_dev = lowerdev;4414	vxlan_config_apply(dev, &conf, lowerdev, vxlan->net, true);4415	return 0;4416}4417 4418static void vxlan_dellink(struct net_device *dev, struct list_head *head)4419{4420	struct vxlan_dev *vxlan = netdev_priv(dev);4421	struct vxlan_fdb_flush_desc desc = {4422		/* Default entry is deleted at vxlan_uninit. */4423		.ignore_default_entry = true,4424	};4425 4426	vxlan_flush(vxlan, &desc);4427 4428	list_del(&vxlan->next);4429	unregister_netdevice_queue(dev, head);4430	if (vxlan->default_dst.remote_dev)4431		netdev_upper_dev_unlink(vxlan->default_dst.remote_dev, dev);4432}4433 4434static size_t vxlan_get_size(const struct net_device *dev)4435{4436	return nla_total_size(sizeof(__u32)) +	/* IFLA_VXLAN_ID */4437		nla_total_size(sizeof(struct in6_addr)) + /* IFLA_VXLAN_GROUP{6} */4438		nla_total_size(sizeof(__u32)) +	/* IFLA_VXLAN_LINK */4439		nla_total_size(sizeof(struct in6_addr)) + /* IFLA_VXLAN_LOCAL{6} */4440		nla_total_size(sizeof(__u8)) +	/* IFLA_VXLAN_TTL */4441		nla_total_size(sizeof(__u8)) +	/* IFLA_VXLAN_TTL_INHERIT */4442		nla_total_size(sizeof(__u8)) +	/* IFLA_VXLAN_TOS */4443		nla_total_size(sizeof(__u8)) +	/* IFLA_VXLAN_DF */4444		nla_total_size(sizeof(__be32)) + /* IFLA_VXLAN_LABEL */4445		nla_total_size(sizeof(__u32)) +  /* IFLA_VXLAN_LABEL_POLICY */4446		nla_total_size(sizeof(__u8)) +	/* IFLA_VXLAN_LEARNING */4447		nla_total_size(sizeof(__u8)) +	/* IFLA_VXLAN_PROXY */4448		nla_total_size(sizeof(__u8)) +	/* IFLA_VXLAN_RSC */4449		nla_total_size(sizeof(__u8)) +	/* IFLA_VXLAN_L2MISS */4450		nla_total_size(sizeof(__u8)) +	/* IFLA_VXLAN_L3MISS */4451		nla_total_size(sizeof(__u8)) +	/* IFLA_VXLAN_COLLECT_METADATA */4452		nla_total_size(sizeof(__u32)) +	/* IFLA_VXLAN_AGEING */4453		nla_total_size(sizeof(__u32)) +	/* IFLA_VXLAN_LIMIT */4454		nla_total_size(sizeof(__be16)) + /* IFLA_VXLAN_PORT */4455		nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_UDP_CSUM */4456		nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_UDP_ZERO_CSUM6_TX */4457		nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_UDP_ZERO_CSUM6_RX */4458		nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_REMCSUM_TX */4459		nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_REMCSUM_RX */4460		nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_LOCALBYPASS */4461		/* IFLA_VXLAN_PORT_RANGE */4462		nla_total_size(sizeof(struct ifla_vxlan_port_range)) +4463		nla_total_size(0) + /* IFLA_VXLAN_GBP */4464		nla_total_size(0) + /* IFLA_VXLAN_GPE */4465		nla_total_size(0) + /* IFLA_VXLAN_REMCSUM_NOPARTIAL */4466		nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_VNIFILTER */4467		0;4468}4469 4470static int vxlan_fill_info(struct sk_buff *skb, const struct net_device *dev)4471{4472	const struct vxlan_dev *vxlan = netdev_priv(dev);4473	const struct vxlan_rdst *dst = &vxlan->default_dst;4474	struct ifla_vxlan_port_range ports = {4475		.low =  htons(vxlan->cfg.port_min),4476		.high = htons(vxlan->cfg.port_max),4477	};4478 4479	if (nla_put_u32(skb, IFLA_VXLAN_ID, be32_to_cpu(dst->remote_vni)))4480		goto nla_put_failure;4481 4482	if (!vxlan_addr_any(&dst->remote_ip)) {4483		if (dst->remote_ip.sa.sa_family == AF_INET) {4484			if (nla_put_in_addr(skb, IFLA_VXLAN_GROUP,4485					    dst->remote_ip.sin.sin_addr.s_addr))4486				goto nla_put_failure;4487#if IS_ENABLED(CONFIG_IPV6)4488		} else {4489			if (nla_put_in6_addr(skb, IFLA_VXLAN_GROUP6,4490					     &dst->remote_ip.sin6.sin6_addr))4491				goto nla_put_failure;4492#endif4493		}4494	}4495 4496	if (dst->remote_ifindex && nla_put_u32(skb, IFLA_VXLAN_LINK, dst->remote_ifindex))4497		goto nla_put_failure;4498 4499	if (!vxlan_addr_any(&vxlan->cfg.saddr)) {4500		if (vxlan->cfg.saddr.sa.sa_family == AF_INET) {4501			if (nla_put_in_addr(skb, IFLA_VXLAN_LOCAL,4502					    vxlan->cfg.saddr.sin.sin_addr.s_addr))4503				goto nla_put_failure;4504#if IS_ENABLED(CONFIG_IPV6)4505		} else {4506			if (nla_put_in6_addr(skb, IFLA_VXLAN_LOCAL6,4507					     &vxlan->cfg.saddr.sin6.sin6_addr))4508				goto nla_put_failure;4509#endif4510		}4511	}4512 4513	if (nla_put_u8(skb, IFLA_VXLAN_TTL, vxlan->cfg.ttl) ||4514	    nla_put_u8(skb, IFLA_VXLAN_TTL_INHERIT,4515		       !!(vxlan->cfg.flags & VXLAN_F_TTL_INHERIT)) ||4516	    nla_put_u8(skb, IFLA_VXLAN_TOS, vxlan->cfg.tos) ||4517	    nla_put_u8(skb, IFLA_VXLAN_DF, vxlan->cfg.df) ||4518	    nla_put_be32(skb, IFLA_VXLAN_LABEL, vxlan->cfg.label) ||4519	    nla_put_u32(skb, IFLA_VXLAN_LABEL_POLICY, vxlan->cfg.label_policy) ||4520	    nla_put_u8(skb, IFLA_VXLAN_LEARNING,4521		       !!(vxlan->cfg.flags & VXLAN_F_LEARN)) ||4522	    nla_put_u8(skb, IFLA_VXLAN_PROXY,4523		       !!(vxlan->cfg.flags & VXLAN_F_PROXY)) ||4524	    nla_put_u8(skb, IFLA_VXLAN_RSC,4525		       !!(vxlan->cfg.flags & VXLAN_F_RSC)) ||4526	    nla_put_u8(skb, IFLA_VXLAN_L2MISS,4527		       !!(vxlan->cfg.flags & VXLAN_F_L2MISS)) ||4528	    nla_put_u8(skb, IFLA_VXLAN_L3MISS,4529		       !!(vxlan->cfg.flags & VXLAN_F_L3MISS)) ||4530	    nla_put_u8(skb, IFLA_VXLAN_COLLECT_METADATA,4531		       !!(vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA)) ||4532	    nla_put_u32(skb, IFLA_VXLAN_AGEING, vxlan->cfg.age_interval) ||4533	    nla_put_u32(skb, IFLA_VXLAN_LIMIT, vxlan->cfg.addrmax) ||4534	    nla_put_be16(skb, IFLA_VXLAN_PORT, vxlan->cfg.dst_port) ||4535	    nla_put_u8(skb, IFLA_VXLAN_UDP_CSUM,4536		       !(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM_TX)) ||4537	    nla_put_u8(skb, IFLA_VXLAN_UDP_ZERO_CSUM6_TX,4538		       !!(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM6_TX)) ||4539	    nla_put_u8(skb, IFLA_VXLAN_UDP_ZERO_CSUM6_RX,4540		       !!(vxlan->cfg.flags & VXLAN_F_UDP_ZERO_CSUM6_RX)) ||4541	    nla_put_u8(skb, IFLA_VXLAN_REMCSUM_TX,4542		       !!(vxlan->cfg.flags & VXLAN_F_REMCSUM_TX)) ||4543	    nla_put_u8(skb, IFLA_VXLAN_REMCSUM_RX,4544		       !!(vxlan->cfg.flags & VXLAN_F_REMCSUM_RX)) ||4545	    nla_put_u8(skb, IFLA_VXLAN_LOCALBYPASS,4546		       !!(vxlan->cfg.flags & VXLAN_F_LOCALBYPASS)))4547		goto nla_put_failure;4548 4549	if (nla_put(skb, IFLA_VXLAN_PORT_RANGE, sizeof(ports), &ports))4550		goto nla_put_failure;4551 4552	if (vxlan->cfg.flags & VXLAN_F_GBP &&4553	    nla_put_flag(skb, IFLA_VXLAN_GBP))4554		goto nla_put_failure;4555 4556	if (vxlan->cfg.flags & VXLAN_F_GPE &&4557	    nla_put_flag(skb, IFLA_VXLAN_GPE))4558		goto nla_put_failure;4559 4560	if (vxlan->cfg.flags & VXLAN_F_REMCSUM_NOPARTIAL &&4561	    nla_put_flag(skb, IFLA_VXLAN_REMCSUM_NOPARTIAL))4562		goto nla_put_failure;4563 4564	if (vxlan->cfg.flags & VXLAN_F_VNIFILTER &&4565	    nla_put_u8(skb, IFLA_VXLAN_VNIFILTER,4566		       !!(vxlan->cfg.flags & VXLAN_F_VNIFILTER)))4567		goto nla_put_failure;4568 4569	return 0;4570 4571nla_put_failure:4572	return -EMSGSIZE;4573}4574 4575static struct net *vxlan_get_link_net(const struct net_device *dev)4576{4577	struct vxlan_dev *vxlan = netdev_priv(dev);4578 4579	return READ_ONCE(vxlan->net);4580}4581 4582static struct rtnl_link_ops vxlan_link_ops __read_mostly = {4583	.kind		= "vxlan",4584	.maxtype	= IFLA_VXLAN_MAX,4585	.policy		= vxlan_policy,4586	.priv_size	= sizeof(struct vxlan_dev),4587	.setup		= vxlan_setup,4588	.validate	= vxlan_validate,4589	.newlink	= vxlan_newlink,4590	.changelink	= vxlan_changelink,4591	.dellink	= vxlan_dellink,4592	.get_size	= vxlan_get_size,4593	.fill_info	= vxlan_fill_info,4594	.get_link_net	= vxlan_get_link_net,4595};4596 4597struct net_device *vxlan_dev_create(struct net *net, const char *name,4598				    u8 name_assign_type,4599				    struct vxlan_config *conf)4600{4601	struct nlattr *tb[IFLA_MAX + 1];4602	struct net_device *dev;4603	int err;4604 4605	memset(&tb, 0, sizeof(tb));4606 4607	dev = rtnl_create_link(net, name, name_assign_type,4608			       &vxlan_link_ops, tb, NULL);4609	if (IS_ERR(dev))4610		return dev;4611 4612	err = __vxlan_dev_create(net, dev, conf, NULL);4613	if (err < 0) {4614		free_netdev(dev);4615		return ERR_PTR(err);4616	}4617 4618	err = rtnl_configure_link(dev, NULL, 0, NULL);4619	if (err < 0) {4620		LIST_HEAD(list_kill);4621 4622		vxlan_dellink(dev, &list_kill);4623		unregister_netdevice_many(&list_kill);4624		return ERR_PTR(err);4625	}4626 4627	return dev;4628}4629EXPORT_SYMBOL_GPL(vxlan_dev_create);4630 4631static void vxlan_handle_lowerdev_unregister(struct vxlan_net *vn,4632					     struct net_device *dev)4633{4634	struct vxlan_dev *vxlan, *next;4635	LIST_HEAD(list_kill);4636 4637	list_for_each_entry_safe(vxlan, next, &vn->vxlan_list, next) {4638		struct vxlan_rdst *dst = &vxlan->default_dst;4639 4640		/* In case we created vxlan device with carrier4641		 * and we loose the carrier due to module unload4642		 * we also need to remove vxlan device. In other4643		 * cases, it's not necessary and remote_ifindex4644		 * is 0 here, so no matches.4645		 */4646		if (dst->remote_ifindex == dev->ifindex)4647			vxlan_dellink(vxlan->dev, &list_kill);4648	}4649 4650	unregister_netdevice_many(&list_kill);4651}4652 4653static int vxlan_netdevice_event(struct notifier_block *unused,4654				 unsigned long event, void *ptr)4655{4656	struct net_device *dev = netdev_notifier_info_to_dev(ptr);4657	struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id);4658 4659	if (event == NETDEV_UNREGISTER)4660		vxlan_handle_lowerdev_unregister(vn, dev);4661	else if (event == NETDEV_UDP_TUNNEL_PUSH_INFO)4662		vxlan_offload_rx_ports(dev, true);4663	else if (event == NETDEV_UDP_TUNNEL_DROP_INFO)4664		vxlan_offload_rx_ports(dev, false);4665 4666	return NOTIFY_DONE;4667}4668 4669static struct notifier_block vxlan_notifier_block __read_mostly = {4670	.notifier_call = vxlan_netdevice_event,4671};4672 4673static void4674vxlan_fdb_offloaded_set(struct net_device *dev,4675			struct switchdev_notifier_vxlan_fdb_info *fdb_info)4676{4677	struct vxlan_dev *vxlan = netdev_priv(dev);4678	struct vxlan_rdst *rdst;4679	struct vxlan_fdb *f;4680	u32 hash_index;4681 4682	hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni);4683 4684	spin_lock_bh(&vxlan->hash_lock[hash_index]);4685 4686	f = vxlan_find_mac(vxlan, fdb_info->eth_addr, fdb_info->vni);4687	if (!f)4688		goto out;4689 4690	rdst = vxlan_fdb_find_rdst(f, &fdb_info->remote_ip,4691				   fdb_info->remote_port,4692				   fdb_info->remote_vni,4693				   fdb_info->remote_ifindex);4694	if (!rdst)4695		goto out;4696 4697	rdst->offloaded = fdb_info->offloaded;4698 4699out:4700	spin_unlock_bh(&vxlan->hash_lock[hash_index]);4701}4702 4703static int4704vxlan_fdb_external_learn_add(struct net_device *dev,4705			     struct switchdev_notifier_vxlan_fdb_info *fdb_info)4706{4707	struct vxlan_dev *vxlan = netdev_priv(dev);4708	struct netlink_ext_ack *extack;4709	u32 hash_index;4710	int err;4711 4712	hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni);4713	extack = switchdev_notifier_info_to_extack(&fdb_info->info);4714 4715	spin_lock_bh(&vxlan->hash_lock[hash_index]);4716	err = vxlan_fdb_update(vxlan, fdb_info->eth_addr, &fdb_info->remote_ip,4717			       NUD_REACHABLE,4718			       NLM_F_CREATE | NLM_F_REPLACE,4719			       fdb_info->remote_port,4720			       fdb_info->vni,4721			       fdb_info->remote_vni,4722			       fdb_info->remote_ifindex,4723			       NTF_USE | NTF_SELF | NTF_EXT_LEARNED,4724			       0, false, extack);4725	spin_unlock_bh(&vxlan->hash_lock[hash_index]);4726 4727	return err;4728}4729 4730static int4731vxlan_fdb_external_learn_del(struct net_device *dev,4732			     struct switchdev_notifier_vxlan_fdb_info *fdb_info)4733{4734	struct vxlan_dev *vxlan = netdev_priv(dev);4735	struct vxlan_fdb *f;4736	u32 hash_index;4737	int err = 0;4738 4739	hash_index = fdb_head_index(vxlan, fdb_info->eth_addr, fdb_info->vni);4740	spin_lock_bh(&vxlan->hash_lock[hash_index]);4741 4742	f = vxlan_find_mac(vxlan, fdb_info->eth_addr, fdb_info->vni);4743	if (!f)4744		err = -ENOENT;4745	else if (f->flags & NTF_EXT_LEARNED)4746		err = __vxlan_fdb_delete(vxlan, fdb_info->eth_addr,4747					 fdb_info->remote_ip,4748					 fdb_info->remote_port,4749					 fdb_info->vni,4750					 fdb_info->remote_vni,4751					 fdb_info->remote_ifindex,4752					 false);4753 4754	spin_unlock_bh(&vxlan->hash_lock[hash_index]);4755 4756	return err;4757}4758 4759static int vxlan_switchdev_event(struct notifier_block *unused,4760				 unsigned long event, void *ptr)4761{4762	struct net_device *dev = switchdev_notifier_info_to_dev(ptr);4763	struct switchdev_notifier_vxlan_fdb_info *fdb_info;4764	int err = 0;4765 4766	switch (event) {4767	case SWITCHDEV_VXLAN_FDB_OFFLOADED:4768		vxlan_fdb_offloaded_set(dev, ptr);4769		break;4770	case SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE:4771		fdb_info = ptr;4772		err = vxlan_fdb_external_learn_add(dev, fdb_info);4773		if (err) {4774			err = notifier_from_errno(err);4775			break;4776		}4777		fdb_info->offloaded = true;4778		vxlan_fdb_offloaded_set(dev, fdb_info);4779		break;4780	case SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE:4781		fdb_info = ptr;4782		err = vxlan_fdb_external_learn_del(dev, fdb_info);4783		if (err) {4784			err = notifier_from_errno(err);4785			break;4786		}4787		fdb_info->offloaded = false;4788		vxlan_fdb_offloaded_set(dev, fdb_info);4789		break;4790	}4791 4792	return err;4793}4794 4795static struct notifier_block vxlan_switchdev_notifier_block __read_mostly = {4796	.notifier_call = vxlan_switchdev_event,4797};4798 4799static void vxlan_fdb_nh_flush(struct nexthop *nh)4800{4801	struct vxlan_fdb *fdb;4802	struct vxlan_dev *vxlan;4803	u32 hash_index;4804 4805	rcu_read_lock();4806	list_for_each_entry_rcu(fdb, &nh->fdb_list, nh_list) {4807		vxlan = rcu_dereference(fdb->vdev);4808		WARN_ON(!vxlan);4809		hash_index = fdb_head_index(vxlan, fdb->eth_addr,4810					    vxlan->default_dst.remote_vni);4811		spin_lock_bh(&vxlan->hash_lock[hash_index]);4812		if (!hlist_unhashed(&fdb->hlist))4813			vxlan_fdb_destroy(vxlan, fdb, false, false);4814		spin_unlock_bh(&vxlan->hash_lock[hash_index]);4815	}4816	rcu_read_unlock();4817}4818 4819static int vxlan_nexthop_event(struct notifier_block *nb,4820			       unsigned long event, void *ptr)4821{4822	struct nh_notifier_info *info = ptr;4823	struct nexthop *nh;4824 4825	if (event != NEXTHOP_EVENT_DEL)4826		return NOTIFY_DONE;4827 4828	nh = nexthop_find_by_id(info->net, info->id);4829	if (!nh)4830		return NOTIFY_DONE;4831 4832	vxlan_fdb_nh_flush(nh);4833 4834	return NOTIFY_DONE;4835}4836 4837static __net_init int vxlan_init_net(struct net *net)4838{4839	struct vxlan_net *vn = net_generic(net, vxlan_net_id);4840	unsigned int h;4841 4842	INIT_LIST_HEAD(&vn->vxlan_list);4843	spin_lock_init(&vn->sock_lock);4844	vn->nexthop_notifier_block.notifier_call = vxlan_nexthop_event;4845 4846	for (h = 0; h < PORT_HASH_SIZE; ++h)4847		INIT_HLIST_HEAD(&vn->sock_list[h]);4848 4849	return register_nexthop_notifier(net, &vn->nexthop_notifier_block,4850					 NULL);4851}4852 4853static void __net_exit vxlan_destroy_tunnels(struct vxlan_net *vn,4854					     struct list_head *dev_to_kill)4855{4856	struct vxlan_dev *vxlan, *next;4857 4858	list_for_each_entry_safe(vxlan, next, &vn->vxlan_list, next)4859		vxlan_dellink(vxlan->dev, dev_to_kill);4860}4861 4862static void __net_exit vxlan_exit_batch_rtnl(struct list_head *net_list,4863					     struct list_head *dev_to_kill)4864{4865	struct net *net;4866 4867	ASSERT_RTNL();4868	list_for_each_entry(net, net_list, exit_list) {4869		struct vxlan_net *vn = net_generic(net, vxlan_net_id);4870 4871		__unregister_nexthop_notifier(net, &vn->nexthop_notifier_block);4872 4873		vxlan_destroy_tunnels(vn, dev_to_kill);4874	}4875}4876 4877static void __net_exit vxlan_exit_net(struct net *net)4878{4879	struct vxlan_net *vn = net_generic(net, vxlan_net_id);4880	unsigned int h;4881 4882	for (h = 0; h < PORT_HASH_SIZE; ++h)4883		WARN_ON_ONCE(!hlist_empty(&vn->sock_list[h]));4884}4885 4886static struct pernet_operations vxlan_net_ops = {4887	.init = vxlan_init_net,4888	.exit_batch_rtnl = vxlan_exit_batch_rtnl,4889	.exit = vxlan_exit_net,4890	.id   = &vxlan_net_id,4891	.size = sizeof(struct vxlan_net),4892};4893 4894static int __init vxlan_init_module(void)4895{4896	int rc;4897 4898	get_random_bytes(&vxlan_salt, sizeof(vxlan_salt));4899 4900	rc = register_pernet_subsys(&vxlan_net_ops);4901	if (rc)4902		goto out1;4903 4904	rc = register_netdevice_notifier(&vxlan_notifier_block);4905	if (rc)4906		goto out2;4907 4908	rc = register_switchdev_notifier(&vxlan_switchdev_notifier_block);4909	if (rc)4910		goto out3;4911 4912	rc = rtnl_link_register(&vxlan_link_ops);4913	if (rc)4914		goto out4;4915 4916	rc = vxlan_vnifilter_init();4917	if (rc)4918		goto out5;4919 4920	return 0;4921out5:4922	rtnl_link_unregister(&vxlan_link_ops);4923out4:4924	unregister_switchdev_notifier(&vxlan_switchdev_notifier_block);4925out3:4926	unregister_netdevice_notifier(&vxlan_notifier_block);4927out2:4928	unregister_pernet_subsys(&vxlan_net_ops);4929out1:4930	return rc;4931}4932late_initcall(vxlan_init_module);4933 4934static void __exit vxlan_cleanup_module(void)4935{4936	vxlan_vnifilter_uninit();4937	rtnl_link_unregister(&vxlan_link_ops);4938	unregister_switchdev_notifier(&vxlan_switchdev_notifier_block);4939	unregister_netdevice_notifier(&vxlan_notifier_block);4940	unregister_pernet_subsys(&vxlan_net_ops);4941	/* rcu_barrier() is called by netns */4942}4943module_exit(vxlan_cleanup_module);4944 4945MODULE_LICENSE("GPL");4946MODULE_VERSION(VXLAN_VERSION);4947MODULE_AUTHOR("Stephen Hemminger <stephen@networkplumber.org>");4948MODULE_DESCRIPTION("Driver for VXLAN encapsulated traffic");4949MODULE_ALIAS_RTNL_LINK("vxlan");4950