diff options
-rw-r--r-- | .SRCINFO | 12 | ||||
-rw-r--r-- | 950c-add-cake-to-tc.patch | 1654 | ||||
-rw-r--r-- | PKGBUILD | 29 |
3 files changed, 19 insertions, 1676 deletions
@@ -1,8 +1,8 @@ pkgbase = iproute2-cake pkgdesc = IP Routing Utilities - pkgver = 4.15.0 - pkgrel = 3 - url = https://git.kernel.org/pub/scm/network/iproute2/iproute2.git + pkgver = r4214.0407be50 + pkgrel = 1 + url = https://www.github.com/dtaht/tc-adv arch = x86_64 groups = base license = GPL2 @@ -24,15 +24,11 @@ pkgbase = iproute2-cake backup = etc/iproute2/rt_realms backup = etc/iproute2/rt_scopes backup = etc/iproute2/rt_tables - source = https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-4.15.0.tar.xz - source = https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-4.15.0.tar.sign + source = git+https://www.github.com/dtaht/tc-adv source = 0001-make-iproute2-fhs-compliant.patch - source = 950c-add-cake-to-tc.patch validpgpkeys = 9F6FC345B05BE7E766B83C8F80A77F6095CDE47E - md5sums = 0681bf4664b2649ad4e12551a3a7a1f9 md5sums = SKIP md5sums = 5345bd18b521fb2f305acb2ab1203269 - md5sums = a9f986fbe42eb0390f41c94af1672ee2 pkgname = iproute2-cake diff --git a/950c-add-cake-to-tc.patch b/950c-add-cake-to-tc.patch deleted file mode 100644 index de102be6f833..000000000000 --- a/950c-add-cake-to-tc.patch +++ /dev/null @@ -1,1654 +0,0 @@ -diff -rupN a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h ---- a/include/uapi/linux/pkt_sched.h 2018-01-29 11:08:52.000000000 -0500 -+++ b/include/uapi/linux/pkt_sched.h 2018-03-16 10:20:59.011309988 -0400 -@@ -934,4 +934,75 @@ enum { - - #define TCA_CBS_MAX (__TCA_CBS_MAX - 1) - -+/* CAKE */ -+enum { -+ TCA_CAKE_UNSPEC, -+ TCA_CAKE_BASE_RATE, -+ TCA_CAKE_DIFFSERV_MODE, -+ TCA_CAKE_ATM, -+ TCA_CAKE_FLOW_MODE, -+ TCA_CAKE_OVERHEAD, -+ TCA_CAKE_RTT, -+ TCA_CAKE_TARGET, -+ TCA_CAKE_AUTORATE, -+ TCA_CAKE_MEMORY, -+ TCA_CAKE_NAT, -+ TCA_CAKE_RAW, // was _ETHERNET -+ TCA_CAKE_WASH, -+ TCA_CAKE_MPU, -+ TCA_CAKE_INGRESS, -+ TCA_CAKE_ACK_FILTER, -+ __TCA_CAKE_MAX -+}; -+#define TCA_CAKE_MAX (__TCA_CAKE_MAX - 1) -+ -+struct tc_cake_traffic_stats { -+ __u32 packets; -+ __u32 link_ms; -+ __u64 bytes; -+}; -+ -+#define TC_CAKE_MAX_TINS (8) -+struct tc_cake_tin_stats { -+ -+ __u32 threshold_rate; -+ __u32 target_us; -+ struct tc_cake_traffic_stats sent; -+ struct tc_cake_traffic_stats dropped; -+ struct tc_cake_traffic_stats ecn_marked; -+ struct tc_cake_traffic_stats backlog; -+ __u32 interval_us; -+ __u32 way_indirect_hits; -+ __u32 way_misses; -+ __u32 way_collisions; -+ __u32 peak_delay_us; /* ~= bulk flow delay */ -+ __u32 avge_delay_us; -+ __u32 base_delay_us; /* ~= sparse flows delay */ -+ __u16 sparse_flows; -+ __u16 bulk_flows; -+ __u16 unresponse_flows; -+ __u16 spare; -+ __u32 max_skblen; -+ struct tc_cake_traffic_stats ack_drops; -+}; -+ -+struct tc_cake_xstats { -+ __u16 version; -+ __u16 tin_stats_size; /* == sizeof(struct tc_cake_tin_stats) */ -+ __u32 capacity_estimate; -+ __u32 memory_limit; -+ __u32 memory_used; -+ __u8 tin_cnt; -+ __u8 avg_trnoff; -+ __u16 max_trnlen; -+ __u16 max_adjlen; -+ __u16 min_trnlen; -+ __u16 min_adjlen; -+ -+ __u16 spare1; -+ __u32 spare2; -+ -+ struct tc_cake_tin_stats tin_stats[0]; /* keep last */ -+}; -+ - #endif -diff -rupN a/man/man8/tc-cake.8 b/man/man8/tc-cake.8 ---- a/man/man8/tc-cake.8 1969-12-31 19:00:00.000000000 -0500 -+++ b/man/man8/tc-cake.8 2018-03-16 10:21:03.145100055 -0400 -@@ -0,0 +1,678 @@ -+.TH CAKE 8 "23 November 2017" "iproute2" "Linux" -+.SH NAME -+CAKE \- COMMON Applications Kept Enhanced (CAKE) -+.SH SYNOPSIS -+.B tc qdisc ... cake -+.br -+[ -+.BR bandwidth -+RATE | -+.BR unlimited* -+| -+.BR autorate_ingress -+] -+.br -+[ -+.BR rtt -+TIME | -+.BR datacentre -+| -+.BR lan -+| -+.BR metro -+| -+.BR regional -+| -+.BR internet* -+| -+.BR oceanic -+| -+.BR satellite -+| -+.BR interplanetary -+] -+.br -+[ -+.BR besteffort -+| -+.BR diffserv8 -+| -+.BR diffserv4 -+| -+.BR diffserv-llt -+| -+.BR diffserv3* -+] -+.br -+[ -+.BR flowblind -+| -+.BR srchost -+| -+.BR dsthost -+| -+.BR hosts -+| -+.BR flows -+| -+.BR dual-srchost -+| -+.BR dual-dsthost -+| -+.BR triple-isolate* -+] -+.br -+[ -+.BR nat -+| -+.BR nonat* -+] -+.br -+[ -+.BR wash -+| -+.BR nowash* -+] -+.br -+[ -+.BR ack-filter -+| -+.BR ack-filter-aggressive -+| -+.BR no-ack-filter* -+] -+.br -+[ -+.BR memlimit -+LIMIT ] -+.br -+[ -+.BR ptm -+| -+.BR atm -+| -+.BR noatm* -+] -+.br -+[ -+.BR overhead -+N | -+.BR conservative -+| -+.BR raw* -+] -+.br -+[ -+.BR mpu -+N ] -+.br -+[ -+.BR ingress -+| -+.BR egress* -+] -+.br -+(* marks defaults) -+ -+ -+.SH DESCRIPTION -+CAKE (Common Applications Kept Enhanced) is a shaping-capable queue discipline -+which uses both AQM and FQ. It combines COBALT, which is an AQM algorithm -+combining Codel and BLUE, a shaper which operates in deficit mode, and a variant -+of DRR++ for flow isolation. 8-way set-associative hashing is used to virtually -+eliminate hash collisions. Priority queuing is available through a simplified -+diffserv implementation. Overhead compensation for various encapsulation -+schemes is tightly integrated. -+ -+All settings are optional; the default settings are chosen to be sensible in -+most common deployments. Most people will only need to set the -+.B bandwidth -+parameter to get useful results, but reading the -+.B Overhead Compensation -+and -+.B Round Trip Time -+sections is strongly encouraged. -+ -+.SH SHAPER PARAMETERS -+CAKE uses a deficit-mode shaper, which does not exhibit the initial burst -+typical of token-bucket shapers. It will automatically burst precisely as much -+as required to maintain the configured throughput. As such, it is very -+straightforward to configure. -+.PP -+.B unlimited -+(default) -+.br -+ No limit on the bandwidth. -+.PP -+.B bandwidth -+RATE -+.br -+ Set the shaper bandwidth. See -+.BR tc(8) -+or examples below for details of the RATE value. -+.PP -+.B autorate_ingress -+.br -+ Automatic capacity estimation based on traffic arriving at this qdisc. -+This is most likely to be useful with cellular links, which tend to change -+quality randomly. A -+.B bandwidth -+parameter can be used in conjunction to specify an initial estimate. The shaper -+will periodically be set to a bandwidth slightly below the estimated rate. This -+estimator cannot estimate the bandwidth of links downstream of itself. -+ -+.SH OVERHEAD COMPENSATION PARAMETERS -+The size of each packet on the wire may differ from that seen by Linux. The -+following parameters allow CAKE to compensate for this difference by internally -+considering each packet to be bigger than Linux informs it. To assist users who -+are not expert network engineers, keywords have been provided to represent a -+number of common link technologies. -+ -+.SS Manual Overhead Specification -+.B overhead -+BYTES -+.br -+ Adds BYTES to the size of each packet. BYTES may be negative; values -+between -64 and 256 (inclusive) are accepted. -+.PP -+.B mpu -+BYTES -+.br -+ Rounds each packet (including overhead) up to a minimum length -+BYTES. BYTES may not be negative; values between 0 and 256 (inclusive) -+are accepted. -+.PP -+.B atm -+.br -+ Compensates for ATM cell framing, which is normally found on ADSL links. -+This is performed after the -+.B overhead -+parameter above. ATM uses fixed 53-byte cells, each of which can carry 48 bytes -+payload. -+.PP -+.B ptm -+.br -+ Compensates for PTM encoding, which is normally found on VDSL2 links and -+uses a 64b/65b encoding scheme. It is even more efficient to simply -+derate the specified shaper bandwidth by a factor of 64/65 or 0.984. See -+ITU G.992.3 Annex N and IEEE 802.3 Section 61.3 for details. -+.PP -+.B noatm -+.br -+ Disables ATM and PTM compensation. -+ -+.SS Failsafe Overhead Keywords -+These two keywords are provided for quick-and-dirty setup. Use them if you -+can't be bothered to read the rest of this section. -+.PP -+.B raw -+(default) -+.br -+ Turns off all overhead compensation in CAKE. The packet size reported -+by Linux will be used directly. -+.PP -+ Other overhead keywords may be added after "raw". The effect of this is -+to make the overhead compensation operate relative to the reported packet size, -+not the underlying IP packet size. -+.PP -+.B conservative -+.br -+ Compensates for more overhead than is likely to occur on any -+widely-deployed link technology. -+.br -+ Equivalent to -+.B overhead 48 atm. -+ -+.SS ADSL Overhead Keywords -+Most ADSL modems have a way to check which framing scheme is in use. Often this -+is also specified in the settings document provided by the ISP. The keywords in -+this section are intended to correspond with these sources of information. All -+of them implicitly set the -+.B atm -+flag. -+.PP -+.B pppoa-vcmux -+.br -+ Equivalent to -+.B overhead 10 atm -+.PP -+.B pppoa-llc -+.br -+ Equivalent to -+.B overhead 14 atm -+.PP -+.B pppoe-vcmux -+.br -+ Equivalent to -+.B overhead 32 atm -+.PP -+.B pppoe-llcsnap -+.br -+ Equivalent to -+.B overhead 40 atm -+.PP -+.B bridged-vcmux -+.br -+ Equivalent to -+.B overhead 24 atm -+.PP -+.B bridged-llcsnap -+.br -+ Equivalent to -+.B overhead 32 atm -+.PP -+.B ipoa-vcmux -+.br -+ Equivalent to -+.B overhead 8 atm -+.PP -+.B ipoa-llcsnap -+.br -+ Equivalent to -+.B overhead 16 atm -+.PP -+See also the Ethernet Correction Factors section below. -+ -+.SS VDSL2 Overhead Keywords -+ATM was dropped from VDSL2 in favour of PTM, which is a much more -+straightforward framing scheme. Some ISPs retained PPPoE for compatibility with -+their existing back-end systems. -+.PP -+.B pppoe-ptm -+.br -+ Equivalent to -+.B overhead 30 ptm -+ -+.br -+ PPPoE: 2B PPP + 6B PPPoE + -+.br -+ ETHERNET: 6B dest MAC + 6B src MAC + 2B ethertype + 4B Frame Check Sequence + -+.br -+ PTM: 1B Start of Frame (S) + 1B End of Frame (Ck) + 2B TC-CRC (PTM-FCS) -+.br -+.PP -+.B bridged-ptm -+.br -+ Equivalent to -+.B overhead 22 ptm -+.br -+ ETHERNET: 6B dest MAC + 6B src MAC + 2B ethertype + 4B Frame Check Sequence + -+.br -+ PTM: 1B Start of Frame (S) + 1B End of Frame (Ck) + 2B TC-CRC (PTM-FCS) -+.br -+.PP -+See also the Ethernet Correction Factors section below. -+ -+.SS DOCSIS Cable Overhead Keyword -+DOCSIS is the universal standard for providing Internet service over cable-TV -+infrastructure. -+ -+In this case, the actual on-wire overhead is less important than the packet size -+the head-end equipment uses for shaping and metering. This is specified to be -+an Ethernet frame including the CRC (aka FCS). -+.PP -+.B docsis -+.br -+ Equivalent to -+.B overhead 18 mpu 64 noatm -+ -+.SS Ethernet Overhead Keywords -+.PP -+.B ethernet -+.br -+ Accounts for Ethernet's preamble, inter-frame gap, and Frame Check -+Sequence. Use this keyword when the bottleneck being shaped for is an -+actual Ethernet cable. -+.br -+ Equivalent to -+.B overhead 38 mpu 84 noatm -+.PP -+.B ether-vlan -+.br -+ Adds 4 bytes to the overhead compensation, accounting for an IEEE 802.1Q -+VLAN header appended to the Ethernet frame header. NB: Some ISPs use one or -+even two of these within PPPoE; this keyword may be repeated as necessary to -+express this. -+ -+.SH ROUND TRIP TIME PARAMETERS -+Active Queue Management (AQM) consists of embedding congestion signals in the -+packet flow, which receivers use to instruct senders to slow down when the queue -+is persistently occupied. CAKE uses ECN signalling when available, and packet -+drops otherwise, according to a combination of the Codel and BLUE AQM algorithms -+called COBALT. -+ -+Very short latencies require a very rapid AQM response to adequately control -+latency. However, such a rapid response tends to impair throughput when the -+actual RTT is relatively long. CAKE allows specifying the RTT it assumes for -+tuning various parameters. Actual RTTs within an order of magnitude of this -+will generally work well for both throughput and latency management. -+ -+At the 'lan' setting and below, the time constants are similar in magnitude to -+the jitter in the Linux kernel itself, so congestion might be signalled -+prematurely. The flows will then become sparse and total throughput reduced, -+leaving little or no back-pressure for the fairness logic to work against. Use -+the "metro" setting for local lans unless you have a custom kernel. -+.PP -+.B rtt -+TIME -+.br -+ Manually specify an RTT. -+.PP -+.B datacentre -+.br -+ For extremely high-performance 10GigE+ networks only. Equivalent to -+.B rtt 100us. -+.PP -+.B lan -+.br -+ For pure Ethernet (not Wi-Fi) networks, at home or in the office. Don't -+use this when shaping for an Internet access link. Equivalent to -+.B rtt 1ms. -+.PP -+.B metro -+.br -+ For traffic mostly within a single city. Equivalent to -+.B rtt 10ms. -+.PP -+.B regional -+.br -+ For traffic mostly within a European-sized country. Equivalent to -+.B rtt 30ms. -+.PP -+.B internet -+(default) -+.br -+ This is suitable for most Internet traffic. Equivalent to -+.B rtt 100ms. -+.PP -+.B oceanic -+.br -+ For Internet traffic with generally above-average latency, such as that -+suffered by Australasian residents. Equivalent to -+.B rtt 300ms. -+.PP -+.B satellite -+.br -+ For traffic via geostationary satellites. Equivalent to -+.B rtt 1000ms. -+.PP -+.B interplanetary -+.br -+ So named because Jupiter is about 1 light-hour from Earth. Use this to -+(almost) completely disable AQM actions. Equivalent to -+.B rtt 3600s. -+ -+.SH FLOW ISOLATION PARAMETERS -+With flow isolation enabled, CAKE places packets from different flows into -+different queues, each of which carries its own AQM state. Packets from each -+queue are then delivered fairly, according to a DRR++ algorithm which minimises -+latency for "sparse" flows. CAKE uses a set-associative hashing algorithm to -+minimise flow collisions. -+ -+These keywords specify whether fairness based on source address, destination -+address, individual flows, or any combination of those is desired. -+.PP -+.B flowblind -+.br -+ Disables flow isolation; all traffic passes through a single queue for -+each tin. -+.PP -+.B srchost -+.br -+ Flows are defined only by source address. Could be useful on the egress -+path of an ISP backhaul. -+.PP -+.B dsthost -+.br -+ Flows are defined only by destination address. Could be useful on the -+ingress path of an ISP backhaul. -+.PP -+.B hosts -+.br -+ Flows are defined by source-destination host pairs. This is host -+isolation, rather than flow isolation. -+.PP -+.B flows -+.br -+ Flows are defined by the entire 5-tuple of source address, destination -+address, transport protocol, source port and destination port. This is the type -+of flow isolation performed by SFQ and fq_codel. -+.PP -+.B dual-srchost -+.br -+ Flows are defined by the 5-tuple, and fairness is applied first over -+source addresses, then over individual flows. Good for use on egress traffic -+from a LAN to the internet, where it'll prevent any one LAN host from -+monopolising the uplink, regardless of the number of flows they use. -+.PP -+.B dual-dsthost -+.br -+ Flows are defined by the 5-tuple, and fairness is applied first over -+destination addresses, then over individual flows. Good for use on ingress -+traffic to a LAN from the internet, where it'll prevent any one LAN host from -+monopolising the downlink, regardless of the number of flows they use. -+.PP -+.B triple-isolate -+(default) -+.br -+ Flows are defined by the 5-tuple, and fairness is applied over source -+*and* destination addresses intelligently (ie. not merely by host-pairs), and -+also over individual flows. Use this if you're not certain whether to use -+dual-srchost or dual-dsthost; it'll do both jobs at once, preventing any one -+host on *either* side of the link from monopolising it with a large number of -+flows. -+.PP -+.B nat -+.br -+ Instructs Cake to perform a NAT lookup before applying flow-isolation -+rules, to determine the true addresses and port numbers of the packet, to -+improve fairness between hosts "inside" the NAT. This has no practical effect -+in "flowblind" or "flows" modes, or if NAT is performed on a different host. -+.PP -+.B nonat -+(default) -+.br -+ Cake will not perform a NAT lookup. Flow isolation will be performed -+using the addresses and port numbers directly visible to the interface Cake is -+attached to. -+ -+.SH PRIORITY QUEUE PARAMETERS -+CAKE can divide traffic into "tins" based on the Diffserv field. Each tin has -+its own independent set of flow-isolation queues, and is serviced based on a WRR -+algorithm. To avoid perverse Diffserv marking incentives, tin weights have a -+"priority sharing" value when bandwidth used by that tin is below a threshold, -+and a lower "bandwidth sharing" value when above. Bandwidth is compared against -+the threshold using the same algorithm as the deficit-mode shaper. -+ -+Detailed customisation of tin parameters is not provided. The following presets -+perform all necessary tuning, relative to the current shaper bandwidth and RTT -+settings. -+.PP -+.B besteffort -+.br -+ Disables priority queuing by placing all traffic in one tin. -+.PP -+.B precedence -+.br -+ Enables legacy interpretation of TOS "Precedence" field. Use of this -+preset on the modern Internet is firmly discouraged. -+.PP -+.B diffserv-llt -+.br -+ Provides a "Latency-Loss Tradeoff" implementation with five tins: -+.br -+ Low Loss (TOS1, TOS2), 100% threshold, increased Codel target. -+.br -+ Best Effort (general), 100% threshold, normal Codel target & interval. -+.br -+ Low Latency (TOS4, TOS5, VA, EF), 100% threshold, reduced Codel interval. -+.br -+ Bulk (CS1), 6.25% threshold, normal Codel target & interval. -+.br -+ Net Control (CS6, CS7), 6.25% threshold, increased Codel target & interval. -+.PP -+.B diffserv4 -+.br -+ Provides a general-purpose Diffserv implementation with four tins: -+.br -+ Bulk (CS1), 6.25% threshold, generally low priority. -+.br -+ Best Effort (general), 100% threshold. -+.br -+ Video (AF4x, AF3x, CS3, AF2x, CS2, TOS4, TOS1), 50% threshold. -+.br -+ Voice (CS7, CS6, EF, VA, CS5, CS4), 25% threshold. -+.PP -+.B diffserv3 -+(default) -+.br -+ Provides a simple, general-purpose Diffserv implementation with three tins: -+.br -+ Bulk (CS1), 6.25% threshold, generally low priority. -+.br -+ Best Effort (general), 100% threshold. -+.br -+ Voice (CS7, CS6, EF, VA, TOS4), 25% threshold, reduced Codel interval. -+ -+.SH OTHER PARAMETERS -+.B memlimit -+LIMIT -+.br -+ Limit the memory consumed by Cake to LIMIT bytes. Note that this does -+not translate directly to queue size (so do not size this based on bandwidth -+delay product considerations, but rather on worst case acceptable memory -+consumption), as there is some overhead in the data structures containing the -+packets, especially for small packets. -+ -+ By default, the limit is calculated based on the bandwidth and RTT -+settings. -+ -+.PP -+.B wash -+ -+.br -+ Traffic entering your diffserv domain is frequently mis-marked in -+transit from the perspective of your network, and traffic exiting yours may be -+mis-marked from the perspective of the transiting provider. -+ -+Apply the wash option to clear all extra diffserv (but not ECN bits), after -+priority queuing has taken place. -+ -+If you are shaping inbound, and cannot trust the diffserv markings (as is the -+case for Comcast Cable, among others), it is best to use a single queue -+"besteffort" mode with wash. -+ -+.SH EXAMPLES -+# tc qdisc delete root dev eth0 -+.br -+# tc qdisc add root dev eth0 cake bandwidth 9500Kbit pppoe-ptm ether-vlan -+.br -+# tc -s qdisc show dev eth0 -+.br -+qdisc cake 8007: root refcnt 6 bandwidth 9500Kbit diffserv3 triple-isolate rtt 100.0ms ptm overhead 34 via-ethernet total_overhead 34 hard_header_len 14 -+ Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) -+ backlog 0b 0p requeues 0 -+ memory used: 0b of 4Mb -+ capacity estimate: 9500Kbit -+.br -+ Bulk Best Effort Voice -+.br -+ thresh 593744bit 9500Kbit 2375Kbit -+.br -+ target 30.6ms 5.0ms 7.6ms -+.br -+ interval 125.6ms 100.0ms 102.6ms -+.br -+ pk_delay 0us 0us 0us -+.br -+ av_delay 0us 0us 0us -+.br -+ sp_delay 0us 0us 0us -+.br -+ pkts 0 0 0 -+.br -+ bytes 0 0 0 -+.br -+ way_inds 0 0 0 -+.br -+ way_miss 0 0 0 -+.br -+ way_cols 0 0 0 -+.br -+ drops 0 0 0 -+.br -+ marks 0 0 0 -+.br -+ ack_drop 0 0 0 -+.br -+ sp_flows 0 0 0 -+.br -+ bk_flows 0 0 0 -+.br -+ un_flows 0 0 0 -+.br -+ max_len 0 0 0 -+.br -+ -+After some use: -+.br -+# tc -s qdisc show dev eth0 -+ -+qdisc cake 8007: root refcnt 6 bandwidth 9500Kbit diffserv3 triple-isolate rtt 100.0ms ptm overhead 34 via-ethernet total_overhead 34 hard_header_len 14 -+ Sent 110769306 bytes 313857 pkt (dropped 18, overlimits 741791 requeues 0) -+ backlog 0b 0p requeues 0 -+ memory used: 110488b of 4Mb -+ capacity estimate: 9500Kbit -+.br -+ Bulk Best Effort Voice -+.br -+ thresh 593744bit 9500Kbit 2375Kbit -+.br -+ target 30.6ms 5.0ms 7.6ms -+.br -+ interval 125.6ms 100.0ms 102.6ms -+.br -+ pk_delay 16.0ms 545us 15us -+.br -+ av_delay 2.4ms 161us 3us -+.br -+ sp_delay 59us 1us 1us -+.br -+ pkts 32866 195815 85194 -+.br -+ bytes 8132614 69517496 33122156 -+.br -+ way_inds 0 29208 0 -+.br -+ way_miss 7 173 17 -+.br -+ way_cols 0 0 0 -+.br -+ drops 10 7 1 -+.br -+ marks 217 692 300 -+.br -+ ack_drop 0 0 0 -+.br -+ sp_flows 0 0 0 -+.br -+ bk_flows 0 0 1 -+.br -+ un_flows 0 0 0 -+.br -+ max_len 3028 3012 3028 -+.br -+ -+.SH SEE ALSO -+.BR tc (8), -+.BR tc-codel (8), -+.BR tc-fq_codel (8), -+.BR tc-red (8) -+ -+.SH AUTHORS -+Cake's principal author is Jonathan Morton, with contributions from -+Tony Ambardar, Kevin Darbyshire-Bryant, Toke Høiland-Jørgensen, -+Sebastian Moeller, Ryan Mounce, Dean Scarff, Nils Andreas Svee, and Dave Täht. -+ -+This manual page was written by Loganaden Velvindron. Please report corrections -+to the Linux Networking mailing list <netdev@vger.kernel.org>. -diff -rupN a/tc/Makefile b/tc/Makefile ---- a/tc/Makefile 2018-01-29 11:08:52.000000000 -0500 -+++ b/tc/Makefile 2018-03-16 10:20:59.011309988 -0400 -@@ -66,6 +66,7 @@ TCMODULES += q_codel.o - TCMODULES += q_fq_codel.o - TCMODULES += q_fq.o - TCMODULES += q_pie.o -+TCMODULES += q_cake.o - TCMODULES += q_hhf.o - TCMODULES += q_clsact.o - TCMODULES += e_bpf.o -diff -rupN a/tc/q_cake.c b/tc/q_cake.c ---- a/tc/q_cake.c 1969-12-31 19:00:00.000000000 -0500 -+++ b/tc/q_cake.c 2018-03-16 10:21:03.148099902 -0400 -@@ -0,0 +1,771 @@ -+/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ -+/* -+ * Common Applications Kept Enhanced -- CAKE -+ * -+ * Copyright (C) 2014-2018 Jonathan Morton <chromatix99@gmail.com> -+ * Copyright (C) 2017-2018 Toke Høiland-Jørgensen <toke@toke.dk> -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions, and the following disclaimer, -+ * without modification. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. The names of the authors may not be used to endorse or promote products -+ * derived from this software without specific prior written permission. -+ * -+ * Alternatively, provided that this notice is retained in full, this -+ * software may be distributed under the terms of the GNU General -+ * Public License ("GPL") version 2, in which case the provisions of the -+ * GPL apply INSTEAD OF those given above. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -+ * DAMAGE. -+ * -+ */ -+ -+#include <stddef.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <syslog.h> -+#include <fcntl.h> -+#include <sys/socket.h> -+#include <netinet/in.h> -+#include <arpa/inet.h> -+#include <string.h> -+#include <inttypes.h> -+ -+#include "utils.h" -+#include "tc_util.h" -+ -+static void explain(void) -+{ -+ fprintf(stderr, -+"Usage: ... cake [ bandwidth RATE | unlimited* | autorate_ingress ]\n" -+" [ rtt TIME | datacentre | lan | metro | regional |\n" -+" internet* | oceanic | satellite | interplanetary ]\n" -+" [ besteffort | diffserv8 | diffserv4 | diffserv-llt |\n" -+" diffserv3* ]\n" -+" [ flowblind | srchost | dsthost | hosts | flows |\n" -+" dual-srchost | dual-dsthost | triple-isolate* ]\n" -+" [ nat | nonat* ]\n" -+" [ wash | nowash* ]\n" -+" [ ack-filter | ack-filter-aggressive | no-ack-filter* ]\n" -+" [ memlimit LIMIT ]\n" -+" [ ptm | atm | noatm* ] [ overhead N | conservative | raw* ]\n" -+" [ mpu N ] [ ingress | egress* ]\n" -+" (* marks defaults)\n"); -+} -+ -+static int cake_parse_opt(struct qdisc_util *qu, int argc, char **argv, -+ struct nlmsghdr *n, const char *dev) -+{ -+ int unlimited = 0; -+ unsigned bandwidth = 0; -+ unsigned interval = 0; -+ unsigned target = 0; -+ unsigned diffserv = 0; -+ unsigned memlimit = 0; -+ int overhead = 0; -+ bool overhead_set = false; -+ bool overhead_override = false; -+ int mpu = 0; -+ int flowmode = -1; -+ int nat = -1; -+ int atm = -1; -+ int autorate = -1; -+ int wash = -1; -+ int ingress = -1; -+ int ack_filter = -1; -+ struct rtattr *tail; -+ -+ while (argc > 0) { -+ if (strcmp(*argv, "bandwidth") == 0) { -+ NEXT_ARG(); -+ if (get_rate(&bandwidth, *argv)) { -+ fprintf(stderr, "Illegal \"bandwidth\"\n"); -+ return -1; -+ } -+ unlimited = 0; -+ autorate = 0; -+ } else if (strcmp(*argv, "unlimited") == 0) { -+ bandwidth = 0; -+ unlimited = 1; -+ autorate = 0; -+ } else if (strcmp(*argv, "autorate_ingress") == 0) { -+ autorate = 1; -+ -+ } else if (strcmp(*argv, "rtt") == 0) { -+ NEXT_ARG(); -+ if (get_time(&interval, *argv)) { -+ fprintf(stderr, "Illegal \"rtt\"\n"); -+ return -1; -+ } -+ target = interval / 20; -+ if(!target) -+ target = 1; -+ } else if (strcmp(*argv, "datacentre") == 0) { -+ interval = 100; -+ target = 5; -+ } else if (strcmp(*argv, "lan") == 0) { -+ interval = 1000; -+ target = 50; -+ } else if (strcmp(*argv, "metro") == 0) { -+ interval = 10000; -+ target = 500; -+ } else if (strcmp(*argv, "regional") == 0) { -+ interval = 30000; -+ target = 1500; -+ } else if (strcmp(*argv, "internet") == 0) { -+ interval = 100000; -+ target = 5000; -+ } else if (strcmp(*argv, "oceanic") == 0) { -+ interval = 300000; -+ target = 15000; -+ } else if (strcmp(*argv, "satellite") == 0) { -+ interval = 1000000; -+ target = 50000; -+ } else if (strcmp(*argv, "interplanetary") == 0) { -+ interval = 1000000000; -+ target = 50000000; -+ -+ } else if (strcmp(*argv, "besteffort") == 0) { -+ diffserv = 1; -+ } else if (strcmp(*argv, "precedence") == 0) { -+ diffserv = 2; -+ } else if (strcmp(*argv, "diffserv8") == 0) { -+ diffserv = 3; -+ } else if (strcmp(*argv, "diffserv4") == 0) { -+ diffserv = 4; -+ } else if (strcmp(*argv, "diffserv") == 0) { -+ diffserv = 4; -+ } else if (strcmp(*argv, "diffserv-llt") == 0) { -+ diffserv = 5; -+ } else if (strcmp(*argv, "diffserv3") == 0) { -+ diffserv = 6; -+ -+ } else if (strcmp(*argv, "nowash") == 0) { -+ wash = 0; -+ } else if (strcmp(*argv, "wash") == 0) { -+ wash = 1; -+ -+ } else if (strcmp(*argv, "flowblind") == 0) { -+ flowmode = 0; -+ } else if (strcmp(*argv, "srchost") == 0) { -+ flowmode = 1; -+ } else if (strcmp(*argv, "dsthost") == 0) { -+ flowmode = 2; -+ } else if (strcmp(*argv, "hosts") == 0) { -+ flowmode = 3; -+ } else if (strcmp(*argv, "flows") == 0) { -+ flowmode = 4; -+ } else if (strcmp(*argv, "dual-srchost") == 0) { -+ flowmode = 5; -+ } else if (strcmp(*argv, "dual-dsthost") == 0) { -+ flowmode = 6; -+ } else if (strcmp(*argv, "triple-isolate") == 0) { -+ flowmode = 7; -+ -+ } else if (strcmp(*argv, "nat") == 0) { -+ nat = 1; -+ } else if (strcmp(*argv, "nonat") == 0) { -+ nat = 0; -+ -+ } else if (strcmp(*argv, "ptm") == 0) { -+ atm = 2; -+ } else if (strcmp(*argv, "atm") == 0) { -+ atm = 1; -+ } else if (strcmp(*argv, "noatm") == 0) { -+ atm = 0; -+ -+ } else if (strcmp(*argv, "raw") == 0) { -+ atm = 0; -+ overhead = 0; -+ overhead_set = true; -+ overhead_override = true; -+ } else if (strcmp(*argv, "conservative") == 0) { -+ /* -+ * Deliberately over-estimate overhead: -+ * one whole ATM cell plus ATM framing. -+ * A safe choice if the actual overhead is unknown. -+ */ -+ atm = 1; -+ overhead = 48; -+ overhead_set = true; -+ -+ /* Various ADSL framing schemes, all over ATM cells */ -+ } else if (strcmp(*argv, "ipoa-vcmux") == 0) { -+ atm = 1; -+ overhead += 8; -+ overhead_set = true; -+ } else if (strcmp(*argv, "ipoa-llcsnap") == 0) { -+ atm = 1; -+ overhead += 16; -+ overhead_set = true; -+ } else if (strcmp(*argv, "bridged-vcmux") == 0) { -+ atm = 1; -+ overhead += 24; -+ overhead_set = true; -+ } else if (strcmp(*argv, "bridged-llcsnap") == 0) { -+ atm = 1; -+ overhead += 32; -+ overhead_set = true; -+ } else if (strcmp(*argv, "pppoa-vcmux") == 0) { -+ atm = 1; -+ overhead += 10; -+ overhead_set = true; -+ } else if (strcmp(*argv, "pppoa-llc") == 0) { -+ atm = 1; -+ overhead += 14; -+ overhead_set = true; -+ } else if (strcmp(*argv, "pppoe-vcmux") == 0) { -+ atm = 1; -+ overhead += 32; -+ overhead_set = true; -+ } else if (strcmp(*argv, "pppoe-llcsnap") == 0) { -+ atm = 1; -+ overhead += 40; -+ overhead_set = true; -+ -+ /* Typical VDSL2 framing schemes, both over PTM */ -+ /* PTM has 64b/65b coding which absorbs some bandwidth */ -+ } else if (strcmp(*argv, "pppoe-ptm") == 0) { -+ /* 2B PPP + 6B PPPoE + 6B dest MAC + 6B src MAC -+ * + 2B ethertype + 4B Frame Check Sequence -+ * + 1B Start of Frame (S) + 1B End of Frame (Ck) -+ * + 2B TC-CRC (PTM-FCS) = 30B -+ */ -+ atm = 2; -+ overhead += 30; -+ overhead_set = true; -+ } else if (strcmp(*argv, "bridged-ptm") == 0) { -+ /* 6B dest MAC + 6B src MAC + 2B ethertype -+ * + 4B Frame Check Sequence -+ * + 1B Start of Frame (S) + 1B End of Frame (Ck) -+ * + 2B TC-CRC (PTM-FCS) = 22B -+ */ -+ atm = 2; -+ overhead += 22; -+ overhead_set = true; -+ -+ } else if (strcmp(*argv, "via-ethernet") == 0) { -+ /* -+ * We used to use this flag to manually compensate for -+ * Linux including the Ethernet header on Ethernet-type -+ * interfaces, but not on IP-type interfaces. -+ * -+ * It is no longer needed, because Cake now adjusts for -+ * that automatically, and is thus ignored. -+ * -+ * It would be deleted entirely, but it appears in the -+ * stats output when the automatic compensation is -+ * active. -+ */ -+ -+ } else if (strcmp(*argv, "ethernet") == 0) { -+ /* ethernet pre-amble & interframe gap & FCS -+ * you may need to add vlan tag */ -+ overhead += 38; -+ overhead_set = true; -+ mpu = 84; -+ -+ /* Additional Ethernet-related overhead used by some ISPs */ -+ } else if (strcmp(*argv, "ether-vlan") == 0) { -+ /* 802.1q VLAN tag - may be repeated */ -+ overhead += 4; -+ overhead_set = true; -+ -+ /* -+ * DOCSIS cable shapers account for Ethernet frame with FCS, -+ * but not interframe gap or preamble. -+ */ -+ } else if (strcmp(*argv, "docsis") == 0) { -+ atm = 0; -+ overhead += 18; -+ overhead_set = true; -+ mpu = 64; -+ -+ } else if (strcmp(*argv, "overhead") == 0) { -+ char* p = NULL; -+ NEXT_ARG(); -+ overhead = strtol(*argv, &p, 10); -+ if(!p || *p || !*argv || overhead < -64 || overhead > 256) { -+ fprintf(stderr, "Illegal \"overhead\", valid range is -64 to 256\\n"); -+ return -1; -+ } -+ overhead_set = true; -+ -+ } else if (strcmp(*argv, "mpu") == 0) { -+ char* p = NULL; -+ NEXT_ARG(); -+ mpu = strtol(*argv, &p, 10); -+ if(!p || *p || !*argv || mpu < 0 || mpu > 256) { -+ fprintf(stderr, "Illegal \"mpu\", valid range is 0 to 256\\n"); -+ return -1; -+ } -+ -+ } else if (strcmp(*argv, "ingress") == 0) { -+ ingress = 1; -+ } else if (strcmp(*argv, "egress") == 0) { -+ ingress = 0; -+ -+ } else if (strcmp(*argv, "no-ack-filter") == 0) { -+ ack_filter = 0; -+ } else if (strcmp(*argv, "ack-filter") == 0) { -+ ack_filter = 0x0200; -+ } else if (strcmp(*argv, "ack-filter-aggressive") == 0) { -+ ack_filter = 0x0600; -+ -+ } else if (strcmp(*argv, "memlimit") == 0) { -+ NEXT_ARG(); -+ if(get_size(&memlimit, *argv)) { -+ fprintf(stderr, "Illegal value for \"memlimit\": \"%s\"\n", *argv); -+ return -1; -+ } -+ -+ } else if (strcmp(*argv, "help") == 0) { -+ explain(); -+ return -1; -+ } else { -+ fprintf(stderr, "What is \"%s\"?\n", *argv); -+ explain(); -+ return -1; -+ } -+ argc--; argv++; -+ } -+ -+ tail = NLMSG_TAIL(n); -+ addattr_l(n, 1024, TCA_OPTIONS, NULL, 0); -+ if (bandwidth || unlimited) -+ addattr_l(n, 1024, TCA_CAKE_BASE_RATE, &bandwidth, sizeof(bandwidth)); -+ if (diffserv) -+ addattr_l(n, 1024, TCA_CAKE_DIFFSERV_MODE, &diffserv, sizeof(diffserv)); -+ if (atm != -1) -+ addattr_l(n, 1024, TCA_CAKE_ATM, &atm, sizeof(atm)); -+ if (flowmode != -1) -+ addattr_l(n, 1024, TCA_CAKE_FLOW_MODE, &flowmode, sizeof(flowmode)); -+ if (overhead_set) -+ addattr_l(n, 1024, TCA_CAKE_OVERHEAD, &overhead, sizeof(overhead)); -+ if (overhead_override) { -+ unsigned zero = 0; -+ addattr_l(n, 1024, TCA_CAKE_RAW, &zero, sizeof(zero)); -+ } -+ if (mpu > 0) -+ addattr_l(n, 1024, TCA_CAKE_MPU, &mpu, sizeof(mpu)); -+ if (interval) -+ addattr_l(n, 1024, TCA_CAKE_RTT, &interval, sizeof(interval)); -+ if (target) -+ addattr_l(n, 1024, TCA_CAKE_TARGET, &target, sizeof(target)); -+ if (autorate != -1) -+ addattr_l(n, 1024, TCA_CAKE_AUTORATE, &autorate, sizeof(autorate)); -+ if (memlimit) -+ addattr_l(n, 1024, TCA_CAKE_MEMORY, &memlimit, sizeof(memlimit)); -+ if (nat != -1) -+ addattr_l(n, 1024, TCA_CAKE_NAT, &nat, sizeof(nat)); -+ if (wash != -1) -+ addattr_l(n, 1024, TCA_CAKE_WASH, &wash, sizeof(wash)); -+ if (ingress != -1) -+ addattr_l(n, 1024, TCA_CAKE_INGRESS, &ingress, sizeof(ingress)); -+ if (ack_filter != -1) -+ addattr_l(n, 1024, TCA_CAKE_ACK_FILTER, &ack_filter, sizeof(ack_filter)); -+ -+ tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail; -+ return 0; -+} -+ -+ -+static int cake_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) -+{ -+ struct rtattr *tb[TCA_CAKE_MAX + 1]; -+ unsigned bandwidth = 0; -+ unsigned diffserv = 0; -+ unsigned flowmode = 0; -+ unsigned interval = 0; -+ unsigned memlimit = 0; -+ int overhead = 0; -+ int raw = 0; -+ int mpu = 0; -+ int atm = 0; -+ int nat = 0; -+ int autorate = 0; -+ int wash = 0; -+ int ingress = 0; -+ int ack_filter = 0; -+ SPRINT_BUF(b1); -+ SPRINT_BUF(b2); -+ -+ if (opt == NULL) -+ return 0; -+ -+ parse_rtattr_nested(tb, TCA_CAKE_MAX, opt); -+ -+ if (tb[TCA_CAKE_BASE_RATE] && -+ RTA_PAYLOAD(tb[TCA_CAKE_BASE_RATE]) >= sizeof(__u32)) { -+ bandwidth = rta_getattr_u32(tb[TCA_CAKE_BASE_RATE]); -+ if(bandwidth) { -+ print_uint(PRINT_JSON, "bandwidth", NULL, bandwidth); -+ print_string(PRINT_FP, NULL, "bandwidth %s ", sprint_rate(bandwidth, b1)); -+ } else -+ print_string(PRINT_ANY, "bandwidth", "bandwidth %s ", "unlimited"); -+ } -+ if (tb[TCA_CAKE_AUTORATE] && -+ RTA_PAYLOAD(tb[TCA_CAKE_AUTORATE]) >= sizeof(__u32)) { -+ autorate = rta_getattr_u32(tb[TCA_CAKE_AUTORATE]); -+ if(autorate == 1) -+ print_string(PRINT_ANY, "autorate", "autorate_%s ", "ingress"); -+ else if(autorate) -+ print_string(PRINT_ANY, "autorate", "(?autorate?) ", "unknown"); -+ } -+ if (tb[TCA_CAKE_DIFFSERV_MODE] && -+ RTA_PAYLOAD(tb[TCA_CAKE_DIFFSERV_MODE]) >= sizeof(__u32)) { -+ diffserv = rta_getattr_u32(tb[TCA_CAKE_DIFFSERV_MODE]); -+ switch(diffserv) { -+ case 1: -+ print_string(PRINT_ANY, "diffserv", "%s ", "besteffort"); -+ break; -+ case 2: -+ print_string(PRINT_ANY, "diffserv", "%s ", "precedence"); -+ break; -+ case 3: -+ print_string(PRINT_ANY, "diffserv", "%s ", "diffserv8"); -+ break; -+ case 4: -+ print_string(PRINT_ANY, "diffserv", "%s ", "diffserv4"); -+ break; -+ case 5: -+ print_string(PRINT_ANY, "diffserv", "%s ", "diffserv-llt"); -+ break; -+ case 6: -+ print_string(PRINT_ANY, "diffserv", "%s ", "diffserv3"); -+ break; -+ default: -+ print_string(PRINT_ANY, "diffserv", "(?diffserv?) ", "unknown"); -+ break; -+ }; -+ } -+ if (tb[TCA_CAKE_FLOW_MODE] && -+ RTA_PAYLOAD(tb[TCA_CAKE_FLOW_MODE]) >= sizeof(__u32)) { -+ flowmode = rta_getattr_u32(tb[TCA_CAKE_FLOW_MODE]); -+ nat = !!(flowmode & 64); -+ flowmode &= ~64; -+ switch(flowmode) { -+ case 0: -+ print_string(PRINT_ANY, "flowmode", "%s ", "flowblind"); -+ break; -+ case 1: -+ print_string(PRINT_ANY, "flowmode", "%s ", "srchost"); -+ break; -+ case 2: -+ print_string(PRINT_ANY, "flowmode", "%s ", "dsthost"); -+ break; -+ case 3: -+ print_string(PRINT_ANY, "flowmode", "%s ", "hosts"); -+ break; -+ case 4: -+ print_string(PRINT_ANY, "flowmode", "%s ", "flows"); -+ break; -+ case 5: -+ print_string(PRINT_ANY, "flowmode", "%s ", "dual-srchost"); -+ break; -+ case 6: -+ print_string(PRINT_ANY, "flowmode", "%s ", "dual-dsthost"); -+ break; -+ case 7: -+ print_string(PRINT_ANY, "flowmode", "%s ", "triple-isolate"); -+ break; -+ default: -+ print_string(PRINT_ANY, "flowmode", "(?flowmode?) ", "unknown"); -+ break; -+ }; -+ -+ if(nat) -+ print_string(PRINT_FP, NULL, "nat ", NULL); -+ print_bool(PRINT_JSON, "nat", NULL, nat); -+ } -+ if (tb[TCA_CAKE_WASH] && -+ RTA_PAYLOAD(tb[TCA_CAKE_WASH]) >= sizeof(__u32)) { -+ wash = rta_getattr_u32(tb[TCA_CAKE_WASH]); -+ } -+ if (tb[TCA_CAKE_ATM] && -+ RTA_PAYLOAD(tb[TCA_CAKE_ATM]) >= sizeof(__u32)) { -+ atm = rta_getattr_u32(tb[TCA_CAKE_ATM]); -+ } -+ if (tb[TCA_CAKE_OVERHEAD] && -+ RTA_PAYLOAD(tb[TCA_CAKE_OVERHEAD]) >= sizeof(__u32)) { -+ overhead = rta_getattr_u32(tb[TCA_CAKE_OVERHEAD]); -+ } -+ if (tb[TCA_CAKE_MPU] && -+ RTA_PAYLOAD(tb[TCA_CAKE_MPU]) >= sizeof(__u32)) { -+ mpu = rta_getattr_u32(tb[TCA_CAKE_MPU]); -+ } -+ if (tb[TCA_CAKE_INGRESS] && -+ RTA_PAYLOAD(tb[TCA_CAKE_INGRESS]) >= sizeof(__u32)) { -+ ingress = rta_getattr_u32(tb[TCA_CAKE_INGRESS]); -+ } -+ if (tb[TCA_CAKE_ACK_FILTER] && -+ RTA_PAYLOAD(tb[TCA_CAKE_ACK_FILTER]) >= sizeof(__u32)) { -+ ack_filter = rta_getattr_u32(tb[TCA_CAKE_ACK_FILTER]); -+ } -+ if (tb[TCA_CAKE_RAW]) { -+ raw = 1; -+ } -+ if (tb[TCA_CAKE_RTT] && -+ RTA_PAYLOAD(tb[TCA_CAKE_RTT]) >= sizeof(__u32)) { -+ interval = rta_getattr_u32(tb[TCA_CAKE_RTT]); -+ } -+ -+ if (wash) -+ print_string(PRINT_FP, NULL, "wash ", NULL); -+ print_bool(PRINT_JSON, "wash", NULL, wash); -+ -+ if (ingress) -+ print_string(PRINT_FP, NULL, "ingress ", NULL); -+ print_bool(PRINT_JSON, "ingress", NULL, ingress); -+ -+ if (ack_filter == 0x0600) -+ print_string(PRINT_ANY, "ack-filter", "ack-filter-%s ", "aggressive"); -+ else if (ack_filter) -+ print_string(PRINT_ANY, "ack-filter", "ack-filter ", "enabled"); -+ else -+ print_string(PRINT_JSON, "ack-filter", NULL, "disabled"); -+ -+ if (interval) -+ print_string(PRINT_FP, NULL, "rtt %s ", sprint_time(interval, b2)); -+ print_uint(PRINT_JSON, "rtt", NULL, interval); -+ -+ if (raw) -+ print_string(PRINT_FP, NULL, "raw ", NULL); -+ print_bool(PRINT_JSON, "raw", NULL, raw); -+ -+ if (atm == 1) -+ print_string(PRINT_ANY, "atm", "%s ", "atm"); -+ else if (atm == 2) -+ print_string(PRINT_ANY, "atm", "%s ", "ptm"); -+ else if (!raw) -+ print_string(PRINT_ANY, "atm", "%s ", "noatm"); -+ -+ print_int(PRINT_ANY, "overhead", "overhead %d ", overhead); -+ -+ if (mpu) -+ print_uint(PRINT_ANY, "mpu", "mpu %" PRIu64 " ", mpu); -+ -+ if (memlimit) { -+ print_uint(PRINT_JSON, "memlimit", NULL, memlimit); -+ print_string(PRINT_FP, NULL, "memlimit %s", sprint_size(memlimit, b1)); -+ } -+ -+ return 0; -+} -+ -+#define FOR_EACH_TIN(xstats, tst, i) \ -+ for(tst = xstats->tin_stats, i = 0; \ -+ i < xstats->tin_cnt; \ -+ i++, tst = ((void *) xstats->tin_stats) + xstats->tin_stats_size * i) -+ -+static void cake_print_json_tin(struct tc_cake_tin_stats *tst) -+{ -+ open_json_object(NULL); -+ print_uint(PRINT_JSON, "threshold_rate", NULL, tst->threshold_rate); -+ print_uint(PRINT_JSON, "target", NULL, tst->target_us); -+ print_uint(PRINT_JSON, "interval", NULL, tst->interval_us); -+ print_uint(PRINT_JSON, "peak_delay", NULL, tst->peak_delay_us); -+ print_uint(PRINT_JSON, "average_delay", NULL, tst->avge_delay_us); -+ print_uint(PRINT_JSON, "base_delay", NULL, tst->base_delay_us); -+ print_uint(PRINT_JSON, "sent_packets", NULL, tst->sent.packets); -+ print_uint(PRINT_JSON, "sent_bytes", NULL, tst->sent.bytes); -+ print_uint(PRINT_JSON, "way_indirect_hits", NULL, tst->way_indirect_hits); -+ print_uint(PRINT_JSON, "way_misses", NULL, tst->way_misses); -+ print_uint(PRINT_JSON, "way_collisions", NULL, tst->way_collisions); -+ print_uint(PRINT_JSON, "drops", NULL, tst->dropped.packets); -+ print_uint(PRINT_JSON, "ecn_mark", NULL, tst->ecn_marked.packets); -+ print_uint(PRINT_JSON, "ack_drops", NULL, tst->ack_drops.packets); -+ print_uint(PRINT_JSON, "sparse_flows", NULL, tst->sparse_flows); -+ print_uint(PRINT_JSON, "bulk_flows", NULL, tst->bulk_flows); -+ print_uint(PRINT_JSON, "unresponsive_flows", NULL, tst->unresponse_flows); -+ print_uint(PRINT_JSON, "max_pkt_len", NULL, tst->max_skblen); -+ close_json_object(); -+} -+ -+static int cake_print_xstats(struct qdisc_util *qu, FILE *f, -+ struct rtattr *xstats) -+{ -+ struct tc_cake_xstats *stnc; -+ struct tc_cake_tin_stats *tst; -+ SPRINT_BUF(b1); -+ int i; -+ -+ if (xstats == NULL) -+ return 0; -+ -+ if (RTA_PAYLOAD(xstats) < sizeof(*stnc)) -+ return -1; -+ -+ stnc = RTA_DATA(xstats); -+ -+ if (stnc->version < 0x101 || -+ RTA_PAYLOAD(xstats) < (sizeof(struct tc_cake_xstats) + -+ stnc->tin_stats_size * stnc->tin_cnt)) -+ return -1; -+ -+ print_uint(PRINT_JSON, "memory_used", NULL, stnc->memory_used); -+ print_uint(PRINT_JSON, "memory_limit", NULL, stnc->memory_limit); -+ print_uint(PRINT_JSON, "capacity_estimate", NULL, stnc->capacity_estimate); -+ -+ print_string(PRINT_FP, NULL, " memory used: %s", -+ sprint_size(stnc->memory_used, b1)); -+ print_string(PRINT_FP, NULL, " of %s\n", -+ sprint_size(stnc->memory_limit, b1)); -+ print_string(PRINT_FP, NULL, " capacity estimate: %s\n", -+ sprint_rate(stnc->capacity_estimate, b1)); -+ -+ print_uint(PRINT_ANY, "min_transport_size", " min/max transport layer size: %10" PRIu64, -+ stnc->min_trnlen); -+ print_uint(PRINT_ANY, "max_transport_size", " /%8" PRIu64 "\n", stnc->max_trnlen); -+ print_uint(PRINT_ANY, "min_adj_size", " min/max overhead-adjusted size: %8" PRIu64, -+ stnc->min_adjlen); -+ print_uint(PRINT_ANY, "max_adj_size", " /%8" PRIu64 "\n", stnc->max_adjlen); -+ print_uint(PRINT_ANY, "avg_hdr_offset", " average transport hdr offset: %10" PRIu64 "\n\n", -+ stnc->avg_trnoff); -+ -+ if (is_json_context()) { -+ open_json_array(PRINT_JSON, "tins"); -+ FOR_EACH_TIN(stnc, tst, i) -+ cake_print_json_tin(tst); -+ close_json_array(PRINT_JSON, NULL); -+ return 0; -+ } -+ -+ -+ switch(stnc->tin_cnt) { -+ case 3: -+ fprintf(f, " Bulk Best Effort Voice\n"); -+ break; -+ -+ case 4: -+ fprintf(f, " Bulk Best Effort Video Voice\n"); -+ break; -+ -+ case 5: -+ fprintf(f, " Low Loss Best Effort Low Delay Bulk Net Control\n"); -+ break; -+ -+ default: -+ fprintf(f, " "); -+ for(i=0; i < stnc->tin_cnt; i++) -+ fprintf(f, " Tin %u", i); -+ fprintf(f, "\n"); -+ }; -+ -+ fprintf(f, " thresh "); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12s", sprint_rate(tst->threshold_rate, b1)); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " target "); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12s", sprint_time(tst->target_us, b1)); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " interval"); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12s", sprint_time(tst->interval_us, b1)); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " pk_delay"); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12s", sprint_time(tst->peak_delay_us, b1)); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " av_delay"); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12s", sprint_time(tst->avge_delay_us, b1)); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " sp_delay"); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12s", sprint_time(tst->base_delay_us, b1)); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " pkts "); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12u", tst->sent.packets); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " bytes "); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12llu", tst->sent.bytes); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " way_inds"); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12u", tst->way_indirect_hits); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " way_miss"); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12u", tst->way_misses); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " way_cols"); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12u", tst->way_collisions); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " drops "); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12u", tst->dropped.packets); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " marks "); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12u", tst->ecn_marked.packets); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " ack_drop"); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12u", tst->ack_drops.packets); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " sp_flows"); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12u", tst->sparse_flows); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " bk_flows"); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12u", tst->bulk_flows); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " un_flows"); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12u", tst->unresponse_flows); -+ fprintf(f, "\n"); -+ -+ fprintf(f, " max_len "); -+ FOR_EACH_TIN(stnc, tst, i) -+ fprintf(f, " %12u", tst->max_skblen); -+ fprintf(f, "\n"); -+ -+ return 0; -+} -+ -+struct qdisc_util cake_qdisc_util = { -+ .id = "cake", -+ .parse_qopt = cake_parse_opt, -+ .print_qopt = cake_print_opt, -+ .print_xstats = cake_print_xstats, -+}; -diff -rupN a/tc/tc_qdisc.c b/tc/tc_qdisc.c ---- a/tc/tc_qdisc.c 2018-01-29 11:08:52.000000000 -0500 -+++ b/tc/tc_qdisc.c 2018-03-16 10:21:03.147099953 -0400 -@@ -20,6 +20,7 @@ - #include <string.h> - #include <math.h> - #include <malloc.h> -+#include <inttypes.h> - - #include "utils.h" - #include "tc_util.h" -@@ -264,7 +265,7 @@ int print_qdisc(const struct sockaddr_nl - } - - if (t->tcm_info != 1) -- print_uint(PRINT_ANY, "refcnt", "refcnt %u ", t->tcm_info); -+ print_uint(PRINT_ANY, "refcnt", "refcnt %" PRIu64 " ", t->tcm_info); - - if (tb[TCA_HW_OFFLOAD] && - (rta_getattr_u8(tb[TCA_HW_OFFLOAD]))) -diff -rupN a/tc/tc_util.c b/tc/tc_util.c ---- a/tc/tc_util.c 2018-01-29 11:08:52.000000000 -0500 -+++ b/tc/tc_util.c 2018-03-16 10:21:03.147099953 -0400 -@@ -21,6 +21,7 @@ - #include <string.h> - #include <math.h> - #include <errno.h> -+#include <inttypes.h> - - #include "utils.h" - #include "names.h" -@@ -714,10 +715,10 @@ void print_action_control(FILE *f, const - open_json_object("control_action"); - print_string(PRINT_ANY, "type", "%s", action_n2a(action)); - if (TC_ACT_EXT_CMP(action, TC_ACT_GOTO_CHAIN)) -- print_uint(PRINT_ANY, "chain", " chain %u", -+ print_uint(PRINT_ANY, "chain", " chain %" PRIu64 , - action & TC_ACT_EXT_VAL_MASK); - if (TC_ACT_EXT_CMP(action, TC_ACT_JUMP)) -- print_uint(PRINT_ANY, "jump", " %u", -+ print_uint(PRINT_ANY, "jump", " %" PRIu64 , - action & TC_ACT_EXT_VAL_MASK); - close_json_object(); - print_string(PRINT_FP, NULL, "%s", suffix); -@@ -770,17 +771,17 @@ void print_tm(FILE *f, const struct tcf_ - - if (tm->install != 0) { - print_uint(PRINT_JSON, "installed", NULL, tm->install); -- print_uint(PRINT_FP, NULL, " installed %u sec", -+ print_uint(PRINT_FP, NULL, " installed %" PRIu64 " sec", - (unsigned int)(tm->install/hz)); - } - if (tm->lastuse != 0) { - print_uint(PRINT_JSON, "last_used", NULL, tm->lastuse); -- print_uint(PRINT_FP, NULL, " used %u sec", -+ print_uint(PRINT_FP, NULL, " used %" PRIu64 " sec", - (unsigned int)(tm->lastuse/hz)); - } - if (tm->expires != 0) { - print_uint(PRINT_JSON, "expires", NULL, tm->expires); -- print_uint(PRINT_FP, NULL, " expires %u sec", -+ print_uint(PRINT_FP, NULL, " expires %" PRIu64 " sec", - (unsigned int)(tm->expires/hz)); - } - } -@@ -798,17 +799,17 @@ void print_tcstats2_attr(FILE *fp, struc - memcpy(&bs, RTA_DATA(tbs[TCA_STATS_BASIC]), MIN(RTA_PAYLOAD(tbs[TCA_STATS_BASIC]), sizeof(bs))); - print_string(PRINT_FP, NULL, "%s", prefix); - print_lluint(PRINT_ANY, "bytes", "Sent %llu bytes", bs.bytes); -- print_uint(PRINT_ANY, "packets", " %u pkt", bs.packets); -+ print_uint(PRINT_ANY, "packets", " %" PRIu64 " pkt", bs.packets); - } - - if (tbs[TCA_STATS_QUEUE]) { - struct gnet_stats_queue q = {0}; - - memcpy(&q, RTA_DATA(tbs[TCA_STATS_QUEUE]), MIN(RTA_PAYLOAD(tbs[TCA_STATS_QUEUE]), sizeof(q))); -- print_uint(PRINT_ANY, "drops", " (dropped %u", q.drops); -- print_uint(PRINT_ANY, "overlimits", ", overlimits %u", -+ print_uint(PRINT_ANY, "drops", " (dropped %" PRIu64, q.drops); -+ print_uint(PRINT_ANY, "overlimits", ", overlimits %" PRIu64, - q.overlimits); -- print_uint(PRINT_ANY, "requeues", " requeues %u) ", q.requeues); -+ print_uint(PRINT_ANY, "requeues", " requeues %" PRIu64 ") ", q.requeues); - } - - if (tbs[TCA_STATS_RATE_EST64]) { -@@ -833,7 +834,7 @@ void print_tcstats2_attr(FILE *fp, struc - print_uint(PRINT_JSON, "rate", NULL, re.bps); - print_string(PRINT_FP, NULL, "rate %s", - sprint_rate(re.bps, b1)); -- print_uint(PRINT_ANY, "pps", " %upps", re.pps); -+ print_uint(PRINT_ANY, "pps", " %" PRIu64 "pps", re.pps); - } - - if (tbs[TCA_STATS_QUEUE]) { -@@ -845,8 +846,8 @@ void print_tcstats2_attr(FILE *fp, struc - print_uint(PRINT_JSON, "backlog", NULL, q.backlog); - print_string(PRINT_FP, NULL, "backlog %s", - sprint_size(q.backlog, b1)); -- print_uint(PRINT_ANY, "qlen", " %up", q.qlen); -- print_uint(PRINT_FP, NULL, " requeues %u", q.requeues); -+ print_uint(PRINT_ANY, "qlen", " %" PRIu64 "p", q.qlen); -+ print_uint(PRINT_FP, NULL, " requeues %" PRIu64, q.requeues); - } - - if (xstats) @@ -5,12 +5,17 @@ # Maintainer: George Amanakis <g_amanakis@yahoo.com> pkgname=iproute2-cake -pkgver=4.15.0 -pkgrel=3 +_srcname=tc-adv +pkgver=r4214.0407be50 +pkgrel=1 +pkgver() { + cd "${srcdir}/${_srcname}" + printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" +} pkgdesc='IP Routing Utilities' arch=('x86_64') license=('GPL2') -url='https://git.kernel.org/pub/scm/network/iproute2/iproute2.git' +url='https://www.github.com/dtaht/tc-adv' depends=('glibc' 'iptables' 'libelf') optdepends=('linux-atm: ATM support') groups=('base') @@ -29,15 +34,13 @@ backup=('etc/iproute2/ematch_map' makedepends=('linux-atm') options=('staticlibs') validpgpkeys=('9F6FC345B05BE7E766B83C8F80A77F6095CDE47E') # Stephen Hemminger -source=("https://www.kernel.org/pub/linux/utils/net/${pkgname/-cake}/${pkgname/-cake}-${pkgver}.tar."{xz,sign} - '0001-make-iproute2-fhs-compliant.patch' - '950c-add-cake-to-tc.patch') +source=('git+https://www.github.com/dtaht/tc-adv' + '0001-make-iproute2-fhs-compliant.patch') prepare() { - cd "${srcdir}/${pkgname/-cake}-${pkgver}" + cd "${srcdir}/${_srcname}" # set correct fhs structure - patch -Np1 -i "${srcdir}/950c-add-cake-to-tc.patch" patch -Np1 -i "${srcdir}/0001-make-iproute2-fhs-compliant.patch" # do not treat warnings as errors @@ -46,14 +49,14 @@ prepare() { } build() { - cd "${srcdir}/${pkgname/-cake}-${pkgver}" + cd "${srcdir}/${_srcname}" ./configure make } package() { - cd "${srcdir}/${pkgname/-cake}-${pkgver}" + cd "${srcdir}/${_srcname}" make DESTDIR="${pkgdir}" SBINDIR="/usr/bin" install @@ -62,7 +65,5 @@ package() { install -Dm0644 lib/libnetlink.a "${pkgdir}/usr/lib/libnetlink.a" } -md5sums=('0681bf4664b2649ad4e12551a3a7a1f9' - 'SKIP' - '5345bd18b521fb2f305acb2ab1203269' - 'a9f986fbe42eb0390f41c94af1672ee2') +md5sums=('SKIP' + '5345bd18b521fb2f305acb2ab1203269') |