Hi!
So my last attempt wasn't met with much appreciation, so I'll slow down:
- when I add a vlan(4), vether(4) or something, my ospf6d dies
- I don't like that
- therefore, with new release comes new diff
- this time I tried to make it as small as possible, in separate parts
It doesn't fix departures (if_leave_group jumps on a non-existing
interface), but I guess people don't remove interfaces that often.
I will rewrite and post the rest of the big one if someone shows
interest in this bit.
--
Martin Pelikan
Index: kroute.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/kroute.c,v
retrieving revision 1.30
diff -u -p -r1.30 kroute.c
--- kroute.c 7 Mar 2011 07:43:02 -0000 1.30
+++ kroute.c 1 Jun 2011 20:36:31 -0000
@@ -973,15 +973,22 @@ if_announce(void *msg)
if ((iface = if_new(ifan->ifan_index, ifan->ifan_name)) == NULL)
fatal("if_announce failed");
iface->cflags |= F_IFACE_AVAIL;
+ main_imsg_compose_rde(IMSG_IFADD, 0,
+ iface, sizeof(struct iface));
+ main_imsg_compose_ospfe(IMSG_IFADD, 0,
+ iface, sizeof(struct iface));
break;
case IFAN_DEPARTURE:
- iface = if_find(ifan->ifan_index);
- if (iface->cflags & F_IFACE_CONFIGURED) {
- main_imsg_compose_rde(IMSG_IFDELETE, 0,
- &iface->ifindex, sizeof(iface->ifindex));
- main_imsg_compose_ospfe(IMSG_IFDELETE, 0,
- &iface->ifindex, sizeof(iface->ifindex));
+ if ((iface = if_find(ifan->ifan_index)) == NULL) {
+ log_warn("someone announced departure of non-existing "
+ "interface %s - possible race condition?",
+ ifan->ifan_name);
+ return;
}
+ main_imsg_compose_rde(IMSG_IFDELETE, 0,
+ &iface->ifindex, sizeof(iface->ifindex));
+ main_imsg_compose_ospfe(IMSG_IFDELETE, 0,
+ &iface->ifindex, sizeof(iface->ifindex));
if_del(iface);
break;
}
Index: ospfe.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/ospfe.c,v
retrieving revision 1.34
diff -u -p -r1.34 ospfe.c
--- ospfe.c 2 May 2011 09:24:00 -0000 1.34
+++ ospfe.c 1 Jun 2011 20:36:31 -0000
@@ -299,16 +299,16 @@ ospfe_dispatch_main(int fd, short event,
}
break;
case IMSG_IFADD:
- if ((iface = malloc(sizeof(struct iface))) == NULL)
- fatal(NULL);
- memcpy(iface, imsg.data, sizeof(struct iface));
+ ifp = imsg.data;
+ if ((iface = if_new(ifp->ifindex, ifp->name)) == NULL)
+ fatalx("IFADD in ospfe");
- LIST_INIT(&iface->nbr_list);
- TAILQ_INIT(&iface->ls_ack_list);
- RB_INIT(&iface->lsa_tree);
+ /* ifaces from config belong to some area */
+ if ((iface->cflags & F_IFACE_CONFIGURED) &&
+ (area = area_find(oeconf, iface->area_id)) != NULL)
+ LIST_INSERT_HEAD(&area->iface_list, iface,
+ entry);
- area = area_find(oeconf, iface->area_id);
- LIST_INSERT_HEAD(&area->iface_list, iface, entry);
break;
case IMSG_IFDELETE:
if (imsg.hdr.len != IMSG_HEADER_SIZE +
Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/rde.c,v
retrieving revision 1.52
diff -u -p -r1.52 rde.c
--- rde.c 5 May 2011 15:58:02 -0000 1.52
+++ rde.c 1 Jun 2011 20:36:31 -0000
@@ -623,7 +623,7 @@ rde_dispatch_parent(int fd, short event,
{
static struct area *narea;
struct area *area;
- struct iface *iface;
+ struct iface *iface, *ifp;
struct ifaddrchange *ifc;
struct iface_addr *ia, *nia;
struct imsg imsg;
@@ -710,16 +710,16 @@ rde_dispatch_parent(int fd, short event,
0, -1, &kr, sizeof(kr));
break;
case IMSG_IFADD:
- if ((iface = malloc(sizeof(struct iface))) == NULL)
- fatal(NULL);
- memcpy(iface, imsg.data, sizeof(struct iface));
-
- LIST_INIT(&iface->nbr_list);
- TAILQ_INIT(&iface->ls_ack_list);
- RB_INIT(&iface->lsa_tree);
+ ifp = imsg.data;
+ if ((iface = if_new(ifp->ifindex, ifp->name)) == NULL)
+ fatalx("IFADD in rde");
+
+ /* ifaces from config belong to area */
+ if ((iface->cflags & F_IFACE_CONFIGURED) &&
+ (area = area_find(rdeconf, iface->area_id)) != NULL)
+ LIST_INSERT_HEAD(&area->iface_list, iface,
+ entry);
- area = area_find(rdeconf, iface->area_id);
- LIST_INSERT_HEAD(&area->iface_list, iface, entry);
break;
case IMSG_IFDELETE:
if (imsg.hdr.len != IMSG_HEADER_SIZE +