[PATCH 2/2] Added support for carp validation on BSD

Fredrik Danerklint fredan-gitbird at fredan.se
Wed Jan 18 19:15:48 CET 2012


---
 sysdep/bsd/Modules    |    1 +
 sysdep/bsd/krt-sock.c |   10 ++++++++--
 sysdep/bsd/krt-sock.h |    2 ++
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/sysdep/bsd/Modules b/sysdep/bsd/Modules
index 84abffd..5af82ee 100644
--- a/sysdep/bsd/Modules
+++ b/sysdep/bsd/Modules
@@ -4,3 +4,4 @@ sysio.h
 krt-set.h
 krt-sock.c
 krt-sock.h
+check_carp.c
diff --git a/sysdep/bsd/krt-sock.c b/sysdep/bsd/krt-sock.c
index 4bf6600..671c96f 100644
--- a/sysdep/bsd/krt-sock.c
+++ b/sysdep/bsd/krt-sock.c
@@ -458,8 +458,14 @@ krt_read_ifinfo(struct ks_msg *msg)
   f.mtu = ifm->ifm_data.ifi_mtu;
   f.flags = 0;
 
-  if (fl & IFF_UP)
-    f.flags |= IF_ADMIN_UP;
+  int carp = check_carp(f.name, strlen(f.name));
+  if (carp < 0) //no carp interface
+    if (fl & IFF_UP)
+      f.flags |= IF_ADMIN_UP;
+  else
+    if (fl & IFF_UP && carp == 2) // (interface) carp is master and only then should the interface be up.
+      f.flags |= IF_ADMIN_UP;
+
   if (ifm->ifm_data.ifi_link_state != LINK_STATE_DOWN)
     f.flags |= IF_LINK_UP;          /* up or unknown */
   if (fl & IFF_LOOPBACK)            /* Loopback */
diff --git a/sysdep/bsd/krt-sock.h b/sysdep/bsd/krt-sock.h
index aab639c..d836709 100644
--- a/sysdep/bsd/krt-sock.h
+++ b/sysdep/bsd/krt-sock.h
@@ -39,4 +39,6 @@ static inline void krt_set_copy_params(struct krt_set_params *d UNUSED, struct k
 
 void krt_read_msg(struct proto *p, struct ks_msg *msg, int scan);
 
+int check_carp(const char *name, int namelen);
+
 #endif
-- 
1.7.3.5


--------------010500000801000408070709--



More information about the Bird-users mailing list