Measuring Tools and Scripts » History » Version 4

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

1 3 Cuadro, Juan Pablo
h1. Measuring Tools
2 1 Cuadro, Juan Pablo
3 4 Cuadro, Juan Pablo
-----
4 4 Cuadro, Juan Pablo
5 3 Cuadro, Juan Pablo
h2. EL470
6 1 Cuadro, Juan Pablo
7 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:
8 1 Cuadro, Juan Pablo
9 1 Cuadro, Juan Pablo
<pre>
10 1 Cuadro, Juan Pablo
Timestamp,Demod,RqModCod,EsNo,CarrierBitrate
11 2 Cuadro, Juan Pablo
2014-12-12 15:05:19,1,16APSK-2/3,11.20,1445835
12 2 Cuadro, Juan Pablo
2014-12-12 15:05:24,1,16APSK-2/3,10.72,1324072
13 2 Cuadro, Juan Pablo
2014-12-12 15:05:28,1,16APSK-2/3,10.61,1324072
14 2 Cuadro, Juan Pablo
2014-12-12 15:05:31,1,16APSK-2/3,10.66,1324072
15 2 Cuadro, Juan Pablo
2014-12-12 15:05:34,1,8PSK-3/4,10.19,1313479
16 2 Cuadro, Juan Pablo
2014-12-12 15:05:37,1,8PSK-3/4,11.87,1313479
17 2 Cuadro, Juan Pablo
2014-12-12 15:05:41,1,8PSK-3/4,10.40,1313479
18 2 Cuadro, Juan Pablo
2014-12-12 15:06:47,1,QPSK-5/6,6.93,884389
19 2 Cuadro, Juan Pablo
2014-12-12 15:06:51,1,QPSK-5/6,8.18,884389
20 2 Cuadro, Juan Pablo
2014-12-12 15:06:56,1,QPSK-5/6,7.02,825503
21 1 Cuadro, Juan Pablo
</pre>
22 1 Cuadro, Juan Pablo
23 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:
24 1 Cuadro, Juan Pablo
25 1 Cuadro, Juan Pablo
* Timestamp (in seconds)
26 1 Cuadro, Juan Pablo
* Modcod parameter (modulation + coding rate)
27 1 Cuadro, Juan Pablo
* Estimate of E ~s~ / N ~0~
28 1 Cuadro, Juan Pablo
* Information bitrate (in bps)
29 1 Cuadro, Juan Pablo
30 1 Cuadro, Juan Pablo
h2. Traffic generation and capture
31 1 Cuadro, Juan Pablo
32 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.
33 3 Cuadro, Juan Pablo
34 3 Cuadro, Juan Pablo
notice. We will generate a UDP data stream in order to test throughput.
35 3 Cuadro, Juan Pablo
36 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.
37 3 Cuadro, Juan Pablo
38 3 Cuadro, Juan Pablo
<pre><code class="Terminal">
39 3 Cuadro, Juan Pablo
# STATION PC LISTENING ON PORT 5201
40 3 Cuadro, Juan Pablo
41 3 Cuadro, Juan Pablo
$ iperf -s -u -i1 -p 5201
42 3 Cuadro, Juan Pablo
------------------------------------------------------------
43 3 Cuadro, Juan Pablo
Server listening on UDP port 5201
44 3 Cuadro, Juan Pablo
Receiving 1470 byte datagrams
45 3 Cuadro, Juan Pablo
UDP buffer size:  192 KByte (default)
46 3 Cuadro, Juan Pablo
------------------------------------------------------------
47 3 Cuadro, Juan Pablo
</code></pre>
48 3 Cuadro, Juan Pablo
49 3 Cuadro, Juan Pablo
<pre><code class="Terminal">
50 3 Cuadro, Juan Pablo
# HUB PC STARTS UDP DATA STREAM DES_PORT = 5201
51 3 Cuadro, Juan Pablo
52 3 Cuadro, Juan Pablo
$ iperf -c 10.0.0.130 -u -t <duration in secs> -b <bandwidth> -l <udp size> -p 5201
53 3 Cuadro, Juan Pablo
------------------------------------------------------------
54 3 Cuadro, Juan Pablo
Client connecting to 10.0.0.130, UDP port 5201
55 3 Cuadro, Juan Pablo
Sending <udp size>  byte datagrams
56 3 Cuadro, Juan Pablo
UDP buffer size: 9.00 KByte (default)
57 3 Cuadro, Juan Pablo
------------------------------------------------------------
58 3 Cuadro, Juan Pablo
</code></pre>
59 3 Cuadro, Juan Pablo
60 3 Cuadro, Juan Pablo
At the same time the Station PC must capture all incoming traffic, we will use the following command:
61 3 Cuadro, Juan Pablo
62 3 Cuadro, Juan Pablo
<pre><code class="Terminal">
63 3 Cuadro, Juan Pablo
# CAPTURE INCOMING TRAFFIC
64 3 Cuadro, Juan Pablo
$ tcpdump -w output_file_name.pcap
65 3 Cuadro, Juan Pablo
</code></pre>
66 3 Cuadro, Juan Pablo
67 3 Cuadro, Juan Pablo
h1. Scripts
68 4 Cuadro, Juan Pablo
69 4 Cuadro, Juan Pablo
-----
70 4 Cuadro, Juan Pablo
71 3 Cuadro, Juan Pablo
72 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:
73 3 Cuadro, Juan Pablo
74 3 Cuadro, Juan Pablo
* *pcaptput.py* : Calculates throughput metrics from .pcap file.
75 3 Cuadro, Juan Pablo
* *bulk_pcaptput* : Bash script to run pcaptput.py on all data and generate .tput files.
76 3 Cuadro, Juan Pablo
* *ConsolidateRun.m* : MATLAB class to import and consolidate .pcap as well as .tput data.
77 3 Cuadro, Juan Pablo
* *bulk_consolidate_results.m* : MATLAB script to generate all graphs in this wiki.
78 3 Cuadro, Juan Pablo
79 3 Cuadro, Juan Pablo
There is also README for further clarification.
80 3 Cuadro, Juan Pablo
 
