Fix build for net-snmp
diff --git a/ChangeLog b/ChangeLog
index 04089be..1f15ad6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2003-03-17 Amir Guindehi <amir@datacore.ch>
+
+	* Extended SNMP checks in configure.ac so that net-snmp works
+
+2003-03-17 Amir Guindehi <amir@datacore.ch>
+           Ralph Keller <keller@tik.ee.ethz.ch>
+	* merge OSPF-API 
+
 2003-02-07 Paul Jakma <paul@dishone.st>
 
 	* Sync to zebra CVS
diff --git a/bgpd/bgp_snmp.c b/bgpd/bgp_snmp.c
index bf9c7f8..822036c 100644
--- a/bgpd/bgp_snmp.c
+++ b/bgpd/bgp_snmp.c
@@ -21,6 +21,9 @@
 #include <zebra.h>
 
 #ifdef HAVE_SNMP
+#ifdef HAVE_NETSNMP
+#include <net-snmp/net-snmp-config.h>
+#endif
 #include <asn1.h>
 #include <snmp.h>
 #include <snmp_impl.h>
@@ -516,7 +519,7 @@
     case BGPPEEROUTTOTALMESSAGES:
       return SNMP_INTEGER (peer->open_out + peer->update_out
 			   + peer->keepalive_out + peer->notify_out
-			   + peer->refresh_out, peer->dynamic_cap_out);
+			   + peer->refresh_out + peer->dynamic_cap_out);
       break;
     case BGPPEERLASTERROR:
       {
diff --git a/configure.ac b/configure.ac
index c274a0d..4c30212 100755
--- a/configure.ac
+++ b/configure.ac
@@ -617,6 +617,19 @@
 	AC_CHECK_LIB(snmp, asn_parse_int, HAVE_SNMP=yes)
 	LIBS="${old_libs}"
   fi
+  if test "${HAVE_SNMP}" = ""; then
+	if test "${NEED_CRYPTO}" = ""; then
+	     old_libs="${LIBS}"
+	     LIBS="-L/usr/lib"
+	     AC_CHECK_LIB(netsnmp, asn_parse_int, [HAVE_NETSNMP=yes; HAVE_SNMP=yes ])
+	     LIBS="${old_libs}"
+	else
+	     old_libs="${LIBS}"
+	     LIBS="-L/usr/lib"
+       	     AC_CHECK_LIB(netsnmp, asn_parse_int, [HAVE_NETSNMP=yes; HAVE_SNMP=yes; NEED_CRYPTO=yes;LIBS="$LIBS -lcrypto" ],,"-lcrypto")
+	     LIBS="${old_libs}"
+	fi
+  fi
   if test "${HAVE_SNMP}" = "yes"; then
     for ac_snmp in /usr/include/net-snmp/library/asn1.h /usr/include/ucd-snmp/asn1.h /usr/local/include/ucd-snmp/asn1.h /dev/null
     do
@@ -626,8 +639,13 @@
       /usr/include/net-snmp/*)
                   AC_DEFINE(HAVE_SNMP,,SNMP)
                   AC_DEFINE(UCD_COMPATIBLE,,SNMP)
-                  CFLAGS="${CFLAGS} -I/usr/include/ucd-snmp"
+                  CFLAGS="${CFLAGS} -I/usr/include/net-snmp -I/usr/include/net-snmp/library"
+		  if test "${HAVE_NETSNMP}" = "yes"; then
+                       AC_DEFINE(HAVE_NETSNMP,,SNMP)
+                       LIBS="${LIBS} -lnetsnmp"
+		  else
                   LIBS="${LIBS} -lsnmp"
+		  fi
                   ;;
       /usr/include/ucd-snmp/*) 
                   AC_DEFINE(HAVE_SNMP,,SNMP)
diff --git a/lib/smux.c b/lib/smux.c
index 32f8c8f..0479292 100644
--- a/lib/smux.c
+++ b/lib/smux.c
@@ -22,7 +22,9 @@
 #include <zebra.h>
 
 #ifdef HAVE_SNMP
-
+#ifdef HAVE_NETSNMP
+#include <net-snmp/net-snmp-config.h>
+#endif
 #include <asn1.h>
 #include <snmp.h>
 #include <snmp_impl.h>
diff --git a/ospfclient/.cvsignore b/ospfclient/.cvsignore
new file mode 100644
index 0000000..d7e3a7e
--- /dev/null
+++ b/ospfclient/.cvsignore
@@ -0,0 +1,7 @@
+Makefile
+*.o
+ospfd
+ospfd.conf
+tags
+TAGS
+.deps
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog
index 31c5b0f..5dfc96e 100644
--- a/ospfd/ChangeLog
+++ b/ospfd/ChangeLog
@@ -1,3 +1,17 @@
+2002-03-17  Amir Guindehi <amir@datacore.ch>
+
+        * ospf_apiserver.[ch]: Merge Ralph Keller's OSPFAPI support.
+        * ospf_api.[ch]: Merge Ralph Keller's OSPFAPI support.
+	* ospfclient: OSPFAPI demonstration client.
+
+2003-01-23  Masahiko Endo <endo@suri.co.jp>
+
+	* ospf_ism.c: NSM event schedule bug fix.
+
+2002-10-30  Greg Troxel <gdt@ir.bbn.com>
+
+	* ospf_packet.c (ospf_make_md5_digest): MD5 length fix. 
+
 2002-10-23  endo@suri.co.jp (Masahiko Endo)
 
 	* ospf_opaque.c: Update Opaque LSA patch.
diff --git a/ospfd/ospf_snmp.c b/ospfd/ospf_snmp.c
index 4ed0ecd..4f9af31 100644
--- a/ospfd/ospf_snmp.c
+++ b/ospfd/ospf_snmp.c
@@ -24,6 +24,9 @@
 #include <zebra.h>
 
 #ifdef HAVE_SNMP
+#ifdef HAVE_NETSNMP
+#include <net-snmp/net-snmp-config.h>
+#endif
 #include <asn1.h>
 #include <snmp.h>
 #include <snmp_impl.h>
diff --git a/ripd/rip_snmp.c b/ripd/rip_snmp.c
index dc2b621..5a5060f 100644
--- a/ripd/rip_snmp.c
+++ b/ripd/rip_snmp.c
@@ -22,6 +22,9 @@
 #include <zebra.h>
 
 #ifdef HAVE_SNMP
+#ifdef HAVE_NETSNMP
+#include <net-snmp/net-snmp-config.h>
+#endif
 #include <asn1.h>
 #include <snmp.h>
 #include <snmp_impl.h>
diff --git a/zebra/zebra_snmp.c b/zebra/zebra_snmp.c
index d160bfa..051aaaa 100644
--- a/zebra/zebra_snmp.c
+++ b/zebra/zebra_snmp.c
@@ -1,4 +1,4 @@
-/* BGP4 SNMP support
+/* FIB SNMP.
  * Copyright (C) 1999 Kunihiro Ishiguro
  *
  * This file is part of GNU Zebra.
@@ -22,6 +22,9 @@
 #include <zebra.h>
 
 #ifdef HAVE_SNMP
+#ifdef HAVE_NETSNMP
+#include <net-snmp/net-snmp-config.h>
+#endif
 #include <asn1.h>
 #include <snmp.h>
 #include <snmp_impl.h>
@@ -90,41 +93,41 @@
 u_char * ipCidrTable ();
 
 struct variable zebra_variables[] = 
-{
-  {0, GAUGE32, RONLY, ipFwNumber, 1, {1}},
-  {IPFORWARDDEST, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 1}},
-  {IPFORWARDMASK, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 2}},
-  {IPFORWARDPOLICY, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 3}},
-  {IPFORWARDNEXTHOP, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 4}},
-  {IPFORWARDIFINDEX, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 5}},
-  {IPFORWARDTYPE, ENUMERATION, RONLY, ipFwTable, 3, {2, 1, 6}},
-  {IPFORWARDPROTO, ENUMERATION, RONLY, ipFwTable, 3, {2, 1, 7}},
-  {IPFORWARDAGE, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 8}},
-  {IPFORWARDINFO, OBJECTIDENTIFIER, RONLY, ipFwTable, 3, {2, 1, 9}},
-  {IPFORWARDNEXTHOPAS, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 10}},
-  {IPFORWARDMETRIC1, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 11}},
-  {IPFORWARDMETRIC2, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 12}},
-  {IPFORWARDMETRIC3, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 13}},
-  {IPFORWARDMETRIC4, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 14}},
-  {IPFORWARDMETRIC5, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 15}},
-  {0, GAUGE32, RONLY, ipCidrNumber, 1, {3}},
-  {IPCIDRROUTEDEST, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 1}},
-  {IPCIDRROUTEMASK, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 2}},
-  {IPCIDRROUTETOS, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 3}},
-  {IPCIDRROUTENEXTHOP, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 4}},
-  {IPCIDRROUTEIFINDEX, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 5}},
-  {IPCIDRROUTETYPE, ENUMERATION, RONLY, ipCidrTable, 3, {4, 1, 6}},
-  {IPCIDRROUTEPROTO, ENUMERATION, RONLY, ipCidrTable, 3, {4, 1, 7}},
-  {IPCIDRROUTEAGE, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 8}},
-  {IPCIDRROUTEINFO, OBJECTIDENTIFIER, RONLY, ipCidrTable, 3, {4, 1, 9}},
-  {IPCIDRROUTENEXTHOPAS, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 10}},
-  {IPCIDRROUTEMETRIC1, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 11}},
-  {IPCIDRROUTEMETRIC2, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 12}},
-  {IPCIDRROUTEMETRIC3, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 13}},
-  {IPCIDRROUTEMETRIC4, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 14}},
-  {IPCIDRROUTEMETRIC5, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 15}},
-  {IPCIDRROUTESTATUS, ROWSTATUS, RONLY, ipCidrTable, 3, {4, 1, 16}}
-};
+  {
+    {0, GAUGE32, RONLY, ipFwNumber, 1, {1}},
+    {IPFORWARDDEST, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 1}},
+    {IPFORWARDMASK, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 2}},
+    {IPFORWARDPOLICY, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 3}},
+    {IPFORWARDNEXTHOP, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 4}},
+    {IPFORWARDIFINDEX, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 5}},
+    {IPFORWARDTYPE, ENUMERATION, RONLY, ipFwTable, 3, {2, 1, 6}},
+    {IPFORWARDPROTO, ENUMERATION, RONLY, ipFwTable, 3, {2, 1, 7}},
+    {IPFORWARDAGE, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 8}},
+    {IPFORWARDINFO, OBJECTIDENTIFIER, RONLY, ipFwTable, 3, {2, 1, 9}},
+    {IPFORWARDNEXTHOPAS, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 10}},
+    {IPFORWARDMETRIC1, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 11}},
+    {IPFORWARDMETRIC2, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 12}},
+    {IPFORWARDMETRIC3, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 13}},
+    {IPFORWARDMETRIC4, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 14}},
+    {IPFORWARDMETRIC5, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 15}},
+    {0, GAUGE32, RONLY, ipCidrNumber, 1, {3}},
+    {IPCIDRROUTEDEST, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 1}},
+    {IPCIDRROUTEMASK, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 2}},
+    {IPCIDRROUTETOS, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 3}},
+    {IPCIDRROUTENEXTHOP, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 4}},
+    {IPCIDRROUTEIFINDEX, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 5}},
+    {IPCIDRROUTETYPE, ENUMERATION, RONLY, ipCidrTable, 3, {4, 1, 6}},
+    {IPCIDRROUTEPROTO, ENUMERATION, RONLY, ipCidrTable, 3, {4, 1, 7}},
+    {IPCIDRROUTEAGE, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 8}},
+    {IPCIDRROUTEINFO, OBJECTIDENTIFIER, RONLY, ipCidrTable, 3, {4, 1, 9}},
+    {IPCIDRROUTENEXTHOPAS, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 10}},
+    {IPCIDRROUTEMETRIC1, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 11}},
+    {IPCIDRROUTEMETRIC2, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 12}},
+    {IPCIDRROUTEMETRIC3, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 13}},
+    {IPCIDRROUTEMETRIC4, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 14}},
+    {IPCIDRROUTEMETRIC5, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 15}},
+    {IPCIDRROUTESTATUS, ROWSTATUS, RONLY, ipCidrTable, 3, {4, 1, 16}}
+  };
 
 
 u_char *
@@ -132,16 +135,21 @@
 	    int exact, size_t *val_len, WriteMethod **write_method)
 {
   static int result;
-  struct route_node *np;
+  struct route_table *table;
+  struct route_node *rn;
   struct rib *rib;
 
   if (smux_header_generic(v, objid, objid_len, exact, val_len, write_method) == MATCH_FAILED)
     return NULL;
 
+  table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
+  if (! table)
+    return NULL;
+
   /* Return number of routing entries. */
   result = 0;
-  for (np = route_top (rib_table_ipv4); np; np = route_next (np))
-    for (rib = np->info; rib; rib = rib->next)
+  for (rn = route_top (table); rn; rn = route_next (rn))
+    for (rib = rn->info; rib; rib = rib->next)
       result++;
 
   return (u_char *)&result;
@@ -149,19 +157,24 @@
 
 u_char *
 ipCidrNumber (struct variable *v, oid objid[], size_t *objid_len,
-	    int exact, size_t *val_len, WriteMethod **write_method)
+	      int exact, size_t *val_len, WriteMethod **write_method)
 {
   static int result;
-  struct route_node *np;
+  struct route_table *table;
+  struct route_node *rn;
   struct rib *rib;
 
   if (smux_header_generic(v, objid, objid_len, exact, val_len, write_method) == MATCH_FAILED)
     return NULL;
 
+  table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
+  if (! table)
+    return 0;
+
   /* Return number of routing entries. */
   result = 0;
-  for (np = route_top (rib_table_ipv4); np; np = route_next (np))
-    for (rib = np->info; rib; rib = rib->next)
+  for (rn = route_top (table); rn; rn = route_next (rn))
+    for (rib = rn->info; rib; rib = rib->next)
       result++;
 
   return (u_char *)&result;
@@ -193,16 +206,16 @@
   for (i = 3; 0 <= i; i--) {
     p--;
     if (*p + num > 255) {
-    	*p += num;
-    	num = 1;
+      *p += num;
+      num = 1;
     } else {
-    	*p += num;
-    	return 1;
+      *p += num;
+      return 1;
     }
   }
   if (ip0 > *p) {
-  	/* ip + num > 0xffffffff */
-  	return 0;
+    /* ip + num > 0xffffffff */
+    return 0;
   }
   
   return 1;
@@ -212,26 +225,26 @@
 {
   switch (type)
     {
-      case ZEBRA_ROUTE_SYSTEM:
-        return 1; /* other */
-      case ZEBRA_ROUTE_KERNEL:
-        return 1; /* other */
-      case ZEBRA_ROUTE_CONNECT:
-        return 2; /* local interface */
-      case ZEBRA_ROUTE_STATIC:
-        return 3; /* static route */
-      case ZEBRA_ROUTE_RIP:
-        return 8; /* rip */
-      case ZEBRA_ROUTE_RIPNG:
-        return 1; /* shouldn't happen */
-      case ZEBRA_ROUTE_OSPF:
-        return 13; /* ospf */
-      case ZEBRA_ROUTE_OSPF6:
-        return 1; /* shouldn't happen */
-      case ZEBRA_ROUTE_BGP:
-        return 14; /* bgp */
-      default:
-        return 1; /* other */
+    case ZEBRA_ROUTE_SYSTEM:
+      return 1; /* other */
+    case ZEBRA_ROUTE_KERNEL:
+      return 1; /* other */
+    case ZEBRA_ROUTE_CONNECT:
+      return 2; /* local interface */
+    case ZEBRA_ROUTE_STATIC:
+      return 3; /* static route */
+    case ZEBRA_ROUTE_RIP:
+      return 8; /* rip */
+    case ZEBRA_ROUTE_RIPNG:
+      return 1; /* shouldn't happen */
+    case ZEBRA_ROUTE_OSPF:
+      return 13; /* ospf */
+    case ZEBRA_ROUTE_OSPF6:
+      return 1; /* shouldn't happen */
+    case ZEBRA_ROUTE_BGP:
+      return 14; /* bgp */
+    default:
+      return 1; /* other */
     }
 }
 
@@ -283,6 +296,7 @@
 		       int exact, struct route_node **np, struct rib **rib)
 {
   struct in_addr dest;
+  struct route_table *table;
   struct route_node *np2;
   struct rib *rib2;
   int proto;
@@ -291,7 +305,7 @@
   u_char *pnt;
   int i;
 
-/* Init index variables */
+  /* Init index variables */
 
   pnt = (u_char *) &dest;
   for (i = 0; i < 4; i++)
@@ -304,19 +318,23 @@
   proto = 0;
   policy = 0;
  
-/* Init return variables */
+  /* Init return variables */
 
   *np = NULL;
   *rib = NULL;
 
-/* Short circuit exact matches of wrong length */
+  /* Short circuit exact matches of wrong length */
 
   if (exact && (*objid_len != v->namelen + 10))
     return;
 
-/* Get INDEX information out of OID.
- * ipForwardDest, ipForwardProto, ipForwardPolicy, ipForwardNextHop
- */
+  table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
+  if (! table)
+    return;
+
+  /* Get INDEX information out of OID.
+   * ipForwardDest, ipForwardProto, ipForwardPolicy, ipForwardNextHop
+   */
 
   if (*objid_len > v->namelen)
     oid2in_addr (objid + v->namelen, MIN(4, *objid_len - v->namelen), &dest);
@@ -329,7 +347,7 @@
 
   if (*objid_len > v->namelen + 6)
     oid2in_addr (objid + v->namelen + 6, MIN(4, *objid_len - v->namelen - 6),
-      &nexthop);
+		 &nexthop);
 
   /* Apply GETNEXT on not exact search */
 
