From patchwork Tue Apr 24 20:49:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roopa Prabhu X-Patchwork-Id: 903868 X-Patchwork-Delegate: davem@davemloft.net 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=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="D4Ob1VMQ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40VwS64pKMz9ry1 for ; Wed, 25 Apr 2018 06:49:42 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751280AbeDXUtk (ORCPT ); Tue, 24 Apr 2018 16:49:40 -0400 Received: from mail-pg0-f68.google.com ([74.125.83.68]:36840 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750779AbeDXUti (ORCPT ); Tue, 24 Apr 2018 16:49:38 -0400 Received: by mail-pg0-f68.google.com with SMTP id i6so11724444pgv.3 for ; Tue, 24 Apr 2018 13:49:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id; bh=CFtjy6GCDnTWXAEGsL0BJe8LMrBqRur45Ot9zLHhjhs=; b=D4Ob1VMQj5v0zeQ531vmK0R226UuoUmvy2fDtVTZAr4J9csaP2qDs/x2Yv3UGKBe9o NPvraNDzCeVtq8cdJXrkJzM9ZY5T+SST9txk72PY/LQxI3RFhps6cZhQLOMt7eHmznUz 0oCOxG2TOjol7nwO24GvwpKGL175pz93MK+QU= 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; bh=CFtjy6GCDnTWXAEGsL0BJe8LMrBqRur45Ot9zLHhjhs=; b=qPUIQeqEOVuw6wALXsDzEFhBwZn3CspK1yxgypFUY0HgJiqaTusyu7Axfyt2HaPSkY P9KtkjSjOVyKfAcRGkOKG7/AVuqYVd/A/iEQR2Up4VXmnt/wLHbdS/w2KjBlZXuEUCwK hpZ/tkBItPygr/U6+zEqD19sWWX+3Owg2zAxnoIBJ1wZOWPpyKpm92nenmVHNrEl6Dj2 /68nU+kMlT9Q5LHVi8JW+K75lkXUIRiFbQCkd4RW1II+lhv4Zi+Lt1WMscY/HCBg7uNa bi5NotY0E+XMZyfUEyhYrpaEJZ14jwj0I8Z73I0XobDJ+6XXzzQAKQ3GYuqqBViB8P0U 0RCw== X-Gm-Message-State: ALQs6tDf5gJCAAQrEvCYvZmKobj4iLnaUH0HG+08KYcIs7WtY98scTJG qAj83bXU/TDhgKN/+YIY//YO5w== X-Google-Smtp-Source: AIpwx49RMz50PfU5Tc9B9tq+5iW+FkifCjKznIx3IjMWdYRahdVJ8xDx45J72vLnOqmM/J8d7RlT+w== X-Received: by 2002:a17:902:d20a:: with SMTP id t10-v6mr26345707ply.151.1524602978223; Tue, 24 Apr 2018 13:49:38 -0700 (PDT) Received: from monster-08.mvlab.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id b5sm32787337pfc.16.2018.04.24.13.49.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 24 Apr 2018 13:49:37 -0700 (PDT) From: Roopa Prabhu X-Google-Original-From: Roopa Prabhu To: davem@davemloft.net Cc: netdev@vger.kernel.org, nikolay@cumulusnetworks.com, dsa@cumulusnetworks.com Subject: [PATCH net-next] neighbour: support for NTF_EXT_LEARNED flag Date: Tue, 24 Apr 2018 13:49:34 -0700 Message-Id: <1524602974-11476-1-git-send-email-roopa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Roopa Prabhu This patch extends NTF_EXT_LEARNED support to the neighbour system. Example use-case: An Ethernet VPN implementation (eg in FRR routing suite) can use this flag to add dynamic reachable external neigh entires learned via control plane. The use of neigh NTF_EXT_LEARNED in this patch is consistent with its use with bridge and vxlan fdb entries. Signed-off-by: Roopa Prabhu --- include/net/neighbour.h | 19 ++++++++++++++++++- net/core/neighbour.c | 8 +++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/include/net/neighbour.h b/include/net/neighbour.h index e421f86..6c1eecd 100644 --- a/include/net/neighbour.h +++ b/include/net/neighbour.h @@ -246,6 +246,7 @@ static inline void *neighbour_priv(const struct neighbour *n) #define NEIGH_UPDATE_F_OVERRIDE 0x00000001 #define NEIGH_UPDATE_F_WEAK_OVERRIDE 0x00000002 #define NEIGH_UPDATE_F_OVERRIDE_ISROUTER 0x00000004 +#define NEIGH_UPDATE_F_EXT_LEARNED 0x20000000 #define NEIGH_UPDATE_F_ISROUTER 0x40000000 #define NEIGH_UPDATE_F_ADMIN 0x80000000 @@ -526,5 +527,21 @@ static inline void neigh_ha_snapshot(char *dst, const struct neighbour *n, } while (read_seqretry(&n->ha_lock, seq)); } - +static inline void neigh_update_ext_learned(struct neighbour *neigh, u32 flags, + int *notify) +{ + u8 ndm_flags = 0; + + if (!(flags & NEIGH_UPDATE_F_ADMIN)) + return; + + ndm_flags |= (flags & NEIGH_UPDATE_F_EXT_LEARNED) ? NTF_EXT_LEARNED : 0; + if ((neigh->flags ^ ndm_flags) & NTF_EXT_LEARNED) { + if (ndm_flags & NTF_EXT_LEARNED) + neigh->flags |= NTF_EXT_LEARNED; + else + neigh->flags &= ~NTF_EXT_LEARNED; + *notify = 1; + } +} #endif diff --git a/net/core/neighbour.c b/net/core/neighbour.c index ce51986..5afae29 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c @@ -820,7 +820,8 @@ static void neigh_periodic_work(struct work_struct *work) write_lock(&n->lock); state = n->nud_state; - if (state & (NUD_PERMANENT | NUD_IN_TIMER)) { + if ((state & (NUD_PERMANENT | NUD_IN_TIMER)) || + (n->flags & NTF_EXT_LEARNED)) { write_unlock(&n->lock); goto next_elt; } @@ -1136,6 +1137,8 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, if (neigh->dead) goto out; + neigh_update_ext_learned(neigh, flags, ¬ify); + if (!(new & NUD_VALID)) { neigh_del_timer(neigh); if (old & NUD_CONNECTED) @@ -1781,6 +1784,9 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, flags &= ~NEIGH_UPDATE_F_OVERRIDE; } + if (ndm->ndm_flags & NTF_EXT_LEARNED) + flags |= NEIGH_UPDATE_F_EXT_LEARNED; + if (ndm->ndm_flags & NTF_USE) { neigh_event_send(neigh, NULL); err = 0;