There is no reason anymore for this double wrapping of structs.
Remove it to make the code simpler.
OK?
--
:wq Claudio
Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.485
diff -u -p -r1.485 rde.c
--- rde.c 13 Aug 2019 12:16:20 -0000 1.485
+++ rde.c 14 Aug 2019 07:05:47 -0000
@@ -794,12 +794,12 @@ rde_dispatch_imsg_parent(struct imsgbuf
} else if (rib->flags == rn.flags &&
rib->rtableid == rn.rtableid) {
/* no change to rib apart from filters */
- rib_desc(rib)->state = RECONF_KEEP;
+ rib->state = RECONF_KEEP;
} else {
/* reload rib because somehing changed */
rib->flags_tmp = rn.flags;
rib->rtableid_tmp = rn.rtableid;
- rib_desc(rib)->state = RECONF_RELOAD;
+ rib->state = RECONF_RELOAD;
}
break;
case IMSG_RECONF_FILTER:
@@ -848,14 +848,14 @@ rde_dispatch_imsg_parent(struct imsgbuf
}
r->peer.ribid = rib->id;
if (r->dir == DIR_IN) {
- nr = rib_desc(rib)->in_rules_tmp;
+ nr = rib->in_rules_tmp;
if (nr == NULL) {
nr = calloc(1,
sizeof(struct filter_head));
if (nr == NULL)
fatal(NULL);
TAILQ_INIT(nr);
- rib_desc(rib)->in_rules_tmp = nr;
+ rib->in_rules_tmp = nr;
}
TAILQ_INSERT_TAIL(nr, r, entry);
} else
@@ -1412,7 +1412,7 @@ rde_update_update(struct rde_peer *peer,
aspath_origin(in->aspath.aspath));
/* add original path to the Adj-RIB-In */
- if (prefix_update(&ribs[RIB_ADJ_IN].rib, peer, in, prefix, prefixlen,
+ if (prefix_update(&ribs[RIB_ADJ_IN], peer, in, prefix, prefixlen,
vstate) == 1)
peer->prefix_cnt++;
@@ -1440,9 +1440,9 @@ rde_update_update(struct rde_peer *peer,
rde_update_log("update", i, peer,
&state.nexthop->exit_nexthop, prefix,
prefixlen);
- prefix_update(&ribs[i].rib, peer, &state, prefix,
+ prefix_update(&ribs[i], peer, &state, prefix,
prefixlen, vstate);
- } else if (prefix_withdraw(&ribs[i].rib, peer, prefix,
+ } else if (prefix_withdraw(&ribs[i], peer, prefix,
prefixlen)) {
rde_update_log(wmsg, i, peer,
NULL, prefix, prefixlen);
@@ -1463,13 +1463,13 @@ rde_update_withdraw(struct rde_peer *pee
for (i = RIB_LOC_START; i < rib_size; i++) {
if (!rib_valid(i))
continue;
- if (prefix_withdraw(&ribs[i].rib, peer, prefix, prefixlen))
+ if (prefix_withdraw(&ribs[i], peer, prefix, prefixlen))
rde_update_log("withdraw", i, peer, NULL, prefix,
prefixlen);
}
/* remove original path form the Adj-RIB-In */
- if (prefix_withdraw(&ribs[RIB_ADJ_IN].rib, peer, prefix, prefixlen))
+ if (prefix_withdraw(&ribs[RIB_ADJ_IN], peer, prefix, prefixlen))
peer->prefix_cnt--;
peer->prefix_rcvd_withdraw++;
@@ -3126,10 +3126,10 @@ rde_reload_done(void)
switch (ribs[rid].state) {
case RECONF_DELETE:
- rib_free(&ribs[rid].rib);
+ rib_free(&ribs[rid]);
break;
case RECONF_RELOAD:
- rib_update(&ribs[rid].rib);
+ rib_update(&ribs[rid]);
ribs[rid].state = RECONF_KEEP;
/* FALLTHROUGH */
case RECONF_KEEP:
@@ -3251,7 +3251,7 @@ rde_softreconfig_in_done(void *arg, u_in
static void
rde_softreconfig_out_done(void *arg, u_int8_t aid)
{
- struct rib_desc *rib = arg;
+ struct rib *rib = arg;
/* this RIB dump is done */
log_info("softreconfig out done for %s", rib->name);
@@ -3281,7 +3281,7 @@ static void
rde_softreconfig_in(struct rib_entry *re, void *bula)
{
struct filterstate state;
- struct rib_desc *rib;
+ struct rib *rib;
struct prefix *p;
struct pt_entry *pt;
struct rde_peer *peer;
@@ -3328,11 +3328,11 @@ rde_softreconfig_in(struct rib_entry *re
if (action == ACTION_ALLOW) {
/* update Local-RIB */
- prefix_update(&rib->rib, peer, &state, &prefix,
+ prefix_update(rib, peer, &state, &prefix,
pt->prefixlen, p->validation_state);
} else if (action == ACTION_DENY) {
/* remove from Local-RIB */
- prefix_withdraw(&rib->rib, peer, &prefix,
+ prefix_withdraw(rib, peer, &prefix,
pt->prefixlen);
}
@@ -3362,9 +3362,9 @@ rde_softreconfig_sync_reeval(struct rib_
{
struct prefix_list prefixes;
struct prefix *p, *next;
- struct rib_desc *rd = arg;
+ struct rib *rib = arg;
- if (rd->rib.flags & F_RIB_NOEVALUATE) {
+ if (rib->flags & F_RIB_NOEVALUATE) {
/*
* evaluation process is turned off
* so remove all prefixes from adj-rib-out
@@ -3375,7 +3375,7 @@ rde_softreconfig_sync_reeval(struct rib_
nexthop_unlink(p);
}
if (re->active) {
- rde_generate_updates(re_rib(re), NULL, re->active);
+ rde_generate_updates(rib, NULL, re->active);
re->active = NULL;
}
return;
@@ -3405,14 +3405,14 @@ rde_softreconfig_sync_fib(struct rib_ent
static void
rde_softreconfig_sync_done(void *arg, u_int8_t aid)
{
- struct rib_desc *rd = arg;
+ struct rib *rib = arg;
/* this RIB dump is done */
- if (rd->fibstate == RECONF_RELOAD)
- log_info("fib sync done for %s", rd->name);
+ if (rib->fibstate == RECONF_RELOAD)
+ log_info("fib sync done for %s", rib->name);
else
- log_info("re-evaluation done for %s", rd->name);
- rd->fibstate = RECONF_NONE;
+ log_info("re-evaluation done for %s", rib->name);
+ rib->fibstate = RECONF_NONE;
/* check if other dumps are still running */
if (--softreconfig == 0)
@@ -3726,7 +3726,7 @@ peer_flush_upcall(struct rib_entry *re,
for (i = RIB_LOC_START; i < rib_size; i++) {
if (!rib_valid(i))
continue;
- rp = prefix_get(&ribs[i].rib, peer, &addr, prefixlen);
+ rp = prefix_get(&ribs[i], peer, &addr, prefixlen);
if (rp) {
asp = prefix_aspath(rp);
if (asp->pftableid)
@@ -3963,7 +3963,7 @@ network_add(struct network_config *nc, s
vstate = rde_roa_validity(&conf->rde_roa, &nc->prefix,
nc->prefixlen, aspath_origin(state->aspath.aspath));
- if (prefix_update(&ribs[RIB_ADJ_IN].rib, peerself, state, &nc->prefix,
+ if (prefix_update(&ribs[RIB_ADJ_IN], peerself, state, &nc->prefix,
nc->prefixlen, vstate) == 1)
peerself->prefix_cnt++;
for (i = RIB_LOC_START; i < rib_size; i++) {
@@ -3972,7 +3972,7 @@ network_add(struct network_config *nc, s
rde_update_log("announce", i, peerself,
state->nexthop ? &state->nexthop->exit_nexthop : NULL,
&nc->prefix, nc->prefixlen);
- prefix_update(&ribs[i].rib, peerself, state, &nc->prefix,
+ prefix_update(&ribs[i], peerself, state, &nc->prefix,
nc->prefixlen, vstate);
}
filterset_free(&nc->attrset);
@@ -4033,12 +4033,12 @@ network_delete(struct network_config *nc
for (i = RIB_LOC_START; i < rib_size; i++) {
if (!rib_valid(i))
continue;
- if (prefix_withdraw(&ribs[i].rib, peerself, &nc->prefix,
+ if (prefix_withdraw(&ribs[i], peerself, &nc->prefix,
nc->prefixlen))
rde_update_log("withdraw announce", i, peerself,
NULL, &nc->prefix, nc->prefixlen);
}
- if (prefix_withdraw(&ribs[RIB_ADJ_IN].rib, peerself, &nc->prefix,
+ if (prefix_withdraw(&ribs[RIB_ADJ_IN], peerself, &nc->prefix,
nc->prefixlen))
peerself->prefix_cnt--;
}
@@ -4099,7 +4099,7 @@ network_flush_upcall(struct rib_entry *r
for (i = RIB_LOC_START; i < rib_size; i++) {
if (!rib_valid(i))
continue;
- rp = prefix_get(&ribs[i].rib, peer, &addr, prefixlen);
+ rp = prefix_get(&ribs[i], peer, &addr, prefixlen);
if (rp) {
prefix_destroy(rp);
rde_update_log("flush announce", i, peer,
Index: rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v
retrieving revision 1.224
diff -u -p -r1.224 rde.h
--- rde.h 13 Aug 2019 12:16:20 -0000 1.224
+++ rde.h 14 Aug 2019 07:00:12 -0000
@@ -51,25 +51,21 @@ struct rib_entry {
struct rib {
struct rib_tree tree;
+ char name[PEER_DESCR_LEN];
+ struct filter_head *in_rules;
+ struct filter_head *in_rules_tmp;
u_int rtableid;
u_int rtableid_tmp;
u_int16_t flags;
u_int16_t flags_tmp;
u_int16_t id;
+ enum reconf_action state, fibstate;
};
#define RIB_ADJ_IN 0
#define RIB_LOC_START 1
#define RIB_NOTFOUND 0xffff
-struct rib_desc {
- char name[PEER_DESCR_LEN];
- struct rib rib;
- struct filter_head *in_rules;
- struct filter_head *in_rules_tmp;
- enum reconf_action state, fibstate;
-};
-
/*
* How do we identify peers between the session handler and the rde?
* Currently I assume that we can do that with the neighbor_ip...
@@ -507,13 +503,12 @@ pt_unref(struct pt_entry *pt)
/* rde_rib.c */
extern u_int16_t rib_size;
-extern struct rib_desc *ribs;
+extern struct rib *ribs;
struct rib *rib_new(char *, u_int, u_int16_t);
void rib_update(struct rib *);
struct rib *rib_byid(u_int16_t);
u_int16_t rib_find(char *);
-struct rib_desc *rib_desc(struct rib *);
void rib_free(struct rib *);
void rib_shutdown(void);
struct rib_entry *rib_get(struct rib *, struct bgpd_addr *, int);
Index: rde_rib.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_rib.c,v
retrieving revision 1.204
diff -u -p -r1.204 rde_rib.c
--- rde_rib.c 9 Aug 2019 14:12:21 -0000 1.204
+++ rde_rib.c 14 Aug 2019 07:10:15 -0000
@@ -37,7 +37,7 @@
* This is achieved by heavily linking the different parts together.
*/
u_int16_t rib_size;
-struct rib_desc *ribs;
+struct rib *ribs;
struct rib_entry *rib_add(struct rib *, struct bgpd_addr *, int);
static inline int rib_compare(const struct rib_entry *,
@@ -136,8 +136,8 @@ rib_compare(const struct rib_entry *a, c
struct rib *
rib_new(char *name, u_int rtableid, u_int16_t flags)
{
- struct rib_desc *xribs;
- u_int16_t id;
+ struct rib *xribs;
+ u_int16_t id;
for (id = 0; id < rib_size; id++) {
if (!rib_valid(id))
@@ -146,7 +146,7 @@ rib_new(char *name, u_int rtableid, u_in
if (id >= rib_size) {
if ((xribs = reallocarray(ribs, id + 1,
- sizeof(struct rib_desc))) == NULL) {
+ sizeof(struct rib))) == NULL) {
/* XXX this is not clever */
fatal(NULL);
}
@@ -154,13 +154,13 @@ rib_new(char *name, u_int rtableid, u_in
rib_size = id + 1;
}
- memset(&ribs[id], 0, sizeof(struct rib_desc));
+ memset(&ribs[id], 0, sizeof(struct rib));
strlcpy(ribs[id].name, name, sizeof(ribs[id].name));
- RB_INIT(rib_tree(&ribs[id].rib));
+ RB_INIT(rib_tree(&ribs[id]));
ribs[id].state = RECONF_REINIT;
- ribs[id].rib.id = id;
- ribs[id].rib.flags = flags;
- ribs[id].rib.rtableid = rtableid;
+ ribs[id].id = id;
+ ribs[id].flags = flags;
+ ribs[id].rtableid = rtableid;
ribs[id].in_rules = calloc(1, sizeof(struct filter_head));
if (ribs[id].in_rules == NULL)
@@ -168,7 +168,7 @@ rib_new(char *name, u_int rtableid, u_in
TAILQ_INIT(ribs[id].in_rules);
log_debug("%s: %s -> %u", __func__, name, id);
- return (&ribs[id].rib);
+ return (&ribs[id]);
}
/*
@@ -181,8 +181,6 @@ rib_new(char *name, u_int rtableid, u_in
void
rib_update(struct rib *rib)
{
- struct rib_desc *rd = rib_desc(rib);
-
/* flush fib first if there was one */
if ((rib->flags & (F_RIB_NOFIB | F_RIB_NOEVALUATE)) == 0)
rde_send_kroute_flush(rib);
@@ -190,22 +188,22 @@ rib_update(struct rib *rib)
/* if no evaluate changes then a full reinit is needed */
if ((rib->flags & F_RIB_NOEVALUATE) !=
(rib->flags_tmp & F_RIB_NOEVALUATE))
- rd->fibstate = RECONF_REINIT;
+ rib->fibstate = RECONF_REINIT;
rib->flags = rib->flags_tmp;
rib->rtableid = rib->rtableid_tmp;
/* reload fib if there is no reinit pending and there will be a fib */
- if (rd->fibstate != RECONF_REINIT &&
+ if (rib->fibstate != RECONF_REINIT &&
(rib->flags & (F_RIB_NOFIB | F_RIB_NOEVALUATE)) == 0)
- rd->fibstate = RECONF_RELOAD;
+ rib->fibstate = RECONF_RELOAD;
}
struct rib *
rib_byid(u_int16_t rid)
{
if (rib_valid(rid))
- return &ribs[rid].rib;
+ return &ribs[rid];
return NULL;
}
@@ -226,16 +224,9 @@ rib_find(char *name)
return RIB_NOTFOUND;
}
-struct rib_desc *
-rib_desc(struct rib *rib)
-{
- return (&ribs[rib->id]);
-}
-
void
rib_free(struct rib *rib)
{
- struct rib_desc *rd = rib_desc(rib);
struct rib_entry *re, *xre;
struct prefix *p;
@@ -273,9 +264,9 @@ rib_free(struct rib *rib)
}
if (rib->id <= RIB_LOC_START)
return; /* never remove the default ribs */
- filterlist_free(rd->in_rules_tmp);
- filterlist_free(rd->in_rules);
- memset(rd, 0, sizeof(struct rib_desc));
+ filterlist_free(rib->in_rules_tmp);
+ filterlist_free(rib->in_rules);
+ memset(rib, 0, sizeof(struct rib));
}
void
@@ -286,17 +277,16 @@ rib_shutdown(void)
for (id = 0; id < rib_size; id++) {
if (!rib_valid(id))
continue;
- if (!RB_EMPTY(rib_tree(&ribs[id].rib))) {
+ if (!RB_EMPTY(rib_tree(&ribs[id]))) {
log_warnx("%s: rib %s is not empty", __func__,
ribs[id].name);
}
- rib_free(&ribs[id].rib);
+ rib_free(&ribs[id]);
}
for (id = 0; id <= RIB_LOC_START; id++) {
- struct rib_desc *rd = &ribs[id];
- filterlist_free(rd->in_rules_tmp);
- filterlist_free(rd->in_rules);
- memset(rd, 0, sizeof(struct rib_desc));
+ filterlist_free(ribs[id].in_rules_tmp);
+ filterlist_free(ribs[id].in_rules);
+ memset(&ribs[id], 0, sizeof(struct rib));
}
free(ribs);
}