Usando tc, quero que o TCP e o UDP usem o mesmo buffer

1

Eu tenho dois tipos de tráfego

  1. TCP
  2. UDP

Eu quero aplicar 2 filtros diferentes neles, 1 Mbps p / b para UDP e 7 Mbps p / b para TCP

Mas eu quero que o tráfego deles use um buffer comum de tamanho de 100 pacotes

Eu escrevi o seguinte script de shell

#!/bin/bash

#Size of the queue
qlen=$1

#Delay per link
sdelay=$3

tcp_rate=7Mbit
udp_rate=1Mbit
total_rate=8Mbit

function add_qdisc {

    # deleting default qdisc
    dev=$1
    tc qdisc del dev $dev root
    echo qdisc removed

    # adding custom qdisc
    tc qdisc add dev $dev root handle 1:0 htb default 1
    echo qdisc added

    # creating classes for tcp and udp traffic
    tc class add dev $dev parent 1:0 classid 1:1 htb rate $total_rate ceil $total_rate
    tc class add dev $dev parent 1:1 classid 1:11 htb rate $udp_rate ceil $udp_rate
    tc class add dev $dev parent 1:1 classid 1:12 htb rate $tcp_rate ceil $tcp_rate
    echo classes created

    # creating link delays and queues
    tc qdisc add dev $dev parent 1:1 handle 10: netem delay $sdelay limit $qlen
    echo "delay and queue added"

    # matching the tcp/udp traffic to the appropriate class
    tc filter add dev $dev parent 1:0 protocol ip u32 match ip protocol 0x11 0xff flowid 1:11
    tc filter add dev $dev parent 1:0 protocol ip u32 match ip protocol 0x06 0xff flowid 1:12
    tc filter add dev $dev parent 1:0 protocol ip u32 match ip protocol 0x01 0xff flowid 1:12

    echo filters added

}

add_qdisc s1-eth1
add_qdisc s1-eth2

add_qdisc s3-eth1
add_qdisc s3-eth2

add_qdisc s6-eth1
add_qdisc s6-eth2

Mas estou recebendo o erro RTNETLINK answers: Invalid argument quando estou adicionando o tamanho do buffer ao nó da árvore tc 1:1

Quando estou adicionando o buffer para o filho de 1:1 , digamos 1:11 , o script está funcionando perfeitamente.

O tamanho do buffer pode ser adicionado a 1:1 , pois quero que o tráfego use um buffer comum?

PS: Acabei de começar a aprender o comando tc

EDITAR Atualizado udp_rate para 1 Mbps

    
por xavier666 08.01.2017 / 19:36

1 resposta

0

Você não pode compartilhar o buffer entre dois qdiscs em tc.
Embora, como sua largura de banda é estática, faria sentido codificar a divisão: 12 e 88 pacotes.

tc qdisc add dev $dev parent 1:11 handle 9: netem delay $sdelay limit $qlen_udp
tc qdisc add dev $dev parent 1:12 handle 10: netem delay $sdelay limit $qlen_tcp

Se os seus pacotes UDP são pequenos, você pode querer adaptar o valor de 12 a 20-30 para manter a capacidade de buffer e manter a latência baixa (antes da ação do netem).

Por que você está escrevendo esta função com netem e compartilhamento de buffer? O que você está tentando mostrar?

    
por 10.01.2017 / 11:16