Reconnected event additions and cleanups
This patch adds ports to the EventDPReconnected in dpset, and adds an EventSwitchReconnected to the topology module. Signed-off-by: Victor J. Orlikowski <vjo@duke.edu> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
parent
14379f280b
commit
e3d0721892
@ -56,6 +56,8 @@ class EventDP(EventDPBase):
|
||||
class EventDPReconnected(EventDPBase):
|
||||
def __init__(self, dp):
|
||||
super(EventDPReconnected, self).__init__(dp)
|
||||
# port list, which should not change across reconnects
|
||||
self.ports = []
|
||||
|
||||
|
||||
class EventPortBase(EventDPBase):
|
||||
@ -138,6 +140,7 @@ class DPSet(app_manager.RyuApp):
|
||||
self.send_event_to_observers(ev)
|
||||
if send_dp_reconnected:
|
||||
ev = EventDPReconnected(dp)
|
||||
ev.ports = self.port_state.get(dp.id, {}).values()
|
||||
self.send_event_to_observers(ev)
|
||||
|
||||
def _unregister(self, dp):
|
||||
@ -163,7 +166,6 @@ class DPSet(app_manager.RyuApp):
|
||||
"""
|
||||
This method returns the ryu.controller.controller.Datapath
|
||||
instance for the given Datapath ID.
|
||||
Raises KeyError if no such a datapath connected to this controller.
|
||||
"""
|
||||
return self.dps.get(dp_id)
|
||||
|
||||
|
@ -41,6 +41,11 @@ class EventSwitchLeave(EventSwitchBase):
|
||||
super(EventSwitchLeave, self).__init__(switch)
|
||||
|
||||
|
||||
class EventSwitchReconnected(EventSwitchBase):
|
||||
def __init__(self, switch):
|
||||
super(EventSwitchReconnected, self).__init__(switch)
|
||||
|
||||
|
||||
class EventPortBase(event.EventBase):
|
||||
def __init__(self, port):
|
||||
super(EventPortBase, self).__init__()
|
||||
|
@ -499,6 +499,7 @@ class Switches(app_manager.RyuApp):
|
||||
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION, ofproto_v1_2.OFP_VERSION,
|
||||
ofproto_v1_3.OFP_VERSION, ofproto_v1_4.OFP_VERSION]
|
||||
_EVENTS = [event.EventSwitchEnter, event.EventSwitchLeave,
|
||||
event.EventSwitchReconnected,
|
||||
event.EventPortAdd, event.EventPortDelete,
|
||||
event.EventPortModify,
|
||||
event.EventLinkAdd, event.EventLinkDelete,
|
||||
@ -551,8 +552,9 @@ class Switches(app_manager.RyuApp):
|
||||
|
||||
def _unregister(self, dp):
|
||||
if dp.id in self.dps:
|
||||
del self.dps[dp.id]
|
||||
del self.port_state[dp.id]
|
||||
if (self.dps[dp.id] == dp):
|
||||
del self.dps[dp.id]
|
||||
del self.port_state[dp.id]
|
||||
|
||||
def _get_switch(self, dpid):
|
||||
if dpid in self.dps:
|
||||
@ -606,16 +608,18 @@ class Switches(app_manager.RyuApp):
|
||||
if ev.state == MAIN_DISPATCHER:
|
||||
dp_multiple_conns = False
|
||||
if dp.id in self.dps:
|
||||
LOG.warning('multiple connections from %s', dpid_to_str(dp.id))
|
||||
LOG.warning('Multiple connections from %s', dpid_to_str(dp.id))
|
||||
dp_multiple_conns = True
|
||||
(self.dps[dp.id]).close()
|
||||
|
||||
self._register(dp)
|
||||
switch = self._get_switch(dp.id)
|
||||
LOG.debug('register %s', switch)
|
||||
|
||||
# Do not send event while dp has multiple connections.
|
||||
if not dp_multiple_conns:
|
||||
self.send_event_to_observers(event.EventSwitchEnter(switch))
|
||||
else:
|
||||
self.send_event_to_observers(event.EventSwitchReconnected(switch))
|
||||
|
||||
if not self.link_discovery:
|
||||
return
|
||||
@ -669,19 +673,23 @@ class Switches(app_manager.RyuApp):
|
||||
# dp.id is None when datapath dies before handshake
|
||||
if dp.id is None:
|
||||
return
|
||||
|
||||
switch = self._get_switch(dp.id)
|
||||
self._unregister(dp)
|
||||
LOG.debug('unregister %s', switch)
|
||||
self.send_event_to_observers(event.EventSwitchLeave(switch))
|
||||
if switch:
|
||||
if switch.dp is dp:
|
||||
self._unregister(dp)
|
||||
LOG.debug('unregister %s', switch)
|
||||
|
||||
if not self.link_discovery:
|
||||
return
|
||||
self.send_event_to_observers(event.EventSwitchLeave(switch))
|
||||
|
||||
for port in switch.ports:
|
||||
if not port.is_reserved():
|
||||
self.ports.del_port(port)
|
||||
self._link_down(port)
|
||||
self.lldp_event.set()
|
||||
if not self.link_discovery:
|
||||
return
|
||||
|
||||
for port in switch.ports:
|
||||
if not port.is_reserved():
|
||||
self.ports.del_port(port)
|
||||
self._link_down(port)
|
||||
self.lldp_event.set()
|
||||
|
||||
@set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
|
||||
def port_status_handler(self, ev):
|
||||
@ -766,7 +774,7 @@ class Switches(app_manager.RyuApp):
|
||||
try:
|
||||
src_dpid, src_port_no = LLDPPacket.lldp_parse(msg.data)
|
||||
except LLDPPacket.LLDPUnknownFormat as e:
|
||||
# This handler can receive all the packtes which can be
|
||||
# This handler can receive all the packets which can be
|
||||
# not-LLDP packet. Ignore it silently
|
||||
return
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user