Introduce rde_filterstate_init() and rde_filterstate_copy() for the cases
where either the filterstate needs to be initalized or copied from an
other filterstate. Also switch rde_filterstate_prep() to take a struct
prefix as argument since this is the case for all other call sites.
I think the result is much neater code.

-- 
:wq Claudio

Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.584
diff -u -p -r1.584 rde.c
--- rde.c       11 Jan 2023 17:10:25 -0000      1.584
+++ rde.c       11 Jan 2023 17:28:55 -0000
@@ -462,8 +462,7 @@ rde_dispatch_imsg_session(struct imsgbuf
                        }
                        memcpy(&netconf_s, imsg.data, sizeof(netconf_s));
                        TAILQ_INIT(&netconf_s.attrset);
-                       rde_filterstate_prep(&netconf_state, NULL, NULL, NULL,
-                           0, 0);
+                       rde_filterstate_init(&netconf_state);
                        asp = &netconf_state.aspath;
                        asp->aspath = aspath_get(NULL, 0);
                        asp->origin = ORIGIN_IGP;
@@ -802,7 +801,7 @@ rde_dispatch_imsg_parent(struct imsgbuf 
                case IMSG_NETWORK_DONE:
                        TAILQ_CONCAT(&netconf_p.attrset, &parent_set, entry);
 
-                       rde_filterstate_prep(&state, NULL, NULL, NULL, 0, 0);
+                       rde_filterstate_init(&state);
                        asp = &state.aspath;
                        asp->aspath = aspath_get(NULL, 0);
                        asp->origin = ORIGIN_IGP;
@@ -1235,7 +1234,7 @@ rde_update_dispatch(struct rde_peer *pee
        }
 
        memset(&mpa, 0, sizeof(mpa));
-       rde_filterstate_prep(&state, NULL, NULL, NULL, 0, 0);
+       rde_filterstate_init(&state);
        if (attrpath_len != 0) { /* 0 = no NLRI information in this message */
                /* parse path attributes */
                while (len > 0) {
@@ -1696,8 +1695,7 @@ rde_update_update(struct rde_peer *peer,
                struct rib *rib = rib_byid(i);
                if (rib == NULL)
                        continue;
-               rde_filterstate_prep(&state, &in->aspath, &in->communities,
-                   in->nexthop, in->nhflags, in->vstate);
+               rde_filterstate_copy(&state, in);
                /* input filter */
                action = rde_filter(rib->in_rules, peer, peer, prefix,
                    prefixlen, &state);
@@ -3774,9 +3772,7 @@ rde_softreconfig_in(struct rib_entry *re
                        if (rib->state != RECONF_RELOAD)
                                continue;
 
-                       rde_filterstate_prep(&state, asp, prefix_communities(p),
-                           prefix_nexthop(p), prefix_nhflags(p),
-                           prefix_roa_vstate(p));
+                       rde_filterstate_prep(&state, p);
                        action = rde_filter(rib->in_rules, peer, peer, &prefix,
                            pt->prefixlen, &state);
 
@@ -3915,9 +3911,7 @@ rde_roa_softreload(struct rib_entry *re,
                        if (rib == NULL)
                                continue;
 
-                       rde_filterstate_prep(&state, asp, prefix_communities(p),
-                           prefix_nexthop(p), prefix_nhflags(p),
-                           prefix_roa_vstate(p));
+                       rde_filterstate_prep(&state, p);
                        action = rde_filter(rib->in_rules, peer, peer, &prefix,
                            pt->prefixlen, &state);
 
Index: rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v
retrieving revision 1.277
diff -u -p -r1.277 rde.h
--- rde.h       11 Jan 2023 17:10:26 -0000      1.277
+++ rde.h       11 Jan 2023 17:28:55 -0000
@@ -533,8 +533,9 @@ void                 prefix_evaluate_nexthop(struct pr
 /* rde_filter.c */
 void   rde_apply_set(struct filter_set_head *, struct rde_peer *,
            struct rde_peer *, struct filterstate *, uint8_t);
-void   rde_filterstate_prep(struct filterstate *, struct rde_aspath *,
-           struct rde_community *, struct nexthop *, uint8_t, uint8_t);
+void   rde_filterstate_init(struct filterstate *);
+void   rde_filterstate_prep(struct filterstate *, struct prefix *);
+void   rde_filterstate_copy(struct filterstate *, struct filterstate *);
 void   rde_filterstate_clean(struct filterstate *);
 int    rde_filter_equal(struct filter_head *, struct filter_head *,
            struct rde_peer *);
Index: rde_filter.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_filter.c,v
retrieving revision 1.130
diff -u -p -r1.130 rde_filter.c
--- rde_filter.c        11 Jan 2023 17:10:26 -0000      1.130
+++ rde_filter.c        11 Jan 2023 17:28:55 -0000
@@ -426,13 +426,19 @@ rde_filter_equal(struct filter_head *a, 
 }
 
 void
-rde_filterstate_prep(struct filterstate *state, struct rde_aspath *asp,
+rde_filterstate_init(struct filterstate *state)
+{
+       memset(state, 0, sizeof(*state));
+       path_prep(&state->aspath);
+}
+
+static void
+rde_filterstate_set(struct filterstate *state, struct rde_aspath *asp,
     struct rde_community *communities, struct nexthop *nh, uint8_t nhflags,
     uint8_t vstate)
 {
-       memset(state, 0, sizeof(*state));
+       rde_filterstate_init(state);
 
-       path_prep(&state->aspath);
        if (asp)
                path_copy(&state->aspath, asp);
        if (communities)
@@ -440,6 +446,20 @@ rde_filterstate_prep(struct filterstate 
        state->nexthop = nexthop_ref(nh);
        state->nhflags = nhflags;
        state->vstate = vstate;
+}
+
+void
+rde_filterstate_prep(struct filterstate *state, struct prefix *p)
+{
+       rde_filterstate_set(state, prefix_aspath(p), prefix_communities(p),
+           prefix_nexthop(p), prefix_nhflags(p), prefix_roa_vstate(p));
+}
+
+void
+rde_filterstate_copy(struct filterstate *state, struct filterstate *src)
+{
+       rde_filterstate_set(state, &src->aspath, &src->communities,
+           src->nexthop, src->nhflags, src->vstate);
 }
 
 void
Index: rde_update.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_update.c,v
retrieving revision 1.150
diff -u -p -r1.150 rde_update.c
--- rde_update.c        11 Jan 2023 17:10:26 -0000      1.150
+++ rde_update.c        11 Jan 2023 17:28:55 -0000
@@ -176,9 +176,7 @@ up_generate_updates(struct filter_head *
                    !(peer->flags & PEERFLAG_EVALUATE_ALL))
                        break;
 
-               rde_filterstate_prep(&state, prefix_aspath(new),
-                   prefix_communities(new), prefix_nexthop(new),
-                   prefix_nhflags(new), prefix_roa_vstate(new));
+               rde_filterstate_prep(&state, new);
                if (rde_filter(rules, peer, prefix_peer(new), &addr,
                    prefixlen, &state) == ACTION_DENY) {
                        rde_filterstate_clean(&state);
@@ -318,9 +316,7 @@ up_generate_addpath(struct filter_head *
                if (!up_test_update(peer, new))
                        continue;
 
-               rde_filterstate_prep(&state, prefix_aspath(new),
-                   prefix_communities(new), prefix_nexthop(new),
-                   prefix_nhflags(new), prefix_roa_vstate(new));
+               rde_filterstate_prep(&state, new);
                if (rde_filter(rules, peer, prefix_peer(new), &addr,
                    prefixlen, &state) == ACTION_DENY) {
                        rde_filterstate_clean(&state);
@@ -428,9 +424,7 @@ up_generate_addpath_all(struct filter_he
                if (!up_test_update(peer, new))
                        continue;
 
-               rde_filterstate_prep(&state, prefix_aspath(new),
-                   prefix_communities(new), prefix_nexthop(new),
-                   prefix_nhflags(new), prefix_roa_vstate(new));
+               rde_filterstate_prep(&state, new);
                if (rde_filter(rules, peer, prefix_peer(new), &addr,
                    prefixlen, &state) == ACTION_DENY) {
                        rde_filterstate_clean(&state);
@@ -488,7 +482,7 @@ up_generate_default(struct filter_head *
        if (peer->capa.mp[aid] == 0)
                return;
 
-       rde_filterstate_prep(&state, NULL, NULL, NULL, 0, ROA_NOTFOUND);
+       rde_filterstate_init(&state);
        asp = &state.aspath;
        asp->aspath = aspath_get(NULL, 0);
        asp->origin = ORIGIN_IGP;
@@ -1033,8 +1027,7 @@ up_dump_attrnlri(u_char *buf, int len, s
        if (p == NULL)
                goto done;
 
-       rde_filterstate_prep(&state, prefix_aspath(p), prefix_communities(p),
-           prefix_nexthop(p), prefix_nhflags(p), prefix_roa_vstate(p));
+       rde_filterstate_prep(&state, p);
 
        r = up_generate_attr(buf + 2, len - 2, peer, &state, AID_INET);
        rde_filterstate_clean(&state);
@@ -1172,8 +1165,7 @@ up_dump_mp_reach(u_char *buf, int len, s
 
        wpos = 4;       /* reserve space for length fields */
 
-       rde_filterstate_prep(&state, prefix_aspath(p), prefix_communities(p),
-           prefix_nexthop(p), prefix_nhflags(p), prefix_roa_vstate(p));
+       rde_filterstate_prep(&state, p);
 
        /* write regular path attributes */
        r = up_generate_attr(buf + wpos, len - wpos, peer, &state, aid);

Reply via email to