<feed xmlns='http://www.w3.org/2005/Atom'>
<title>packages/net/shunt, branch master</title>
<subtitle>Mirror of packages feed</subtitle>
<id>https://git.openwrt.org/feed/packages/atom?h=master</id>
<link rel='self' href='https://git.openwrt.org/feed/packages/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/feed/packages/'/>
<updated>2026-10-30T20:52:39Z</updated>
<entry>
<title>shunt: tproxy improvements &amp; fixes</title>
<updated>2026-10-30T20:52:39Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-10-30T20:52:39Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/feed/packages/commit/?id=63f96e57d5f4b8b152b170171dfc8f60529714c2'/>
<id>urn:sha1:63f96e57d5f4b8b152b170171dfc8f60529714c2</id>
<content type='text'>
- report br_netfilter under a tproxy policy
- skip IPv6 routes and rules on a kernel without IPv6
- report unknown section types
- count kernel routes per family in the rpcd status
- correct the rtnl return value note in rt.uc

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: pad learned element timeouts against the TTL edge</title>
<updated>2026-10-14T18:00:41Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-10-14T18:00:41Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/feed/packages/commit/?id=7a0fb450b1670d7e60de7b29908562fab775dc7b'/>
<id>urn:sha1:7a0fb450b1670d7e60de7b29908562fab775dc7b</id>
<content type='text'>
A client asks again when the TTL of an answer runs out, and the write
for the new answer reaches the kernel up to one write interval later.
With the element timed out to the second it is missing for exactly
that gap, and a connection opened in it starts on the normal uplink
and keeps that path for its lifetime.

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: update to 0.2.0</title>
<updated>2026-10-14T08:17:10Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-10-14T08:16:51Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/feed/packages/commit/?id=46160c1f5cca1dd80a7415e63cb9a65e92e103c0'/>
<id>urn:sha1:46160c1f5cca1dd80a7415e63cb9a65e92e103c0</id>
<content type='text'>
- new client selector src_dev: everything arriving on an ingress
  device, in both address families - a whole guest network or VLAN,
  independent of a changing IPv6 prefix; prerouting only, like src_mac
- new destination selector dst_file: address and prefix lists from a
  file, read like domain_file and refilled atomically by
  `shunt refresh`; domain_file.uc becomes list_file.uc for both kinds
- dport/proto alone now select traffic as documented, instead of
  rejecting the policy as "selects nothing"
- a policy whose dst entries are all unusable is skipped instead of
  being widened to every destination of its clients
- client and static destination sets use auto-merge, so overlapping
  prefixes no longer fail the whole ruleset with "conflicting
  intervals"
- update the README

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: update to 0.1.12</title>
<updated>2026-10-11T18:43:56Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-10-11T18:43:31Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/feed/packages/commit/?id=8384d21802fc5686002f56962b8a4919d4626054'/>
<id>urn:sha1:8384d21802fc5686002f56962b8a4919d4626054</id>
<content type='text'>
- fallback 'block' now rejects instead of dropping, so clients fail
  at once rather than on a timeout
- tproxy: a proxied flow whose listener is gone is rejected the same
  way, whatever the fallback
- route: the policy table's fallback default is a prohibit route
  instead of a blackhole
