Measuring Tools and Scripts » History » Version 3

Cuadro, Juan Pablo, 12/14/2014 03:07 AM

1 3 Cuadro, Juan Pablo
h1. Measuring Tools
2 1 Cuadro, Juan Pablo
3 3 Cuadro, Juan Pablo
h2. EL470
4 1 Cuadro, Juan Pablo
5 2 Cuadro, Juan Pablo
The Newtec EL470 versions that Telecom Bretagne owns have no protocol testing capabilities. However, when in ACM mode, the ACM controller (the HUB) keeps a log file containing the modulation and coding schemes as well as bitrate and Es/N0 estimates . This is information is stored in a .csv file containing the following:
6 1 Cuadro, Juan Pablo
7 1 Cuadro, Juan Pablo
<pre>
8 1 Cuadro, Juan Pablo
Timestamp,Demod,RqModCod,EsNo,CarrierBitrate
9 2 Cuadro, Juan Pablo
2014-12-12 15:05:19,1,16APSK-2/3,11.20,1445835
10 2 Cuadro, Juan Pablo
2014-12-12 15:05:24,1,16APSK-2/3,10.72,1324072
11 2 Cuadro, Juan Pablo
2014-12-12 15:05:28,1,16APSK-2/3,10.61,1324072
12 2 Cuadro, Juan Pablo
2014-12-12 15:05:31,1,16APSK-2/3,10.66,1324072
13 2 Cuadro, Juan Pablo
2014-12-12 15:05:34,1,8PSK-3/4,10.19,1313479
14 2 Cuadro, Juan Pablo
2014-12-12 15:05:37,1,8PSK-3/4,11.87,1313479
15 2 Cuadro, Juan Pablo
2014-12-12 15:05:41,1,8PSK-3/4,10.40,1313479
16 2 Cuadro, Juan Pablo
2014-12-12 15:06:47,1,QPSK-5/6,6.93,884389
17 2 Cuadro, Juan Pablo
2014-12-12 15:06:51,1,QPSK-5/6,8.18,884389
18 2 Cuadro, Juan Pablo
2014-12-12 15:06:56,1,QPSK-5/6,7.02,825503
19 1 Cuadro, Juan Pablo
</pre>
20 1 Cuadro, Juan Pablo
21 2 Cuadro, Juan Pablo
It is unclear though what the logging frequency is. We have determined that this rate depends on the rate at which Es/N0 estimates change. From the csv file we can extract the following information:
22 1 Cuadro, Juan Pablo
23 1 Cuadro, Juan Pablo
* Timestamp (in seconds)
24 1 Cuadro, Juan Pablo
* Modcod parameter (modulation + coding rate)
25 1 Cuadro, Juan Pablo
* Estimate of E ~s~ / N ~0~
26 1 Cuadro, Juan Pablo
* Information bitrate (in bps)
27 1 Cuadro, Juan Pablo
28 1 Cuadro, Juan Pablo
h2. Traffic generation and capture
29 1 Cuadro, Juan Pablo
30 3 Cuadro, Juan Pablo
In order to measure performance at the application level we will use _Iperf_. _Iperf_ is a tool to generate streams of TCP and UDP traffic as well as measuring throughput and other statistics. It has a client and server functionality, and can measure the throughput between the two ends. In order to have a finer control over the values obtained, we will capture all traffic using _tcpdump_ and perform an offline calculation of throughput using pcaptput.py.
31 3 Cuadro, Juan Pablo
32 3 Cuadro, Juan Pablo
notice. We will generate a UDP data stream in order to test throughput.
33 3 Cuadro, Juan Pablo
34 3 Cuadro, Juan Pablo
To setup Iperf we will have to launch it on both the HUB PC (as client) and Station PC (as server). Since the HUB PC will be the one sending packets it has to be setup as a server. Likewise, the Station PC must be setup as a server.
35 3 Cuadro, Juan Pablo
36 3 Cuadro, Juan Pablo
<pre><code class="Terminal">
37 3 Cuadro, Juan Pablo
# STATION PC LISTENING ON PORT 5201
38 3 Cuadro, Juan Pablo
39 3 Cuadro, Juan Pablo
$ iperf -s -u -i1 -p 5201
40 3 Cuadro, Juan Pablo
------------------------------------------------------------
41 3 Cuadro, Juan Pablo
Server listening on UDP port 5201
42 3 Cuadro, Juan Pablo
Receiving 1470 byte datagrams
43 3 Cuadro, Juan Pablo
UDP buffer size:  192 KByte (default)
44 3 Cuadro, Juan Pablo
------------------------------------------------------------
45 3 Cuadro, Juan Pablo
</code></pre>
46 3 Cuadro, Juan Pablo
47 3 Cuadro, Juan Pablo
<pre><code class="Terminal">
48 3 Cuadro, Juan Pablo
# HUB PC STARTS UDP DATA STREAM DES_PORT = 5201
49 3 Cuadro, Juan Pablo
50 3 Cuadro, Juan Pablo
$ iperf -c 10.0.0.130 -u -t <duration in secs> -b <bandwidth> -l <udp size> -p 5201
51 3 Cuadro, Juan Pablo
------------------------------------------------------------
52 3 Cuadro, Juan Pablo
Client connecting to 10.0.0.130, UDP port 5201
53 3 Cuadro, Juan Pablo
Sending <udp size>  byte datagrams
54 3 Cuadro, Juan Pablo
UDP buffer size: 9.00 KByte (default)
55 3 Cuadro, Juan Pablo
------------------------------------------------------------
56 3 Cuadro, Juan Pablo
</code></pre>
57 3 Cuadro, Juan Pablo
58 3 Cuadro, Juan Pablo
At the same time the Station PC must capture all incoming traffic, we will use the following command:
59 3 Cuadro, Juan Pablo
60 3 Cuadro, Juan Pablo
<pre><code class="Terminal">
61 3 Cuadro, Juan Pablo
# CAPTURE INCOMING TRAFFIC
62 3 Cuadro, Juan Pablo
$ tcpdump -w output_file_name.pcap
63 3 Cuadro, Juan Pablo
</code></pre>
64 3 Cuadro, Juan Pablo
65 3 Cuadro, Juan Pablo
h1. Scripts
66 3 Cuadro, Juan Pablo
67 3 Cuadro, Juan Pablo
In order to process obtained data we have created multiple scripts to parse and display results. Please download (), inside you will find measurements taken in the course of this project as well as well as the follwoing scripts:
68 3 Cuadro, Juan Pablo
69 3 Cuadro, Juan Pablo
* *pcaptput.py* : Calculates throughput metrics from .pcap file.
70 3 Cuadro, Juan Pablo
* *bulk_pcaptput* : Bash script to run pcaptput.py on all data and generate .tput files.
71 3 Cuadro, Juan Pablo
* *ConsolidateRun.m* : MATLAB class to import and consolidate .pcap as well as .tput data.
72 3 Cuadro, Juan Pablo
* *bulk_consolidate_results.m* : MATLAB script to generate all graphs in this wiki.
73 3 Cuadro, Juan Pablo
74 3 Cuadro, Juan Pablo
There is also README for further clarification.
75 3 Cuadro, Juan Pablo
 
