Query about tc configuration and associated network issues

Linux Advanced Routing and Traffic Control

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I work on a master thesis project regarding broadband connection sharing. My network topology is as follows: 1. A PC which is connected to the Internet via eth0 and shares its connection with other computers via wlan0 (as a hotspot). 2. Two laptops serving as traffic generators connected to the hotspot through WiFi.
3. A PC serving as a traffic sink.

I’m using the D-ITG traffic generator to emulate HTTP traffic. One of the laptops runs ITGSend in multi-flow mode to generate simultaneously several flows(e.g. 100 flows) whose traffic is delivered to the sink (3) which runs ITGRecv.

I have tested this scenario without having any tc rules [qdisc, class, filter] applied, and it works fine.

The problem I'm facing is that when I am setting a bandwidth limit (downlink: 10Mbps, uplink:200Kbps) and testing different queueing configurations(for example HTB, prio) (see the attached file - SBS), ITGRecv gives me an error and drops the connection.

Given that without any tc rules applied my system works fine, I’m guessing that tc is affecting D-ITG somehow. After some researching I wasn’t able to pin point what is the issue. For example, my initial guess was the due to the limited bandwidth, lots of out of order packets were delivered to the sink, or IP fragmentation could be the issue, but I wasn't able to verify any of these assumptions through netstat –sa.

Does anyone have any idea what the problem could be? Is anything wrong with my tc configuration? Is there any chance that a kernel configuration might solve the issue?

In case this is not the appropriate mailing list for posting this question, do you have to suggest any other relevant mailing list that i could probably ping about this issue?

Thank you in advance,
Dimitris
#!/bin/bash

TC=/sbin/tc
IF=eth0		      # Interface 
IFHU=wlan3	      # Interface Home Users
IFGU=wlan5            # Interface Guest Users
IP="$(ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1)"    # IP eth0 Interface
echo "eth0 Interface IP: $IP"
GHU="$(ifconfig $IFHU | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1)"    # IP Home Users Interface
HUS="$( ifconfig $IFHU | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1 | cut -d '.' -f 1-3)"	# Home User Subnet
echo "Gateway Home User IP: $GHU"
echo "Home User Subnet: $HUS.0/24"
GGU="$(ifconfig $IFGU | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1)"    # IP Guest Users Interface
GUS="$( ifconfig $IFGU | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1 | cut -d '.' -f 1-3)"	# Guest User Subnet
echo "Gateway Guest User IP: $GGU"
echo "Guest User Subnet: $GUS.0/24" 

start() {

echo "Set Download Speed"
read DOWNLOAD
echo "Set Upload Speed"
read UPLOAD
wondershaper $IFHU $UPLOAD $DOWNLOAD
wondershaper $IFGU $UPLOAD $DOWNLOAD 

BW=$(($UPLOAD))kbit
echo $BW
echo "Set Ratio "
read RATIO 
echo "Home User Bandwidth "
HUBW=$(((($UPLOAD*(100-$RATIO)/100))))kbit         # Home Users Limit
echo $HUBW
echo "Guest User Bandwidth "
GUBW=$((($UPLOAD*$RATIO)/100))kbit          # Guest Users Limit
echo $GUBW

PATH=/sbin:/bin:/usr/sbin:/usr/bin

iptables -F
iptables -Z
iptables -X
iptables -t mangle -F
iptables -t nat -F

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -t nat -P PREROUTING ACCEPT
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

#NAT Guest Network
iptables -o $IF -I POSTROUTING -t nat -s 10.42.1.0/24 -j SNAT --to-source $IP
#NAT Home Network
iptables -o $IF -I POSTROUTING -t nat -s 10.42.0.0/24 -j SNAT --to-source $IP

####################Bandwith Limit - Home,Guest Users########################
    $TC qdisc add dev $IF root handle 1: htb default 30
    $TC class add dev $IF parent 1: classid 1:1 htb rate $BW
    $TC class add dev $IF parent 1:1 classid 1:10 htb rate $HUBW ceil $HUBW 
    $TC class add dev $IF parent 1:1 classid 1:20 htb rate $GUBW ceil $GUBW
    $TC class add dev $IF parent 1:1 classid 1:30 htb rate 10kbit ceil 10kbit
    iptables -I FORWARD 1 -p all -o $IFHU -d 10.42.0.0/24 -j MARK --set-mark 10
    iptables -I FORWARD 2 -p all -i $IFHU -s 10.42.0.0/24 -j MARK --set-mark 10
    iptables -I FORWARD 3 -p all -i $IFHU -o $IFHU -j MARK --set-mark 10
    iptables -I FORWARD 4 -p all -o $IFGU -d 10.42.1.0/24 -j MARK --set-mark 20
    iptables -I FORWARD 5 -p all -i $IFGU -s 10.42.1.0/24 -j MARK --set-mark 20
    iptables -I FORWARD 6 -p all -i $IFGU -o $IFGU -j MARK --set-mark 20
    $TC filter add dev $IF parent 1: protocol ip handle 10 fw flowid 1:10
    $TC filter add dev $IF parent 1: protocol ip handle 20 fw flowid 1:20
    $TC qdisc add dev $IF parent 1:10 handle 110: pfifo_fast
    $TC qdisc add dev $IF parent 1:20 handle 120: pfifo_fast
    $TC qdisc add dev $IF parent 1:30 handle 130: pfifo_fast
#############################################################################

}

stop() {

    $TC qdisc del dev $IF root
    wondershaper clear $IFHU
    wondershaper clear $IFGU

}

restart() {

    stop
    sleep 1
    start

}

show() {

    $TC -s qdisc ls dev $IF

}

case "$1" in

  start)

    echo "Starting bandwidth shaping: "
    start
    echo "done"
    ;;

  stop)

    echo "Stopping bandwidth shaping: "
    stop
    echo "done"
    ;;

  restart)

    echo -n "Restarting bandwidth shaping: "
    restart
    echo "done"
    ;;

  show)
    	    	    
    echo "Bandwidth shaping status for $IF:\n"
    show
    echo ""
    ;;

  *)

    pwd=$/home/dimitris/Dropbox/Thesis/Scripts
    echo "Usage: $(/usr/bin/dirname $pwd)/SBS1 {start|stop|restart|show}"
    ;;

esac

exit 0


[Index of Archives]     [LARTC Home Page]     [Netfilter]     [Netfilter Development]     [Network Development]     [Bugtraq]     [GCC Help]     [Yosemite News]     [Linux Kernel]     [Fedora Users]
  Powered by Linux