3 changes in rde_lsdb.c
- lsa_find_lsid() has redondant parameters
- call to lsa_self() can be simplified (== ospfd)
- update debug messages to be more suitable

Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/rde.c,v
retrieving revision 1.83
diff -u -p -r1.83 rde.c
--- rde.c       21 Jan 2020 15:17:12 -0000      1.83
+++ rde.c       27 Jan 2020 17:11:52 -0000
@@ -455,17 +455,10 @@ rde_dispatch_imsg(int fd, short event, v
 
                                rde_req_list_del(nbr, &lsa->hdr);
 
-                               self = lsa_self(lsa);
-                               if (self) {
-                                       if (v == NULL)
-                                               /* LSA is no longer announced,
-                                                * remove by premature aging. */
-                                               lsa_flush(nbr, lsa);
-                                       else
-                                               lsa_reflood(v, lsa);
-                               } else if (lsa_add(nbr, lsa))
-                                       /* delayed lsa, don't flood yet */
-                                       break;
+                               if (!(self = lsa_self(nbr, lsa, v)))
+                                       if (lsa_add(nbr, lsa))
+                                               /* delayed lsa */
+                                               break;
 
                                /* flood and perhaps ack LSA */
                                imsg_compose_event(iev_ospfe, IMSG_LS_FLOOD,
@@ -1683,8 +1676,7 @@ orig_asext_lsa(struct kroute *kr, u_int1
        memcpy((char *)lsa + sizeof(struct lsa_hdr) + sizeof(struct lsa_asext),
            &kr->prefix, LSA_PREFIXSIZE(kr->prefixlen));
 
-       lsa->hdr.ls_id = lsa_find_lsid(&asext_tree, lsa->hdr.type,
-           lsa->hdr.adv_rtr, comp_asext, lsa);
+       lsa->hdr.ls_id = lsa_find_lsid(&asext_tree, comp_asext, lsa);
 
        if (age == MAX_AGE) {
                /* inherit metric and ext_tag from the current LSA,
Index: rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/rde.h,v
retrieving revision 1.24
diff -u -p -r1.24 rde.h
--- rde.h       21 Jan 2020 15:17:12 -0000      1.24
+++ rde.h       27 Jan 2020 17:11:52 -0000
@@ -145,9 +145,7 @@ void                 vertex_nexthop_add(struct vertex 
                    const struct in6_addr *, u_int32_t);
 int             lsa_newer(struct lsa_hdr *, struct lsa_hdr *);
 int             lsa_check(struct rde_nbr *, struct lsa *, u_int16_t);
-int             lsa_self(struct lsa *);
-void            lsa_flush(struct rde_nbr *, struct lsa *);
-void            lsa_reflood(struct vertex *, struct lsa*);
+int             lsa_self(struct rde_nbr *, struct lsa *, struct vertex *);
 int             lsa_add(struct rde_nbr *, struct lsa *);
 void            lsa_del(struct rde_nbr *, struct lsa_hdr *);
 void            lsa_age(struct vertex *);
@@ -156,7 +154,7 @@ struct vertex       *lsa_find_rtr(struct area 
 struct vertex  *lsa_find_rtr_frag(struct area *, u_int32_t, unsigned int);
 struct vertex  *lsa_find_tree(struct lsa_tree *, u_int16_t, u_int32_t,
                    u_int32_t);
-u_int32_t       lsa_find_lsid(struct lsa_tree *, u_int16_t, u_int32_t,
+u_int32_t       lsa_find_lsid(struct lsa_tree *,
                    int (*)(struct lsa *, struct lsa *), struct lsa *);
 u_int16_t       lsa_num_links(struct vertex *);
 void            lsa_snap(struct rde_nbr *);
Index: rde_lsdb.c
===================================================================
RCS file: /cvs/src/usr.sbin/ospf6d/rde_lsdb.c,v
retrieving revision 1.42
diff -u -p -r1.42 rde_lsdb.c
--- rde_lsdb.c  21 Jan 2020 15:17:13 -0000      1.42
+++ rde_lsdb.c  27 Jan 2020 17:11:52 -0000
@@ -192,7 +192,7 @@ lsa_check(struct rde_nbr *nbr, struct ls
                return (0);
        }
        if (ntohs(lsa->hdr.len) != len) {
-               log_warnx("lsa_check: bad packet size");
+               log_warnx("lsa_check: bad packet length");
                return (0);
        }
 
@@ -244,7 +244,7 @@ lsa_check(struct rde_nbr *nbr, struct ls
                }
                metric = ntohl(lsa->data.pref_sum.metric);
                if (metric & ~LSA_METRIC_MASK) {
-                       log_warnx("lsa_check: bad LSA summary metric");
+                       log_warnx("lsa_check: bad LSA prefix summary metric");
                        return (0);
                }
                if (lsa_get_prefix(((char *)lsa) + sizeof(lsa->hdr) +
@@ -263,7 +263,7 @@ lsa_check(struct rde_nbr *nbr, struct ls
                }
                metric = ntohl(lsa->data.rtr_sum.metric);
                if (metric & ~LSA_METRIC_MASK) {
-                       log_warnx("lsa_check: bad LSA summary metric");
+                       log_warnx("lsa_check: bad LSA router summary metric");
                        return (0);
                }
                break;
@@ -379,7 +379,7 @@ lsa_asext_check(struct lsa *lsa, u_int16
 
        if ((len % sizeof(u_int32_t)) ||
            len < sizeof(lsa->hdr) + sizeof(*asext)) {
-               log_warnx("lsa_asext_check: bad LSA as-external packet");
+               log_warnx("lsa_asext_check: bad LSA as-external packet size");
                return (0);
        }
 
@@ -421,38 +421,44 @@ lsa_asext_check(struct lsa *lsa, u_int16
 }
 
 int
-lsa_self(struct lsa *lsa)
+lsa_self(struct rde_nbr *nbr, struct lsa *lsa, struct vertex *v)
 {
-       return rde_router_id() == lsa->hdr.adv_rtr;
-}
+       struct lsa      *dummy;
 
-void
-lsa_flush(struct rde_nbr *nbr, struct lsa *lsa)
-{
-       struct lsa      *copy;
+       if (nbr->self)
+               return (0);
 
-       /*
-        * The LSA may not be altered because the caller may still
-        * use it, so a copy needs to be added to the LSDB.
-        * The copy will be reflooded via the default timeout handler.
-        */
-       if ((copy = malloc(ntohs(lsa->hdr.len))) == NULL)
-               fatal("lsa_flush");
-       memcpy(copy, lsa, ntohs(lsa->hdr.len));
-       copy->hdr.age = htons(MAX_AGE);
-       (void)lsa_add(rde_nbr_self(nbr->area), copy);
-}
+       if (rde_router_id() != lsa->hdr.adv_rtr)
+               return (0);
+
+       if (v == NULL) {
+               /* LSA is no longer announced, remove by premature aging.
+                * The LSA may not be altered because the caller may still
+                * use it, so a copy needs to be added to the LSDB.
+                * The copy will be reflooded via the default timeout handler.
+                */
+               if ((dummy = malloc(ntohs(lsa->hdr.len))) == NULL)
+                       fatal("lsa_self");
+               memcpy(dummy, lsa, ntohs(lsa->hdr.len));
+               dummy->hdr.age = htons(MAX_AGE);
+               /*
+                * The clue is that by using the remote nbr as originator
+                * the dummy LSA will be reflooded via the default timeout
+                * handler.
+                */
+               (void)lsa_add(rde_nbr_self(nbr->area), dummy);
+               return (1);
+       }
 
-void
-lsa_reflood(struct vertex *v, struct lsa *new)
-{
        /*
-        * We only need to create a new instance by setting the LSA
-        * sequence number equal to the one of 'new' and calling
-        * lsa_refresh(). Actual flooding will be done by the caller.
+        * LSA is still originated, just reflood it. But we need to create
+        * a new instance by setting the LSA sequence number equal to the
+        * one of new and calling lsa_refresh(). Flooding will be done by the
+        * caller.
         */
-       v->lsa->hdr.seq_num = new->hdr.seq_num;
+       v->lsa->hdr.seq_num = lsa->hdr.seq_num;
        lsa_refresh(v);
+       return (1);
 }
 
 int
@@ -461,7 +467,6 @@ lsa_add(struct rde_nbr *nbr, struct lsa 
        struct lsa_tree *tree;
        struct vertex   *new, *old;
        struct timeval   tv, now, res;
-       int              update = 1;
 
        if (LSA_IS_SCOPE_AS(ntohs(lsa->hdr.type)))
                tree = &asext_tree;
@@ -470,7 +475,7 @@ lsa_add(struct rde_nbr *nbr, struct lsa 
        else if (LSA_IS_SCOPE_LLOCAL(ntohs(lsa->hdr.type)))
                tree = &nbr->iface->lsa_tree;
        else
-               fatalx("unknown scope type");
+               fatalx("%s: unknown scope type", __func__);
 
        new = vertex_get(lsa, nbr, tree);
        old = RB_INSERT(lsa_tree, tree, new);
@@ -490,13 +495,16 @@ lsa_add(struct rde_nbr *nbr, struct lsa 
                                fatal("lsa_add");
                        return (1);
                }
-               if (lsa_equal(new->lsa, old->lsa))
-                       update = 0;
+               if (!lsa_equal(new->lsa, old->lsa)) {
+                       if (ntohs(lsa->hdr.type) == LSA_TYPE_LINK)
+                               orig_intra_area_prefix_lsas(nbr->area);
+                       if (ntohs(lsa->hdr.type) != LSA_TYPE_EXTERNAL)
+                               nbr->area->dirty = 1;
+                       start_spf_timer();
+               }
                vertex_free(old);
                RB_INSERT(lsa_tree, tree, new);
-       }
-
-       if (update) {
+       } else {
                if (ntohs(lsa->hdr.type) == LSA_TYPE_LINK)
                        orig_intra_area_prefix_lsas(nbr->area);
                if (ntohs(lsa->hdr.type) != LSA_TYPE_EXTERNAL)
@@ -513,7 +521,7 @@ lsa_add(struct rde_nbr *nbr, struct lsa 
                tv.tv_sec = MAX_AGE - ntohs(new->lsa->hdr.age);
 
        if (evtimer_add(&new->ev, &tv) != 0)
-               fatal("lsa_add");
+               fatal("lsa_add: evtimer_add()");
        return (0);
 }
 
@@ -651,8 +659,8 @@ lsa_find_rtr_frag(struct area *area, u_i
 }
 
 u_int32_t
-lsa_find_lsid(struct lsa_tree *tree, u_int16_t type, u_int32_t adv_rtr,
-    int (*cmp)(struct lsa *, struct lsa *), struct lsa *lsa)
+lsa_find_lsid(struct lsa_tree *tree, int (*cmp)(struct lsa *, struct lsa *),
+    struct lsa *lsa)
 {
 #define MIN(x, y)      ((x) < (y) ? (x) : (y))
        struct vertex   *v;
@@ -660,8 +668,8 @@ lsa_find_lsid(struct lsa_tree *tree, u_i
        u_int32_t        min, cur;
 
        key.ls_id = 0;
-       key.adv_rtr = ntohl(adv_rtr);
-       key.type = ntohs(type);
+       key.adv_rtr = ntohl(lsa->hdr.adv_rtr);
+       key.type = ntohs(lsa->hdr.type);
 
        cur = 0;
        min = 0xffffffffU;

Reply via email to