To notify ofp_port state change, this patch implements ofp_event.EventOFPPortStateChange. This event performs like EventOFPPortStatus, but ofp_handler will send this event after updating "ports" dict of datapath instances.
And, this patch suppresses the warning when user app accessing to datapath.ports for backward compatibility. Signed-off-by: IWASE Yusuke <[email protected]> --- ryu/controller/controller.py | 19 ------------------- ryu/controller/ofp_event.py | 8 ++++++++ ryu/controller/ofp_handler.py | 18 ++++++++++++++++++ ryu/tests/unit/controller/test_controller.py | 2 +- 4 files changed, 27 insertions(+), 20 deletions(-) diff --git a/ryu/controller/controller.py b/ryu/controller/controller.py index 1ae7287..177b289 100644 --- a/ryu/controller/controller.py +++ b/ryu/controller/controller.py @@ -150,25 +150,6 @@ class Datapath(ofproto_protocol.ProtocolDesc): self.ofp_brick = ryu.base.app_manager.lookup_service_brick('ofp_event') self.set_state(HANDSHAKE_DISPATCHER) - def _get_ports(self): - if (self.ofproto_parser is not None and - self.ofproto_parser.ofproto.OFP_VERSION >= 0x04): - message = ( - 'Datapath#ports is kept for compatibility with the previous ' - 'openflow versions (< 1.3). ' - 'This is not updated by the EventOFPPortStatus message. ' - 'If you want to be updated, you should use ' - '\'ryu.controller.dpset\' or \'ryu.topology.switches\'.' - ) - warnings.warn(message, stacklevel=2) - return self._ports - - def _set_ports(self, ports): - self._ports = ports - - # To show warning when Datapath#ports is read - ports = property(_get_ports, _set_ports) - @_deactivate def close(self): if self.state != DEAD_DISPATCHER: diff --git a/ryu/controller/ofp_event.py b/ryu/controller/ofp_event.py index 16eb493..aa2b6c1 100644 --- a/ryu/controller/ofp_event.py +++ b/ryu/controller/ofp_event.py @@ -86,4 +86,12 @@ class EventOFPStateChange(event.EventBase): self.datapath = dp +class EventOFPPortStateChange(event.EventBase): + def __init__(self, dp, reason, port_no): + super(EventOFPPortStateChange, self).__init__() + self.datapath = dp + self.reason = reason + self.port_no = port_no + + handler.register_service('ryu.controller.ofp_handler') diff --git a/ryu/controller/ofp_handler.py b/ryu/controller/ofp_handler.py index edff696..b524a28 100644 --- a/ryu/controller/ofp_handler.py +++ b/ryu/controller/ofp_handler.py @@ -245,6 +245,24 @@ class OFPHandler(ryu.base.app_manager.RyuApp): datapath = msg.datapath datapath.acknowledge_echo_reply(msg.xid) + @set_ev_handler(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER) + def port_status_handler(self, ev): + msg = ev.msg + datapath = msg.datapath + ofproto = datapath.ofproto + + if msg.reason in [ofproto.OFPPR_ADD, ofproto.OFPPR_MODIFY]: + datapath.ports[msg.desc.port_no] = msg.desc + elif msg.reason == ofproto.OFPPR_DELETE: + datapath.ports.pop(msg.desc.port_no, None) + else: + return + + self.send_event_to_observers( + ofp_event.EventOFPPortStateChange( + datapath, msg.reason, msg.desc.port_no), + datapath.state) + @set_ev_handler(ofp_event.EventOFPErrorMsg, [HANDSHAKE_DISPATCHER, CONFIG_DISPATCHER, MAIN_DISPATCHER]) def error_msg_handler(self, ev): diff --git a/ryu/tests/unit/controller/test_controller.py b/ryu/tests/unit/controller/test_controller.py index 0eeb30d..27a2bce 100644 --- a/ryu/tests/unit/controller/test_controller.py +++ b/ryu/tests/unit/controller/test_controller.py @@ -72,7 +72,7 @@ class Test_Datapath(unittest.TestCase): self.assertTrue(issubclass(msg.category, UserWarning)) def test_ports_accessibility_v13(self): - self._test_ports_accessibility(ofproto_v1_3_parser, 2) + self._test_ports_accessibility(ofproto_v1_3_parser, 0) def test_ports_accessibility_v12(self): self._test_ports_accessibility(ofproto_v1_2_parser, 0) -- 2.7.4 ------------------------------------------------------------------------------ Mobile security can be enabling, not merely restricting. Employees who bring their own devices (BYOD) to work are irked by the imposition of MDM restrictions. Mobile Device Manager Plus allows you to control only the apps on BYO-devices by containerizing them, leaving personal data untouched! https://ad.doubleclick.net/ddm/clk/304595813;131938128;j _______________________________________________ Ryu-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ryu-devel
