Re-modificado Linux HTB adicionando uma única mensagem printk em função htb_dequeue .
static struct sk_buff *htb_dequeue(struct Qdisc *sch)
{
... original code
... original code
for (level = 0; level < TC_HTB_MAXDEPTH; level++) {
printk("Current level in loop is: %d\n", level);
... original code
}
}
Na documentação oficial, diz:
Each class is assigned level. Leaf has ALWAYS level 0 and root classes have level TC_HTB_MAXDEPTH-1. Interior nodes has level one less than their parent.
Eu corri o seguinte exemplo:
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 40kbps ceil 100kbps
root
|
|
class rate 100kbps ceil 100kbps
|
Leaf rate 40kbps ceil 100kbps
A altura deve ser 2 ou 3, não mais que 3
No entanto, depois de executar isso, eu inspecionar a saída no dmesg eu recebo o seguinte:
Current level in loop is: 0
Current level in loop is: 1
Current level in loop is: 2
Current level in loop is: 3
Current level in loop is: 4
Current level in loop is: 5
Current level in loop is: 6
Current level in loop is: 7
Eu não tinha ideia de por que essa saída, então eu a executei novamente com o seguinte diagrama
root
|
|
class rate 100kbps ceil 100kbps
|
class rate 70kbps ceil 100kbps
|
Leaf rate 40kbps ceil 100kbps
E eu tive a mesma saída no dmesg ...
Certifiquei-me de ter compilado o kernel corretamente após adicionar o printk
make
make modules_install
make install
update-initramfs -c -k 4.17.0+
update-grub
reiniciou a máquina e o kernel foi atualizado porque eu tinha a saída do printk.
Minha pergunta é: por que a altura é 7 e não 2?
Tags networking linux traffic-shaping tc