From patchwork Tue Oct 10 16:41:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 823928 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; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Quz0O5wO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yBND64CVlz9tYV for ; Wed, 11 Oct 2017 03:41:26 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932460AbdJJQlY (ORCPT ); Tue, 10 Oct 2017 12:41:24 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:38833 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932436AbdJJQlN (ORCPT ); Tue, 10 Oct 2017 12:41:13 -0400 Received: by mail-pf0-f195.google.com with SMTP id a7so36889819pfj.5 for ; Tue, 10 Oct 2017 09:41:13 -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=90MGOENXzG94B0R6gQvTREN1/YJFjfYo1k0/4siijds=; b=Quz0O5wOAdNhCCUqg5uCk8FM7DNWGmCGu2JXsAtoBSWBdGg8yj/2fzWduIpUTfVXTj L+YFkIno7fGP8wUm8Sn+k/8Cv3LCd7FcN/HV7vEGbHTBGsUwmKx/V6quznvEU1n3R+IN EClPYf2dovx5ZPGfgHtGP0H8PtSJl86z3K5CU/G9qS4OHyFLfqWpkgj80D0JKzXfqN2a FNg+i716mxT7UWwqu+kScXCH971cEyrvpOHp8CPhIVuu80K+s3SJS6qvLzoy4XhpD1mm kxcASN0zu1wjudjPvAgx8jsT/I2SLe6+rzitiq8HS+HBpwCwsSNif/DNAo99RzEQ7iRg tQXQ== 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=90MGOENXzG94B0R6gQvTREN1/YJFjfYo1k0/4siijds=; b=Nqi+TcEVx9qbljBQAFybsp7fkhRQqWdXNMoI4KOWiMsZ6alsTjrDVut0cSiTW735qM NgJq2RR36QX2nYEF65nYll2kFoKV87GxWJGwiEDbsDUXk4WLUuFGJaaVtgRPXhPB5sDY BUQ7L7DZFETgTWfkziBHzYjP4fA+uQ9dxHlrTUEC77izuAcw/yq5V70ZBKgWRGLJkRfn 2fPih1BtGC8JILqQKOrouVcVpIO6RQAOOBEJtOZJ9TD4daalYizgMIostXH+lQ3PPVM+ oKCQb4jDcQAJdCFq4rS1bD/LAURaovel3nfEcIr/t/aAwEzQFlnTntNNdfs4yNyCUKMQ FNhw== X-Gm-Message-State: AMCzsaW7gR/yUoZTG2C5nQjjhjMRNlGWwWN9tsmKPTeaBbxw4lUXvAZG L9M4/dlxfCJM9frmvInPt+4i2A== X-Google-Smtp-Source: AOwi7QA1TJlqp5ATBHK08pwO6hp2Me191x2OYgjpWlLDB86y8n/t1tscmHIIhetBjXcBhX2X/09/mA== X-Received: by 10.159.252.201 with SMTP id o9mr12941226pls.135.1507653673183; Tue, 10 Oct 2017 09:41:13 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id l189sm21626822pga.24.2017.10.10.09.41.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 10 Oct 2017 09:41:12 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: jiri@mellanox.com, idosch@mellanox.com, kjlx@templeofstupid.com, David Ahern Subject: [RFC net-next 3/4] mlxsw: spectrum: router: Add support for address validator notifier Date: Tue, 10 Oct 2017 09:41:04 -0700 Message-Id: <1507653665-20540-4-git-send-email-dsahern@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1507653665-20540-1-git-send-email-dsahern@gmail.com> References: <1507653665-20540-1-git-send-email-dsahern@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add support for inetaddr_validator and inet6addr_validator. The notifiers provide a means for validating ipv4 and ipv6 addresses before the addresses are installed and on failure the error is propagated back to the user. Signed-off-by: David Ahern --- drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 10 ++++ drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 4 ++ .../net/ethernet/mellanox/mlxsw/spectrum_router.c | 53 ++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 321988ac57cc..da4ee91235be 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c @@ -4505,11 +4505,19 @@ static struct notifier_block mlxsw_sp_netdevice_nb __read_mostly = { .notifier_call = mlxsw_sp_netdevice_event, }; +static struct notifier_block mlxsw_sp_inetaddr_valid_nb __read_mostly = { + .notifier_call = mlxsw_sp_inetaddr_valid_event, +}; + static struct notifier_block mlxsw_sp_inetaddr_nb __read_mostly = { .notifier_call = mlxsw_sp_inetaddr_event, .priority = 10, /* Must be called before FIB notifier block */ }; +static struct notifier_block mlxsw_sp_inet6addr_valid_nb __read_mostly = { + .notifier_call = mlxsw_sp_inet6addr_valid_event, +}; + static struct notifier_block mlxsw_sp_inet6addr_nb __read_mostly = { .notifier_call = mlxsw_sp_inet6addr_event, }; @@ -4533,7 +4541,9 @@ static int __init mlxsw_sp_module_init(void) int err; register_netdevice_notifier(&mlxsw_sp_netdevice_nb); + register_inetaddr_validator_notifier(&mlxsw_sp_inetaddr_valid_nb); register_inetaddr_notifier(&mlxsw_sp_inetaddr_nb); + register_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb); register_inet6addr_notifier(&mlxsw_sp_inet6addr_nb); register_netevent_notifier(&mlxsw_sp_router_netevent_nb); diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h index 8e45183dc9bb..4865a6f58c83 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h @@ -390,8 +390,12 @@ int mlxsw_sp_router_netevent_event(struct notifier_block *unused, int mlxsw_sp_netdevice_router_port_event(struct net_device *dev); int mlxsw_sp_inetaddr_event(struct notifier_block *unused, unsigned long event, void *ptr); +int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused, + unsigned long event, void *ptr); int mlxsw_sp_inet6addr_event(struct notifier_block *unused, unsigned long event, void *ptr); +int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused, + unsigned long event, void *ptr); int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event, struct netdev_notifier_changeupper_info *info); void diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index 6a356f4b99a3..7d53fdf2c0a8 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c @@ -5656,6 +5656,33 @@ int mlxsw_sp_inetaddr_event(struct notifier_block *unused, struct mlxsw_sp_rif *rif; int err = 0; + /* NETDEV_UP event is handled by mlxsw_sp_inetaddr_valid_event */ + if (event == NETDEV_UP) + goto out; + + mlxsw_sp = mlxsw_sp_lower_get(dev); + if (!mlxsw_sp) + goto out; + + rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); + if (!mlxsw_sp_rif_should_config(rif, dev, event)) + goto out; + + err = __mlxsw_sp_inetaddr_event(dev, event); +out: + return notifier_from_errno(err); +} + +/* only expected to be called for event == NETDEV_UP */ +int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused, + unsigned long event, void *ptr) +{ + struct in_validator_info *ivi = (struct in_validator_info *)ptr; + struct net_device *dev = ivi->ivi_dev->dev; + struct mlxsw_sp *mlxsw_sp; + struct mlxsw_sp_rif *rif; + int err = 0; + mlxsw_sp = mlxsw_sp_lower_get(dev); if (!mlxsw_sp) goto out; @@ -5708,6 +5735,10 @@ int mlxsw_sp_inet6addr_event(struct notifier_block *unused, struct mlxsw_sp_inet6addr_event_work *inet6addr_work; struct net_device *dev = if6->idev->dev; + /* NETDEV_UP event is handled by mlxsw_sp_inet6addr_valid_event */ + if (event == NETDEV_UP) + return NOTIFY_DONE; + if (!mlxsw_sp_port_dev_lower_find_rcu(dev)) return NOTIFY_DONE; @@ -5724,6 +5755,28 @@ int mlxsw_sp_inet6addr_event(struct notifier_block *unused, return NOTIFY_DONE; } +int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused, + unsigned long event, void *ptr) +{ + struct in6_validator_info *i6vi = (struct in6_validator_info *)ptr; + struct net_device *dev = i6vi->i6vi_dev->dev; + struct mlxsw_sp *mlxsw_sp; + struct mlxsw_sp_rif *rif; + int err = 0; + + mlxsw_sp = mlxsw_sp_lower_get(dev); + if (!mlxsw_sp) + goto out; + + rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); + if (!mlxsw_sp_rif_should_config(rif, dev, event)) + goto out; + + err = __mlxsw_sp_inetaddr_event(dev, event); +out: + return notifier_from_errno(err); +} + static int mlxsw_sp_rif_edit(struct mlxsw_sp *mlxsw_sp, u16 rif_index, const char *mac, int mtu) {