From patchwork Tue Mar 13 15:29:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 885303 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Bs+1kZHh"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4011JV50HYz9sRG for ; Wed, 14 Mar 2018 03:58:18 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933152AbeCMPaC (ORCPT ); Tue, 13 Mar 2018 11:30:02 -0400 Received: from mail-pg0-f68.google.com ([74.125.83.68]:33300 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752375AbeCMP36 (ORCPT ); Tue, 13 Mar 2018 11:29:58 -0400 Received: by mail-pg0-f68.google.com with SMTP id g12so5360pgs.0 for ; Tue, 13 Mar 2018 08:29:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=QSmdneucbMpXbXn3RRsJPxzT9yTgsGhqTBJknici6x0=; b=Bs+1kZHhg724hJ/cs8M0h8mbzWrvqgW1ZRLNVSGVmZboNJVMCO8rcZ7GwtU7/ndFZt T+TcETWcMPudsT71jbMbef4zeuzVnp3g4KdARYZHZDcMABL8+RWaP7NxyaRmYBwSzvnD Vx/lSVwUK8YZCIes1kMj0x6HNRJGYJQgvaNAQg/iWBEfOAnNTrn2MtOLvAHu9VAtUqpK drfVCvsS9bJA3LvJqJ8shvmBgSyZpJL5WIs9Jt6gMqkiS/+IGeLMdKKXnV1ZoJB4QCCp uOg6rDpcPaUa3H14a9jW4F1UPV6hF/K0YHSeQyTMqKzccYY9cORSb+u4Z7xlxz0XYBt2 Tsog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=QSmdneucbMpXbXn3RRsJPxzT9yTgsGhqTBJknici6x0=; b=WLoVun8UrI9qd5Z401cIQuMtU7ATLNJtUiy6Zvn6bhsZW4y3rNz967t2ey0Lm5Jj90 3bVXkT8pGuCJYLR1ZK6kMVCOgaVeRVjuVvWNH3ZPzrFa9QsjboezlDaBjcgIw/1QxKgj 4msEYxRqWvQFTcl5CEGqqdTjsTAPQlJx9REeM6ITc4JHKCn4MYkXHc4qLOdu++mHTAX+ oiSoI8u+l9bj7tETr8S9EXqeYIqQZSpBPJc9Q3Szcxiz3PIxGQDhbn2TUDtnDdMBkWPe YiacK4rPyOtzzSvtgrJdT2Mq5XADxx8CL3T0yfOTwQ4CKHL+9PFNTONdl8IKsxdPzWMS Hi7Q== X-Gm-Message-State: AElRT7FeSqJ0UGgUJNt3Q7/AOuKWUvUdL7yQHTYFTzLU8COoRAgipQqk hdPvzKiN7yIaE5s+vSz1YSR4ZQ== X-Google-Smtp-Source: AG47ELualuguyMX8i21JvSc486NO4F7w5zDDy+8W5AgrvQCu7rrta/VHpQyPdFMdUr+MoFuOrfmKqw== X-Received: by 10.98.138.217 with SMTP id o86mr1026093pfk.128.1520954997216; Tue, 13 Mar 2018 08:29:57 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id k73sm1231187pfk.54.2018.03.13.08.29.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 13 Mar 2018 08:29:55 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: idosch@idosch.org, David Ahern Subject: [PATCH v4 net-next 3/6] net/ipv6: Add l3mdev check to ipv6_chk_addr_and_flags Date: Tue, 13 Mar 2018 08:29:38 -0700 Message-Id: <20180313152941.31218-4-dsahern@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180313152941.31218-1-dsahern@gmail.com> References: <20180313152941.31218-1-dsahern@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Lookup the L3 master device for the passed in device. Only consider addresses on netdev's with the same master device. If the device is not enslaved or is NULL, then the l3mdev is NULL which means only devices not enslaved (ie, in the default domain) are considered. Signed-off-by: David Ahern Reviewed-by: Ido Schimmel --- net/ipv6/addrconf.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 0677b9732d56..6fd4bbdc444f 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -1856,22 +1856,37 @@ int ipv6_chk_addr(struct net *net, const struct in6_addr *addr, } EXPORT_SYMBOL(ipv6_chk_addr); +/* device argument is used to find the L3 domain of interest. If + * skip_dev_check is set, then the ifp device is not checked against + * the passed in dev argument. So the 2 cases for addresses checks are: + * 1. does the address exist in the L3 domain that dev is part of + * (skip_dev_check = true), or + * + * 2. does the address exist on the specific device + * (skip_dev_check = false) + */ int ipv6_chk_addr_and_flags(struct net *net, const struct in6_addr *addr, const struct net_device *dev, bool skip_dev_check, int strict, u32 banned_flags) { unsigned int hash = inet6_addr_hash(net, addr); + const struct net_device *l3mdev; struct inet6_ifaddr *ifp; u32 ifp_flags; rcu_read_lock(); + l3mdev = l3mdev_master_dev_rcu(dev); if (skip_dev_check) dev = NULL; hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) { if (!net_eq(dev_net(ifp->idev->dev), net)) continue; + + if (l3mdev_master_dev_rcu(ifp->idev->dev) != l3mdev) + continue; + /* Decouple optimistic from tentative for evaluation here. * Ban optimistic addresses explicitly, when required. */