From patchwork Mon Oct 25 15:47:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Borkmann X-Patchwork-Id: 12582279 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D7AE2C433FE for ; Mon, 25 Oct 2021 15:47:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C29BA60EBD for ; Mon, 25 Oct 2021 15:47:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232932AbhJYPuF (ORCPT ); Mon, 25 Oct 2021 11:50:05 -0400 Received: from www62.your-server.de ([213.133.104.62]:45682 "EHLO www62.your-server.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232111AbhJYPuA (ORCPT ); Mon, 25 Oct 2021 11:50:00 -0400 Received: from 226.206.1.85.dynamic.wline.res.cust.swisscom.ch ([85.1.206.226] helo=localhost) by www62.your-server.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92.3) (envelope-from ) id 1mf2CH-000BDc-BO; Mon, 25 Oct 2021 17:47:37 +0200 From: Daniel Borkmann To: dsahern@kernel.org Cc: netdev@vger.kernel.org, Daniel Borkmann Subject: [PATCH iproute2 -next v2 3/3] ip, neigh: Add NTF_EXT_MANAGED support Date: Mon, 25 Oct 2021 17:47:28 +0200 Message-Id: <20211025154728.2161-4-daniel@iogearbox.net> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20211025154728.2161-1-daniel@iogearbox.net> References: <20211025154728.2161-1-daniel@iogearbox.net> MIME-Version: 1.0 X-Authenticated-Sender: daniel@iogearbox.net X-Virus-Scanned: Clear (ClamAV 0.103.3/26333/Mon Oct 25 10:29:40 2021) Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: dsahern@gmail.com Currently, ip neigh does not support the NTF_EXT_MANAGED flag. Add cmdline support. Usage example: # ./ip/ip n replace 192.168.178.30 dev enp5s0 managed extern_learn # ./ip/ip n 192.168.178.30 dev enp5s0 lladdr f4:8c:50:5e:71:9a managed extern_learn REACHABLE [...] Signed-off-by: Daniel Borkmann --- ip/ipneigh.c | 20 +++++++++++++++----- man/man8/ip-neighbour.8 | 9 +++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/ip/ipneigh.c b/ip/ipneigh.c index 874c9033..7facc399 100644 --- a/ip/ipneigh.c +++ b/ip/ipneigh.c @@ -51,7 +51,8 @@ static void usage(void) fprintf(stderr, "Usage: ip neigh { add | del | change | replace }\n" " { ADDR [ lladdr LLADDR ] [ nud STATE ] proxy ADDR }\n" - " [ dev DEV ] [ router ] [ use ] [ extern_learn ] [ protocol PROTO ]\n" + " [ dev DEV ] [ router ] [ use ] [ managed ] [ extern_learn ]\n" + " [ protocol PROTO ]\n" "\n" " ip neigh { show | flush } [ proxy ] [ to PREFIX ] [ dev DEV ] [ nud STATE ]\n" " [ vrf NAME ] [ nomaster ]\n" @@ -115,6 +116,7 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv) .ndm.ndm_family = preferred_family, .ndm.ndm_state = NUD_PERMANENT, }; + __u32 ext_flags = 0; char *dev = NULL; int dst_ok = 0; int dev_ok = 0; @@ -150,6 +152,9 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv) req.ndm.ndm_flags |= NTF_ROUTER; } else if (strcmp(*argv, "use") == 0) { req.ndm.ndm_flags |= NTF_USE; + } else if (strcmp(*argv, "managed") == 0) { + ext_flags |= NTF_EXT_MANAGED; + req.ndm.ndm_state = NUD_NONE; } else if (matches(*argv, "extern_learn") == 0) { req.ndm.ndm_flags |= NTF_EXT_LEARNED; } else if (strcmp(*argv, "dev") == 0) { @@ -185,7 +190,10 @@ static int ipneigh_modify(int cmd, int flags, int argc, char **argv) req.ndm.ndm_family = dst.family; if (addattr_l(&req.n, sizeof(req), NDA_DST, &dst.data, dst.bytelen) < 0) return -1; - + if (ext_flags && + addattr_l(&req.n, sizeof(req), NDA_FLAGS_EXT, &ext_flags, + sizeof(ext_flags)) < 0) + return -1; if (lla && strcmp(lla, "null")) { char llabuf[20]; int l; @@ -305,6 +313,7 @@ int print_neigh(struct nlmsghdr *n, void *arg) int len = n->nlmsg_len; struct rtattr *tb[NDA_MAX+1]; static int logit = 1; + __u32 ext_flags = 0; __u8 protocol = 0; if (n->nlmsg_type != RTM_NEWNEIGH && n->nlmsg_type != RTM_DELNEIGH && @@ -348,6 +357,8 @@ int print_neigh(struct nlmsghdr *n, void *arg) if (tb[NDA_PROTOCOL]) protocol = rta_getattr_u8(tb[NDA_PROTOCOL]); + if (tb[NDA_FLAGS_EXT]) + ext_flags = rta_getattr_u32(tb[NDA_FLAGS_EXT]); if (filter.protocol && filter.protocol != protocol) return 0; @@ -430,13 +441,12 @@ int print_neigh(struct nlmsghdr *n, void *arg) if (r->ndm_flags & NTF_ROUTER) print_null(PRINT_ANY, "router", "%s ", "router"); - if (r->ndm_flags & NTF_PROXY) print_null(PRINT_ANY, "proxy", "%s ", "proxy"); - + if (ext_flags & NTF_EXT_MANAGED) + print_null(PRINT_ANY, "managed", "%s ", "managed"); if (r->ndm_flags & NTF_EXT_LEARNED) print_null(PRINT_ANY, "extern_learn", "%s ", "extern_learn"); - if (r->ndm_flags & NTF_OFFLOADED) print_null(PRINT_ANY, "offload", "%s ", "offload"); diff --git a/man/man8/ip-neighbour.8 b/man/man8/ip-neighbour.8 index 3001cd01..6fed47ce 100644 --- a/man/man8/ip-neighbour.8 +++ b/man/man8/ip-neighbour.8 @@ -26,6 +26,7 @@ ip-neighbour \- neighbour/arp tables management. .IR DEV " ] [ " .BR router " ] [ " .BR use " ] [ " +.BR managed " ] [ " .BR extern_learn " ]" .ti -8 @@ -100,6 +101,14 @@ the kernel that a controller is using this dynamic entry. If the entry does not exist, the kernel will resolve it. If it exists, an attempt to refresh the neighbor entry will be triggered. +.TP +.BI managed +this neigh entry is "managed". This option can be used to indicate to +the kernel that a controller is using this dynamic entry. In contrast +to "use", if the entry does not exist, the kernel will resolve it and +periodically attempt to auto-refresh the neighbor entry such that it +remains in resolved state when possible. + .TP .BI extern_learn this neigh entry was learned externally. This option can be used to