This diff switches rib_get and rib_add to work on struct pt_entry pointers and introduces rib_get_addr() which works like rib_get before. I want to use rib_get and rib_add in the flowspec code.
Long term I want to push struct pt_entry further out and closer to the NLRI handling in the input path but this is enough to get me unlocked for now. -- :wq Claudio Index: rde.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v retrieving revision 1.599 diff -u -p -r1.599 rde.c --- rde.c 3 Apr 2023 10:48:00 -0000 1.599 +++ rde.c 7 Apr 2023 10:38:03 -0000 @@ -1734,7 +1734,7 @@ pathid_assign(struct rde_peer *peer, uin return peer->path_id_tx; /* peer uses add-path, therefore new path_ids need to be assigned */ - re = rib_get(rib_byid(RIB_ADJ_IN), prefix, prefixlen); + re = rib_get_addr(rib_byid(RIB_ADJ_IN), prefix, prefixlen); if (re != NULL) { struct prefix *p; @@ -3052,14 +3052,15 @@ rde_dump_ctx_new(struct ctl_show_rib_req if (req->flags & F_SHORTER) { for (plen = 0; plen <= req->prefixlen; plen++) { - re = rib_get(rib_byid(rid), &req->prefix, plen); + re = rib_get_addr(rib_byid(rid), &req->prefix, + plen); rde_dump_upcall(re, ctx); } } else if (req->prefixlen == hostplen) { re = rib_match(rib_byid(rid), &req->prefix); rde_dump_upcall(re, ctx); } else { - re = rib_get(rib_byid(rid), &req->prefix, + re = rib_get_addr(rib_byid(rid), &req->prefix, req->prefixlen); rde_dump_upcall(re, ctx); } Index: rde.h =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v retrieving revision 1.290 diff -u -p -r1.290 rde.h --- rde.h 30 Mar 2023 12:11:18 -0000 1.290 +++ rde.h 7 Apr 2023 10:37:17 -0000 @@ -548,7 +548,8 @@ struct rib *rib_byid(uint16_t); uint16_t rib_find(char *); void rib_free(struct rib *); void rib_shutdown(void); -struct rib_entry *rib_get(struct rib *, struct bgpd_addr *, int); +struct rib_entry *rib_get(struct rib *, struct pt_entry *); +struct rib_entry *rib_get_addr(struct rib *, struct bgpd_addr *, int); struct rib_entry *rib_match(struct rib *, struct bgpd_addr *); int rib_dump_pending(void); void rib_dump_runner(void); Index: rde_rib.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rde_rib.c,v retrieving revision 1.257 diff -u -p -r1.257 rde_rib.c --- rde_rib.c 29 Mar 2023 10:46:11 -0000 1.257 +++ rde_rib.c 7 Apr 2023 10:40:21 -0000 @@ -38,7 +38,7 @@ uint16_t rib_size; struct rib **ribs; -struct rib_entry *rib_add(struct rib *, struct bgpd_addr *, int); +struct rib_entry *rib_add(struct rib *, struct pt_entry *); static inline int rib_compare(const struct rib_entry *, const struct rib_entry *); void rib_remove(struct rib_entry *); @@ -297,12 +297,12 @@ rib_shutdown(void) } struct rib_entry * -rib_get(struct rib *rib, struct bgpd_addr *prefix, int prefixlen) +rib_get(struct rib *rib, struct pt_entry *pte) { struct rib_entry xre, *re; memset(&xre, 0, sizeof(xre)); - xre.prefix = pt_fill(prefix, prefixlen); + xre.prefix = pte; re = RB_FIND(rib_tree, rib_tree(rib), &xre); if (re && re->rib_id != rib->id) @@ -312,6 +312,12 @@ rib_get(struct rib *rib, struct bgpd_add } struct rib_entry * +rib_get_addr(struct rib *rib, struct bgpd_addr *prefix, int prefixlen) +{ + return rib_get(rib, pt_fill(prefix, prefixlen)); +} + +struct rib_entry * rib_match(struct rib *rib, struct bgpd_addr *addr) { struct rib_entry *re; @@ -321,7 +327,7 @@ rib_match(struct rib *rib, struct bgpd_a case AID_INET: case AID_VPN_IPv4: for (i = 32; i >= 0; i--) { - re = rib_get(rib, addr, i); + re = rib_get_addr(rib, addr, i); if (re != NULL) return (re); } @@ -329,7 +335,7 @@ rib_match(struct rib *rib, struct bgpd_a case AID_INET6: case AID_VPN_IPv6: for (i = 128; i >= 0; i--) { - re = rib_get(rib, addr, i); + re = rib_get_addr(rib, addr, i); if (re != NULL) return (re); } @@ -342,15 +348,10 @@ rib_match(struct rib *rib, struct bgpd_a struct rib_entry * -rib_add(struct rib *rib, struct bgpd_addr *prefix, int prefixlen) +rib_add(struct rib *rib, struct pt_entry *pte) { - struct pt_entry *pte; struct rib_entry *re; - pte = pt_get(prefix, prefixlen); - if (pte == NULL) - pte = pt_add(prefix, prefixlen); - if ((re = calloc(1, sizeof(*re))) == NULL) fatal("rib_add"); @@ -861,7 +862,7 @@ prefix_get(struct rib *rib, struct rde_p { struct rib_entry *re; - re = rib_get(rib, prefix, prefixlen); + re = rib_get_addr(rib, prefix, prefixlen); if (re == NULL) return (NULL); return (prefix_bypeer(re, peer, path_id)); @@ -1024,12 +1025,16 @@ prefix_add(struct bgpd_addr *prefix, int struct rde_aspath *asp, struct rde_community *comm, struct nexthop *nexthop, uint8_t nhflags, uint8_t vstate) { + struct pt_entry *pte; struct prefix *p; struct rib_entry *re; - re = rib_get(rib, prefix, prefixlen); + pte = pt_get(prefix, prefixlen); + if (pte == NULL) + pte = pt_add(prefix, prefixlen); + re = rib_get(rib, pte); if (re == NULL) - re = rib_add(rib, prefix, prefixlen); + re = rib_add(rib, pte); p = prefix_alloc(); prefix_link(p, re, re->prefix, peer, path_id, path_id_tx, asp, comm,