Claudio Jeker a écrit :
Could you try the following diff instead? This should fix the real cause
of the crashes.

Thanks for this quick patch. It works very well. I know that my previous patch was wrong. In fact after spending a few hours more, I have made a bigger patch wich do almost the same.

I suppose that due to the change in route handling in 4.3, the message were send twice in RTM_VERSION 3 and 4.

I still have a problem on a box which have a vlan, interface :

ifconfig  vlan1
vlan1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
       lladdr 00:40:f4:8a:16:81
       vlan: 2 priority: 0 parent interface: rl0
       groups: vlan
       inet6 fe80::240:f4ff:fe8a:1681%vlan1 prefixlen 64 scopeid 0x5
       inet 192.168.20.1 netmask 0xffffff00 broadcast 255.255.255.0

Note the broadcast addr ? I have these behaviour since I upgrade to 4.3.
However the route are correct.
So I wrote this small patch wich test if the broadcast or dest addr are not the same as the mask.


$OpenBSD: patch-zebra_if_ioctl_c,v 1.0 2008/05/14 18:31:18 arf Exp $
--- zebra/if_ioctl.c.orig       Wed May 21 18:08:40 2008
+++ zebra/if_ioctl.c    Wed May 21 18:08:54 2008
@@ -258,18 +258,16 @@ if_getaddrs (void)
         dest_pnt = NULL;

         if (ifap->ifa_dstaddr &&
-             !IPV4_ADDR_SAME(&addr->sin_addr,
-                             &((struct sockaddr_in *)
-                               ifap->ifa_dstaddr)->sin_addr))
+ !IPV4_ADDR_SAME(&addr->sin_addr, &((struct sockaddr_in *) ifap->ifa_dstaddr)->sin_addr)&& + !IPV4_ADDR_SAME(&mask->sin_addr, &((struct sockaddr_in *) ifap->ifa_dstaddr)->sin_addr))
           {
             dest = (struct sockaddr_in *) ifap->ifa_dstaddr;
             dest_pnt = &dest->sin_addr;
             flags = ZEBRA_IFA_PEER;
           }
-         else if (ifap->ifa_broadaddr &&
-                  !IPV4_ADDR_SAME(&addr->sin_addr,
-                                  &((struct sockaddr_in *)
-                                    ifap->ifa_broadaddr)->sin_addr))
+         else if (ifap->ifa_broadaddr &&
+ !IPV4_ADDR_SAME(&addr->sin_addr, &((struct sockaddr_in *) ifap->ifa_broadaddr)->sin_addr)&& + !IPV4_ADDR_SAME(&mask->sin_addr, &((struct sockaddr_in *) ifap->ifa_broadaddr)->sin_addr))
           {
             dest = (struct sockaddr_in *) ifap->ifa_broadaddr;
             dest_pnt = &dest->sin_addr;
@@ -294,18 +292,16 @@ if_getaddrs (void)
         dest_pnt = NULL;

         if (ifap->ifa_dstaddr &&
-             !IPV6_ADDR_SAME(&addr->sin6_addr,
-                             &((struct sockaddr_in6 *)
-                               ifap->ifa_dstaddr)->sin6_addr))
+ !IPV6_ADDR_SAME(&addr->sin6_addr, &((struct sockaddr_in6 *) ifap->ifa_dstaddr)->sin6_addr)&& + !IPV6_ADDR_SAME(&mask->sin6_addr, &((struct sockaddr_in6 *) ifap->ifa_dstaddr)->sin6_addr))
           {
             dest = (struct sockaddr_in6 *) ifap->ifa_dstaddr;
             dest_pnt = &dest->sin6_addr;
             flags = ZEBRA_IFA_PEER;
           }
-         else if (ifap->ifa_broadaddr &&
-                  !IPV6_ADDR_SAME(&addr->sin6_addr,
-                                  &((struct sockaddr_in6 *)
-                                    ifap->ifa_broadaddr)->sin6_addr))
+         else if (ifap->ifa_broadaddr &&
+ !IPV6_ADDR_SAME(&addr->sin6_addr, &((struct sockaddr_in6 *) ifap->ifa_broadaddr)->sin6_addr)&& + !IPV6_ADDR_SAME(&mask->sin6_addr, &((struct sockaddr_in6 *) ifap->ifa_broadaddr)->sin6_addr))
           {
             dest = (struct sockaddr_in6 *) ifap->ifa_broadaddr;
             dest_pnt = &dest->sin6_addr;




Reply via email to