zebra link state detection support
diff --git a/lib/if.c b/lib/if.c
index 0934e40..ce3595d 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -270,6 +270,22 @@
return ifp->flags & IFF_UP;
}
+/* Is interface running? */
+int
+if_is_running (struct interface *ifp)
+{
+ return ifp->flags & IFF_RUNNING;
+}
+
+/* Is the interface operative, eg. either UP & RUNNING
+ or UP & !ZEBRA_INTERFACE_LINK_DETECTION */
+int
+if_is_operative (struct interface *ifp)
+{
+ return ((ifp->flags & IFF_UP) &&
+ (ifp->flags & IFF_RUNNING || !CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_LINKDETECTION)));
+}
+
/* Is this loopback interface ? */
int
if_is_loopback (struct interface *ifp)
diff --git a/lib/if.h b/lib/if.h
index 55337fc..554126f 100644
--- a/lib/if.h
+++ b/lib/if.h
@@ -85,6 +85,7 @@
u_char status;
#define ZEBRA_INTERFACE_ACTIVE (1 << 0)
#define ZEBRA_INTERFACE_SUB (1 << 1)
+#define ZEBRA_INTERFACE_LINKDETECTION (1 << 2)
/* Interface flags. */
unsigned long flags;
@@ -188,6 +189,8 @@
struct interface *if_get_by_name (char *);
void if_delete (struct interface *);
int if_is_up (struct interface *);
+int if_is_running (struct interface *);
+int if_is_operative (struct interface *);
int if_is_loopback (struct interface *);
int if_is_broadcast (struct interface *);
int if_is_pointopoint (struct interface *);
diff --git a/lib/zclient.c b/lib/zclient.c
index 5e37154..c1b286f 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -564,6 +564,7 @@
ifp->ifindex = stream_getl (s);
/* Read interface's value. */
+ ifp->status = stream_getc (s);
ifp->flags = stream_getl (s);
ifp->metric = stream_getl (s);
ifp->mtu = stream_getl (s);
@@ -600,6 +601,7 @@
ifp->ifindex = stream_getl (s);
/* Read interface's value. */
+ ifp->status = stream_getc (s);
ifp->flags = stream_getl (s);
ifp->metric = stream_getl (s);
ifp->mtu = stream_getl (s);