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