From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stefano Brivio Subject: [PATCH net-next v2 02/11] vxlan: ICMP error lookup handler Date: Thu, 8 Nov 2018 12:19:15 +0100 Message-ID: <0a3118f577f3eeb38ec611bb1f0fa9ce009e231c.1541675666.git.sbrivio@redhat.com> References: Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Cc: Sabrina Dubroca , Xin Long , Stephen Hemminger , Jiri Benc , David Ahern , netdev@vger.kernel.org To: "David S. Miller" Return-path: Received: from mx1.redhat.com ([209.132.183.28]:57358 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726145AbeKHUy4 (ORCPT ); Thu, 8 Nov 2018 15:54:56 -0500 In-Reply-To: Sender: netdev-owner@vger.kernel.org List-ID: Export an encap_err_lookup() operation to match an ICMP error against a valid VNI. Signed-off-by: Stefano Brivio Reviewed-by: Sabrina Dubroca --- v2: no changes drivers/net/vxlan.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index ae969f806d56..0851af6733f3 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@ -1552,6 +1552,34 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb) return 0; } +/* Callback from net/ipv{4,6}/udp.c to check that we have a VNI for errors */ +static int vxlan_err_lookup(struct sock *sk, struct sk_buff *skb) +{ + struct vxlan_dev *vxlan; + struct vxlan_sock *vs; + struct vxlanhdr *hdr; + __be32 vni; + + if (skb->len < VXLAN_HLEN) + return -EINVAL; + + hdr = vxlan_hdr(skb); + + if (!(hdr->vx_flags & VXLAN_HF_VNI)) + return -EINVAL; + + vs = rcu_dereference_sk_user_data(sk); + if (!vs) + return -ENOENT; + + vni = vxlan_vni(hdr->vx_vni); + vxlan = vxlan_vs_find_vni(vs, skb->dev->ifindex, vni); + if (!vxlan) + return -ENOENT; + + return 0; +} + static int arp_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni) { struct vxlan_dev *vxlan = netdev_priv(dev); @@ -2948,6 +2976,7 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, bool ipv6, tunnel_cfg.sk_user_data = vs; tunnel_cfg.encap_type = 1; tunnel_cfg.encap_rcv = vxlan_rcv; + tunnel_cfg.encap_err_lookup = vxlan_err_lookup; tunnel_cfg.encap_destroy = NULL; tunnel_cfg.gro_receive = vxlan_gro_receive; tunnel_cfg.gro_complete = vxlan_gro_complete; -- 2.19.1