]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Babel: Fix handling of missing IPv4 next hops
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Wed, 13 Jun 2018 13:22:29 +0000 (15:22 +0200)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Wed, 13 Jun 2018 13:22:29 +0000 (15:22 +0200)
In case of missing IPv4 next hop, we should skip such routes
on transmit and ignore such routes on receive.

Thanks to Julian Schuh for the bugreport and Toke Hoiland-Jorgensen
for the original patch.

proto/babel/babel.c
proto/babel/packets.c

index 44c6adb86ae19fc54a9fad1d5a9d58f9e178f4df..20953044c65d27bc7a890033851465619a5cd759 100644 (file)
@@ -952,6 +952,10 @@ babel_send_update_(struct babel_iface *ifa, btime changed, struct fib *rtable)
     msg.update.next_hop = ((e->n.addr->type == NET_IP4) ?
                           ifa->next_hop_ip4 : ifa->next_hop_ip6);
 
+    /* Do not send route if next hop is unknown, e.g. no configured IPv4 address */
+    if (ipa_zero(msg.update.next_hop))
+      continue;
+
     babel_enqueue(&msg, ifa);
 
     /* Update feasibility distance for redistributed routes */
@@ -1580,7 +1584,7 @@ babel_add_iface(struct babel_proto *p, struct iface *new, struct babel_iface_con
   ifa->next_hop_ip6 = ipa_nonzero(ic->next_hop_ip6) ? ic->next_hop_ip6 : ifa->addr;
 
   if (ipa_zero(ifa->next_hop_ip4) && p->ip4_channel)
-    log(L_WARN "%s: Cannot find IPv4 next hop addr on %s", p->p.name, new->name);
+    log(L_WARN "%s: Missing IPv4 next hop address for %s", p->p.name, new->name);
 
   init_list(&ifa->neigh_list);
   ifa->hello_seqno = 1;
@@ -1682,7 +1686,7 @@ babel_reconfigure_iface(struct babel_proto *p, struct babel_iface *ifa, struct b
   ifa->next_hop_ip6 = ipa_nonzero(new->next_hop_ip6) ? new->next_hop_ip6 : ifa->addr;
 
   if (ipa_zero(ifa->next_hop_ip4) && p->ip4_channel)
-    log(L_WARN "%s: Cannot find IPv4 next hop addr on %s", p->p.name, ifa->ifname);
+    log(L_WARN "%s: Missing IPv4 next hop address for %s", p->p.name, ifa->ifname);
 
   if (ifa->next_hello > (current_time() + new->hello_interval))
     ifa->next_hello = current_time() + (random() % new->hello_interval);
index 59678678ae0b8f3092aeeaf9a44af9763b62e6a5..d4ecf649dedc02a5ba39432ee32c72b9c10d26b6 100644 (file)
@@ -616,7 +616,7 @@ babel_read_update(struct babel_tlv *hdr, union babel_msg *m,
 
     /* Update must have next hop, unless it is retraction */
     if (ipa_zero(state->next_hop_ip4) && (msg->metric != BABEL_INFINITY))
-      return PARSE_ERROR;
+      return PARSE_IGNORE;
 
     /* Merge saved prefix and received prefix parts */
     memcpy(buf, state->def_ip4_prefix, tlv->omitted);