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 +

Reply via email to