-
Notifications
You must be signed in to change notification settings - Fork 0
/
app_2_traffic_monitor.py
141 lines (127 loc) · 5.6 KB
/
app_2_traffic_monitor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
from operator import attrgetter
from ryu.app import simple_switch_13
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import DEAD_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.lib import hub
from ryu.ofproto import ofproto_v1_3
class SimpleMonitor(simple_switch_13.SimpleSwitch13):
def __init__(self, *args, **kwargs):
super(SimpleMonitor, self).__init__(*args, **kwargs)
self.datapaths = {}
# {datapath.id:datapath}
self.monitor_thread = hub.spawn(self._monitor)
# self._monitor()
self._s_flag = 0
@set_ev_cls(ofp_event.EventOFPStateChange, [MAIN_DISPATCHER, DEAD_DISPATCHER])
def _state_change_handler(self, ev):
#A methon for negotiation phase change notification.
datapath = ev.datapath
if ev.state == MAIN_DISPATCHER:
# if the state is up or down
if not datapath.id in self.datapaths:
# self.logger.debug('register datapath: %016x',
# datapath.id)
self.logger.info('register datapath: %016x',
datapath.id)
self.datapaths[datapath.id] = datapath
elif ev.state == DEAD_DISPATCHER:
if datapath.id in self.datapaths:
# self.logger.debug('unregister datapath: %016x',
# datapath.id)
self.logger.info('unregister datapath: %016x',
datapath.id)
del self.datapaths[datapath.id]
@set_ev_cls(ofp_event.EventOFPPortStateChange, MAIN_DISPATCHER)
def _szj_port_state_change_handler(self, ev):
# A method to notify the port state changes of Dtatapath instance.
dp = ev.datapath
dpid = dp.id
port = ev.port_no
try:
port_state = dp.ports[port].state
print port_state
except:
port_state = 3
reason = ev.reason
if reason == ofproto_v1_3.OFPPR_ADD:
_reason = 'OFPPR_ADD'
elif reason == ofproto_v1_3.OFPPR_DELETE:
_reason = 'OFPPR_DELETE'
elif reason == ofproto_v1_3.OFPPR_MODIFY:
_reason = 'OFPPR_MODIFY'
else:
_reason = 'other reason'
if port_state == ofproto_v1_3.OFPPS_LINK_DOWN:
p_state = 'LINK_DOWN'
elif port_state == ofproto_v1_3.OFPPS_BLOCKED:
p_state = 'OFPPS_BLOCKED'
elif port_state == ofproto_v1_3.OFPPS_LIVE:
p_state == 'OFPPS_LIVE'
elif port_state == 0:
p_state = 'recovery again.'
else:
p_state = 'Unknown'
if p_state == 'Unknown':
self.logger.info(
'\n\nThe SWITCH{} PORT{} is {}\n\n'.format(dpid,
port, _reason))
else:
self.logger.info(
'\n\nThe SWITCH{} PORT{} is {}, due to {}\n\n'.format(
dp.id, port, p_state, _reason))
def _monitor(self):
while True:
for dp in self.datapaths.values():
self._request_stats(dp)
hub.sleep(10)
def _request_stats(self, datapath):
# send flow stats request and port stats request
# self.logger.debug('send stats request: %016x', datapath.id)
self.logger.info('send stats request: %016x', datapath.id)
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
req = parser.OFPFlowStatsRequest(datapath)
# Import ofproto.ofproto_v1_3_parser.OFPFlowStatsRequest
datapath.send_msg(req)
# req = parser.OFPPortStatsRequest(datapath, 0, ofproto.OFPP_ANY)
req = parser.OFPPortStatsRequest(datapath)
# Import ofproto.ofproto_v1_3_parser.OFPPortStatsRequest
datapath.send_msg(req)
@set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
def _flow_stats_reply_handler(self, ev):
print '\n'
body = ev.msg.body
# ofproto.ofproto_v1_3_parser.OFPFlowStats
self.logger.info('datapath '
'in-port eth-dst '
'out-port packets bytes')
self.logger.info('---------------- '
'-------- ----------------- '
'-------- -------- --------')
for stat in sorted([flow for flow in body if flow.priority == 1],
key=lambda flow: (flow.match['in_port'], flow.match['eth_dst'])):
self.logger.info('%016x %8x %17s %8x %8d %8d',
ev.msg.datapath.id,
stat.match['in_port'], stat.match['eth_dst'],
stat.instructions[0].actions[0].port,
stat.packet_count, stat.byte_count)
print '\n'
@set_ev_cls(ofp_event.EventOFPPortStatsReply, MAIN_DISPATCHER)
def _port_stats_reply_handler(self, ev):
print '\n'
body = ev.msg.body
# Import ofproto.ofproto_v1_3_parser.OFPPortStats
self.logger.info('datapath port '
'rx-pkts rx-bytes rx-error '
'tx-pkts tx-bytes tx-error')
self.logger.info('---------------- -------- '
'-------- -------- -------- '
'-------- -------- --------')
for stat in sorted(body, key=attrgetter('port_no')):
self.logger.info('%016x %8x %8d %8d %8d %8d %8d %8d',
ev.msg.datapath.id, stat.port_no,
stat.rx_packets, stat.rx_bytes, stat.rx_errors,
stat.tx_packets, stat.tx_bytes, stat.tx_errors)
print '\n'