#LyX 1.3 created this file. For more info see http://www.lyx.org/
\lyxformat 221
\textclass report
\begin_preamble
\input{preamble}
\end_preamble
\language english
\inputencoding auto
\fontscheme times
\graphics default
\paperfontsize 11
\spacing double
\papersize letterpaper
\paperpackage a4
\use_geometry 1
\use_amsmath 1
\use_natbib 1
\use_numerical_citations 1
\paperorientation portrait
\leftmargin 1.5in
\topmargin 0.9in
\rightmargin 1in
\bottommargin 1in
\headsep 0.17in
\footskip 0in
\secnumdepth 4
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle fancy
\layout Chapter
Technique for Multiple Path Routing
\layout Standard
\begin_inset ERT
status Collapsed
\layout Standard
\backslash
thispagestyle{empty}
\end_inset
\begin_inset ERT
status Collapsed
\layout Standard
\backslash
renewcommand
\backslash
figurename{Fig.}
\end_inset
\layout Standard
This section represents the discoveries using the User Mode Linux frame
work.
The main goal is to set up the Linux kernel to do multi-path routing, where
the kernel alternates the intermediate destination of the packet but has
the same final destination.
The Intermediate computer (proxies or gateways) sends the packet to the
correct destination.
Bottom line, setting up a system where there are multiple paths to the
destination.
\layout Standard
Within the Linux kernel, the multi-path enhancements are able to send alternate
the packets to different intermediate destinations.
For example in Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{fig:Simple-web-request}
\end_inset
, 10 packets are in a simple HTTP request: six packets send from the client
and four return packets from the server.
If there are three gateways, the first gateway receives two packets (packets
one and seven); second gateway receives two packets (packets three and
eight) and; the third receives the remaining two packets (packets four
and ten).
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Graphics
filename Figures/04simpleWeb.eps
display none
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig:Simple-web-request}
\end_inset
Simple web request (left) and using multi-path routing (right)
\end_inset
\layout Standard
The ten packets transmitted are spread over the three proxies.
This is multi-path routing.
Multi-path routing the ability to spread the packet load between multiple
intermediate proxies or gateways so that the destination server does not
know about the intermediate gateways or routers.
Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{fig:Small-network-with}
\end_inset
is an illustration of Multi-path routing.
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Graphics
filename Figures/06IpTunnelingThroughProxies.sxd.eps
display none
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig:Small-network-with}
\end_inset
Small network with the first IP header removed after proxy
\end_inset
\layout Standard
To follow all the standards for IP (Internet Protocol), the multi-path modificat
ions to the IP header are encapsulated in another IP header.
This technique of having two IP headers is called IP tunneling.
Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{fig:IP-tunnel-packet}
\end_inset
shows a modified IP tunnel header used to route the packets.
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Graphics
filename Figures/05IpTunnelHeader.eps
display none
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig:IP-tunnel-packet}
\end_inset
IP tunnel packet header
\end_inset
\layout Standard
Four modifications were made to the individual Linux machines and to the
actual kernel to achieve multi-path routing.
The changes include: creating an IP tunnels to interface with the kernel
changes, modifying to the destination entry in the Linux kernel, and packet
buffering the incoming TCP packets.
\layout Section
Iproute2 to create IP tunnels
\begin_inset LatexCommand \label{sec:Iproute2-to-create}
\end_inset
\layout Standard
IP Tunneling is taking the packet and wrapping it with an additional IP
Header, so the packet has two IP Headers.
Generally the first IP header goes to the first packet destination; the
encapsulated header is the final destination.
\layout Standard
The main advantage to IP tunneling is hiding the packet's intermediate sender.
For this project when the packet is received by an intermediate computer
(proxy or gateway), the outer IP header is removed.
The intermediate computer removes the first IP header and forwards the
packet to the destination (according to the remaining IP header).
The remaining packet is repackaged with a new Ethernet frame and sent.
\layout Standard
Creating IP tunnels is not trivial, at first.
IP Tunnels needs to be turned on in the kernel.
The option is under the "network option" in the config menu (or .config
file).
If the IP Tunnel option is not turned on, an error messages like the ones
shown in Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{fig:IP-error messages}
\end_inset
will appear.
If this error appears, check the kernel options and make sure that IP Tunnel
is selected.
Most Linux distributions have IP tunnel turned on as a module.
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\layout Standard
\paragraph_spacing single
ioctl: No such device
\layout Standard
\paragraph_spacing single
SIOCSIFADDR: No such device
\layout Standard
\paragraph_spacing single
tunl1: unknown interface: No such device
\layout Standard
\paragraph_spacing single
SIOCSIFNETMASK: No such device
\layout Standard
\paragraph_spacing single
SIOCSIFDSTADDR: No such device
\end_inset
|
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig:IP-error messages}
\end_inset
IP tunnel error messages
\end_inset
\layout Standard
There are three commands used to setup IP Tunnel
\begin_inset LatexCommand \citep{Cai2004}
\end_inset
:
\begin_inset Quotes eld
\end_inset
ifconfig
\begin_inset Quotes erd
\end_inset
,
\begin_inset Quotes eld
\end_inset
ip route
\begin_inset Quotes erd
\end_inset
and
\begin_inset Quotes eld
\end_inset
ip tunnel
\begin_inset Quotes erd
\end_inset
.
\begin_inset Quotes eld
\end_inset
ip route
\begin_inset Quotes erd
\end_inset
and
\begin_inset Quotes eld
\end_inset
ip tunnel
\begin_inset Quotes erd
\end_inset
are part of the iproute2 suite.
The iproute2 suite of utilities was designed to replace the
\begin_inset Quotes eld
\end_inset
route
\begin_inset Quotes erd
\end_inset
command.
Many technical websites state conversion is going along quick because the
adaption of the new
\begin_inset Quotes eld
\end_inset
ip route
\begin_inset Quotes erd
\end_inset
.
The
\begin_inset Quotes eld
\end_inset
route
\begin_inset Quotes erd
\end_inset
command has the routing information laid out differently and using
\begin_inset Quotes eld
\end_inset
ip route
\begin_inset Quotes erd
\end_inset
takes some adjustments.
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\layout Standard
\paragraph_spacing single
\align left
> ip tunnel add tunl1 mode ipip remote 172.31.0.172 dev eth0
\newline
> ifconfig tunl1 172.31.0.169 netmask 255.255.255.255 pointopoint 172.31.0.172 up
\newline
\SpecialChar ~
\end_inset
|
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig:IP tunnel commands}
\end_inset
IP tunnel commands
\end_inset
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Graphics
filename Figures/07TwoCompEstATun.eps
display none
\end_inset
\layout Caption
\begin_inset LatexCommand \label{Fig:Two computers establishing a tunnel}
\end_inset
Two computers establishing a tunnel
\end_inset
The commands in Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{fig:IP tunnel commands}
\end_inset
are the commands needed to setup an IP Tunnel between 172.31.0.169 (client)
and 172.31.0.172 (proxy or gateway).
This establishes the tunnel and creates a device driver.
Packets are encapsulated with an additional IP header (as shown in Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{Fig:Two computers establishing a tunnel}
\end_inset
).
The routing table is updated to inform the kernel where packets are heading
and if the packets need to be routed through a tunnel.
Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{fig:command routing table IP tunnel}
\end_inset
is the command to update the routing table to use the IP tunnel.
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\layout Standard
\paragraph_spacing single
> ip route add 172.31.0.197 dev tunl1
\end_inset
|
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig:command routing table IP tunnel}
\end_inset
Command to update routing table for ip tunnelling
\end_inset
\layout Section
Changing the Linux network device driver
\begin_inset LatexCommand \label{sec:Changing-the-Linux}
\end_inset
\layout Standard
Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{fig:Small-network-with}
\end_inset
shows how the packets are sent to an intermediate proxy (or gateway).
The standard direct connections go through the device eth0; the packets
destined for an intermediate machine through an IP tunnel are sent to device
tunl1.
The multipath routing takes advantage of using the INET's underlying device
drivers.
The modifications to the INET code alternates the IP tunnel addresses.
To make the multi-path scheme work, each outgoing packet is sent to different
tunnel device (e.g., tunl1, tunl2, tunl3, tunl4, and tunl5).
Selecting which packet goes to which tunnel device is done in the Linux
kernel in the code handling the IP header
\begin_inset LatexCommand \citep{Cai2004a}
\end_inset
.
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Graphics
filename Figures/08LinuxKernelwithmultiplenetworkdevices.eps
display none
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig:Linux kernel with multiple network devices}
\end_inset
Linux kernel with multiple network devices
\end_inset
\layout Standard
The Linux kernel receives a packet and uses pointers to the headers, and
payload stored in a structure called sk_buff.
There is a socket for each connection called an INET socket and another
overseer type socket, called a BSD socket as shown Fig\SpecialChar ~
\begin_inset LatexCommand \ref{fig:Linux kernel with multiple network devices}
\end_inset
.
The differences between the INET and BSD socket are talked about in detail
in Appendix D.
The INET socket which is responsible for the connection and has routing
information for the IP and Ethernet headers.
This information is stored in a structure called the dst_entry.
\layout Standard
The dst_entry is complex.
It is part of a bigger structure, called rtable as shown in Fig\SpecialChar ~
\begin_inset LatexCommand \ref{fig:TCP-routing-and}
\end_inset
.
Rtable stands for
\begin_inset Quotes eld
\end_inset
routing tables
\begin_inset Quotes erd
\end_inset
.
These routing tables structures work with the computer's routing table
to communicate the packet's destination and correct header and device informati
on.
Each time a packet is sent, the INET socket's dst_entry is consulted to
determine the correct header information.
The INET socket also contains the engine maintaining the SEQ and ACK numbers
for the connection stored in the tp_pinfo structure.
The dst_entry's settings for a direct connection uses the eth0 (Ethernet)
network device.
And for an IP Tunnel, the dst_entry uses the tunl (IP Tunnel) network device.
\layout Standard
Since the dst_entry is so complex, the kernel modifications relies on values
being set in the routing tables.
Actual modifications are not done to the dst_entry.
If the destination of the packet is not routed through the tunnel device
in the routing table and the multi-path routing kernel modifications are
activated, the kernel will try to route a packet with a dst_entry set for
a direct connect oppose to IP tunnel.
This will confuse the kernel and cause it to crash.
The information from the routing tables stored in the dst_entry and the
way the kernel uses this information should match.
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Graphics
filename Figures/09TCProutingandsocketstructures.eps
display none
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig:TCP-routing-and}
\end_inset
TCP routing and socket structure
\end_inset
\layout Section
Packet buffering
\begin_inset LatexCommand \label{sec:Packet-buffering}
\end_inset
\layout Standard
The Linux kernel stores outbound packets in a queue before flushing the
network device.
Multi-path routing uses multiple network devices and causes packets to
arrive out of order.
If one or multiple packets get delayed and the packet arrive out of order,
the TCP protocol sends another acknowledgment requesting a retransmission
of the delayed packet.
If this happens three times, the packet window is set to zero.
This poses a problem and is a major hit on performance.
\layout Standard
A solution to out of order packets is to queue the arriving packets and
wait for the delayed packet.
This packet buffering is done using the INET socket.
The INET socket is connection based, so there is one INET socket per connection
and is a structure containing information about the connection (e.g,.
sequence number).
\layout Standard
When the packet is queued, it is placed on the buffer in order of the sequence
number (earliest sequence number are closest to the head) and packets with
duplicate sequence numbers are removed.
When the packet with the correct sequence number arrives, the packets are
fed to the TCP processing code, one packet at a time.
The INET code stores the next expected sequence number in the ip_option.
If the next packet on the queue does not match what is expected, the buffering
continues.
\layout Standard
If the packet is lost, the expected packet will never arrive.
There are two solutions for missing packet.
The TCP timer will time out and send another acknowledgment requesting
the packet.
Another solution is limit the size of the buffer.
If the buffer size becomes greater than a given threshold, the packets
are processed as though the buffer did not exist and the TCP engine would
send another acknowledgment.
\layout Standard
To control the size of the buffer and various parameters of the multi-path
routing in the kernel, the proc file system is used to communicate with
the kernel from the application level.
\layout Section
Utilizing the Proc File System
\begin_inset LatexCommand \label{sec:Utilizing-the-Proc}
\end_inset
\layout Standard
The Linux proc file system has one purpose, to communicate information between
the Kernel and the user to fine tune the Kernel's performance.
The proc file system is not stored on the hard drive but is entirely in
memory and starts and disappears with the Kernel.
At startup the kernel populates the proc file system and mounts it to a
directory for the user and applications to have access.
For example, the IP routing table use the proc to communicate the gateway
and dev information needed to route incoming and outgoing packets properly.
When the command
\begin_inset Quotes eld
\end_inset
route
\begin_inset Quotes erd
\end_inset
is executed, the ārouteā program displays a file in the proc file system,
/proc/net/route, to the screen.
The route command just makes the contents of this file look more eye appeasing
to the user.
\layout Standard
This project uses the proc file system
\begin_inset LatexCommand \citep{Mouw2001}
\end_inset
to turn off and on the multipath routing and control other variables used
for scold loging and buffering.
Within the Linux code, a proc directory can be created in the /proc using
the command
\begin_inset Quotes eld
\end_inset
proc_mkdir.
\begin_inset Quotes erd
\end_inset
Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{cap:Kernel-code-for a proc}
\end_inset
is the code to make a proc directory and populate an entry.
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\layout Standard
\paragraph_spacing single
\align left
#define MAXDATALEN 20
\newline
char bufferOnVal[MAXDATALEN + 1];
\newline
static int initScoldProc(void){
\layout Standard
\paragraph_spacing single
\align left
\SpecialChar ~
\SpecialChar ~
// creates the directory in the proc file system under /proc/sys/net/ipv4/mulipa
th
\newline
\SpecialChar ~
\SpecialChar ~
multiPathDir = proc_mkdir("sys/net/ipv4/multipath", NULL);
\newline
\SpecialChar ~
\SpecialChar ~
// creates a proc entry /proc/sys/net/ipv4/multpath/bufferOn
\newline
\SpecialChar ~
\SpecialChar ~
bufferOnProc = create_proc_entry("bufferOn", 0644, multiPathDir);
\newline
\SpecialChar ~
\SpecialChar ~
// sets the proc struct to use the following functions read, and write
\newline
\SpecialChar ~
\SpecialChar ~
// and sets the data value to char array, bufferOnVal.
\newline
\SpecialChar ~
\SpecialChar ~
bufferOnProc->data = bufferOnVal;
\newline
\SpecialChar ~
\SpecialChar ~
bufferOnProc->read_proc = procReadBufferOn;
\newline
\SpecialChar ~
\SpecialChar ~
bufferOnProc->write_proc = procWriteBufferOn;
\newline
}
\end_inset
|
\end_inset
\layout Caption
\begin_inset LatexCommand \label{cap:Kernel-code-for a proc}
\end_inset
Kernel code for a proc file system entry
\end_inset
\layout Standard
Towards the end, pointers to the functions
\begin_inset Quotes eld
\end_inset
procReadBufferOn
\begin_inset Quotes erd
\end_inset
and
\begin_inset Quotes eld
\end_inset
procWriteBufferOn
\begin_inset Quotes erd
\end_inset
are set the
\begin_inset Quotes eld
\end_inset
read_proc
\begin_inset Quotes erd
\end_inset
and
\begin_inset Quotes eld
\end_inset
write_proc.
\begin_inset Quotes erd
\end_inset
These methods are shown in the next frame.
The file system has an API for developers to use the proc file system.
Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{fig:proc read and write method}
\end_inset
shows the two functions pass in for read and write.
These functions read in a pointer
\begin_inset Quotes eld
\end_inset
data
\begin_inset Quotes erd
\end_inset
and and type casts the value so the user can easily have read and write
access to the data.
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\layout Standard
\paragraph_spacing single
\align left
static int procWriteBufferOn(struct file *file, const char *buffer, unsigned
long count, void *data)
\newline
{
\newline
\SpecialChar ~
\SpecialChar ~
int len; char * inData = (char*) data;
\newline
\SpecialChar ~
\SpecialChar ~
if (count > MAXDATALEN) {
\newline
\SpecialChar ~
\SpecialChar ~
len = MAXDATALEN;
\newline
\SpecialChar ~
\SpecialChar ~
} else{
\newline
\SpecialChar ~
\SpecialChar ~
\SpecialChar ~
\SpecialChar ~
len = count;
\newline
\SpecialChar ~
\SpecialChar ~
}
\newline
\SpecialChar ~
\SpecialChar ~
// retrieve data from user
\newline
\SpecialChar ~
\SpecialChar ~
if (copy_from_user(inData, buffer, len)) {
\newline
\SpecialChar ~
\SpecialChar ~
\SpecialChar ~
\SpecialChar ~
return -EFAULT;
\newline
\SpecialChar ~
\SpecialChar ~
}
\newline
\SpecialChar ~
\SpecialChar ~
// write data to variable
\newline
\SpecialChar ~
\SpecialChar ~
inData[len] = '
\backslash
0';
\newline
\SpecialChar ~
\SpecialChar ~
sscanf(inData, "%d", &bufferOn);
\newline
\SpecialChar ~
\SpecialChar ~
//printk (KERN_CRIT "bufferOn: %d
\backslash
n", bufferOn);
\newline
\SpecialChar ~
\SpecialChar ~
return len;
\newline
}
\layout Standard
\paragraph_spacing single
\align left
static int procReadBufferOn(char *page, char ** start, off_t off, int count,
int *eof, void *data){
\newline
\SpecialChar ~
\SpecialChar ~
int len;
\newline
\SpecialChar ~
\SpecialChar ~
char *outData = (char *) data;
\newline
\SpecialChar ~
\SpecialChar ~
len = sprintf (page, "%s", outData);
\newline
\SpecialChar ~
\SpecialChar ~
//printk(KERN_CRIT "Read bufferOn %d", bufferOn); return len;
\newline
}
\end_inset
|
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig:proc read and write method}
\end_inset
Kernel code for a proc read and write methods
\end_inset
\layout Standard
To use the proc values values at the application layer, a
\begin_inset Quotes eld
\end_inset
cat
\begin_inset Quotes erd
\end_inset
command can show the contents of a variable.
The proc value can be written to using
\begin_inset Quotes eld
\end_inset
echo
\begin_inset Quotes erd
\end_inset
with a redirection.
Two examples are shown in Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{fig: setting proc values}
\end_inset
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\layout Standard
\paragraph_spacing single
\align left
\SpecialChar ~
\newline
root@walrus:/proc/sys/net/ipv4/multipath# ls
\newline
bufferOn bufferSize
\newline
root@walrus:/proc/sys/net/ipv4/multipath# cat bufferOn
\newline
0
\newline
root@walrus:/proc/sys/net/ipv4/multipath# echo "1" > bufferOn
\newline
root@walrus:/proc/sys/net/ipv4/multipath# cat bufferOn
\newline
1
\newline
\SpecialChar ~
\end_inset
|
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig: setting proc values}
\end_inset
Setting proc values
\end_inset
\layout Section
Testing using TC bandwidth limiting
\begin_inset LatexCommand \label{sec:Testing-using-TC}
\end_inset
\layout Standard
Rate limiting is a condition needed to test the multi-path routing.
Tc is a tool used for maintaining traffic
\begin_inset LatexCommand \citep{Devera2002}
\end_inset
; it is an interface to the IP chains in the kernel.
Of the different types of command line interfaces to IP chains, and tc
seems to be the easiest to set up.
The tc utility can be downloaded from the maintainers' website
\begin_inset LatexCommand \citep{Huberta}
\end_inset
and is included in newer version of Iproute2 (the software used to setup
the IP Tunnels)
\begin_inset LatexCommand \citep{Echantillac2004}
\end_inset
.
\layout Standard
The tc utility works per device.
Each device can be assigned a total bandwidth.
The bandwidth can also be partition between different outgoing IP address
using qdiscs.
For example, eth0 (default Ethernet device driver) is set to two different
destinations 128.198.60.172 and 128.198.60.173.
The total bandwidth for eth0 is 1024 kb/s.
The total bandwidth can be partitioned into a qdisc based on destination
address.
For this example, there is a one to two ratio used for the two classes.
So the qdisc with packets outbound to 128.198.60.172 (341 kbit/sec) has twice
bandwidth as the qdisc with packets bounded to 128.198.60.173 (683 kbit/sec).
\layout Standard
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\layout Standard
\paragraph_spacing single
\align left
tc qdisc add dev eth0 root handle 1: htb default 12
\newline
tc class add dev eth0 parent 1: classid 1:1 htb rate $maxSpeed ceil $maxSpeed
\newline
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 341kbps speed ceil
1024kbps speed
\newline
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 683kbps speed ceil
1024kbps speed
\newline
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 1024kbps speed ceil
1024kbps speed
\newline
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 128.198.60.17
2 ip flowid 1:10
\newline
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 128.198.60.17
3 ip flowid 1:11
\newline
\SpecialChar ~
\end_inset
|
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig:setting up tc qdisc to limit bandwidth}
\end_inset
Setting up tc qdisc to limit bandwidth
\end_inset
\layout Standard
The Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{fig:setting up tc qdisc to limit bandwidth}
\end_inset
shows the commands to set up the rate limiting using tc's qdiscs.
There are three sets of commands: set up the root for the eth0, set up
each class, and setup each filter.
\layout Standard
Finally there are additional kernel requirements when setting up the qc
utility.
Accroding the tc utilities' website
\begin_inset LatexCommand \citep{Huberta}
\end_inset
, the following QoS (Quality of Service) kernel options need to be set.
These QoS kernel options are listed in Fig.\SpecialChar ~
\begin_inset LatexCommand \ref{fig:Kernel options needed for tc to run}
\end_inset
\layout Standard
\paragraph_spacing single
\align left
\begin_inset Float figure
placement H
wide false
collapsed false
\layout Standard
\align center
\begin_inset Tabular
\begin_inset Text
\layout Standard
\paragraph_spacing single
\align left
#
\newline
# QoS and/or fair queueing
\newline
#
\newline
CONFIG_NET_SCHED=y
\newline
CONFIG_NET_SCH_CBQ=m
\newline
CONFIG_NET_SCH_HTB=m
\newline
CONFIG_NET_SCH_CSZ=m
\newline
CONFIG_NET_SCH_PRIO=m
\newline
CONFIG_NET_SCH_RED=m
\newline
CONFIG_NET_SCH_SFQ=m
\newline
CONFIG_NET_SCH_TEQL=m
\newline
CONFIG_NET_SCH_TBF=m
\newline
CONFIG_NET_SCH_GRED=m
\newline
\end_inset
|
\begin_inset Text
\layout Standard
\paragraph_spacing single
\align left
CONFIG_NET_SCH_DSMARK=m
\newline
CONFIG_NET_SCH_INGRESS=m
\newline
CONFIG_NET_QOS=y
\newline
CONFIG_NET_ESTIMATOR=y
\newline
CONFIG_NET_CLS=y
\newline
CONFIG_NET_CLS_TCINDEX=m
\newline
CONFIG_NET_CLS_ROUTE4=m
\newline
CONFIG_NET_CLS_ROUTE=y
\newline
CONFIG_NET_CLS_FW=m
\newline
CONFIG_NET_CLS_U32=m
\newline
CONFIG_NET_CLS_RSVP=m
\newline
CONFIG_NET_CLS_RSVP6=m
\newline
CONFIG_NET_CLS_POLICE=y
\newline
\end_inset
|
\end_inset
\layout Caption
\begin_inset LatexCommand \label{fig:Kernel options needed for tc to run}
\end_inset
Kernel options needed for tc to run
\end_inset
\the_end