76 3 Cuadro, Juan Pablo
h2. pcaptput.py
77 3 Cuadro, Juan Pablo
78 3 Cuadro, Juan Pablo
_pcaptput.py_ is a small python script we wrote in order to calculate application (UDP) throughput  as well as layer 3 end-to-end throughput considering only IP packets (header + payload). It uses the "dpkt":http://code.google.com/p/dpkt/. library which is a "fast, simple packet creation / parsing, with definitions for the basic TCP/IP protocols" Python library. 
79 3 Cuadro, Juan Pablo
80 3 Cuadro, Juan Pablo
<pre><code class="Python">
81 3 Cuadro, Juan Pablo
#!/usr/bin/python2.6
82 3 Cuadro, Juan Pablo
83 3 Cuadro, Juan Pablo
# pcaptput.py
84 3 Cuadro, Juan Pablo
85 3 Cuadro, Juan Pablo
import sys, dpkt
86 3 Cuadro, Juan Pablo
if len(sys.argv) != 2:
87 3 Cuadro, Juan Pablo
	raise ValueError('.pcap file needs to be specified.')
88 3 Cuadro, Juan Pablo
89 3 Cuadro, Juan Pablo
filename = sys.argv[1];
90 3 Cuadro, Juan Pablo
udpPort = 5201
91 3 Cuadro, Juan Pablo
tRes = 1
92 3 Cuadro, Juan Pablo
periodn = 0
93 3 Cuadro, Juan Pablo
baseTimeStamp = 0
94 3 Cuadro, Juan Pablo
iter = 0
95 3 Cuadro, Juan Pablo
# Total IP packet counter
96 3 Cuadro, Juan Pablo
ipBitCount = 0
97 3 Cuadro, Juan Pablo
# UDP payload counter
98 3 Cuadro, Juan Pablo
udpBitCount = 0
99 3 Cuadro, Juan Pablo
print 'Time[s]', 'IP-Throughput[bps]', 'UDP-Throughput[bps]'
100 3 Cuadro, Juan Pablo
for timeStamp, buf in dpkt.pcap.Reader(open(filename, 'r')):
101 3 Cuadro, Juan Pablo
	iter += 1