@@ -345,14 +363,14 @@
     {
       if (policy) /* Not supported (yet?) */
         return;
-      for (*np = route_top (rib_table_ipv4); *np; *np = route_next (*np))
+      for (*np = route_top (table); *np; *np = route_next (*np))
 	{
 	  if (!in_addr_cmp(&(*np)->p.u.prefix, (u_char *)&dest))
 	    {
 	      for (*rib = (*np)->info; *rib; *rib = (*rib)->next)
 	        {
 		  if (!in_addr_cmp((u_char *)&(*rib)->nexthop->gate.ipv4,
-		    (u_char *)&nexthop))
+				   (u_char *)&nexthop))
 		    if (proto == proto_trans((*rib)->type))
 		      return;
 		}
@@ -361,9 +379,9 @@
       return;
     }
 
-/* Search next best entry */
+  /* Search next best entry */
 
-  for (np2 = route_top (rib_table_ipv4); np2; np2 = route_next (np2))
+  for (np2 = route_top (table); np2; np2 = route_next (np2))
     {
 
       /* Check destination first */
@@ -527,7 +545,7 @@
 
 u_char *
 ipCidrTable (struct variable *v, oid objid[], size_t *objid_len,
-	   int exact, size_t *val_len, WriteMethod **write_method)
+	     int exact, size_t *val_len, WriteMethod **write_method)
 {
   switch (v->magic)
     {