Hi!

It may be a fix/safeguard for a reload prolem I discussed with rmind@ and christos@ in May 2017:

To quote my analysis:
OK, I got the time to dig into it and found the cause.

Silly me has (now had) a configuration like this:

group "a" on if1 {
  ruleset "blacklistd"
  ...
}

group default {
  ruleset "blacklistd"
  ...
}

This leads to two group entries in the rs_dynamic list refencing the same named 
dynamic ruleset.
Dynamic rulesets are matched by name in a first found basis.
rs_dynamic[0] has the ruleset reference for the default group (last entry in 
the config file).
rs_dynamic[1] has the rulesat reference for the interface specific group
When reloading oldconfig->rs_dynamic[0] will be re-parented correctly to the new first 
group referencing the rule name "blacklistd".
For the second new interface specific group the old first group is looked up as 
parent (first match of old group list). That's when
the KASSERT fires as these dynamic rules have already been re-parented to the 
new configuration.

This also explains why I see no effect of the dynamic rules. dynamic rules are 
added by name and thus to the first matching entry. This is the ruleset 
reference from the default group - bummer: one name but two instances.

So we have a semantic issue here - following questions arise:
    1) can groups only reference unique dynamic ruleset names? This needs to be 
enforced then.
    2) If dynamic rulesets are to be shared then the parent notion needs to be 
reworked/redesigned.

Best regards,
Frank

Looks like solition 1) was choosen for now.

Seems you just didn't trip over the underlying issue. I have not closely followed NPF lately so I don't know the actual fix status of NPF. As in the example above I also had the idea of re-using dynamic rulesets - maybe this can be implemented as I still think it is useful. For now my workaround was to have several rulesets, but this is just good enough to work with blacklistd.

Frank

On 03/07/18 05:46, Geoff Wing wrote:
Hi,
npf previously had no issues using a "ruleset" in multiple groups, however
it now has a problem and fails with

        npfctl: (re)load failed: some table has a duplicate entry?

The following is a minimal npf.conf to illustrate with it failing due to
the second ``ruleset "blacklistd"'' causing the issue:
-----
        $if1_if = inet4(vmx0)
        $if2_if = inet4(vmx1)

        alg "icmp"

        group "foo" on $if1_if {
                ruleset "blacklistd"
        }
        group "bar" on $if2_if {
                ruleset "blacklistd"
        }

        group default {
                pass final on lo0 all
                block all
        }
-----

I haven't investigated further yet.  Ring any bells with anyone?

System is amd64 -current.

Regards,
Geoff

Reply via email to