102 3 Cuadro, Juan Pablo
	if iter == 1:
103 3 Cuadro, Juan Pablo
		baseTimeStamp = timeStamp
104 3 Cuadro, Juan Pablo
	# Get ethernet frame
105 3 Cuadro, Juan Pablo
	eth = dpkt.ethernet.Ethernet(buf)
106 3 Cuadro, Juan Pablo
	# Check for pure IP traffic only (no ARP packets)
107 3 Cuadro, Juan Pablo
	if type(eth.data) != dpkt.ip.IP:
108 3 Cuadro, Juan Pablo
		continue
109 3 Cuadro, Juan Pablo
	ip = eth.data
110 3 Cuadro, Juan Pablo
	ts = timeStamp - baseTimeStamp
111 3 Cuadro, Juan Pablo
	# Histogram bins
112 3 Cuadro, Juan Pablo
	if ts >= periodn * tRes:
113 3 Cuadro, Juan Pablo
		print periodn * tRes, ipBitCount / tRes, udpBitCount / tRes
114 3 Cuadro, Juan Pablo
		periodn += 1
115 3 Cuadro, Juan Pablo
		udpBitCount = 0
116 3 Cuadro, Juan Pablo
		ipBitCount = 0
117 3 Cuadro, Juan Pablo
	# Counters
118 3 Cuadro, Juan Pablo
	ipBitCount += ip.len * 8
119 3 Cuadro, Juan Pablo
	if isinstance(ip.data, dpkt.udp.UDP) and (udpPort == ip.data.dport):
120 3 Cuadro, Juan Pablo
		udpBitCount += ip.data.ulen * 8
121 3 Cuadro, Juan Pablo
</code></pre>
122 3 Cuadro, Juan Pablo
123 3 Cuadro, Juan Pablo
Usage is as follows:
124 3 Cuadro, Juan Pablo
125 3 Cuadro, Juan Pablo
<pre><code class="Terminal">
126 3 Cuadro, Juan Pablo
$ ./pcaptput.py input.pcap > output.tput
127 3 Cuadro, Juan Pablo
</code></pre>
128 3 Cuadro, Juan Pablo
129 3 Cuadro, Juan Pablo
<pre><code class="Terminal">
130 3 Cuadro, Juan Pablo
Time[s] IP-Throughput[bps] UDP-Throughput[bps]
131 3 Cuadro, Juan Pablo
0 0 0
132 3 Cuadro, Juan Pablo
1 4688 0
133 3 Cuadro, Juan Pablo
2 3984 96
134 3 Cuadro, Juan Pablo
3 754720 742944
135 3 Cuadro, Juan Pablo
4 775552 763872
136 3 Cuadro, Juan Pablo
5 860544 847584
137 3 Cuadro, Juan Pablo
6 903040 889440
138 3 Cuadro, Juan Pablo
7 1019904 1004544
139 3 Cuadro, Juan Pablo
8 1083648 1067328
140 3 Cuadro, Juan Pablo
9 1221760 1203360
141 3 Cuadro, Juan Pablo
10 1296128 1276608
142 3 Cuadro, Juan Pablo
11 903040 889440
143 3 Cuadro, Juan Pablo
12 764928 753408
144 3 Cuadro, Juan Pablo
13 807424 795264
145 3 Cuadro, Juan Pablo
14 860544 847584
146 3 Cuadro, Juan Pablo
15 956160 941760
147 3 Cuadro, Juan Pablo
16 988032 973152
148 3 Cuadro, Juan Pablo
</code></pre>
149 3 Cuadro, Juan Pablo
150 3 Cuadro, Juan Pablo
Which leads to the following output: