On Wed, Jan 18, 2023 at 05:37:37PM +0100, Claudio Jeker wrote:
> On Wed, Jan 18, 2023 at 05:18:58PM +0100, Theo Buehler wrote:
> > On Wed, Jan 18, 2023 at 02:46:19PM +0100, Claudio Jeker wrote:
> > > This is the next step in vstate cleanup.
> > > Since the vstate is now part of struct filterstate use that information
> > > instead of passing an explicit vstate to the various update functions.
> >
> > It took me a moment to understand that rde_filterstate_clean() does not
> > zero the vstate, so the changes in rde_update.c preserve behavior.
> > That's not super intuitive to me, but if that's bound to stay this way,
>
> Uhm, now I'm a bit confused. Where is the vstate used after calling
> rde_filterstate_clean()? I did not spot that issue in rde_update.c
> I think we could zero everyting in the filterstate during clean. Just to
> be sure.
It is super confusing. For example in up_generate_addpath() it starts
with:
rde_filterstate_prep(&state, new);
After this, state.vstate == prefix_roa_vstate(new).
if (rde_filter(rules, peer, prefix_peer(new), &addr,
prefixlen, &state) == ACTION_DENY) {
rde_filterstate_clean(&state);
continue;
}
if (up_enforce_open_policy(peer, &state)) {
rde_filterstate_clean(&state);
continue;
}
/* from here on we know this is an update */
p = prefix_adjout_get(peer, new->path_id_tx, &addr, prefixlen);
up_prep_adjout(peer, &state, addr.aid);
None of the above code touches state.vstate.
prefix_adjout_update(p, peer, &state, &addr,
prefixlen, new->path_id_tx);
and here you dropped the prefix_roa_vstate(new) argument that is now
taken from state, which is correct.
In up_generate_update() I think there's something wrong.
Again, the vstate is copied from new at the start
rde_filterstate_prep(&state, new);
then new may or may not change over the next few lines, and the two
rde_filterstate_clean(&state) before prefix_adjout_update() don't
change state's vstate, and state.vstate may or may not match
prefix_adjout_update(new).