Merge volatile/cumulus_ospf6d

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 6044383..26b97c2 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -534,6 +534,25 @@
 }
 #endif /* HAVE_IPV6 */
 
+static int
+if_get_ipv4_address (struct interface *ifp, struct in_addr *addr)
+{
+  struct listnode *cnode;
+  struct connected *connected;
+  struct prefix *cp;
+
+  for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
+    {
+      cp = connected->address;
+      if ((cp->family == AF_INET) && !ipv4_martian(&(cp->u.prefix4)))
+	  {
+	    *addr = cp->u.prefix4;
+	    return 1;
+	  }
+    }
+  return 0;
+}
+
 int
 bgp_nexthop_set (union sockunion *local, union sockunion *remote, 
 		 struct bgp_nexthop *nexthop, struct peer *peer)
@@ -592,8 +611,9 @@
     {
       struct interface *direct = NULL;
 
-      /* IPv4 nexthop.  I don't care about it. */
-      if (peer->local_id.s_addr)
+      /* IPv4 nexthop. */
+      ret = if_get_ipv4_address(ifp, &nexthop->v4);
+      if (!ret && peer->local_id.s_addr)
 	nexthop->v4 = peer->local_id;
 
       /* Global address*/
diff --git a/lib/prefix.h b/lib/prefix.h
index 7f0d360..8c8992e 100644
--- a/lib/prefix.h
+++ b/lib/prefix.h
@@ -196,4 +196,14 @@
 
 extern int all_digit (const char *);
 
+static inline int ipv4_martian (struct in_addr *addr)
+{
+  in_addr_t ip = addr->s_addr;
+
+  if (IPV4_NET0(ip) || IPV4_NET127(ip) || IPV4_CLASS_DE(ip)) {
+    return 1;
+  }
+  return 0;
+}
+
 #endif /* _ZEBRA_PREFIX_H */
diff --git a/lib/vty.c b/lib/vty.c
index 0d6345c..96cb1e4 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -1856,9 +1856,11 @@
     {
       case AF_INET:
         naddr=&su.sin.sin_addr;
+        break;
 #ifdef HAVE_IPV6
       case AF_INET6:
         naddr=&su.sin6.sin6_addr;
+        break;
 #endif	
     }
 
diff --git a/ospf6d/ospf6_snmp.c b/ospf6d/ospf6_snmp.c
index f8a3b92..4660392 100644
--- a/ospf6d/ospf6_snmp.c
+++ b/ospf6d/ospf6_snmp.c
@@ -528,7 +528,7 @@
     return NULL;
 
   len = *length - v->namelen;
-  len = (len >= 1 ? sizeof 1 : 0);
+  len = (len >= 1 ? 1 : 0);
   if (exact && len != 1)
     return NULL;
   if (len)
diff --git a/ospfd/ospf_asbr.c b/ospfd/ospf_asbr.c
index a23b4f2..7e7c84f 100644
--- a/ospfd/ospf_asbr.c
+++ b/ospfd/ospf_asbr.c
@@ -164,7 +164,8 @@
   new->nexthop = nexthop;
   new->tag = 0;
 
-  rn->info = new;
+  if (rn)
+    rn->info = new;
 
   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
     zlog_debug ("Redistribute[%s]: %s/%d external info created.",
diff --git a/ospfd/ospf_te.c b/ospfd/ospf_te.c
index 587564a..c605ce6 100644
--- a/ospfd/ospf_te.c
+++ b/ospfd/ospf_te.c
@@ -1036,7 +1036,8 @@
   /* If the lsa's age reached to MaxAge, start flushing procedure. */
   if (IS_LSA_MAXAGE (lsa))
     {
-      lp->flags &= ~LPFLG_LSA_ENGAGED;
+      if (lp)
+        lp->flags &= ~LPFLG_LSA_ENGAGED;
       ospf_opaque_lsa_flush_schedule (lsa);
       goto out;
     }
diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c
index 34a3b2a..b5268a3 100644
--- a/ospfd/ospf_zebra.c
+++ b/ospfd/ospf_zebra.c
@@ -482,7 +482,7 @@
 	  if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
 	    {
 	      char buf[2][INET_ADDRSTRLEN];
-	      zlog_debug("Zebra: Route add %s/%d nexthop %s",
+	      zlog_debug("Zebra: Route delete %s/%d nexthop %s",
 			 inet_ntop(AF_INET, &p->prefix,
 				   buf[0], sizeof(buf[0])),
 			 p->prefixlen,
diff --git a/zebra/irdp_packet.c b/zebra/irdp_packet.c
index 28dc171..5052504 100644
--- a/zebra/irdp_packet.c
+++ b/zebra/irdp_packet.c
@@ -287,7 +287,7 @@
   if (!(ifp->flags & IFF_UP))
     return;
 
-  if (!p) 
+  if (p)
     src = ntohl(p->u.prefix4.s_addr);
   else 
     src = 0; /* Is filled in */
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 77c0d8c..6616f9a 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -2160,12 +2160,20 @@
   /* Apply mask. */
   apply_mask_ipv4 (p);
 
-  if (IS_ZEBRA_DEBUG_KERNEL && gate)
-    zlog_debug ("rib_delete_ipv4(): route delete %s/%d via %s ifindex %d",
-		       inet_ntop (AF_INET, &p->prefix, buf1, INET_ADDRSTRLEN),
-		       p->prefixlen, 
-		       inet_ntoa (*gate), 
-		       ifindex);
+  if (IS_ZEBRA_DEBUG_KERNEL)
+    {
+      if (gate)
+	zlog_debug ("rib_delete_ipv4(): route delete %s/%d via %s ifindex %d",
+		    inet_ntop (AF_INET, &p->prefix, buf1, INET_ADDRSTRLEN),
+		    p->prefixlen,
+		    inet_ntoa (*gate),
+		    ifindex);
+      else
+	zlog_debug ("rib_delete_ipv4(): route delete %s/%d ifindex %d",
+		    inet_ntop (AF_INET, &p->prefix, buf1, INET_ADDRSTRLEN),
+		    p->prefixlen,
+		    ifindex);
+    }
 
   /* Lookup route node. */
   rn = route_node_lookup (table, (struct prefix *) p);
diff --git a/zebra/zserv.c b/zebra/zserv.c
index 5df521b..55ac6e4 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -879,6 +879,7 @@
 	      break;
 	    case ZEBRA_NEXTHOP_IPV4_IFINDEX:
 	      nexthop.s_addr = stream_get_ipv4 (s);
+	      nexthop_p = &nexthop;
 	      ifindex = stream_getl (s);
 	      break;
 	    case ZEBRA_NEXTHOP_IPV6: