]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Babel: Fix missing modulo comparison of seqnos
authorToke Høiland-Jørgensen <toke@toke.dk>
Mon, 30 Jan 2023 22:36:39 +0000 (23:36 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Mon, 30 Jan 2023 22:36:39 +0000 (23:36 +0100)
Juliusz noticed there were a couple of places we were doing straight
inequality comparisons of seqnos in Babel. This is wrong because seqnos can
wrap: so we need to use the modulo-64k comparison function for these cases
as well.

Introduce a strict-inequality version of the modulo-comparison for this
purpose.

proto/babel/babel.c

index ff8b6b52ef4a3f3c06f1447ec452c246d2841716..a20bd72456bb82bc3b4055de156da0b24f3d1ca0 100644 (file)
 static inline int ge_mod64k(uint a, uint b)
 { return (u16)(a - b) < 0x8000; }
 
+/* Strict inequality version of the above */
+static inline int gt_mod64k(uint a, uint b)
+{ return ge_mod64k(a, b) && a != b; }
+
 static void babel_expire_requests(struct babel_proto *p, struct babel_entry *e);
 static void babel_select_route(struct babel_proto *p, struct babel_entry *e, struct babel_route *mod);
 static inline void babel_announce_retraction(struct babel_proto *p, struct babel_entry *e);
@@ -559,7 +563,7 @@ babel_is_feasible(struct babel_source *s, u16 seqno, u16 metric)
 {
   return !s ||
     (metric == BABEL_INFINITY) ||
-    (seqno > s->seqno) ||
+    gt_mod64k(seqno, s->seqno) ||
     ((seqno == s->seqno) && (metric < s->metric));
 }
 
@@ -1013,7 +1017,7 @@ babel_send_update_(struct babel_iface *ifa, btime changed, struct fib *rtable)
       struct babel_source *s = babel_get_source(p, e, e->router_id);
       s->expires = current_time() + BABEL_GARBAGE_INTERVAL;
 
-      if ((msg.update.seqno > s->seqno) ||
+      if (gt_mod64k(msg.update.seqno, s->seqno) ||
          ((msg.update.seqno == s->seqno) && (msg.update.metric < s->metric)))
       {
        s->seqno = msg.update.seqno;