Le Tue, Mar 15, 2022 at 04:03:20PM +0100, Claudio Jeker a écrit : > Currently EoR markers use a full byte in struct prefix what can be done in > a bit. Use the last flags field so that that 1 byte is available again. > I already have a need for that byte this is why I came up with this > change. >
OK denis@ > -- > :wq Claudio > > ? obj > Index: rde.h > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v > retrieving revision 1.247 > diff -u -p -r1.247 rde.h > --- rde.h 2 Mar 2022 16:51:43 -0000 1.247 > +++ rde.h 15 Mar 2022 14:59:27 -0000 > @@ -333,7 +333,7 @@ struct prefix { > uint32_t path_id_tx; > uint8_t validation_state; > uint8_t nhflags; > - uint8_t eor; > + uint8_t unused; > uint8_t flags; > #define PREFIX_FLAG_WITHDRAW 0x01 /* enqueued on withdraw queue */ > #define PREFIX_FLAG_UPDATE 0x02 /* enqueued on update queue */ > @@ -341,6 +341,7 @@ struct prefix { > #define PREFIX_FLAG_STALE 0x08 /* stale entry (graceful > reload) */ > #define PREFIX_FLAG_MASK 0x0f /* mask for the prefix types */ > #define PREFIX_FLAG_ADJOUT 0x10 /* prefix is in the adj-out rib > */ > +#define PREFIX_FLAG_EOR 0x20 /* prefix is EoR */ > #define PREFIX_NEXTHOP_LINKED 0x40 /* prefix is linked onto > nexthop list */ > #define PREFIX_FLAG_LOCKED 0x80 /* locked by rib walker */ > }; > Index: rde_rib.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/rde_rib.c,v > retrieving revision 1.233 > diff -u -p -r1.233 rde_rib.c > --- rde_rib.c 15 Mar 2022 14:39:34 -0000 1.233 > +++ rde_rib.c 15 Mar 2022 14:59:28 -0000 > @@ -875,10 +875,10 @@ prefix_index_cmp(struct prefix *a, struc > static inline int > prefix_cmp(struct prefix *a, struct prefix *b) > { > - if (a->eor != b->eor) > - return a->eor - b->eor; > - /* if EOR marker no need to check the rest also a->eor == b->eor */ > - if (a->eor) > + if ((a->flags & PREFIX_FLAG_EOR) != (b->flags & PREFIX_FLAG_EOR)) > + return (a->flags & PREFIX_FLAG_EOR) ? 1 : -1; > + /* if EOR marker no need to check the rest */ > + if (a->flags & PREFIX_FLAG_EOR) > return 0; > > if (a->aspath != b->aspath) > @@ -1152,8 +1152,7 @@ prefix_add_eor(struct rde_peer *peer, ui > struct prefix *p; > > p = prefix_alloc(); > - p->flags = PREFIX_FLAG_ADJOUT | PREFIX_FLAG_UPDATE; > - p->eor = 1; > + p->flags = PREFIX_FLAG_ADJOUT | PREFIX_FLAG_UPDATE | PREFIX_FLAG_EOR; > if (RB_INSERT(prefix_tree, &peer->updates[aid], p) != NULL) > /* no need to add if EoR marker already present */ > prefix_free(p); > @@ -1290,7 +1289,7 @@ prefix_adjout_destroy(struct prefix *p) > if ((p->flags & PREFIX_FLAG_ADJOUT) == 0) > fatalx("%s: prefix without PREFIX_FLAG_ADJOUT hit", __func__); > > - if (p->eor) { > + if (p->flags & PREFIX_FLAG_EOR) { > /* EOR marker is not linked in the index */ > prefix_free(p); > return; > Index: rde_update.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/rde_update.c,v > retrieving revision 1.136 > diff -u -p -r1.136 rde_update.c > --- rde_update.c 2 Mar 2022 16:51:43 -0000 1.136 > +++ rde_update.c 15 Mar 2022 14:59:28 -0000 > @@ -586,7 +586,7 @@ up_is_eor(struct rde_peer *peer, uint8_t > struct prefix *p; > > p = RB_MIN(prefix_tree, &peer->updates[aid]); > - if (p != NULL && p->eor) { > + if (p != NULL && (p->flags & PREFIX_FLAG_EOR)) { > /* > * Need to remove eor from update tree because > * prefix_adjout_destroy() can't handle that. > @@ -635,7 +635,7 @@ up_dump_prefix(u_char *buf, int len, str > np->communities != p->communities || > np->nexthop != p->nexthop || > np->nhflags != p->nhflags || > - np->eor) > + (np->flags & PREFIX_FLAG_EOR)) > done = 1; > > >