mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-06-29 23:43:21 -04:00
Currently, when doing rate limiting using the tc-police(8) action, the easiest way is to simply drop the packets which exceed or conform the configured bandwidth limit. Add a new option to tc-skbmod(8), so that users may use the ECN [1] extension to explicitly inform the receiver about the congestion instead of dropping packets "on the floor". The 2 least significant bits of the Traffic Class field in IPv4 and IPv6 headers are used to represent different ECN states [2]: 0b00: "Non ECN-Capable Transport", Non-ECT 0b10: "ECN Capable Transport", ECT(0) 0b01: "ECN Capable Transport", ECT(1) 0b11: "Congestion Encountered", CE As an example: $ tc filter add dev eth0 parent 1: protocol ip prio 10 \ matchall action skbmod ecn Doing the above marks all ECT(0) and ECT(1) packets as CE. It does NOT affect Non-ECT or non-IP packets. In the tc-police scenario mentioned above, users may pipe a tc-police action and a tc-skbmod "ecn" action together to achieve ECN-based rate limiting. For TCP connections, upon receiving a CE packet, the receiver will respond with an ECE packet, asking the sender to reduce their congestion window. However ECN also works with other L4 protocols e.g. DCCP and SCTP [2], and our implementation does not touch or care about L4 headers. The updated tc-skbmod SYNOPSIS looks like the following: tc ... action skbmod { set SETTABLE | swap SWAPPABLE | ecn } ... Only one of "set", "swap" or "ecn" shall be used in a single tc-skbmod command. Trying to use more than one of them at a time is considered undefined behavior; pipe multiple tc-skbmod commands together instead. "set" and "swap" only affect Ethernet packets, while "ecn" only affects IPv{4,6} packets. It is also worth mentioning that, in theory, the same effect could be achieved by piping a "police" action and a "bpf" action using the bpf_skb_ecn_set_ce() helper, but this requires eBPF programming from the user, thus impractical. Depends on patch "net/sched: act_skbmod: Skip non-Ethernet packets". [1] https://datatracker.ietf.org/doc/html/rfc3168 [2] https://en.wikipedia.org/wiki/Explicit_Congestion_Notification Reviewed-by: Cong Wang <cong.wang@bytedance.com> Signed-off-by: Peilin Ye <peilin.ye@bytedance.com> Signed-off-by: David S. Miller <davem@davemloft.net>
39 lines
841 B
C
39 lines
841 B
C
/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
|
|
/*
|
|
* Copyright (c) 2016, Jamal Hadi Salim
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*/
|
|
|
|
#ifndef __LINUX_TC_SKBMOD_H
|
|
#define __LINUX_TC_SKBMOD_H
|
|
|
|
#include <linux/pkt_cls.h>
|
|
|
|
#define SKBMOD_F_DMAC 0x1
|
|
#define SKBMOD_F_SMAC 0x2
|
|
#define SKBMOD_F_ETYPE 0x4
|
|
#define SKBMOD_F_SWAPMAC 0x8
|
|
#define SKBMOD_F_ECN 0x10
|
|
|
|
struct tc_skbmod {
|
|
tc_gen;
|
|
__u64 flags;
|
|
};
|
|
|
|
enum {
|
|
TCA_SKBMOD_UNSPEC,
|
|
TCA_SKBMOD_TM,
|
|
TCA_SKBMOD_PARMS,
|
|
TCA_SKBMOD_DMAC,
|
|
TCA_SKBMOD_SMAC,
|
|
TCA_SKBMOD_ETYPE,
|
|
TCA_SKBMOD_PAD,
|
|
__TCA_SKBMOD_MAX
|
|
};
|
|
#define TCA_SKBMOD_MAX (__TCA_SKBMOD_MAX - 1)
|
|
|
|
#endif
|