From patchwork Sat May 27 22:19:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 767784 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3wZy9N4vdKz9s7q for ; Sun, 28 May 2017 08:19:52 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="g14EPbZN"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750794AbdE0WTo (ORCPT ); Sat, 27 May 2017 18:19:44 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:33708 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750781AbdE0WTm (ORCPT ); Sat, 27 May 2017 18:19:42 -0400 Received: by mail-pg0-f66.google.com with SMTP id s62so2469466pgc.0 for ; Sat, 27 May 2017 15:19:42 -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=ocy/IF0T89vUR+UR3MVETt5GyYyefHZKPRN47k2E2J4=; b=g14EPbZNUCNrGt7xbvcXX8yG6n94tnfjyNNwJ9oTAIGJiJdnrBhs6wazgkdUw/imO3 eR0Uej+Mp29YZLWF9qLfqJ+Ktld8WR1BBPi99vhPx1+ViHW7mPsNaK9BH0YqM/ETovf6 bg1RH9qYsbdtV9EJDpmdOA99iFBihwrzmz3Ydlm0QbxNLQZWXOElrvIwBoE2nOs6aXyf 8IsMVbqNVRITYa51kWhfMPQJuCmwJlWWz7ombVknTq/vEEfSHMH9iwDTisKXxHKQZXMp o0c4AL91FTEV1LTJq5bUHhz7GPOjHWwzypphrcQAH3HJkbqHGAemVp/O+jxq5czP9Ad5 jmYQ== 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=ocy/IF0T89vUR+UR3MVETt5GyYyefHZKPRN47k2E2J4=; b=cOA4N/ndr1iWhCGnfr7FLut3cChDcxy79Ane7OZUCmSWTYwPPndxQGNSBVIqvcVo1z 7gLx4FL3mgLQraiOujjlht6zmDu1zWNIDOBF0wH6gXzIu0IM1syhaVPWJX9NxKlkXFUL hTxlElTepUYdJ53vv8A/63E+a1wMwTfqmRLJ8NjO4Cj1FscwWjXWCCIPXocyoiXZ5TbM zkL7KOX0a+b2C+At2dPomCqlPXxVL27PCWM5dD4Nllg8exsQlJWrSRavauGYTsne3Rml fddcMSjVBZ/+io4Pq785smnI2KxfEG06NgQEJPSD+eGC6xnwhk3EElFkWgKQvpep5d2d J6gw== X-Gm-Message-State: AODbwcCueTPHtXfMp6XZ/0WxgPNbColaeJ9geeIciIuwmDaBvBc64b9a Wpxs7YiHM8MXJNRJ X-Received: by 10.84.231.139 with SMTP id g11mr52254549plk.71.1495923581464; Sat, 27 May 2017 15:19:41 -0700 (PDT) Received: from Davids-MacBook-Pro.local.net (c-73-181-33-26.hsd1.co.comcast.net. [73.181.33.26]) by smtp.gmail.com with ESMTPSA id v188sm7965428pgv.51.2017.05.27.15.19.39 (version=TLS1 cipher=AES128-SHA bits=128/128); Sat, 27 May 2017 15:19:40 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: roopa@cumulusnetworks.com, David Ahern Subject: [PATCH v2 net-next 2/9] net: ipv4: Add extack message for invalid prefix or length Date: Sat, 27 May 2017 16:19:26 -0600 Message-Id: <20170527221933.57644-3-dsahern@gmail.com> X-Mailer: git-send-email 2.11.0 (Apple Git-81) In-Reply-To: <20170527221933.57644-1-dsahern@gmail.com> References: <20170527221933.57644-1-dsahern@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add extack error message for invalid prefix length and invalid prefix. Example of the latter is a route spec containing 172.16.100.1/24, where the /24 mask means the lower 8-bits should be 0. Amazing how easy that one is to overlook when an EINVAL is returned. Signed-off-by: David Ahern --- include/net/ip_fib.h | 3 ++- net/ipv4/fib_frontend.c | 7 ++++--- net/ipv4/fib_trie.c | 17 +++++++++++------ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index 25f5c516afd1..c3fa1f0438c1 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h @@ -266,7 +266,8 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, struct fib_result *res, int fib_flags); int fib_table_insert(struct net *, struct fib_table *, struct fib_config *, struct netlink_ext_ack *extack); -int fib_table_delete(struct net *, struct fib_table *, struct fib_config *); +int fib_table_delete(struct net *, struct fib_table *, struct fib_config *, + struct netlink_ext_ack *extack); int fib_table_dump(struct fib_table *table, struct sk_buff *skb, struct netlink_callback *cb); int fib_table_flush(struct net *net, struct fib_table *table); diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 14d2f7bd7c76..715b7967d8ea 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -588,7 +588,8 @@ int ip_rt_ioctl(struct net *net, unsigned int cmd, void __user *arg) if (cmd == SIOCDELRT) { tb = fib_get_table(net, cfg.fc_table); if (tb) - err = fib_table_delete(net, tb, &cfg); + err = fib_table_delete(net, tb, &cfg, + NULL); else err = -ESRCH; } else { @@ -732,7 +733,7 @@ static int inet_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh, goto errout; } - err = fib_table_delete(net, tb, &cfg); + err = fib_table_delete(net, tb, &cfg, extack); errout: return err; } @@ -851,7 +852,7 @@ static void fib_magic(int cmd, int type, __be32 dst, int dst_len, struct in_ifad if (cmd == RTM_NEWROUTE) fib_table_insert(net, tb, &cfg, NULL); else - fib_table_delete(net, tb, &cfg); + fib_table_delete(net, tb, &cfg, NULL); } void fib_add_ifaddr(struct in_ifaddr *ifa) diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 9bd46e1e1037..a624d380c81d 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -1099,13 +1099,18 @@ static int fib_insert_alias(struct trie *t, struct key_vector *tp, return 0; } -static bool fib_valid_key_len(u32 key, u8 plen) +static bool fib_valid_key_len(u32 key, u8 plen, struct netlink_ext_ack *extack) { - if (plen > KEYLENGTH) + if (plen > KEYLENGTH) { + NL_SET_ERR_MSG(extack, "Invalid prefix length"); return false; + } - if ((plen < KEYLENGTH) && (key << plen)) + if ((plen < KEYLENGTH) && (key << plen)) { + NL_SET_ERR_MSG(extack, + "Invalid prefix for given prefix length"); return false; + } return true; } @@ -1128,7 +1133,7 @@ int fib_table_insert(struct net *net, struct fib_table *tb, key = ntohl(cfg->fc_dst); - if (!fib_valid_key_len(key, plen)) + if (!fib_valid_key_len(key, plen, extack)) return -EINVAL; pr_debug("Insert table=%u %08x/%d\n", tb->tb_id, key, plen); @@ -1516,7 +1521,7 @@ static void fib_remove_alias(struct trie *t, struct key_vector *tp, /* Caller must hold RTNL. */ int fib_table_delete(struct net *net, struct fib_table *tb, - struct fib_config *cfg) + struct fib_config *cfg, struct netlink_ext_ack *extack) { struct trie *t = (struct trie *) tb->tb_data; struct fib_alias *fa, *fa_to_delete; @@ -1528,7 +1533,7 @@ int fib_table_delete(struct net *net, struct fib_table *tb, key = ntohl(cfg->fc_dst); - if (!fib_valid_key_len(key, plen)) + if (!fib_valid_key_len(key, plen, extack)) return -EINVAL; l = fib_find_node(t, &tp, key);