From patchwork Sat Dec 10 20:32:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 704772 X-Patchwork-Delegate: shemminger@vyatta.com 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 3tbgl96XLFz9t1T for ; Sun, 11 Dec 2016 07:32:37 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="YQYaojBR"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752614AbcLJUce (ORCPT ); Sat, 10 Dec 2016 15:32:34 -0500 Received: from mail-pg0-f46.google.com ([74.125.83.46]:34725 "EHLO mail-pg0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752463AbcLJUc0 (ORCPT ); Sat, 10 Dec 2016 15:32:26 -0500 Received: by mail-pg0-f46.google.com with SMTP id x23so20195750pgx.1 for ; Sat, 10 Dec 2016 12:32:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=AwoKwZlz16Ren/9jmmrnBTjJgHkUj5BSXITfJbGm+oA=; b=YQYaojBRxxWQYrMbraW6HWrvyQB3EsYrJH5ps/8yTMwIGxUXSHnixXc8MDAvyLGEFM rpH4ufOJWENR7J75rsNvsLutxKNrJAtjWI36UXEWljqlQm2b7fuL56kK7QX6A4xg/fZS lWcNzZLV5Hf/OFQ7kNotZW7eLASVv62I7yDDg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=AwoKwZlz16Ren/9jmmrnBTjJgHkUj5BSXITfJbGm+oA=; b=VZF/3878rpCkiQV5+rtWPfth4QwirlpdoD/TMDx3pv8j+aQCKNAMK3uqAeLQy7k99q rl48V/7HJO8AlBWTii6dtIfEQGzTUNhtY7t2jWBB8Y9drxvEQbGZQPx4/ZsMzjdHdsx4 qIT2pOkaKd36RHNiOoAqcQX8kVb0k4nw+4i88kVclJPBxnRvT+sreZeMX/29VbwgiUL9 TCNV7BsqX41dwEgALJnj/B1KzFvK9/jdIFd3TJbXB3/SwzC70cAaXIsrAT8qCu/hM3my iSesYqI4KaA/tmom9lgU3mzWvojwO78FrnJH6ea8v7UVouyodwtsMX/6dZfNZhn/Vu1F AAJw== X-Gm-Message-State: AKaTC02EgWQ984xe9k2kd6abkzmj5PiSLXVxJEG2FxnNC5R9BAQ/mopIkpGAwMph06Hqakn2 X-Received: by 10.99.211.21 with SMTP id b21mr110056393pgg.120.1481401945514; Sat, 10 Dec 2016 12:32:25 -0800 (PST) Received: from kenny.cumulusnetworks.com. ([216.129.126.126]) by smtp.googlemail.com with ESMTPSA id m5sm66555005pgn.42.2016.12.10.12.32.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 10 Dec 2016 12:32:25 -0800 (PST) From: David Ahern To: netdev@vger.kernel.org, stephen@networkplumber.org Cc: David Ahern Subject: [iproute2 net-next 7/8] libnetlink: Add variant of rtnl_talk that does not display RTNETLINK answers error Date: Sat, 10 Dec 2016 12:32:13 -0800 Message-Id: <1481401934-4026-8-git-send-email-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1481401934-4026-1-git-send-email-dsa@cumulusnetworks.com> References: <1481401934-4026-1-git-send-email-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org iplink_vrf has 2 functions used to validate a user given device name is a VRF device and to return the table id. If the user string is not a device name ip commands with a vrf keyword show a confusing error message: "RTNETLINK answers: No such device". Add a variant of rtnl_talk that does not display the "RTNETLINK answers" message and update iplink_vrf to use it. Signed-off-by: David Ahern --- include/libnetlink.h | 3 +++ ip/iplink_vrf.c | 14 +++++++++++--- lib/libnetlink.c | 20 +++++++++++++++++--- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/include/libnetlink.h b/include/libnetlink.h index 751ebf186dd4..bd0267dfcc02 100644 --- a/include/libnetlink.h +++ b/include/libnetlink.h @@ -81,6 +81,9 @@ int rtnl_dump_filter_nc(struct rtnl_handle *rth, int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, struct nlmsghdr *answer, size_t len) __attribute__((warn_unused_result)); +int rtnl_talk_suppress_rtnl_errmsg(struct rtnl_handle *rtnl, struct nlmsghdr *n, + struct nlmsghdr *answer, size_t len) + __attribute__((warn_unused_result)); int rtnl_send(struct rtnl_handle *rth, const void *buf, int) __attribute__((warn_unused_result)); int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int) diff --git a/ip/iplink_vrf.c b/ip/iplink_vrf.c index c101ed770f87..917630e85337 100644 --- a/ip/iplink_vrf.c +++ b/ip/iplink_vrf.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "rt_names.h" #include "utils.h" @@ -126,8 +127,14 @@ __u32 ipvrf_get_table(const char *name) addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, strlen(name) + 1); - if (rtnl_talk(&rth, &req.n, &answer.n, sizeof(answer)) < 0) - return 0; + if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n, + &answer.n, sizeof(answer)) < 0) { + /* special case "default" vrf to be the main table */ + if (errno == ENODEV && !strcmp(name, "default")) + rtnl_rttable_a2n(&tb_id, "main"); + + return tb_id; + } ifi = NLMSG_DATA(&answer.n); len = answer.n.nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)); @@ -186,7 +193,8 @@ int name_is_vrf(const char *name) addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, strlen(name) + 1); - if (rtnl_talk(&rth, &req.n, &answer.n, sizeof(answer)) < 0) + if (rtnl_talk_suppress_rtnl_errmsg(&rth, &req.n, + &answer.n, sizeof(answer)) < 0) return 0; ifi = NLMSG_DATA(&answer.n); diff --git a/lib/libnetlink.c b/lib/libnetlink.c index a5db168e50eb..9d7e89aebbd0 100644 --- a/lib/libnetlink.c +++ b/lib/libnetlink.c @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -397,8 +398,9 @@ int rtnl_dump_filter_nc(struct rtnl_handle *rth, return rtnl_dump_filter_l(rth, a); } -int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, - struct nlmsghdr *answer, size_t maxlen) +static int __rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, + struct nlmsghdr *answer, size_t maxlen, + bool show_rtnl_err) { int status; unsigned int seq; @@ -485,7 +487,7 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, return 0; } - if (rtnl->proto != NETLINK_SOCK_DIAG) + if (rtnl->proto != NETLINK_SOCK_DIAG && show_rtnl_err) fprintf(stderr, "RTNETLINK answers: %s\n", strerror(-err->error)); @@ -517,6 +519,18 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, } } +int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, + struct nlmsghdr *answer, size_t maxlen) +{ + return __rtnl_talk(rtnl, n, answer, maxlen, true); +} + +int rtnl_talk_suppress_rtnl_errmsg(struct rtnl_handle *rtnl, struct nlmsghdr *n, + struct nlmsghdr *answer, size_t maxlen) +{ + return __rtnl_talk(rtnl, n, answer, maxlen, false); +} + int rtnl_listen_all_nsid(struct rtnl_handle *rth) { unsigned int on = 1;