Commit Graph
22 Commits
Author SHA1 Message Date
世界 08986ad405 Fix address filter matching for inverted legacy DNS rules
Inverted rules whose address filter conditions come from rule sets or
logical rules were rejected during pre-lookup matching, so the lookup was
never sent and the rules never matched; for plain ip rule sets this was a
regression from the rule-set invert fix in 1.12.22. Pre-lookup matching
now tracks whether the result depends on deferred address filter
conditions and defers such rules to the response phase, while results
already determined by evaluated conditions are still decided during
pre-lookup.
2026-08-30 17:41:46 +08:00
世界 b3a45e0839 Add query_client_subnet and query_dnssec DNS rule items and remove_client_subnet DNS route action option 2026-08-30 17:41:45 +08:00
世界 6e09f2892a Add JSON schema support 2026-08-30 17:41:44 +08:00
世界 e09e3b49f9 dns: Add namespace and parallel support for evaluate 2026-08-30 17:41:44 +08:00
世界 510586c4f8 route: simplify rule_set matching semantics
Since b0c6762bc, every rule inside a referenced rule-set was evaluated
as if merged into the outer rule, which required tracking per-branch
group states and let outer rules and rule-set rules satisfy each
other's grouped conditions in both directions.

Restrict merging to the only designed case: a rule-set containing
exactly one non-inverted default rule is merged into the outer rule as
before. Any other rule-set now matches as an ordinary condition of the
outer rule: it matches when any of its rules matches on its own, and
its rules no longer exchange grouped match state with the outer rule
in either direction. Multiple referenced rule-sets keep OR semantics.

Flat address rule-sets such as generated geosite/geoip sets contain a
single default rule, so their behavior is unchanged. The group-state
set machinery is replaced by a single required/satisfied mask pair.

Also update the route and DNS rule docs.
2026-08-30 17:41:44 +08:00
世界 14b8f1bd4d dns: Add preferred_by rule item 2026-08-30 17:41:40 +08:00
世界 bc6f9703e3 Add package_name_regex route, DNS and headless rule item 2026-08-30 17:41:39 +08:00
世界 d72c1d9be7 Un-deprecate ip_accept_any DNS rule item 2026-08-30 17:41:39 +08:00
nekohasekai cd77e78f0a Add evaluate DNS rule action and related rule items 2026-08-30 17:41:39 +08:00
世界 57c62b5330 Add MAC and hostname rule items 2026-08-30 17:41:38 +08:00
世界 d454aa0fdf route: formalize nested rule_set group-state semantics
Before 795d1c289, nested rule-set evaluation reused the parent rule
match cache. In practice, this meant these fields leaked across nested
evaluation:

- SourceAddressMatch
- SourcePortMatch
- DestinationAddressMatch
- DestinationPortMatch
- DidMatch

That leak had two opposite effects.

First, it made included rule-sets partially behave like the docs'
"merged" semantics. For example, if an outer route rule had:

  rule_set = ["geosite-additional-!cn"]
  ip_cidr  = 104.26.10.0/24

and the inline rule-set matched `domain_suffix = speedtest.net`, the
inner match could set `DestinationAddressMatch = true` and the outer
rule would then pass its destination-address group check. This is why
some `rule_set + ip_cidr` combinations used to work.

But the same leak also polluted sibling rules and sibling rule-sets.
A branch could partially match one group, then fail later, and still
leave that group cache set for the next branch. This broke cases such
as gh-3485: with `rule_set = [test1, test2]`, `test1` could touch
destination-address cache before an AdGuard `@@` exclusion made the
whole branch fail, and `test2` would then run against dirty state.

795d1c289 fixed that by cloning metadata for nested rule-set/rule
evaluation and resetting the rule match cache for each branch. That
stopped sibling pollution, but it also removed the only mechanism by
which a successful nested branch could affect the parent rule's grouped
matching state.

As a result, nested rule-sets became pure boolean sub-items against the
outer rule. The previous example stopped working: the inner
`domain_suffix = speedtest.net` still matched, but the outer rule no
longer observed any destination-address-group success, so it fell
through to `final`.

This change makes the semantics explicit instead of relying on cache
side effects:

- `rule_set: ["a", "b"]` is OR
- rules inside one rule-set are OR
- each nested branch is evaluated in isolation
- failed branches contribute no grouped match state
- a successful branch contributes its grouped match state back to the
  parent rule
- grouped state from different rule-sets must not be combined together
  to satisfy one outer rule

In other words, rule-sets now behave as "OR branches whose successful
group matches merge into the outer rule", which matches the documented
intent without reintroducing cross-branch cache leakage.
2026-03-24 15:03:43 +08:00
世界 8ae93a98e5 Remove overdue deprecated features 2026-03-01 12:30:43 +08:00
世界 65264afdf9 Add interface address rule items 2026-01-17 05:44:26 +08:00
世界 988ac62a1b refactor: Outbound domain resolver 2025-07-08 13:12:14 +08:00
世界 3016338e34 refactor: DNS 2025-07-08 13:12:14 +08:00
世界 d8b2d5142f Fix panic on some stupid input 2025-04-25 16:03:58 +08:00
世界 9db9484863 Refactor multi networks strategy 2025-01-13 15:14:30 +08:00
世界 05ea0ca00e Add network_[type/is_expensive/is_constrained] rule items 2025-01-13 15:14:29 +08:00
世界 9afe75586a refactor: Extract services form router 2025-01-13 15:14:29 +08:00
世界 a1be455202 refactor: Modular network manager 2025-01-13 15:14:29 +08:00
世界 4fe40fcee0 Remove unused reject methods 2025-01-13 15:14:29 +08:00
世界 8304295c48 Crazy sekai overturns the small pond 2025-01-13 15:14:29 +08:00