81 3 Cuadro, Juan Pablo
h2. pcaptput.py
82 3 Cuadro, Juan Pablo
83 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. 
84 3 Cuadro, Juan Pablo
85 3 Cuadro, Juan Pablo
<pre><code class="Python">
86 3 Cuadro, Juan Pablo
#!/usr/bin/python2.6
87 3 Cuadro, Juan Pablo
88 3 Cuadro, Juan Pablo
# pcaptput.py
89 3 Cuadro, Juan Pablo
90 3 Cuadro, Juan Pablo
import sys, dpkt
91 3 Cuadro, Juan Pablo
if len(sys.argv) != 2:
92 3 Cuadro, Juan Pablo
	raise ValueError('.pcap file needs to be specified.')
93 3 Cuadro, Juan Pablo
94 3 Cuadro, Juan Pablo
filename = sys.argv[1];
95 3 Cuadro, Juan Pablo
udpPort = 5201
96 3 Cuadro, Juan Pablo
tRes = 1
97 3 Cuadro, Juan Pablo
periodn = 0
98 3 Cuadro, Juan Pablo
baseTimeStamp = 0
99 3 Cuadro, Juan Pablo
iter = 0
100 3 Cuadro, Juan Pablo
# Total IP packet counter
101 3 Cuadro, Juan Pablo
ipBitCount = 0
102 3 Cuadro, Juan Pablo
# UDP payload counter
103 3 Cuadro, Juan Pablo
udpBitCount = 0
104 3 Cuadro, Juan Pablo
print 'Time[s]', 'IP-Throughput[bps]', 'UDP-Throughput[bps]'
105 3 Cuadro, Juan Pablo
for timeStamp, buf in dpkt.pcap.Reader(open(filename, 'r')):
106 3 Cuadro, Juan Pablo
	iter += 1
107 3 Cuadro, Juan Pablo
	if iter == 1:
108 3 Cuadro, Juan Pablo
		baseTimeStamp = timeStamp
109 3 Cuadro, Juan Pablo
	# Get ethernet frame
110 3 Cuadro, Juan Pablo
	eth = dpkt.ethernet.Ethernet(buf)
111 3 Cuadro, Juan Pablo
	# Check for pure IP traffic only (no ARP packets)
112 3 Cuadro, Juan Pablo
	if type(eth.data) != dpkt.ip.IP:
113 3 Cuadro, Juan Pablo
		continue
114 3 Cuadro, Juan Pablo
	ip = eth.data
115 3 Cuadro, Juan Pablo
	ts = timeStamp - baseTimeStamp
116 3 Cuadro, Juan Pablo
	# Histogram bins
117 3 Cuadro, Juan Pablo
	if ts >= periodn * tRes:
118 3 Cuadro, Juan Pablo
		print periodn * tRes, ipBitCount / tRes, udpBitCount / tRes
119 3 Cuadro, Juan Pablo
		periodn += 1
120 3 Cuadro, Juan Pablo
		udpBitCount = 0
121 3 Cuadro, Juan Pablo
		ipBitCount = 0
122 3 Cuadro, Juan Pablo
	# Counters
123 3 Cuadro, Juan Pablo
	ipBitCount += ip.len * 8
124 3 Cuadro, Juan Pablo
	if isinstance(ip.data, dpkt.udp.UDP) and (udpPort == ip.data.dport):
125 3 Cuadro, Juan Pablo
		udpBitCount += ip.data.ulen * 8
126 3 Cuadro, Juan Pablo
</code></pre>
127 3 Cuadro, Juan Pablo
128 3 Cuadro, Juan Pablo
Usage is as follows:
129 3 Cuadro, Juan Pablo
130 3 Cuadro, Juan Pablo
<pre><code class="Terminal">
131 3 Cuadro, Juan Pablo
$ ./pcaptput.py input.pcap > output.tput
132 3 Cuadro, Juan Pablo
</code></pre>
133 3 Cuadro, Juan Pablo
134 3 Cuadro, Juan Pablo
<pre><code class="Terminal">
135 3 Cuadro, Juan Pablo
Time[s] IP-Throughput[bps] UDP-Throughput[bps]
136 3 Cuadro, Juan Pablo
0 0 0
137 3 Cuadro, Juan Pablo
1 4688 0
138 3 Cuadro, Juan Pablo
2 3984 96
139 3 Cuadro, Juan Pablo
3 754720 742944
140 3 Cuadro, Juan Pablo
4 775552 763872
141 3 Cuadro, Juan Pablo
5 860544 847584
142 3 Cuadro, Juan Pablo
6 903040 889440
143 3 Cuadro, Juan Pablo
7 1019904 1004544
144 3 Cuadro, Juan Pablo
8 1083648 1067328
145 3 Cuadro, Juan Pablo
9 1221760 1203360
146 3 Cuadro, Juan Pablo
10 1296128 1276608
147 3 Cuadro, Juan Pablo
11 903040 889440
148 3 Cuadro, Juan Pablo
12 764928 753408
149 3 Cuadro, Juan Pablo
13 807424 795264
150 3 Cuadro, Juan Pablo
14 860544 847584
151 3 Cuadro, Juan Pablo
15 956160 941760
152 3 Cuadro, Juan Pablo
16 988032 973152
153 3 Cuadro, Juan Pablo
</code></pre>
154 3 Cuadro, Juan Pablo
155 3 Cuadro, Juan Pablo
Which leads to the following output: