From: Roopa Prabhu <ro...@cumulusnetworks.com>

send netlink notification if neigh_update results in NTF_ROUTER
change and if NEIGH_UPDATE_F_ISROUTER is on. Also move the
NTF_ROUTER change function into a helper.

Signed-off-by: Roopa Prabhu <ro...@cumulusnetworks.com>
---
 include/net/neighbour.h | 15 +++++++++++++++
 net/core/neighbour.c    |  7 ++-----
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/include/net/neighbour.h b/include/net/neighbour.h
index 6c1eecd..0874f7fc 100644
--- a/include/net/neighbour.h
+++ b/include/net/neighbour.h
@@ -544,4 +544,19 @@ static inline void neigh_update_ext_learned(struct 
neighbour *neigh, u32 flags,
                *notify = 1;
        }
 }
+
+static inline void neigh_update_is_router(struct neighbour *neigh, u32 flags,
+                                         int *notify)
+{
+       u8 ndm_flags = 0;
+
+       ndm_flags |= (flags & NEIGH_UPDATE_F_ISROUTER) ? NTF_ROUTER : 0;
+       if ((neigh->flags ^ ndm_flags) & NTF_ROUTER) {
+               if (ndm_flags & NTF_ROUTER)
+                       neigh->flags |= NTF_ROUTER;
+               else
+                       neigh->flags &= ~NTF_ROUTER;
+               *notify = 1;
+       }
+}
 #endif
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index ca99456..fb89294 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -1277,11 +1277,8 @@ int neigh_update(struct neighbour *neigh, const u8 
*lladdr, u8 new,
                neigh->arp_queue_len_bytes = 0;
        }
 out:
-       if (update_isrouter) {
-               neigh->flags = (flags & NEIGH_UPDATE_F_ISROUTER) ?
-                       (neigh->flags | NTF_ROUTER) :
-                       (neigh->flags & ~NTF_ROUTER);
-       }
+       if (update_isrouter)
+               neigh_update_is_router(neigh, flags, &notify);
        write_unlock_bh(&neigh->lock);
 
        if (notify)
-- 
2.1.4

Reply via email to