A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Documentation ▼
Installation
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
50
__slots_ =
'bins'
,
'nbins'
,
'number_of_flows'
51
def
__init__
(self, el=None):
52
'''! The initializer.
53
@param
self The object pointer.
54
@param
el The element.
55
'''
56
self.
bins
= []
57
if
el
is
not
None
:
58
#self.nbins = int(el.get('nBins'))
59
for
bin
in
el.findall(
'bin'
):
60
self.
bins
.append( (float(bin.get(
"start"
)), float(bin.get(
"width"
)),
int
(bin.get(
"count"
))) )
61
62
63
class
Flow
(
object
):
64
87
__slots_ = [
'flowId'
,
'delayMean'
,
'packetLossRatio'
,
'rxBitrate'
,
'txBitrate'
,
88
'fiveTuple'
,
'packetSizeMean'
,
'probe_stats_unsorted'
,
89
'hopCount'
,
'flowInterruptionsHistogram'
,
'rx_duration'
]
90
def
__init__
(self, flow_el):
91
'''! The initializer.
92
@param
self The object pointer.
93
@param
flow_el The element.
94
'''
95
self.
flowId
=
int
(flow_el.get('flowId'
))
96
rxPackets = float(flow_el.get(
'rxPackets'
))
97
txPackets = float(flow_el.get(
'txPackets'
))
98
99
tx_duration = (parse_time_ns (flow_el.get(
'timeLastTxPacket'
)) -
parse_time_ns
(flow_el.get(
'timeFirstTxPacket'
)))*1e-9
100
rx_duration = (parse_time_ns (flow_el.get(
'timeLastRxPacket'
)) -
parse_time_ns
(flow_el.get(
'timeFirstRxPacket'
)))*1e-9
101
self.
rx_duration
= rx_duration
102
self.
probe_stats_unsorted
= []
103
if
rxPackets:
104
self.
hopCount
= float(flow_el.get(
'timesForwarded'
)) / rxPackets + 1
105
else
:
106
self.
hopCount
= -1000
107
if
rxPackets:
108
self.
delayMean
= float(flow_el.get(
'delaySum'
)[:-2]) / rxPackets * 1e-9
109
self.
packetSizeMean
= float(flow_el.get(
'rxBytes'
)) / rxPackets
110
else
:
111
self.
delayMean
=
None
112
self.
packetSizeMean
=
None
113
if
rx_duration > 0:
114
self.
rxBitrate
= float(flow_el.get(
'rxBytes'
))*8 / rx_duration
115
else
:
116
self.
rxBitrate
=
None
117
if
tx_duration > 0:
118
self.
txBitrate
= float(flow_el.get(
'txBytes'
))*8 / tx_duration
119
else
:
120
self.
txBitrate
=
None
121
lost = float(flow_el.get(
'lostPackets'
))
122
#print "rxBytes: %s; txPackets: %s; rxPackets: %s; lostPackets: %s" % (flow_el.get('rxBytes'), txPackets, rxPackets, lost)
123
if
rxPackets == 0:
124
self.
packetLossRatio
=
None
125
else
:
126
self.
packetLossRatio
= (lost / (rxPackets + lost))
127
128
interrupt_hist_elem = flow_el.find(
"flowInterruptionsHistogram"
)
129
if
interrupt_hist_elem
is
None
:
130
self.
flowInterruptionsHistogram
=
None
131
else
:
132
self.
flowInterruptionsHistogram
=
Histogram
(interrupt_hist_elem)
133
134
135
class
ProbeFlowStats
(
object
):
136
143
__slots_ = [
'probeId'
,
'packets'
,
'bytes'
,
'delayFromFirstProbe'
]
144
145
146
class
Simulation
(
object
):
147
150
def
__init__
(self, simulation_el):
151
'''! The initializer.
152
@param
self The object pointer.
153
@param
simulation_el The element.
154
'''
155
self.
flows
= []
156
FlowClassifier_el, = simulation_el.findall("Ipv4FlowClassifier"
)
157
flow_map = {}
158
for
flow_el
in
simulation_el.findall(
"FlowStats/Flow"
):
159
flow =
Flow
(flow_el)
160
flow_map[flow.flowId] = flow
161
self.
flows
.append(flow)
162
for
flow_cls
in
FlowClassifier_el.findall(
"Flow"
):
163
flowId =
int
(flow_cls.get(
'flowId'
))
164
flow_map[flowId].fiveTuple =
FiveTuple
(flow_cls)
165
166
for
probe_elem
in
simulation_el.findall(
"FlowProbes/FlowProbe"
):
167
probeId =
int
(probe_elem.get(
'index'
))
168
for
stats
in
probe_elem.findall(
"FlowStats"
):
169
flowId =
int
(stats.get(
'flowId'
))
170
s =
ProbeFlowStats
()
171
s.packets =
int
(stats.get(
'packets'
))
172
s.bytes = float(stats.get(
'bytes'
))
173
s.probeId = probeId
174
if
s.packets > 0:
175
s.delayFromFirstProbe =
parse_time_ns
(stats.get(
'delayFromFirstProbeSum'
)) / float(s.packets)
176
else
:
177
s.delayFromFirstProbe = 0
178
flow_map[flowId].probe_stats_unsorted.append(s)
179
180
181
def
main(argv):
182
file_obj = open(argv[1])
183
print(
"Reading XML file "
, end=
" "
)
184
185
sys.stdout.flush()
186
level = 0
187
sim_list = []
188
for
event, elem
in
ElementTree.iterparse(file_obj, events=(
"start"
,
"end"
)):
189
if
event ==
"start"
:
190
level += 1
191
if
event ==
"end"
:
192
level -= 1
193
if
level == 0
and
elem.tag ==
'FlowMonitor'
:
194
sim =
Simulation
(elem)
195
sim_list.append(sim)
196
elem.clear()
# won't need this any more
197
sys.stdout.write(
"."
)
198
sys.stdout.flush()
199
print(
" done."
)
200
201
202
for
sim
in
sim_list:
203
for
flow
in
sim.flows:
204
t = flow.fiveTuple
205
proto = {6:
'TCP'
, 17:
'UDP'
} [t.protocol]
206
print(
"FlowID: %i (%s %s/%s --> %s/%i)"
% \
207
(flow.flowId, proto, t.sourceAddress, t.sourcePort, t.destinationAddress, t.destinationPort))
208
if
flow.txBitrate
is
None
:
209
print(
"\tTX bitrate: None"
)
210
else
:
211
print(
"\tTX bitrate: %.2f kbit/s"
% (flow.txBitrate*1e-3,))
212
if
flow.rxBitrate
is
None
:
213
print(
"\tRX bitrate: None"
)
214
else
:
215
print(
"\tRX bitrate: %.2f kbit/s"
% (flow.rxBitrate*1e-3,))
216
if
flow.delayMean
is
None
:
217
print(
"\tMean Delay: None"
)
218
else
:
219
print(
"\tMean Delay: %.2f ms"
% (flow.delayMean*1e3,))
220
if
flow.packetLossRatio
is
None
:
221
print(
"\tPacket Loss Ratio: None"
)
222
else
:
223
print(
"\tPacket Loss Ratio: %.2f %%"
% (flow.packetLossRatio*100))
224
225
226
if
__name__ ==
'__main__'
:
227
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:63
flowmon-parse-results.Flow.flowInterruptionsHistogram
flowInterruptionsHistogram
flow histogram
Definition:
flowmon-parse-results.py:130
flowmon-parse-results.Flow.txBitrate
txBitrate
transmit bit rate
Definition:
flowmon-parse-results.py:118
flowmon-parse-results.Flow.packetSizeMean
packetSizeMean
packet size mean
Definition:
flowmon-parse-results.py:109
flowmon-parse-results.Flow.rxBitrate
rxBitrate
receive bit rate
Definition:
flowmon-parse-results.py:114
flowmon-parse-results.Flow.packetLossRatio
packetLossRatio
packet loss ratio
Definition:
flowmon-parse-results.py:124
flowmon-parse-results.Flow.__init__
def __init__(self, flow_el)
The initializer.
Definition:
flowmon-parse-results.py:90
flowmon-parse-results.Flow.rx_duration
rx_duration
receive duration
Definition:
flowmon-parse-results.py:101
flowmon-parse-results.Flow.delayMean
delayMean
mean delay
Definition:
flowmon-parse-results.py:108
flowmon-parse-results.Flow.flowId
flowId
class variablesdelay ID
Definition:
flowmon-parse-results.py:95
flowmon-parse-results.Flow.hopCount
hopCount
hop count
Definition:
flowmon-parse-results.py:104
flowmon-parse-results.Flow.probe_stats_unsorted
probe_stats_unsorted
unsirted probe stats
Definition:
flowmon-parse-results.py:102
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:51
flowmon-parse-results.Histogram.bins
bins
class variableshistogram bins
Definition:
flowmon-parse-results.py:56
flowmon-parse-results.ProbeFlowStats
ProbeFlowStats.
Definition:
flowmon-parse-results.py:135
flowmon-parse-results.Simulation
Simulation.
Definition:
flowmon-parse-results.py:146
flowmon-parse-results.Simulation.flows
flows
class variableslist of flows
Definition:
flowmon-parse-results.py:155
flowmon-parse-results.Simulation.__init__
def __init__(self, simulation_el)
The initializer.
Definition:
flowmon-parse-results.py:150
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 Fri Mar 17 2023 12:34:57 for ns-3 by
1.9.3