]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Merge commit 'f515e22924591542a909db0deb8545386aaa576e' into integrated
authorOndrej Zajicek <santiago@crfreenet.org>
Tue, 29 Apr 2014 13:07:08 +0000 (15:07 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Tue, 29 Apr 2014 13:07:08 +0000 (15:07 +0200)
Conflicts:

sysdep/bsd/krt-sock.c

1  2 
sysdep/bsd/krt-sock.c

index d33486cf3723b3fcea36318cdb5cfd4d58309dbc,3d300369978bd227b51a7f90fd31d5978a591e5a..550032c7f55f9aec3d107739dfbe6f0556ec5afd
@@@ -752,30 -674,40 +752,38 @@@ 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 (scope & SCOPE_LINK)
 -
 -  if (ipa_has_link_scope(ifa.ip))
++  if (ipa_is_link_local(ifa.ip))
      _I0(ifa.ip) = 0xfe800000;
 -
 -  if (ipa_has_link_scope(ifa.brd))
++  if (ipa_is_link_local(ifa.brd))
+     _I0(ifa.brd) = 0xfe800000;
 -#endif
 -  if (masklen < BITS_PER_IP_ADDRESS)
 +
 +  // maxlen = ipv4 ? BITS_PER_IP_ADDRESS4 : BITS_PER_IP_ADDRESS6;
 +  maxlen = BITS_PER_IP_ADDRESS; // XXXX: Hack
 +
-   if ((iface->flags & IF_MULTIACCESS) || (masklen != maxlen))
++  if (masklen < maxlen)
    {
      ifa.prefix = ipa_and(ifa.ip, ipa_mkmask(masklen));
  
-     if (masklen == maxlen)
-       ifa.flags |= IA_HOST;
 -    if (masklen == (BITS_PER_IP_ADDRESS - 1))
 +    if (masklen == (maxlen - 1))
        ifa.opposite = ipa_opposite_m1(ifa.ip);
  
 -#ifndef IPV6
 -    if (masklen == (BITS_PER_IP_ADDRESS - 2))
 +    if (ipv4 && masklen == (maxlen - 2))
        ifa.opposite = ipa_opposite_m2(ifa.ip);
 -#endif
+     if (!(iface->flags & IF_MULTIACCESS))
+       ifa.opposite = ifa.brd;
    }
-   else         /* PtP iface */
+   else if (!(iface->flags & IF_MULTIACCESS) && ipa_nonzero(ifa.brd))
    {
-     ifa.flags |= IA_PEER;
      ifa.prefix = ifa.opposite = ifa.brd;
+     ifa.flags |= IA_PEER;
+   }
+   else
+   {
+     ifa.prefix = ifa.ip;
+     ifa.flags |= IA_HOST;
    }
  
    if (new)