tc u32 - como combinar os protocolos L2 nos kernels recentes?

12

Eu tenho um bom shaper, com filtro de hash, construído em uma ponte linux. Em resumo, br0 conecta external e internal interfaces físicas, os pacotes marcados com VLAN são ligados "transparentemente" (ou seja, não há interfaces de VLAN).

Agora, kernels diferentes fazem isso de forma diferente. Eu posso estar errado com intervalos exatos de verões do kernel, por favor, me perdoe. Obrigado.

2.6.26

Então, no debian, 2.6.26 e acima (até 2.6.32, eu acredito) --- isso funciona:

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200

Aqui, "kernel" corresponde a dois bytes no campo "protocol" com 0x8100, mas conta o início do ip packet como uma "posição zero" (desculpe pelo meu inglês, se eu estiver um pouco incerto).

2.6.32

Novamente, no debian (eu não construí o kernel vanilla), 2.6.32-5 --- isso funciona:

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 at 20 flowid 1:200

Aqui, "kernel" corresponde ao mesmo para o protocolo, mas conta o deslocamento desde o início do cabeçalho deste protocolo --- eu tenho que adicionar 4 bytes ao offset (20, não 16 para o endereço dst). Tudo bem, parece mais lógico, quanto a mim.

3.2.11, o mais recente estável agora

Isso funciona --- como se não houvesse nenhuma tag 802.1q:

tc filter add dev internal protocol ip parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200

O problema é que não consegui encontrar uma maneira de corresponder à tag 802.1q até o momento.

Correspondendo à tag 802.1q no passado

Eu poderia fazer isso antes da seguinte forma:

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 match u16 0x0ed8 0x0fff at -4 flowid 1:300

Agora, não consigo corresponder à tag 802.1q com at 0 , at -2 , at -4 , at -6 ou assim. O principal problema que eu tenho zero acerta conta --- este filtro não está sendo verificado, "protocolo errado", em outras palavras.

Por favor, qualquer um, me ajude: -)

Obrigado!

    
por brownian 17.03.2012 / 23:07

5 respostas

3

A tag VLAN é removida do skb nos kernels recentes. Tente algo assim para fazer uma meta-partida no skb:

tc filter add dev internal protocol all parent 1:0 prio 100 basic match 'meta(vlan mask 0xfff eq 0x0ed8)' flowid 1:300
    
por 10.10.2013 / 05:55
2

Eu tive que fazer exatamente isso. Descobri que a resposta sugerida por @Thusitha era a maneira correta de fazer isso para novos kernels.

Testado com o Debian wheezy kernel 3.2.0-4 e iproute (de onde vem o comando tc) versão 20120521-3 + b3

Aqui está o script completo, as linhas tc filter sendo quase exatamente como especificado por @Thusitha

function qos() {
    if="$1"
    vlan1="$2"
    vlan2="$3"

    # delete previous
    tc qdisc del dev $if root >/dev/null 2>&1
    tc qdisc del dev $if ingress >/dev/null 2>&1

    # Root HTB for $if
    tc qdisc add dev $if root handle 1: htb r2q 1 default 1

    # Root class to borrow from
    tc class add dev $if parent 1: classid 1:1 htb quantum 1000000 rate 500mbit ceil 500mbit burst 64k prio 2
    tc qdisc add dev $if parent 1:1 handle 101 sfq perturb 10

    # class for vlan1
    tc class add dev $if parent 1:1 classid 1:106 htb quantum 1000000 rate 1.00mbit ceil 1.00mbit burst 6k
    tc qdisc add dev $if parent 1:106 handle 107 sfq perturb 10
    tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan1})" flowid 1:106

    # class for vlan2
    tc class add dev $if parent 1:1 classid 1:108 htb quantum 1000000 rate 1.00mbit ceil 10.00mbit burst 6k
    tc qdisc add dev $if parent 1:108 handle 108 sfq perturb 10
    tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan2})" flowid 1:108

}

qos eth1 1234 1235
qos eth2 2345 2346
    
por 13.01.2015 / 17:22
1

Eu recomendaria usar o wireshark para capturar o que está passando pela interface como visível no espaço do usuário e usá-lo para gravar o filtro. Eu estou querendo saber se, talvez, a interface está removendo as tags VLAN por algum motivo (apesar de estar configurado para fazer a ponte de forma transparente). Talvez esteja adicionando tags extras ou algo do tipo?

    
por 12.04.2012 / 19:25
1

Você pode marcar vlan packtes com ebtables .

# mark packets according to the vlan id
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 1 -j mark --mark-set 1
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 5 -j mark --mark-set 2

Em seguida, aplique a modelagem com base nas marcações. ebtables e iptables compartilham a mesma marcação.

Ainda não fiz isso. Então é um palpite.

    
por 24.04.2013 / 15:43
0

Tente desativar a opção reorder_hdr na interface vlan. Se a opção de reordenar cabeçalho estiver ativada, as tags dos quadros serão removidas. Verifique-o pelo comando ip -d link list dev vlan_iface .

    
por 24.05.2012 / 14:57