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);