A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Documentation ▼
Manual
Models
Contributing
Wiki
Development ▼
API Docs
Issue Tracker
Merge Requests
API
flowmon-parse-results.py
Go to the documentation of this file.
1
from
__future__
import
division
2
import
sys
3
import
os
4
try
:
5
from
xml.etree
import
cElementTree
as
ElementTree
6
except
ImportError:
7
from
xml.etree
import
ElementTree
8
9
def
parse_time_ns
(tm):
10
if
tm.endswith(
'ns'
):
11
return
float(tm[:-2])
12
raise
ValueError(tm)
13
14
15
16
17
class
FiveTuple
(
object
):
18
31
__slots_ = [
'sourceAddress'
,
'destinationAddress'
,
'protocol'
,
'sourcePort'
,
'destinationPort'
]
32
def
__init__
(self, el):
33
'''! The initializer.
34
@param
self The object pointer.
35
@param
el The element.
36
'''
37
self.
sourceAddress
= el.get('sourceAddress'
)
38
self.
destinationAddress
= el.get(
'destinationAddress'
)
39
self.
sourcePort
=
int
(el.get(
'sourcePort'
))
40
self.
destinationPort
=
int
(el.get(
'destinationPort'
))
41
self.
protocol
=
int
(el.get(
'protocol'
))
42
43
44
class
Histogram
(
object
):
45
54
__slots_ =
'bins'
,
'nbins'
,
'number_of_flows'
55
def
__init__
(self, el=None):
56
'''! The initializer.
57
@param
self The object pointer.
58
@param
el The element.
59
'''
60
self.
bins
= []
61
if
el
is
not
None
:
62
#self.nbins = int(el.get('nBins'))
63
for
bin
in
el.findall(
'bin'
):
64
self.
bins
.append( (float(bin.get(
"start"
)), float(bin.get(
"width"
)),
int
(bin.get(
"count"
))) )
65
66
67
class
Flow
(
object
):
68
93
__slots_ = [
'flowId'
,
'delayMean'
,
'packetLossRatio'
,
'rxBitrate'
,
'txBitrate'
,
94
'fiveTuple'
,
'packetSizeMean'
,
'probe_stats_unsorted'
,
95
'hopCount'
,
'flowInterruptionsHistogram'
,
'rx_duration'
]
96
def
__init__
(self, flow_el):
97
'''! The initializer.
98
@param
self The object pointer.
99
@param
flow_el The element.
100
'''
101
self.
flowId
=
int
(flow_el.get('flowId'
))
102
rxPackets = float(flow_el.get(
'rxPackets'
))
103
txPackets = float(flow_el.get(
'txPackets'
))
104
105
tx_duration = (parse_time_ns (flow_el.get(
'timeLastTxPacket'
)) -
parse_time_ns
(flow_el.get(
'timeFirstTxPacket'
)))*1e-9
106
rx_duration = (parse_time_ns (flow_el.get(
'timeLastRxPacket'
)) -
parse_time_ns
(flow_el.get(
'timeFirstRxPacket'
)))*1e-9
107
self.
rx_duration
= rx_duration
108
self.
probe_stats_unsorted
= []
109
if
rxPackets:
110
self.
hopCount
= float(flow_el.get(
'timesForwarded'
)) / rxPackets + 1
111
else
:
112
self.
hopCount
= -1000
113
if
rxPackets:
114
self.
delayMean
= float(flow_el.get(
'delaySum'
)[:-2]) / rxPackets * 1e-9
115
self.
packetSizeMean
= float(flow_el.get(
'rxBytes'
)) / rxPackets
116
else
:
117
self.
delayMean
=
None
118
self.
packetSizeMean
=
None
119
if
rx_duration > 0:
120
self.
rxBitrate
= float(flow_el.get(
'rxBytes'
))*8 / rx_duration
121
else
:
122
self.
rxBitrate
=
None
123
if
tx_duration > 0:
124
self.
txBitrate
= float(flow_el.get(
'txBytes'
))*8 / tx_duration
125
else
:
126
self.
txBitrate
=
None
127
lost = float(flow_el.get(
'lostPackets'
))
128
#print "rxBytes: %s; txPackets: %s; rxPackets: %s; lostPackets: %s" % (flow_el.get('rxBytes'), txPackets, rxPackets, lost)
129
if
rxPackets == 0:
130
self.
packetLossRatio
=
None
131
else
:
132
self.
packetLossRatio
= (lost / (rxPackets + lost))
133
134
interrupt_hist_elem = flow_el.find(
"flowInterruptionsHistogram"
)
135
if
interrupt_hist_elem
is
None
:
136
self.
flowInterruptionsHistogram
=
None
137
else
:
138
self.
flowInterruptionsHistogram
=
Histogram
(interrupt_hist_elem)
139
140
141
class
ProbeFlowStats
(
object
):
142
153
__slots_ = [
'probeId'
,
'packets'
,
'bytes'
,
'delayFromFirstProbe'
]
154
155
156
class
Simulation
(
object
):
157
160
def
__init__
(self, simulation_el):
161
'''! The initializer.
162
@param
self The object pointer.
163
@param
simulation_el The element.
164
'''
165
self.
flows
= []
166
FlowClassifier_el, = simulation_el.findall("Ipv4FlowClassifier"
)
167
flow_map = {}
168
for
flow_el
in
simulation_el.findall(
"FlowStats/Flow"
):
169
flow =
Flow
(flow_el)
170
flow_map[flow.flowId] = flow
171
self.
flows
.append(flow)
172
for
flow_cls
in
FlowClassifier_el.findall(
"Flow"
):
173
flowId =
int
(flow_cls.get(
'flowId'
))
174
flow_map[flowId].fiveTuple =
FiveTuple
(flow_cls)
175
176
for
probe_elem
in
simulation_el.findall(
"FlowProbes/FlowProbe"
):
177
probeId =
int
(probe_elem.get(
'index'
))
178
for
stats
in
probe_elem.findall(
"FlowStats"
):
179
flowId =
int
(stats.get(
'flowId'
))
180
s =
ProbeFlowStats
()
181
s.packets =
int
(stats.get(
'packets'
))
182
s.bytes = float(stats.get(
'bytes'
))
183
s.probeId = probeId
184
if
s.packets > 0:
185
s.delayFromFirstProbe =
parse_time_ns
(stats.get(
'delayFromFirstProbeSum'
)) / float(s.packets)
186
else
:
187
s.delayFromFirstProbe = 0
188
flow_map[flowId].probe_stats_unsorted.append(s)
189
190
191
def
main(argv):
192
file_obj = open(argv[1])
193
print(
"Reading XML file "
, end=
" "
)
194
195
sys.stdout.flush()
196
level = 0
197
sim_list = []
198
for
event, elem
in
ElementTree.iterparse(file_obj, events=(
"start"
,
"end"
)):
199
if
event ==
"start"
:
200
level += 1
201
if
event ==
"end"
:
202
level -= 1
203
if
level == 0
and
elem.tag ==
'FlowMonitor'
:
204
sim =
Simulation
(elem)
205
sim_list.append(sim)
206
elem.clear()
# won't need this any more
207
sys.stdout.write(
"."
)
208
sys.stdout.flush()
209
print(
" done."
)
210
211
212
for
sim
in
sim_list:
213
for
flow
in
sim.flows:
214
t = flow.fiveTuple
215
proto = {6:
'TCP'
, 17:
'UDP'
} [t.protocol]
216
print(
"FlowID: %i (%s %s/%s --> %s/%i)"
% \
217
(flow.flowId, proto, t.sourceAddress, t.sourcePort, t.destinationAddress, t.destinationPort))
218
if
flow.txBitrate
is
None
:
219
print(
"\tTX bitrate: None"
)
220
else
:
221
print(
"\tTX bitrate: %.2f kbit/s"
% (flow.txBitrate*1e-3,))
222
if
flow.rxBitrate
is
None
:
223
print(
"\tRX bitrate: None"
)
224
else
:
225
print(
"\tRX bitrate: %.2f kbit/s"
% (flow.rxBitrate*1e-3,))
226
if
flow.delayMean
is
None
:
227
print(
"\tMean Delay: None"
)
228
else
:
229
print(
"\tMean Delay: %.2f ms"
% (flow.delayMean*1e3,))
230
if
flow.packetLossRatio
is
None
:
231
print(
"\tPacket Loss Ratio: None"
)
232
else
:
233
print(
"\tPacket Loss Ratio: %.2f %%"
% (flow.packetLossRatio*100))
234
235
236
if
__name__ ==
'__main__'
:
237
main(sys.argv)
flowmon-parse-results.FiveTuple
FiveTuple.
Definition:
flowmon-parse-results.py:17
flowmon-parse-results.FiveTuple.sourcePort
sourcePort
source port
Definition:
flowmon-parse-results.py:39
flowmon-parse-results.FiveTuple.__init__
def __init__(self, el)
The initializer.
Definition:
flowmon-parse-results.py:32
flowmon-parse-results.FiveTuple.protocol
protocol
network protocol
Definition:
flowmon-parse-results.py:41
flowmon-parse-results.FiveTuple.sourceAddress
sourceAddress
class variablessource address
Definition:
flowmon-parse-results.py:37
flowmon-parse-results.FiveTuple.destinationPort
destinationPort
destination port
Definition:
flowmon-parse-results.py:40
flowmon-parse-results.FiveTuple.destinationAddress
destinationAddress
destination address
Definition:
flowmon-parse-results.py:38
flowmon-parse-results.Flow
Flow.
Definition:
flowmon-parse-results.py:67
flowmon-parse-results.Flow.flowInterruptionsHistogram
flowInterruptionsHistogram
flow histogram
Definition:
flowmon-parse-results.py:136
flowmon-parse-results.Flow.txBitrate
txBitrate
transmit bit rate
Definition:
flowmon-parse-results.py:124
flowmon-parse-results.Flow.packetSizeMean
packetSizeMean
packet size mean
Definition:
flowmon-parse-results.py:115
flowmon-parse-results.Flow.rxBitrate
rxBitrate
receive bit rate
Definition:
flowmon-parse-results.py:120
flowmon-parse-results.Flow.packetLossRatio
packetLossRatio
packet loss ratio
Definition:
flowmon-parse-results.py:130
flowmon-parse-results.Flow.__init__
def __init__(self, flow_el)
The initializer.
Definition:
flowmon-parse-results.py:96
flowmon-parse-results.Flow.rx_duration
rx_duration
receive duration
Definition:
flowmon-parse-results.py:107
flowmon-parse-results.Flow.delayMean
delayMean
mean delay
Definition:
flowmon-parse-results.py:114
flowmon-parse-results.Flow.flowId
flowId
class variablesdelay ID
Definition:
flowmon-parse-results.py:101
flowmon-parse-results.Flow.hopCount
hopCount
hop count
Definition:
flowmon-parse-results.py:110
flowmon-parse-results.Flow.probe_stats_unsorted
probe_stats_unsorted
unsirted probe stats
Definition:
flowmon-parse-results.py:108
flowmon-parse-results.Histogram
Histogram.
Definition:
flowmon-parse-results.py:44
flowmon-parse-results.Histogram.__init__
def __init__(self, el=None)
The initializer.
Definition:
flowmon-parse-results.py:55
flowmon-parse-results.Histogram.bins
bins
class variableshistogram bins
Definition:
flowmon-parse-results.py:60
flowmon-parse-results.ProbeFlowStats
ProbeFlowStats.
Definition:
flowmon-parse-results.py:141
flowmon-parse-results.Simulation
Simulation.
Definition:
flowmon-parse-results.py:156
flowmon-parse-results.Simulation.flows
flows
class variableslist of flows
Definition:
flowmon-parse-results.py:165
flowmon-parse-results.Simulation.__init__
def __init__(self, simulation_el)
The initializer.
Definition:
flowmon-parse-results.py:160
object
check-style-clang-format.int
int
Definition:
check-style-clang-format.py:672
flowmon-parse-results.parse_time_ns
def parse_time_ns(tm)
Definition:
flowmon-parse-results.py:9
src
flow-monitor
examples
flowmon-parse-results.py
Generated on Tue Nov 1 2022 22:59:53 for ns-3 by
1.9.3