[PATCH] babel: Fix missing modulo comparison of seqnos

Toke Høiland-Jørgensen toke at toke.dk
Tue Jan 31 11:51:25 CET 2023


Juliusz Chroboczek <jch at irif.fr> writes:

>> Introduce a strict-inequality version of the modulo-comparison for this
>> purpose.
>
> Thanks.
>
> I'm a little worried about the code around line 1017:
>
>       struct babel_source *s = babel_get_source(p, e, e->router_id);
>       s->expires = current_time() + BABEL_GARBAGE_INTERVAL;
>
>       if (gt_mod64k(msg.update.seqno, s->seqno) ||
> 	  ((msg.update.seqno == s->seqno) && (msg.update.metric < s->metric)))
>       {
> 	s->seqno = msg.update.seqno;
> 	s->metric = msg.update.metric;
>       }
>
> If the source is just being created, then the function babel_get_source
> will initialise s->seqno to 0.  If msg.update.seqno happens to be in the
> interval [0x8000,0xFFFF], then the conditional at line 1020 will fail to
> trigger, and s->seqno will not be updated until msg.updae.seqno catches up
> with 0.
>
> I think that babel_get_source should take an extra argument, the initial
> seqno in case the source does not exist, and it should be called with
> msg.update.seqno.  This corresponds to RFC 8966 Section 3.5.3.

Ah, I see the problem. You're right, of course, sorry for not catching
your meaning the first time around. I'll send (another) patch :)

-Toke


More information about the Bird-users mailing list