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,

Reply via email to