<feed xmlns='http://www.w3.org/2005/Atom'>
<title>qosify, branch master</title>
<subtitle>OpenWrt QoS implementation based one eBPF + CAKE</subtitle>
<id>https://git.openwrt.org/project/qosify/atom?h=master</id>
<link rel='self' href='https://git.openwrt.org/project/qosify/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/qosify/'/>
<updated>2026-06-22T11:49:55Z</updated>
<entry>
<title>qosify: expose default traffic classes in statistics</title>
<updated>2026-06-22T11:49:55Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-06-22T11:49:55Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/qosify/commit/?id=beeb87ec1f16aaf5d99ff8060c2455971d9d400e'/>
<id>urn:sha1:beeb87ec1f16aaf5d99ff8060c2455971d9d400e</id>
<content type='text'>
Report the TCP and UDP default class counters, the class map entries
past the configured classes, as separate tcp_default and udp_default
entries in the classes statistics table, so default and best-effort
traffic is visible alongside the named classes.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>qosify: count all traffic in per-DSCP statistics</title>
<updated>2026-06-22T11:49:49Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-06-22T11:49:49Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/qosify/commit/?id=44ce40f8e083edb649a51a698d3631d5a186c713'/>
<id>urn:sha1:44ce40f8e083edb649a51a698d3631d5a186c713</id>
<content type='text'>
The per-DSCP accounting ran at the end of classify(), but traffic
mapped to a class without the PRESENT flag, notably the best-effort
TCP/UDP port defaults, returned early from dscp_lookup_class() and
never reached it. The bulk of traffic was therefore left uncounted.

Account every IP packet on exit, keyed on the DSCP value actually
present in the packet as it leaves the classifier, and count the
default port classes in their class map entries. Marking behaviour is
unchanged: the default and unclassified paths still pass the packet
without rewriting its DSCP field. Shared counters are incremented
atomically to avoid lost updates across CPUs.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>qosify-bpf: remove unused variable in classify()</title>
<updated>2026-06-22T11:44:19Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-06-22T11:44:19Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/qosify/commit/?id=c49e72a4a45d3166bf637f65fefc1de312f69c27'/>
<id>urn:sha1:c49e72a4a45d3166bf637f65fefc1de312f69c27</id>
<content type='text'>
Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>qosify: account for GSO segment count in packet statistics</title>
<updated>2026-06-19T10:24:28Z</updated>
<author>
<name>John Crispin</name>
</author>
<published>2026-06-18T10:09:51Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/qosify/commit/?id=e57b3404634136e1a4f0236780410e74d2076160'/>
<id>urn:sha1:e57b3404634136e1a4f0236780410e74d2076160</id>
<content type='text'>
A GSO/GRO super-packet is a single skb but represents skb-&gt;gso_segs
packets on the wire. Count it as such in the traffic class, per-DSCP and
per-DNS-pattern packet counters instead of incrementing by one per skb,
matching the segment accounting already done by the flow bulk/prio
checks. Byte counters keep using skb-&gt;len, which is already the
aggregate length.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>qosify: report eBPF map entry count and last reload time</title>
<updated>2026-06-19T10:24:28Z</updated>
<author>
<name>John Crispin</name>
</author>
<published>2026-06-18T08:39:13Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/qosify/commit/?id=6b4be193a6ddfc27c577004c4ff3b0b928d579a4'/>
<id>urn:sha1:6b4be193a6ddfc27c577004c4ff3b0b928d579a4</id>
<content type='text'>
Expose the combined number of active IPv4 and IPv6 map entries and the
wall-clock time of the last map reload as top-level fields in the
get_stats reply. last_reload_time is initialised at startup so it
reflects the initial load until the first explicit reload.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>qosify: track per-DNS-pattern traffic statistics</title>
<updated>2026-06-19T10:24:28Z</updated>
<author>
<name>John Crispin</name>
</author>
<published>2026-06-18T08:38:32Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/qosify/commit/?id=cece4e23a9df07baf6a42ed881bd73f1b13fa1f5'/>
<id>urn:sha1:cece4e23a9df07baf6a42ed881bd73f1b13fa1f5</id>
<content type='text'>
Assign a stable 32-bit pattern id to every DNS map entry and tag the IP
map entries it resolves with that id. Account packets and bytes per
pattern id in a dedicated per-CPU stats map, so the cost scales with the
number of DNS patterns rather than the number of resolved IP addresses.

User space owns the lifecycle of the stats entries: it creates the entry
when a pattern id is assigned and removes it when the pattern is freed,
while the eBPF classifier only updates entries that already exist. The
map is the source of truth and persists across IP entry timeouts; user
space reports the per-pattern hit count and the summed per-CPU
packet/byte totals via the "dns" table in get_stats, and a reset
explicitly zeroes the counters.

The cname cache carries the pattern id alongside the cached dscp so that
attributions inherited through a cname chain are preserved on cache hits;
since pattern ids are never reused, a stale cached id can at most lose an
attribution, never misattribute it.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>dns: track cname cache hit/miss statistics</title>
<updated>2026-06-18T08:49:38Z</updated>
<author>
<name>John Crispin</name>
</author>
<published>2026-06-18T08:35:57Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/qosify/commit/?id=181a691407eed55ed129e8db4a9e677446e0c35e'/>
<id>urn:sha1:181a691407eed55ed129e8db4a9e677446e0c35e</id>
<content type='text'>
Count lookups served from the cname cache, lookups that miss it and the
current number of cached entries, and report them via the "dns_cache"
table in the get_stats reply.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>qosify: add per-DSCP traffic statistics</title>
<updated>2026-06-18T08:49:38Z</updated>
<author>
<name>John Crispin</name>
</author>
<published>2026-06-18T08:34:58Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/qosify/commit/?id=fe8491da8daff6fd40326d902e1b5879f6b795d6'/>
<id>urn:sha1:fe8491da8daff6fd40326d902e1b5879f6b795d6</id>
<content type='text'>
Add a dscp_stats BPF array map indexed by the final DSCP value and
account every classified packet there. Expose the per-codepoint packet
and byte counters via the "dscp" table in the get_stats reply.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>qosify: group traffic class stats under a "classes" table</title>
<updated>2026-06-18T08:49:35Z</updated>
<author>
<name>John Crispin</name>
</author>
<published>2026-06-18T08:49:35Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/qosify/commit/?id=0edbc51af3b67e923e3f6505b370ab51d21514c5'/>
<id>urn:sha1:0edbc51af3b67e923e3f6505b370ab51d21514c5</id>
<content type='text'>
Wrap the per-class statistics in a "classes" table in the get_stats
reply so that the upcoming dns, dscp and dns_cache statistic groups and
the top-level scalar fields can be added as unambiguous siblings.

Note: this changes the get_stats reply layout. The per-class tables,
previously emitted at the top level, now live under "classes".

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>qosify: account for bytes in traffic class statistics</title>
<updated>2026-06-18T08:49:35Z</updated>
<author>
<name>John Crispin</name>
</author>
<published>2026-06-18T08:49:35Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/qosify/commit/?id=d26cc573f36c3005bc433a8516903a9a6bba6c3d'/>
<id>urn:sha1:d26cc573f36c3005bc433a8516903a9a6bba6c3d</id>
<content type='text'>
Extend the per-class statistics with a byte counter next to the existing
packet counter.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
</feed>
