]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixes an issue when opposite address is mistaken for broadcast on ptp ifaces on BSDs.
authorOndrej Zajicek <santiago@crfreenet.org>
Thu, 21 Nov 2013 12:17:42 +0000 (13:17 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Thu, 21 Nov 2013 12:17:42 +0000 (13:17 +0100)
Thanks to Lex van Roon for the bugreport and to Alexander V. Chernikov
for examining it and locating the problem.

sysdep/bsd/krt-sock.c

index 3d300369978bd227b51a7f90fd31d5978a591e5a..0bc29458cc083e90d5bf584d40d3f1129576568e 100644 (file)
@@ -654,17 +654,25 @@ krt_read_addr(struct ks_msg *msg)
 
   if ((masklen = ipa_mklen(imask)) < 0)
   {
-    log("Invalid masklen");
+    log(L_ERR "KIF: Invalid masklen %I for %s", imask, iface->name);
     return;
   }
 
-  bzero(&ifa, sizeof(ifa));
+#ifdef IPV6
+  /* Clean up embedded interface ID returned in link-local address */
 
-  ifa.iface = iface;
+  if (ipa_has_link_scope(iaddr))
+    _I0(iaddr) = 0xfe800000;
 
-  memcpy(&ifa.ip, &iaddr, sizeof(ip_addr));
+  if (ipa_has_link_scope(ibrd))
+    _I0(ibrd) = 0xfe800000;
+#endif
+
+
+  bzero(&ifa, sizeof(ifa));
+  ifa.iface = iface;
+  ifa.ip = iaddr;
   ifa.pxlen = masklen;
-  memcpy(&ifa.brd, &ibrd, sizeof(ip_addr));
 
   scope = ipa_classify(ifa.ip);
   if (scope < 0)
@@ -674,16 +682,6 @@ krt_read_addr(struct ks_msg *msg)
   }
   ifa.scope = scope & IADDR_SCOPE_MASK;
 
-#ifdef IPV6
-  /* Clean up embedded interface ID returned in link-local address */
-
-  if (ipa_has_link_scope(ifa.ip))
-    _I0(ifa.ip) = 0xfe800000;
-
-  if (ipa_has_link_scope(ifa.brd))
-    _I0(ifa.brd) = 0xfe800000;
-#endif
-
   if (masklen < BITS_PER_IP_ADDRESS)
   {
     ifa.prefix = ipa_and(ifa.ip, ipa_mkmask(masklen));
@@ -696,12 +694,15 @@ krt_read_addr(struct ks_msg *msg)
       ifa.opposite = ipa_opposite_m2(ifa.ip);
 #endif
 
+    if (iface->flags & IF_BROADCAST)
+      ifa.brd = ibrd;
+
     if (!(iface->flags & IF_MULTIACCESS))
-      ifa.opposite = ifa.brd;
+      ifa.opposite = ibrd;
   }
-  else if (!(iface->flags & IF_MULTIACCESS) && ipa_nonzero(ifa.brd))
+  else if (!(iface->flags & IF_MULTIACCESS) && ipa_nonzero(ibrd))
   {
-    ifa.prefix = ifa.opposite = ifa.brd;
+    ifa.prefix = ifa.opposite = ibrd;
     ifa.flags |= IA_PEER;
   }
   else