#!/bin/sh
#
# Initializes traffic setup


#####################################################################
############### CONSTANTS ###########################################
#####################################################################

# Upload rate to none LAN addresses.
UPLOAD_SPD=100
let INTERACTIVE_SPD=$UPLOAD_SPD*1/10
let BULK_SPD=$UPLOAD_SPD*9/10
let HTTP_SPD=$BULK_SPD*9/10
let UNCLASSIDIED_SPD=$BULK_SPD*1/10

echo "|UPLOAD_SPD = $UPLOAD_SPD"
echo "+- INTERACTIVE_SPD = $INTERACTIVE_SPD"
echo "+- BULK_SPD = $BULK_SPD"
echo "   +- HTTP_SPD = $HTTP_SPD"
echo "   +- UNCLASSIFIED_SPD = $UNCLASSIDIED_SPD"
exit

UPLOAD_RATE=${UPLOAD_SPD}KBps

# Local area network ip mask
LAN="10.0.0.0/24"
ANY="0.0.0.0/0"


# Queue names
ROOT_QUEUE="1:"
INET_QUEUE="1:11"
LAN_QUEUE="1:10"
INET_DEFAULT_QUEUE="1:110"
INET_INTERACTIVE_QUEUE="1:111"
INET_HTTP_QUEUE="1:1101"
INET_UNCLASSIFIED="1:1102"

# Ports
SSH="22"
TELNET="23"
HTTP="80"

AC="tc class add dev eth0 parent"
FILTER="tc filter add dev eth0 protocol ip parent"


######################################################
###############   Delete existing configuration ######
######################################################
tc qdisc del dev eth0 root    2> /dev/null > /dev/null



#####################################################################
############### SETUP QUEUES ########################################
#####################################################################

# ### Add root queue. ###
tc qdisc add dev eth0 root handle $ROOT_QUEUE htb default 10

# ### LAN Traffic, not limited. ###
$AC $ROOT_QUEUE classid $LAN_QUEUE htb rate 100Mbit

# ### Internet traffic, limited to max adsl out limit. ###
$AC $ROOT_QUEUE classid $INET_QUEUE htb rate $UPLOAD_RATE burst 6k

# ### Normal usage, will usually get all the upload bandwidth ###
$AC $INET_QUEUE classid $INET_DEFAULT_QUEUE htb rate ${BULK_SPD}Kbps ceil $UPLOAD_RATE prio 1 burst 6k

# Interactive usage (ssh), receives higher priority.
$AC $INET_QUEUE classid $INET_INTERACTIVE_QUEUE htb rate ${INTERACTIVE_SPD}Kbps ceil $UPLOAD_RATE prio 2 burst 6k

# ### Create HTTP Traffic queue ###
$AC $INET_DEFAULT_QUEUE classid $INET_HTTP_QUEUE htb rate ${HTTP_SPD}Kbps ceil ${BULK_SPD}Kbps burst 6k
 
# ### Create unclassified traffic queue ###
$AC $INET_DEFAULT_QUEUE classid $INET_UNCLASSIFIED  htb rate ${UNCLASSIDIED_SPD}Kbps ceil ${BULK_SPD}Kbps  burst 6k

tc qdisc add dev eth0 parent $INET_UNCLASSIFIED handle 31: sfq perturb 10
tc qdisc add dev eth0 parent $INET_HTTP_QUEUE handle 30: sfq perturb 10
tc qdisc add dev eth0 parent $INET_INTERACTIVE_QUEUE handle 32: sfq perturb 10

#####################################################################
############### SETUP FILTERS #######################################
#####################################################################

### Match LAN packets to LAN_QUEUE
$FILTER $ROOT_QUEUE prio 1 u32 match ip dst $LAN flowid $LAN_QUEUE

### Inet packets to INET_QUEUE
$FILTER $ROOT_QUEUE prio 2 u32 match ip dst $ANY flowid $INET_QUEUE


# ### High TOS goes to interactive.
$FILTER $INET_QUEUE prio 3 u32 match ip tos 0x10 0xff  flowid $INET_INTERACTIVE_QUEUE

# ICMP (ip protocol 1) in the interactive class 1:10 so we 
# can do measurements & impress our friends:
$FILTER $INET_QUEUE protocol ip prio 4 u32 match ip protocol 1 0xff flowid $INET_INTERACTIVE_QUEUE

# # To speed up downloads while an upload is going on, put ACK packets in
# # the interactive class:
$FILTER $INET_QUEUE prio 5 u32 \
    match ip protocol 6 0xff \
    match u8 0x05 0x0f at 0 \
    match u16 0x0000 0xffc0 at 2 \
    match u8 0x10 0xff at 33 \
    flowid $INET_INTERACTIVE_QUEUE

# ### Send rest of the packets to INET_DEFUALT_QUEUE
$FILTER $INET_QUEUE prio 6 u32 match ip dst $ANY flowid $INET_DEFAULT_QUEUE
 
 
# ### HTTP Traffic to HTTP Queue ###
$FILTER $INET_DEFAULT_QUEUE prio 7 u32 match ip sport $HTTP	0xffff flowid $INET_HTTP_QUEUE

 
# ### Inet unclassified traffic ###
$FILTER $INET_DEFAULT_QUEUE prio 8 u32 match ip dst $ANY flowid $INET_UNCLASSIFIED
