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;