- update the README

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: ignore unspecified netifd nexthop</title>
<updated>2026-10-06T19:49:15Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-10-06T19:48:35Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/feed/packages/commit/?id=24d2074662472662eb3a540b535b0cab8f7d7460'/>
<id>urn:sha1:24d2074662472662eb3a540b535b0cab8f7d7460</id>
<content type='text'>
netifd always emits a nexthop for its routes, the unspecified address
for a gateway-less one, e.g. wg0 with route_allowed_ips. Taken as
gateway, IPv4 treats 0.0.0.0 as none, but the kernel rejects "via ::"
with EINVAL, so the IPv6 policy route was never installed and marked
traffic fell through to main, where the interface metrics decided
(IPv6 leak via WAN).

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: fix rpcd status call</title>
<updated>2026-10-05T19:19:59Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-10-05T19:19:59Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/feed/packages/commit/?id=cdcbc11db8a4c187087ca79358d752824d72f14a'/>
<id>urn:sha1:cdcbc11db8a4c187087ca79358d752824d72f14a</id>
<content type='text'>
* define tproxy_available() before render(): ucode resolves the name
  when render() is compiled, so the later definition left it null and
  every status call failed - LuCI showed "no answer from the backend"

Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: update to 0.1.11</title>
<updated>2026-10-05T18:35:54Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-10-05T18:35:54Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/feed/packages/commit/?id=fa452167642442bd96f29fc7d21b01aee4c0e9e1'/>
<id>urn:sha1:fa452167642442bd96f29fc7d21b01aee4c0e9e1</id>
<content type='text'>
* add the per-policy action 'tproxy': hands the selected tcp/udp traffic
  to a transparent proxy on the router (option tproxy_port), delivered to
  127.0.0.1/::1 via a 'local default dev lo' policy table
* restore rules for tproxy flows carry the tproxy statement on every
  packet - a mark alone loses udp flows to the proxy's reply socket
* a proxied flow whose listener is gone is always dropped: its conntrack
  entry was never NATed and would leave with the client's own address;
  fallback 'main'/'block' decides about new flows only
* no tproxy rules in output (the kernel rejects the statement there), no
  keep_local rule for tproxy (main would forward socket-assigned packets)
* tproxy policies are skipped as an issue without kmod-nft-tproxy instead
  of failing the whole nft batch
* shunt check and the rpcd status report tproxy policies
* readme update

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: update 0.1.10</title>
<updated>2026-09-18T14:06:46Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-09-18T14:06:24Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/feed/packages/commit/?id=6990c0a844c5bdb6afc57f07b3e0bc01d3c56dac'/>
<id>urn:sha1:6990c0a844c5bdb6afc57f07b3e0bc01d3c56dac</id>
<content type='text'>
* snooped elements expire with the TTL of the DNS answer,
  clamped to 60..entry_ttl; entry_ttl is now the ceiling, polled elements still use it
* write cache tracks the expiry it last wrote per element and rewrites
  when the new expiry moves by at least half of the answer's lifetime, in either direction
* a flow's route is decided on its first packet and kept on the conntrack entry:
  route statements set ct mark, one restore rule per policy marks later packets
  of the original direction, settled flows skip the lookups
* LuCI: change the entry_ttl option text
* update the README

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: update to 0.1.8</title>
<updated>2026-09-16T17:29:17Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-09-16T17:28:58Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/feed/packages/commit/?id=93a34793be4416febf6dd835ad3aa97c26b27dd7'/>
<id>urn:sha1:93a34793be4416febf6dd835ad3aa97c26b27dd7</id>
<content type='text'>
- new per-policy `domain_file` list: domain patterns from a file, one
  per line, for community-maintained lists too large for UCI. Entries
  are learned by snoop only, never polled
- a bare name lives under /tmp/shunt (tmpfs, no flash wear), an
  absolute path is taken as given; a missing file is an issue, not a
  fatal error, the policy stays rendered with empty sets
- new `shunt refresh` (ubus method `refresh`): re-reads the files and
  swaps the matcher in place, no restart, learned addresses stay
- matcher: regex fast path, 4x faster on 100k patterns
- routes and rules are written over rtnetlink via ucode-mod-rtnl
  instead of one `ip` process per command; route.uc renders the
  netlink operations, the new src/rt.uc applies them and reads the
  verdict from rtnl.error()
- `rp_filter_manage` writes /proc/sys directly, `nft` is the last
  remaining child process
- `+ip` dropped from DEPENDS
- README update

Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>shunt: readme update</title>
<updated>2026-09-08T09:22:42Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-09-08T09:22:42Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/feed/packages/commit/?id=eb67c64b51f2e00e9f7d319f844c43088dd31328'/>
<id>urn:sha1:eb67c64b51f2e00e9f7d319f844c43088dd31328</id>
<content type='text'>
- readme update regarding wg configuration,
- no version bump

Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
</feed>
