nhrpd: implement next hop resolution protocol

This provides DMVPN support and integrates to strongSwan. Please read
README.nhrpd and README.kernel for more details.
diff --git a/zebra/client_main.c b/zebra/client_main.c
index 43ab299..75c8867 100644
--- a/zebra/client_main.c
+++ b/zebra/client_main.c
@@ -120,6 +120,7 @@
   { "ospf",   ZEBRA_ROUTE_OSPF },
   { "ospf6",  ZEBRA_ROUTE_OSPF6 },
   { "bgp",    ZEBRA_ROUTE_BGP },
+  { "nhrp",   ZEBRA_ROUTE_NHRP },
   { NULL,     0 }
 };
 
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 2aecf5d..9ca0290 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -72,6 +72,7 @@
   [ZEBRA_ROUTE_ISIS]    = {ZEBRA_ROUTE_ISIS,    115},
   [ZEBRA_ROUTE_BGP]     = {ZEBRA_ROUTE_BGP,      20  /* IBGP is 200. */},
   [ZEBRA_ROUTE_BABEL]   = {ZEBRA_ROUTE_BABEL,    95},
+  [ZEBRA_ROUTE_NHRP]    = {ZEBRA_ROUTE_NHRP,     10},
   /* no entry/default: 150 */
 };
 
@@ -1423,6 +1424,7 @@
   [ZEBRA_ROUTE_BGP]     = 3,
   [ZEBRA_ROUTE_HSLS]    = 4,
   [ZEBRA_ROUTE_BABEL]   = 2,
+  [ZEBRA_ROUTE_NHRP]    = 2,
 };
 
 /* Look into the RN and queue it into one or more priority queues,
diff --git a/zebra/zebra_rnh.c b/zebra/zebra_rnh.c
index 5762d3f..859b6d7 100644
--- a/zebra/zebra_rnh.c
+++ b/zebra/zebra_rnh.c
@@ -223,16 +223,27 @@
 	    {
 	      if (CHECK_FLAG (rib->status, RIB_ENTRY_REMOVED))
 		continue;
-	      if (CHECK_FLAG (rib->status, RIB_ENTRY_SELECTED_FIB))
+	      if (! CHECK_FLAG (rib->status, RIB_ENTRY_SELECTED_FIB))
+		continue;
+
+	      if (CHECK_FLAG(rnh->flags, ZEBRA_NHT_CONNECTED))
 		{
-		  if (CHECK_FLAG(rnh->flags, ZEBRA_NHT_CONNECTED))
+		  if (rib->type == ZEBRA_ROUTE_CONNECT)
+		    break;
+
+		  if (rib->type == ZEBRA_ROUTE_NHRP)
 		    {
-		      if (rib->type == ZEBRA_ROUTE_CONNECT)
+		      struct nexthop *nexthop;
+		      for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
+			if (nexthop->type == NEXTHOP_TYPE_IFINDEX ||
+			    nexthop->type == NEXTHOP_TYPE_IFNAME)
+			  break;
+		      if (nexthop)
 			break;
 		    }
-		  else
-		    break;
 		}
+	      else
+		break;
 	    }
 	}
 
diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c
index 38f61e9..c73896b 100644
--- a/zebra/zebra_vty.c
+++ b/zebra/zebra_vty.c
@@ -2121,6 +2121,7 @@
           || rib->type == ZEBRA_ROUTE_OSPF6
           || rib->type == ZEBRA_ROUTE_BABEL
           || rib->type == ZEBRA_ROUTE_ISIS
+          || rib->type == ZEBRA_ROUTE_NHRP
           || rib->type == ZEBRA_ROUTE_BGP)
 	{
 	  time_t uptime;
@@ -2341,6 +2342,7 @@
           || rib->type == ZEBRA_ROUTE_OSPF6
           || rib->type == ZEBRA_ROUTE_BABEL
           || rib->type == ZEBRA_ROUTE_ISIS
+          || rib->type == ZEBRA_ROUTE_NHRP
           || rib->type == ZEBRA_ROUTE_BGP)
 	{
 	  time_t uptime;