Skip to content

Instantly share code, notes, and snippets.

@fuji246
Created December 6, 2018 00:07
Show Gist options
  • Save fuji246/76eaa34aad87bb26e01954ee497803c4 to your computer and use it in GitHub Desktop.
Save fuji246/76eaa34aad87bb26e01954ee497803c4 to your computer and use it in GitHub Desktop.
emulator script
#!/bin/bash
set -x
set -e
GEMODEL_P=8.8235
GEMODEL_R=50
INPUT_INF="enp2s0"
OUTPUT_INF="enp3s0"
FILTER_IP1="10.35.201.46"
FILTER_IP2="10.35.201.45"
# kbit
LINK_BW1="8000"
LINK_BW2="8000"
RAND_LOSS1="0%"
RAND_LOSS2="0%"
# ms
DELAY1=1
DELAY2=1
# ms
QDELAY1=100
QDELAY2=100
DIRECTION="dst"
OPTIONS=b:,l:,d:,q:,f:
LONGOPTIONS=bw:,loss:,delay:,qdelay:,filter:,uplink,downlink
PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTIONS --name "$0" -- "$@")
if [ $? -ne 0 ]; then
exit 2
fi
eval set -- "$PARSED"
while true; do
case "$1" in
-b|--bw)
LINK_BW2=$2
shift 2
;;
-l|--loss)
RAND_LOSS2=$2
shift 2
;;
-d|--delay)
DELAY2=$2
shift 2
;;
-q|--qdelay)
QDELAY2=$2
shift 2
;;
-f|--filter)
FILTER_IP2=$2
shift 2
;;
--uplink)
INPUT_INF="enp3s0"
OUTPUT_INF="enp2s0"
DIRECTION="src"
shift
;;
--downlink)
INPUT_INF="enp2s0"
OUTPUT_INF="enp3s0"
DIRECTION="dst"
shift
;;
--)
shift
break
;;
*)
echo "option not found!"
exit 3
;;
esac
done
TB_QSIZE1=`expr $LINK_BW1 \* 1000 \* $QDELAY1 / 8000`
TB_QSIZE2=`expr $LINK_BW2 \* 1000 \* $QDELAY2 / 8000`
start()
{
modprobe ifb numifbs=10
ip link set dev ifb0 up
ip link set dev ifb1 up
tc qdisc add dev $INPUT_INF ingress
tc filter add dev $INPUT_INF parent ffff: protocol ip prio 1 u32 match ip $DIRECTION $FILTER_IP1 match ip protocol 17 0xff flowid 1:1 action mirred egress redirect dev ifb0
tc filter add dev $INPUT_INF parent ffff: protocol ip prio 1 u32 match ip $DIRECTION $FILTER_IP2 match ip protocol 17 0xff flowid 1:1 action mirred egress redirect dev ifb1
tc qdisc add dev ifb0 root netem loss random $RAND_LOSS1 delay $DELAY1"ms"
tc qdisc add dev ifb1 root netem loss random $RAND_LOSS2 delay $DELAY2"ms"
#tc qdisc add dev ifb0 root netem loss random 5% delay 100ms
#tc qdisc add dev ifb0 root netem loss gemodel $GEMODEL_P% $GEMODEL_R%
tc qdisc add dev $OUTPUT_INF root handle 1: htb default 12
tc class add dev $OUTPUT_INF parent 1: classid 1:1 htb rate 1000mbit
tc class add dev $OUTPUT_INF parent 1:1 classid 1:10 htb rate $LINK_BW1"kbit"
tc class add dev $OUTPUT_INF parent 1:1 classid 1:11 htb rate $LINK_BW2"kbit"
tc class add dev $OUTPUT_INF parent 1:1 classid 1:12 htb rate 1000mbit
tc filter add dev $OUTPUT_INF protocol ip parent 1:0 prio 1 u32 match ip $DIRECTION $FILTER_IP1 match ip protocol 17 0xff flowid 1:10
tc filter add dev $OUTPUT_INF protocol ip parent 1:0 prio 1 u32 match ip $DIRECTION $FILTER_IP2 match ip protocol 17 0xff flowid 1:11
tc qdisc add dev $OUTPUT_INF parent 1:10 bfifo limit $TB_QSIZE1
tc qdisc add dev $OUTPUT_INF parent 1:11 bfifo limit $TB_QSIZE2
}
stop()
{
tc qdisc del dev $OUTPUT_INF root
tc qdisc del dev $INPUT_INF ingress
tc qdisc del dev ifb0 root
tc qdisc del dev ifb1 root
ip link set dev ifb0 down
ip link set dev ifb1 down
modprobe -r ifb
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
esac
date
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment