Re: bgpd mark EoR prefix with a flag field

2022-03-15 Thread Theo Buehler
On Tue, Mar 15, 2022 at 04:03:20PM +0100, Claudio Jeker wrote:
> 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



Re: bgpd mark EoR prefix with a flag field

2022-03-15 Thread Denis Fondras
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 -   1.247
> +++ rde.h 15 Mar 2022 14:59:27 -
> @@ -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_WITHDRAW0x01/* 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_MASK0x0f/* 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 -  1.233
> +++ rde_rib.c 15 Mar 2022 14:59:28 -
> @@ -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, >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 -   1.136
> +++ rde_update.c  15 Mar 2022 14:59:28 -
> @@ -586,7 +586,7 @@ up_is_eor(struct rde_peer *peer, uint8_t
>   struct prefix *p;
>  
>   p = RB_MIN(prefix_tree, >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;
>  
>  
> 



bgpd mark EoR prefix with a flag field

2022-03-15 Thread Claudio Jeker
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.
 
-- 
: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 -   1.247
+++ rde.h   15 Mar 2022 14:59:27 -
@@ -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;
 #definePREFIX_FLAG_WITHDRAW0x01/* enqueued on withdraw queue */
 #definePREFIX_FLAG_UPDATE  0x02/* enqueued on update queue */
@@ -341,6 +341,7 @@ struct prefix {
 #definePREFIX_FLAG_STALE   0x08/* stale entry (graceful 
reload) */
 #definePREFIX_FLAG_MASK0x0f/* mask for the prefix types */
 #definePREFIX_FLAG_ADJOUT  0x10/* prefix is in the adj-out rib 
*/
+#definePREFIX_FLAG_EOR 0x20/* prefix is EoR */
 #definePREFIX_NEXTHOP_LINKED   0x40/* prefix is linked onto 
nexthop list */
 #definePREFIX_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 -  1.233
+++ rde_rib.c   15 Mar 2022 14:59:28 -
@@ -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, >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.c2 Mar 2022 16:51:43 -   1.136
+++ rde_update.c15 Mar 2022 14:59:28 -
@@ -586,7 +586,7 @@ up_is_eor(struct rde_peer *peer, uint8_t
struct prefix *p;
 
p = RB_MIN(prefix_tree, >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;