tc u32 - come abbinare i protocolli L2 nei kernel recenti?


12

Ho un bel shaper, con filtro hash, costruito su un bridge Linux. In breve, br0connessioni externale internalinterfacce fisiche, i pacchetti con tag VLAN sono collegati in modo "trasparente" (voglio dire, non ci sono interfacce VLAN).

Ora, kernel diversi lo fanno diversamente. Posso sbagliarmi con gli intervalli esatti delle versioni del kernel, per favore perdonami. Grazie.

2.6.26

Quindi, in debian, 2.6.26 e versioni successive (fino a 2.6.32, credo) --- funziona:

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

Qui, "kernel" corrisponde a due byte nel campo "protocol" con 0x8100, ma considera l'inizio del pacchetto ip come "posizione zero" (scusate il mio inglese, se non sono abbastanza chiaro).

2.6.32

Ancora una volta, in debian (non ho compilato il kernel vanilla), 2.6.32-5 --- funziona:

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

Qui, "kernel" corrisponde allo stesso per il protocollo, ma conta offset all'inizio dell'intestazione di questo protocollo --- Devo aggiungere 4 byte a offset (20, non 16 per l'indirizzo dst). Va bene, sembra più logico, per quanto mi riguarda.

3.2.11, l'ultima stalla ora

Funziona --- come se non ci fosse alcun 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

Il problema è che finora non sono riuscito a trovare un modo per abbinare il tag 802.1q.

Corrispondenza tag 802.1q in passato

Potrei farlo prima come segue:

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

Ora sono in grado di eguagliare 802.1Q tag con at 0, at -2, at -4, at -6o simile. Il problema principale che ho zero hit conta --- questo filtro non viene controllato affatto, "protocollo errato", in altre parole.

Per favore, chiunque mi aiuti :-)

Grazie!

Risposte:


4

Il tag VLAN viene rimosso da skb nei kernel recenti. Prova qualcosa del genere per fare una meta corrispondenza in skb:

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

protocol allMi dà un tentativo di aggiungere un filtro root per RTNETLINK answers: Invalid argument(kernel 3.3.4 qui). Lo proverò con kernel più recenti. Grazie.
browniano,

Questo ha funzionato per me con il kernel debian wheezy 3.2.0. Ho aggiunto un'altra risposta con tutti i dettagli.
Nick Craig-Wood,

3

Ho dovuto fare esattamente questo. Ho scoperto che la risposta suggerita da @Thusitha era il modo corretto di farlo per i nuovi kernel.

Testato con il kernel Debian wheezy 3.2.0-4 e iproute (da cui proviene il comando tc) versione 20120521-3 + b3

Ecco lo script completo, le tc filterlinee sono quasi esattamente come specificato da @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

Strano, protocol allmi ha dato un errore nel kernel vanilla. Dovrei verificarlo di più. Grazie.
brownian

1

Consiglierei di usare WireShark per catturare ciò che sta attraversando l'interfaccia come visibile nello spazio utente e di usarlo per scrivere il filtro. Mi chiedo se forse l'interfaccia stia rimuovendo i tag VLAN per qualche motivo (nonostante sia configurato per il bridge in modo trasparente). Forse sta aggiungendo tag extra o qualcosa del genere?


No, non si tratta di eliminare il tag VLAN, sicuramente: tutto funziona (il traffico viene commutato tramite trunk su switch hardware), tranne i filtri nello shaper. Guarderò più da vicino, tuttavia. Ho esaminato la funzionalità di offload dei tag VLAN, ma quei driver non sono in grado di eseguire vload offload.
brownian

tcpdumpmostra gli ID vlan su tutte le interfacce bridgee le porte.
browniano,

Ora il mio bel shaper funziona con un kernel linux 3.3.4, tutto funziona benissimo tranne il filtro tag 8021q (posso vivere senza di esso). Il problema rimane irrisolto. Grazie lo stesso.
brownian,

1

È possibile contrassegnare i pacchetti vlan con 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

Quindi applicare la modellatura in base ai segni. ebtables e iptables condividono lo stesso segno.

Non l'ho ancora fatto da solo. Quindi è piuttosto un sospetto.


Dubito che funzionerà senza problemi sul collegamento a 10 GB ... Vorrei evitare qualsiasi * tabelle. Grazie comunque per il suggerimento.
brownian

@brownian pensi che fare esattamente lo stesso filtro in iproute2 avrà prestazioni più elevate? È lo stesso kernel, lo stesso percorso di codice, gli stessi algoritmi. Finché non si fa accidentalmente qualcosa come l'attivazione del rilevamento delle connessioni, non si dovrebbe vedere alcuna differenza. * le tabelle possono influire sulle prestazioni perché possono fare molte cose complesse. Ma ciò non significa che lo farà .
Tylerl,

@tylerl Dato che devo effettivamente filtrare con iproute2 (centinaia di clienti nello stesso vlan, un mucchio di filtri hash) - ogni altro controllo aggiuntivo per ogni pacchetto avrà un impatto sulle prestazioni, credo.
browniano,

0

Prova a disattivare l' reorder_hdropzione sull'interfaccia vlan. Se l'opzione di riordino dell'intestazione è abilitata, i tag dai frame vengono rimossi. Controllalo a comando ip -d link list dev vlan_iface.


1
Per favore, puoi chiarire quando viene rimosso e quando viene reinserito? Voglio dire, un frame con tag entra nel bridge Linux e poi lo lascia da un'altra interfaccia: quando / dove si verificano queste manipolazioni dei tag e quando / dove tcvengono chiamati i filtri? Hai un link a una mappa o simile? Grazie!
brownian,

Per favore, un altro pensiero: quale interfaccia vlan intendi? Quel bridge non ha una sola interfaccia vlan (ho scritto "Voglio dire, non ci sono interfacce VLAN" nel primo paragrafo).
browniano,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.