Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2992434imu; Sun, 9 Dec 2018 14:31:15 -0800 (PST) X-Google-Smtp-Source: AFSGD/Ux+L9miC2L28/DeTpJYCZLG3B+NaUY+QwbUvXjVKKrtdOIAgvQbPSFOgW4r6YnQw32bYp8 X-Received: by 2002:a17:902:d70b:: with SMTP id w11mr10095994ply.294.1544394675189; Sun, 09 Dec 2018 14:31:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544394675; cv=none; d=google.com; s=arc-20160816; b=mt4izVo80L3sixvTfyaeSNS/LkAxKAMMaZlgJMrOCoI1XPGWkZip4wGp3vsUTuS7am QTlAAoZQUq87L15XZSJRYlhGoItTSGxm6RdNPC1fIWjfPsMjbw4SOpYJwd5Jwt9sy5kd k8Zt2P8/Zj8Ma79sO51HSqoQDGQmbxyHHCaDMmwHYTmICKn0JKLHIvJxDH+h/PwvnRWw yu+7tGWTTV/Fu6oAGg/0g70oPZNxJFArsDImbu4/7obIy4WVksQ2KQ/GCb6APlw7UOO/ KcPQmkOtJxgC6ALdAisILzsdGg3Sq4yz1Biahnnxtok1CRXLLiR3jb65KLPGTeiD47Xw zIkA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition; bh=jd6Is3tFdtQtP9+/Mcf+LIVNLQwLldSIc2BIrLjGHD8=; b=D1d9d8fGr9+IvpnzPUsLVjUeWIACH5kYw4a8uoFqvo6qWfDy55XtFeDHDqKn9v8Vxh X+FDiCOCH4HwCcc2VX9e1hPcH13WRb/w9KBqGVzheXg5QaUjfgsVFZRaQvKl2ZH8wdLf wmjmQ9/kJDekZYIczXATaOXPmnYQjcFxG0K1pPU8vI0K73gezRoGMma1waTny8PMvqmR DcIL5SuapYcdes6J7hVplob6ttIeI4w9liIqX610QIGDyRkGMD5Wh3hzOgm8fsFTs2YS 4biUnnmLQIa8hGRjvouo2RsWkvPzRpUY8tBcTqtMYtwFjeBGD30z+GH6IS1Wyg1tUfkr dPDQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c81si9421028pfc.196.2018.12.09.14.30.59; Sun, 09 Dec 2018 14:31:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728640AbeLIW2W (ORCPT + 99 others); Sun, 9 Dec 2018 17:28:22 -0500 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:34600 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726361AbeLIVzL (ORCPT ); Sun, 9 Dec 2018 16:55:11 -0500 Received: from pub.yeoldevic.com ([81.174.156.145] helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1gW72b-0002im-Da; Sun, 09 Dec 2018 21:55:09 +0000 Received: from ben by deadeye with local (Exim 4.91) (envelope-from ) id 1gW72Y-0003EL-UG; Sun, 09 Dec 2018 21:55:06 +0000 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, "David S. Miller" , "Roopa Prabhu" Date: Sun, 09 Dec 2018 21:50:33 +0000 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) X-Patchwork-Hint: ignore Subject: [PATCH 3.16 028/328] vxlan: add new fdb alloc and create helpers In-Reply-To: X-SA-Exim-Connect-IP: 81.174.156.145 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.62-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: Roopa Prabhu commit 25e20e730d56471cffa25419bf2a66078bd55330 upstream. - Add new vxlan_fdb_alloc helper - rename existing vxlan_fdb_create into vxlan_fdb_update: because it really creates or updates an existing fdb entry - move new fdb creation into a separate vxlan_fdb_create Main motivation for this change is to introduce the ability to decouple vxlan fdb creation and notify, used in a later patch. Signed-off-by: Roopa Prabhu Signed-off-by: David S. Miller [bwh: Backported to 3.16: - s/vxlan->cfg\.addrmax/vxlan->addrmax/g - Drop src_vni parameters and initialisation of vxlan_fdb::vni - Drop last argument to vxlan_fdb_head() - Drop change to vxlan_changelink()] Signed-off-by: Ben Hutchings --- drivers/net/vxlan.c | 91 ++++++++++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 29 deletions(-) --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@ -685,9 +685,60 @@ static void vxlan_notify_del_rx_port(str udp_del_offload(&vs->udp_offloads); } -/* Add new entry to forwarding table -- assumes lock held */ +static struct vxlan_fdb *vxlan_fdb_alloc(struct vxlan_dev *vxlan, + const u8 *mac, __u16 state, + __u8 ndm_flags) +{ + struct vxlan_fdb *f; + + f = kmalloc(sizeof(*f), GFP_ATOMIC); + if (!f) + return NULL; + f->state = state; + f->flags = ndm_flags; + f->updated = f->used = jiffies; + INIT_LIST_HEAD(&f->remotes); + memcpy(f->eth_addr, mac, ETH_ALEN); + + return f; +} + static int vxlan_fdb_create(struct vxlan_dev *vxlan, const u8 *mac, union vxlan_addr *ip, + __u16 state, __be16 port, + __be32 vni, __u32 ifindex, __u8 ndm_flags, + struct vxlan_fdb **fdb) +{ + struct vxlan_rdst *rd = NULL; + struct vxlan_fdb *f; + int rc; + + if (vxlan->addrmax && vxlan->addrcnt >= vxlan->addrmax) + return -ENOSPC; + + netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip); + f = vxlan_fdb_alloc(vxlan, mac, state, ndm_flags); + if (!f) + return -ENOMEM; + + rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd); + if (rc < 0) { + kfree(f); + return rc; + } + + ++vxlan->addrcnt; + hlist_add_head_rcu(&f->hlist, + vxlan_fdb_head(vxlan, mac)); + + *fdb = f; + + return 0; +} + +/* Add new entry to forwarding table -- assumes lock held */ +static int vxlan_fdb_update(struct vxlan_dev *vxlan, + const u8 *mac, union vxlan_addr *ip, __u16 state, __u16 flags, __be16 port, __u32 vni, __u32 ifindex, __u8 ndm_flags) @@ -740,35 +791,17 @@ static int vxlan_fdb_create(struct vxlan if (!(flags & NLM_F_CREATE)) return -ENOENT; - if (vxlan->addrmax && vxlan->addrcnt >= vxlan->addrmax) - return -ENOSPC; - /* Disallow replace to add a multicast entry */ if ((flags & NLM_F_REPLACE) && (is_multicast_ether_addr(mac) || is_zero_ether_addr(mac))) return -EOPNOTSUPP; netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip); - f = kmalloc(sizeof(*f), GFP_ATOMIC); - if (!f) - return -ENOMEM; - - notify = 1; - f->state = state; - f->flags = ndm_flags; - f->updated = f->used = jiffies; - INIT_LIST_HEAD(&f->remotes); - memcpy(f->eth_addr, mac, ETH_ALEN); - - rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd); - if (rc < 0) { - kfree(f); + rc = vxlan_fdb_create(vxlan, mac, ip, state, port, + vni, ifindex, ndm_flags, &f); + if (rc < 0) return rc; - } - - ++vxlan->addrcnt; - hlist_add_head_rcu(&f->hlist, - vxlan_fdb_head(vxlan, mac)); + notify = 1; } if (notify) { @@ -886,7 +919,7 @@ static int vxlan_fdb_add(struct ndmsg *n return -EAFNOSUPPORT; spin_lock_bh(&vxlan->hash_lock); - err = vxlan_fdb_create(vxlan, addr, &ip, ndm->ndm_state, flags, + err = vxlan_fdb_update(vxlan, addr, &ip, ndm->ndm_state, flags, port, vni, ifindex, ndm->ndm_flags); spin_unlock_bh(&vxlan->hash_lock); @@ -1012,7 +1045,7 @@ static bool vxlan_snoop(struct net_devic /* close off race between vxlan_flush and incoming packets */ if (netif_running(dev)) - vxlan_fdb_create(vxlan, src_mac, src_ip, + vxlan_fdb_update(vxlan, src_mac, src_ip, NUD_REACHABLE, NLM_F_EXCL|NLM_F_CREATE, vxlan->dst_port, @@ -2718,7 +2751,7 @@ static int vxlan_newlink(struct net *net /* create an fdb entry for a valid default destination */ if (!vxlan_addr_any(&vxlan->default_dst.remote_ip)) { - err = vxlan_fdb_create(vxlan, all_zeros_mac, + err = vxlan_fdb_update(vxlan, all_zeros_mac, &vxlan->default_dst.remote_ip, NUD_REACHABLE|NUD_PERMANENT, NLM_F_EXCL|NLM_F_CREATE,