User Tools

Site Tools


mywiki:linux:tc-ca

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
mywiki:linux:tc-ca [2025/08/29 11:03] – created gshaomywiki:linux:tc-ca [2025/08/29 16:35] (current) – [Example to create below queue structures] gshao
Line 1: Line 1:
 +====== Difference between ingress/egress qdisc ======
 +
 +
 | Feature | Ingress Qdisc | egress Qdisc | | Feature | Ingress Qdisc | egress Qdisc |
 | Direction | Incoming traffic | Outgoing traffic | | Direction | Incoming traffic | Outgoing traffic |
Line 6: Line 9:
 | Shaping Support | ❌ Not supported | ✅ Supported | | Shaping Support | ❌ Not supported | ✅ Supported |
 | Example Qdisc | ingress | htb, fq_codel, tbf, etc. | | Example Qdisc | ingress | htb, fq_codel, tbf, etc. |
 +| create qdisc | tc qdisc add dev <interface> **handle ffff:** ingress | tc qdisc add dev <interface> **root handle** 1: htb default 10 |
 +| create filter | tc filter add dev <interface> **parent ffff:** \ \\ protocol ip prio 1 u32 match ip src 0.0.0.0/0 \ \\  police rate 1mbit burst 10k drop flowid :1 | tc class add dev <interface> **parent 1:** classid 1:10 htb rate 1mbit \\ tc filter add dev <interface> protocol ip **parent 1:** prio 1 u32 \ \\ match ip dst 0.0.0.0/0 flowid 1:10 |
 +
 +Note: 
 +  * **handle ffff:** is a reserved handle for ingress and **parent ffff:** refers to the ingress qdisc.
 +  * **root** refers to the egress qdisc.
 +  * **police** is used to enforce rate limits.
 +  * **htb** is a **hierarchical** token bucket used for shaping.
 +  * **flowid** assigns traffic to **a specific class**.
 +  * **tc class** is only for egress qdisc, not ingress qdisc
 +  * **lowid :1** in this ingress command is a label or tag used for accounting and statistics: tc filter add dev <interface> parent ffff: protocol ip prio 1 u32 match ip src 0.0.0.0/0 police rate 1mbit burst 10k drop **flowid :1**
 +
 +
 +
 +====== Example to create below queue structures ======
 +
 +<code>
 +Queue 1 ─┐
 +Queue 2 ─┘→ Scheduler 1 → Scheduler 2 → Root Egress Qdisc (eth1)
 +
 +Queue 3 ─┐
 +Queue 4 ─┘→ Scheduler 3 → Scheduler 4 → Root Egress Qdisc (eth1)
 +</code>
 +
 +Note: 
 +  * use **tc class** to create queue/scheduler structure
 +  * use **tc filter** to map traffic to queue
 +
 +<code bash t.sh>
 +# Step 1: Add root HTB qdisc to eth1
 +tc qdisc add dev eth1 root handle 1: htb default 100
 +
 +# Step 2: Create top-level classes (Scheduler 2 and Scheduler 4)
 +tc class add dev eth1 parent 1: classid 1:10 htb rate 10mbit  # Scheduler 2
 +tc class add dev eth1 parent 1: classid 1:20 htb rate 10mbit  # Scheduler 4
 +
 +# Step 3: Create second-level classes (Scheduler 1 and Scheduler 3)
 +tc class add dev eth1 parent 1:10 classid 1:11 htb rate 5mbit  # Scheduler 1
 +tc class add dev eth1 parent 1:20 classid 1:21 htb rate 5mbit  # Scheduler 3
 +
 +# Step 4: Create leaf classes (Queues)
 +tc class add dev eth1 parent 1:11 classid 1:111 htb rate 2mbit  # Queue 1
 +tc class add dev eth1 parent 1:11 classid 1:112 htb rate 3mbit  # Queue 2
 +
 +tc class add dev eth1 parent 1:21 classid 1:211 htb rate 2mbit  # Queue 3
 +tc class add dev eth1 parent 1:21 classid 1:212 htb rate 3mbit  # Queue 4
 +
 +# Step 5: Attach filters to classify traffic into queues
 +# You can change IPs or match conditions as needed
 +
 +# Queue 1: traffic from 192.168.1.1
 +tc filter add dev eth1 protocol ip parent 1: prio 1 u32 \
 +    match ip src 192.168.1.1/32 flowid 1:111
 +
 +# Queue 2: traffic from 192.168.1.2
 +tc filter add dev eth1 protocol ip parent 1: prio 1 u32 \
 +    match ip src 192.168.1.2/32 flowid 1:112
 +
 +# Queue 3: traffic from 192.168.1.3
 +tc filter add dev eth1 protocol ip parent 1: prio 1 u32 \
 +    match ip src 192.168.1.3/32 flowid 1:211
 +# Queue 4: traffic from 192.168.1.4
 +tc filter add dev eth1 protocol ip parent 1: prio 1 u32 \
 +    match ip src 192.168.1.4/32 flowid 1:212
 +</code>
 +
 +Delete filter example:
 +  * filter del dev eth1 protocol ip parent 1: prio 1
 +
 +Delete class example: 
 +  * tc class del dev eth1 classid 1:111  # Queue 1
 +  * tc class del dev eth1 classid 1:112  # Queue 2
 +  * tc class del dev eth1 classid 1:211  # Queue 3
 +  * tc class del dev eth1 classid 1:212  # Queue 4
 +  * tc class del dev eth1 classid 1:11   # Scheduler 1
 +  * tc class del dev eth1 classid 1:21   # Scheduler 3
 +  * tc class del dev eth1 classid 1:10   # Scheduler 2
 +  * tc class del dev eth1 classid 1:20   # Scheduler 4
 +
 +Delete qdisc example:
 +  * tc qdisc del dev eth1 root
 +
 +====== example to create multiple chains in the ingress qdisc ======
 +
 +
 +====== example to create multiple chains in the egress qdisc ======
 +
 +
mywiki/linux/tc-ca.1756436584.txt.gz · Last modified: by gshao