From patchwork Thu Jan 3 04:38:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 1020169 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="BrF1vcaU"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43VZtX3dBzz9rxp for ; Thu, 3 Jan 2019 15:38:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729349AbfACEig (ORCPT ); Wed, 2 Jan 2019 23:38:36 -0500 Received: from mail.kernel.org ([198.145.29.99]:34012 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728640AbfACEif (ORCPT ); Wed, 2 Jan 2019 23:38:35 -0500 Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com [216.129.126.126]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7045520896; Thu, 3 Jan 2019 04:38:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1546490314; bh=CIAUfFFGbD8lVFs9YQXlVMvlWzNMoq9rkMqF9O3+DLc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BrF1vcaU2B28bcfd8PFVxC+JrWT99nxgPwP9DRrWSLEepKPIrC1xMqmvAdG5wtcSA +/v4gFha0YIQ5WUSmLXTGLk/rBvIpVlOXHOyF80LoeBZeJSWz3b2Zor9a3YDa/tt3f WV1FXkOTDGc4LqBm9itOr6ZB39b6OtPfcQ6aZH/4= From: David Ahern To: netdev@vger.kernel.org Cc: idosch@mellanox.com, stephen@networkplumber.org, David Ahern Subject: [PATCH iproute2-next 1/5] libnetlink: Add filter function to rtnl_neighdump_req Date: Wed, 2 Jan 2019 20:38:28 -0800 Message-Id: <20190103043832.3748-2-dsahern@kernel.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190103043832.3748-1-dsahern@kernel.org> References: <20190103043832.3748-1-dsahern@kernel.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Add filter function to rtnl_neighdump_req and a buffer to the request for the filter functions to append attributes. Signed-off-by: David Ahern --- include/libnetlink.h | 3 ++- lib/libnetlink.c | 12 +++++++++++- misc/arpd.c | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/include/libnetlink.h b/include/libnetlink.h index dc0c9c4eb3f5..148951510d1e 100644 --- a/include/libnetlink.h +++ b/include/libnetlink.h @@ -60,7 +60,8 @@ int rtnl_routedump_req(struct rtnl_handle *rth, int family, __attribute__((warn_unused_result)); int rtnl_ruledump_req(struct rtnl_handle *rth, int family) __attribute__((warn_unused_result)); -int rtnl_neighdump_req(struct rtnl_handle *rth, int family) +int rtnl_neighdump_req(struct rtnl_handle *rth, int family, + req_filter_fn_t filter_fn) __attribute__((warn_unused_result)); int rtnl_neightbldump_req(struct rtnl_handle *rth, int family) __attribute__((warn_unused_result)); diff --git a/lib/libnetlink.c b/lib/libnetlink.c index 4d7d081054fd..19318b445266 100644 --- a/lib/libnetlink.c +++ b/lib/libnetlink.c @@ -327,11 +327,13 @@ int rtnl_ruledump_req(struct rtnl_handle *rth, int family) return send(rth->fd, &req, sizeof(req), 0); } -int rtnl_neighdump_req(struct rtnl_handle *rth, int family) +int rtnl_neighdump_req(struct rtnl_handle *rth, int family, + req_filter_fn_t filter_fn) { struct { struct nlmsghdr nlh; struct ndmsg ndm; + char buf[256]; } req = { .nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg)), .nlh.nlmsg_type = RTM_GETNEIGH, @@ -340,6 +342,14 @@ int rtnl_neighdump_req(struct rtnl_handle *rth, int family) .ndm.ndm_family = family, }; + if (filter_fn) { + int err; + + err = filter_fn(&req.nlh, sizeof(req)); + if (err) + return err; + } + return send(rth->fd, &req, sizeof(req), 0); } diff --git a/misc/arpd.c b/misc/arpd.c index ce7c09978c2b..504961cb5e3a 100644 --- a/misc/arpd.c +++ b/misc/arpd.c @@ -424,7 +424,7 @@ static int do_one_request(struct nlmsghdr *n) static void load_initial_table(void) { - if (rtnl_neighdump_req(&rth, AF_INET) < 0) { + if (rtnl_neighdump_req(&rth, AF_INET, NULL) < 0) { perror("dump request failed"); exit(1); } From patchwork Thu Jan 3 04:38:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 1020170 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="Byf5dAFj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43VZtY1YH7z9s2P for ; Thu, 3 Jan 2019 15:38:45 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729306AbfACEif (ORCPT ); Wed, 2 Jan 2019 23:38:35 -0500 Received: from mail.kernel.org ([198.145.29.99]:34022 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728760AbfACEif (ORCPT ); Wed, 2 Jan 2019 23:38:35 -0500 Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com [216.129.126.126]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A92C6208E3; Thu, 3 Jan 2019 04:38:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1546490314; bh=qOmYdQy2zmYVWq7yQm241wi/eo4iHGAV/ITaQPq+Bdk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Byf5dAFjmIZng6qk2rwXggnf9olBs4/QMv1nSJJLjzbEL2L6GG9mtncmDYEP0ykgW eY2aJwWCMRxuLGiHzyLjc8Nc+NJZhCU71b2kDpm9QCfLLQc8vMxSck163F787+3SmK hfhy7QN13MNvfVVtnjaI88nT2Apc6a3ZVnq9FcjA= From: David Ahern To: netdev@vger.kernel.org Cc: idosch@mellanox.com, stephen@networkplumber.org, David Ahern Subject: [PATCH iproute2-next 2/5] ip neigh: Convert do_show_or_flush to use rtnl_neighdump_req Date: Wed, 2 Jan 2019 20:38:29 -0800 Message-Id: <20190103043832.3748-3-dsahern@kernel.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190103043832.3748-1-dsahern@kernel.org> References: <20190103043832.3748-1-dsahern@kernel.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Add ipneigh_dump_filter to add filter attributes to the neighbor dump request and update do_show_or_flush to use rtnl_neighdump_req. Signed-off-by: David Ahern --- ip/ipneigh.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/ip/ipneigh.c b/ip/ipneigh.c index 26ac2d1be21f..2d717d2d2aeb 100644 --- a/ip/ipneigh.c +++ b/ip/ipneigh.c @@ -41,6 +41,7 @@ static struct int flushe; int master; int protocol; + __u8 ndm_flags; } filter; static void usage(void) __attribute__((noreturn)); @@ -408,16 +409,29 @@ void ipneigh_reset_filter(int ifindex) filter.index = ifindex; } +static int ipneigh_dump_filter(struct nlmsghdr *nlh, int reqlen) +{ + struct ndmsg *ndm = NLMSG_DATA(nlh); + int err; + + ndm->ndm_flags = filter.ndm_flags; + + if (filter.index) { + err = addattr32(nlh, reqlen, NDA_IFINDEX, filter.index); + if (err) + return err; + } + if (filter.master) { + err = addattr32(nlh, reqlen, NDA_MASTER, filter.master); + if (err) + return err; + } + + return 0; +} + static int do_show_or_flush(int argc, char **argv, int flush) { - struct { - struct nlmsghdr n; - struct ndmsg ndm; - char buf[256]; - } req = { - .n.nlmsg_type = RTM_GETNEIGH, - .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg)), - }; char *filter_dev = NULL; int state_given = 0; @@ -448,7 +462,6 @@ static int do_show_or_flush(int argc, char **argv, int flush) ifindex = ll_name_to_index(*argv); if (!ifindex) invarg("Device does not exist\n", *argv); - addattr32(&req.n, sizeof(req), NDA_MASTER, ifindex); filter.master = ifindex; } else if (strcmp(*argv, "vrf") == 0) { int ifindex; @@ -459,7 +472,6 @@ static int do_show_or_flush(int argc, char **argv, int flush) invarg("Not a valid VRF name\n", *argv); if (!name_is_vrf(*argv)) invarg("Not a valid VRF name\n", *argv); - addattr32(&req.n, sizeof(req), NDA_MASTER, ifindex); filter.master = ifindex; } else if (strcmp(*argv, "unused") == 0) { filter.unused_only = 1; @@ -482,7 +494,7 @@ static int do_show_or_flush(int argc, char **argv, int flush) state = 0x100; filter.state |= state; } else if (strcmp(*argv, "proxy") == 0) { - req.ndm.ndm_flags = NTF_PROXY; + filter.ndm_flags = NTF_PROXY; } else if (matches(*argv, "protocol") == 0) { __u32 prot; @@ -513,11 +525,8 @@ static int do_show_or_flush(int argc, char **argv, int flush) filter.index = ll_name_to_index(filter_dev); if (!filter.index) return nodev(filter_dev); - addattr32(&req.n, sizeof(req), NDA_IFINDEX, filter.index); } - req.ndm.ndm_family = filter.family; - if (flush) { int round = 0; char flushb[4096-512]; @@ -527,7 +536,8 @@ static int do_show_or_flush(int argc, char **argv, int flush) filter.flushe = sizeof(flushb); while (round < MAX_ROUNDS) { - if (rtnl_dump_request_n(&rth, &req.n) < 0) { + if (rtnl_neighdump_req(&rth, filter.family, + ipneigh_dump_filter) < 0) { perror("Cannot send dump request"); exit(1); } @@ -560,7 +570,7 @@ static int do_show_or_flush(int argc, char **argv, int flush) return 1; } - if (rtnl_dump_request_n(&rth, &req.n) < 0) { + if (rtnl_neighdump_req(&rth, filter.family, ipneigh_dump_filter) < 0) { perror("Cannot send dump request"); exit(1); } From patchwork Thu Jan 3 04:38:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 1020172 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="b7vw7/C3"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43VZtZ6vRwz9s2P for ; Thu, 3 Jan 2019 15:38:46 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729271AbfACEif (ORCPT ); Wed, 2 Jan 2019 23:38:35 -0500 Received: from mail.kernel.org ([198.145.29.99]:34038 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726129AbfACEif (ORCPT ); Wed, 2 Jan 2019 23:38:35 -0500 Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com [216.129.126.126]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E1EEF21019; Thu, 3 Jan 2019 04:38:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1546490315; bh=QWp2nnxxIabB0nWbfpI4sgez/1n+H9gtkQeWCxLcXW8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=b7vw7/C32cjPaxK0KfaziuGkQFtwAFgfH5d9l2YiUQ3HnMlcfMk1/NXf0Euz3E0u3 kTXnEVAWeXRAPabmEuwk6rr/yoUSDkGC9EzqWN3jbCF2V4tPZzL2E0Ocx0hM0HwQt0 +04XxItqCY2FZ/ziNW7SRrDRljWSxdGq2UukLMqk= From: David Ahern To: netdev@vger.kernel.org Cc: idosch@mellanox.com, stephen@networkplumber.org, David Ahern Subject: [PATCH iproute2-next 3/5] bridge: Update fdb show to use rtnl_neighdump_req Date: Wed, 2 Jan 2019 20:38:30 -0800 Message-Id: <20190103043832.3748-4-dsahern@kernel.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190103043832.3748-1-dsahern@kernel.org> References: <20190103043832.3748-1-dsahern@kernel.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Add fdb_dump_filter to set filter attributes in dump request and convert fdb_show to use rtnl_neighdump_req. Signed-off-by: David Ahern --- bridge/fdb.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/bridge/fdb.c b/bridge/fdb.c index a7a0d8052307..676267e15ddc 100644 --- a/bridge/fdb.c +++ b/bridge/fdb.c @@ -30,7 +30,7 @@ #include "rt_names.h" #include "utils.h" -static unsigned int filter_index, filter_vlan, filter_state; +static unsigned int filter_index, filter_vlan, filter_state, filter_master; static void usage(void) { @@ -256,20 +256,29 @@ int print_fdb(struct nlmsghdr *n, void *arg) return 0; } -static int fdb_show(int argc, char **argv) +static int fdb_dump_filter(struct nlmsghdr *nlh, int reqlen) { - struct { - struct nlmsghdr n; - struct ndmsg ndm; - char buf[256]; - } req = { - .n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ndmsg)), - .ndm.ndm_family = PF_BRIDGE, - }; + int err; + + if (filter_index) { + struct ndmsg *ndm = NLMSG_DATA(nlh); + ndm->ndm_ifindex = filter_index; + } + + if (filter_master) { + err = addattr32(nlh, reqlen, NDA_MASTER, filter_master); + if (err) + return err; + } + + return 0; +} + +static int fdb_show(int argc, char **argv) +{ char *filter_dev = NULL; char *br = NULL; - int msg_size = sizeof(struct ndmsg); while (argc > 0) { if ((strcmp(*argv, "brport") == 0) || strcmp(*argv, "dev") == 0) { @@ -304,8 +313,7 @@ static int fdb_show(int argc, char **argv) fprintf(stderr, "Cannot find bridge device \"%s\"\n", br); return -1; } - addattr32(&req.n, sizeof(req), IFLA_MASTER, br_ifindex); - msg_size += RTA_LENGTH(4); + filter_master = br_ifindex; } /*we'll keep around filter_dev for older kernels */ @@ -313,10 +321,9 @@ static int fdb_show(int argc, char **argv) filter_index = ll_name_to_index(filter_dev); if (!filter_index) return nodev(filter_dev); - req.ndm.ndm_ifindex = filter_index; } - if (rtnl_dump_request(&rth, RTM_GETNEIGH, &req.ndm, msg_size) < 0) { + if (rtnl_neighdump_req(&rth, PF_BRIDGE, fdb_dump_filter) < 0) { perror("Cannot send dump request"); exit(1); } From patchwork Thu Jan 3 04:38:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 1020171 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="r6Obq5Wv"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43VZtY6RfNz9rxp for ; Thu, 3 Jan 2019 15:38:45 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729382AbfACEim (ORCPT ); Wed, 2 Jan 2019 23:38:42 -0500 Received: from mail.kernel.org ([198.145.29.99]:34048 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729071AbfACEif (ORCPT ); Wed, 2 Jan 2019 23:38:35 -0500 Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com [216.129.126.126]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2702221479; Thu, 3 Jan 2019 04:38:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1546490315; bh=juXz0RU3yxXuBai+YXgoEgDPsWZMLZCojGzDcPa+2qI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=r6Obq5WvlbspVNukPyaQGfHshqkus9M6/Y6hFKXfLNJemz/ymRXIMYwXYFVdbpLfi UsGnc1xSjC8CS0aHDZgH02arL3E7oqHZFAOSVI02fTNvgDNIzpimHvY8HHW8OGc0BE 4Sk9Z2f+5aoVu9zO2l2qlG4bVxef5fgNYC1n/Uwk= From: David Ahern To: netdev@vger.kernel.org Cc: idosch@mellanox.com, stephen@networkplumber.org, David Ahern Subject: [PATCH iproute2-next 4/5] libnetlink: Add RTNL_HANDLE_F_STRICT_CHK flag Date: Wed, 2 Jan 2019 20:38:31 -0800 Message-Id: <20190103043832.3748-5-dsahern@kernel.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190103043832.3748-1-dsahern@kernel.org> References: <20190103043832.3748-1-dsahern@kernel.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Add RTNL_HANDLE_F_STRICT_CHK flag and set in rth flags to let know commands know if the kernel supports strict checking. Extracted from patch from Ido to fix filtering with strict checking enabled. Cc: Ido Schimmel Signed-off-by: David Ahern --- include/libnetlink.h | 1 + lib/libnetlink.c | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/libnetlink.h b/include/libnetlink.h index 148951510d1e..0854d6ad2fab 100644 --- a/include/libnetlink.h +++ b/include/libnetlink.h @@ -23,6 +23,7 @@ struct rtnl_handle { FILE *dump_fp; #define RTNL_HANDLE_F_LISTEN_ALL_NSID 0x01 #define RTNL_HANDLE_F_SUPPRESS_NLERR 0x02 +#define RTNL_HANDLE_F_STRICT_CHK 0x04 int flags; }; diff --git a/lib/libnetlink.c b/lib/libnetlink.c index 19318b445266..600e9a2476ba 100644 --- a/lib/libnetlink.c +++ b/lib/libnetlink.c @@ -166,8 +166,11 @@ void rtnl_set_strict_dump(struct rtnl_handle *rth) { int one = 1; - setsockopt(rth->fd, SOL_NETLINK, NETLINK_GET_STRICT_CHK, - &one, sizeof(one)); + if (setsockopt(rth->fd, SOL_NETLINK, NETLINK_GET_STRICT_CHK, + &one, sizeof(one)) < 0) + return; + + rth->flags |= RTNL_HANDLE_F_STRICT_CHK; } void rtnl_close(struct rtnl_handle *rth) From patchwork Thu Jan 3 04:38:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 1020168 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=kernel.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="sP+5uPFr"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43VZtW5SYxz9s2P for ; Thu, 3 Jan 2019 15:38:43 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728628AbfACEig (ORCPT ); Wed, 2 Jan 2019 23:38:36 -0500 Received: from mail.kernel.org ([198.145.29.99]:34052 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729272AbfACEig (ORCPT ); Wed, 2 Jan 2019 23:38:36 -0500 Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com [216.129.126.126]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5FBA4214C6; Thu, 3 Jan 2019 04:38:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1546490315; bh=pEJ+FKB8z0kJUfhPb5dIsRa2QiGp75xQd5w7mnuxlLY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sP+5uPFrf4n/Pl1+BlR3CnXpsEq4mrnu591OGTITZctl9nZk1REF0oVtUDo2mu1+m i+FjC7QwLCRBzK2ZYZi16LPndgMD9bbdrJfy+Q3uFWfvCcKo4AgyqnquuqX9DjbVyb eN18H1nQdd2L6fNoPSpywaDXXmqe3FXEGaBhBq9c= From: David Ahern To: netdev@vger.kernel.org Cc: idosch@mellanox.com, stephen@networkplumber.org, David Ahern Subject: [PATCH iproute2-next 5/5] bridge: fdb: Fix filtering with strict checking disabled Date: Wed, 2 Jan 2019 20:38:32 -0800 Message-Id: <20190103043832.3748-6-dsahern@kernel.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190103043832.3748-1-dsahern@kernel.org> References: <20190103043832.3748-1-dsahern@kernel.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Older kernels expect an ifinfomsg struct as the ancillary header, and after kernel commit bd961c9bc664 ("rtnetlink: fix rtnl_fdb_dump() for ndmsg header") can handle either ifinfomsg or ndmsg. Strict data checking only allows ndmsg. Use the new RTNL_HANDLE_F_STRICT_CHK flag to know which header to send. Signed-off-by: David Ahern Reviewed-by: Ido Schimmel Tested-by: Ido Schimmel --- bridge/fdb.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/bridge/fdb.c b/bridge/fdb.c index 676267e15ddc..a0fdac00e094 100644 --- a/bridge/fdb.c +++ b/bridge/fdb.c @@ -256,6 +256,25 @@ int print_fdb(struct nlmsghdr *n, void *arg) return 0; } +static int fdb_linkdump_filter(struct nlmsghdr *nlh, int reqlen) +{ + int err; + + if (filter_index) { + struct ifinfomsg *ifm = NLMSG_DATA(nlh); + + ifm->ifi_index = filter_index; + } + + if (filter_master) { + err = addattr32(nlh, reqlen, IFLA_MASTER, filter_master); + if (err) + return err; + } + + return 0; +} + static int fdb_dump_filter(struct nlmsghdr *nlh, int reqlen) { int err; @@ -279,6 +298,7 @@ static int fdb_show(int argc, char **argv) { char *filter_dev = NULL; char *br = NULL; + int rc; while (argc > 0) { if ((strcmp(*argv, "brport") == 0) || strcmp(*argv, "dev") == 0) { @@ -323,7 +343,12 @@ static int fdb_show(int argc, char **argv) return nodev(filter_dev); } - if (rtnl_neighdump_req(&rth, PF_BRIDGE, fdb_dump_filter) < 0) { + if (rth.flags & RTNL_HANDLE_F_STRICT_CHK) + rc = rtnl_neighdump_req(&rth, PF_BRIDGE, fdb_dump_filter); + else + rc = rtnl_linkdump_req_filter_fn(&rth, PF_BRIDGE, + fdb_linkdump_filter); + if (rc < 0) { perror("Cannot send dump request"); exit(1); }