Can Ryu core instead of an applications close the connection of a dead datapath?
On Fri, 26 Feb 2016 17:42:33 +0000 Victor Orlikowski <[email protected]> wrote: > Update applications to remember and close() old Datapaths that may not longer > be valid. > > Signed-off-by: Victor J. Orlikowski <[email protected]> > > --- > ryu/app/cbench.py | 8 ++++++++ > ryu/app/ofctl/service.py | 2 ++ > ryu/app/simple_switch.py | 7 ++++++- > ryu/app/simple_switch_12.py | 7 ++++++- > ryu/app/simple_switch_13.py | 7 ++++++- > ryu/app/simple_switch_14.py | 7 ++++++- > ryu/app/simple_switch_igmp.py | 7 ++++++- > ryu/app/simple_switch_lacp.py | 7 ++++++- > ryu/app/simple_switch_snort.py | 7 ++++++- > ryu/app/simple_switch_stp.py | 7 ++++++- > 10 files changed, 58 insertions(+), 8 deletions(-) > > diff --git a/ryu/app/cbench.py b/ryu/app/cbench.py > index aed83ab..71461ec 100644 > --- a/ryu/app/cbench.py > +++ b/ryu/app/cbench.py > @@ -31,6 +31,7 @@ class Cbench(app_manager.RyuApp): > > def __init__(self, *args, **kwargs): > super(Cbench, self).__init__(*args, **kwargs) > + self.dpid_to_dp = {} > > @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER) > def packet_in_handler(self, ev): > @@ -38,6 +39,13 @@ class Cbench(app_manager.RyuApp): > datapath = msg.datapath > ofproto = datapath.ofproto > > + dpid = datapath.id > + id2dp_entry = self.dpid_to_dp.get(dpid) > + if (id2dp_entry and > + (id2dp_entry is not datapath)): > + id2dp_entry.close() > + dpid_to_dp[dpid] = datapath > + > match = datapath.ofproto_parser.OFPMatch( > ofproto_v1_0.OFPFW_ALL, 0, 0, 0, > 0, 0, 0, 0, 0, 0, 0, 0, 0) > diff --git a/ryu/app/ofctl/service.py b/ryu/app/ofctl/service.py > index 0ca00c7..19aebd4 100644 > --- a/ryu/app/ofctl/service.py > +++ b/ryu/app/ofctl/service.py > @@ -79,6 +79,8 @@ class OfctlService(app_manager.RyuApp): > self.logger.debug('add dpid %s datapath %s new_info %s old_info %s', > id, datapath, new_info, old_info) > self._switches[id] = new_info > + if old_info: > + old_info.datapath.close() > > @set_ev_cls(ofp_event.EventOFPStateChange, DEAD_DISPATCHER) > def _handle_dead(self, ev): > diff --git a/ryu/app/simple_switch.py b/ryu/app/simple_switch.py > index 862b830..c89021e 100644 > --- a/ryu/app/simple_switch.py > +++ b/ryu/app/simple_switch.py > @@ -65,7 +65,12 @@ class SimpleSwitch(app_manager.RyuApp): > src = eth.src > > dpid = datapath.id > - self.mac_to_port.setdefault(dpid, {}) > + m2p_entry = self.mac_to_port.setdefault(dpid, {}) > + m2p_datapath = m2p_entry.get('datapath') > + if (m2p_datapath and > + (m2p_datapath is not datapath)): > + m2p_datapath.close() > + m2p_entry['datapath'] = datapath > > self.logger.info("packet in %s %s %s %s", dpid, src, dst, > msg.in_port) > > diff --git a/ryu/app/simple_switch_12.py b/ryu/app/simple_switch_12.py > index 6895b07..b548464 100644 > --- a/ryu/app/simple_switch_12.py > +++ b/ryu/app/simple_switch_12.py > @@ -64,7 +64,12 @@ class SimpleSwitch12(app_manager.RyuApp): > src = eth.src > > dpid = datapath.id > - self.mac_to_port.setdefault(dpid, {}) > + m2p_entry = self.mac_to_port.setdefault(dpid, {}) > + m2p_datapath = m2p_entry.get('datapath') > + if (m2p_datapath and > + (m2p_datapath is not datapath)): > + m2p_datapath.close() > + m2p_entry['datapath'] = datapath > > self.logger.info("packet in %s %s %s %s", dpid, src, dst, in_port) > > diff --git a/ryu/app/simple_switch_13.py b/ryu/app/simple_switch_13.py > index 3e7c598..a71d1d3 100644 > --- a/ryu/app/simple_switch_13.py > +++ b/ryu/app/simple_switch_13.py > @@ -86,7 +86,12 @@ class SimpleSwitch13(app_manager.RyuApp): > src = eth.src > > dpid = datapath.id > - self.mac_to_port.setdefault(dpid, {}) > + m2p_entry = self.mac_to_port.setdefault(dpid, {}) > + m2p_datapath = m2p_entry.get('datapath') > + if (m2p_datapath and > + (m2p_datapath is not datapath)): > + m2p_datapath.close() > + m2p_entry['datapath'] = datapath > > self.logger.info("packet in %s %s %s %s", dpid, src, dst, in_port) > > diff --git a/ryu/app/simple_switch_14.py b/ryu/app/simple_switch_14.py > index d3151bc..16de4c9 100644 > --- a/ryu/app/simple_switch_14.py > +++ b/ryu/app/simple_switch_14.py > @@ -77,7 +77,12 @@ class SimpleSwitch14(app_manager.RyuApp): > src = eth.src > > dpid = datapath.id > - self.mac_to_port.setdefault(dpid, {}) > + m2p_entry = self.mac_to_port.setdefault(dpid, {}) > + m2p_datapath = m2p_entry.get('datapath') > + if (m2p_datapath and > + (m2p_datapath is not datapath)): > + m2p_datapath.close() > + m2p_entry['datapath'] = datapath > > self.logger.info("packet in %s %s %s %s", dpid, src, dst, in_port) > > diff --git a/ryu/app/simple_switch_igmp.py b/ryu/app/simple_switch_igmp.py > index b1b014f..7d26c1b 100644 > --- a/ryu/app/simple_switch_igmp.py > +++ b/ryu/app/simple_switch_igmp.py > @@ -67,7 +67,12 @@ class SimpleSwitchIgmp(app_manager.RyuApp): > dst = addrconv.mac.bin_to_text(dst_) > > dpid = datapath.id > - self.mac_to_port.setdefault(dpid, {}) > + m2p_entry = self.mac_to_port.setdefault(dpid, {}) > + m2p_datapath = m2p_entry.get('datapath') > + if (m2p_datapath and > + (m2p_datapath is not datapath)): > + m2p_datapath.close() > + m2p_entry['datapath'] = datapath > > self.logger.info("packet in %s %s %s %s", > dpid, src, dst, msg.in_port) > diff --git a/ryu/app/simple_switch_lacp.py b/ryu/app/simple_switch_lacp.py > index 3774163..63d6dc0 100644 > --- a/ryu/app/simple_switch_lacp.py > +++ b/ryu/app/simple_switch_lacp.py > @@ -77,7 +77,12 @@ class SimpleSwitchLacp(app_manager.RyuApp): > dst = addrconv.mac.bin_to_text(dst_) > > dpid = datapath.id > - self.mac_to_port.setdefault(dpid, {}) > + m2p_entry = self.mac_to_port.setdefault(dpid, {}) > + m2p_datapath = m2p_entry.get('datapath') > + if (m2p_datapath and > + (m2p_datapath is not datapath)): > + m2p_datapath.close() > + m2p_entry['datapath'] = datapath > > self.logger.info("packet in %s %s %s %s", > dpid, src, dst, msg.in_port) > diff --git a/ryu/app/simple_switch_snort.py b/ryu/app/simple_switch_snort.py > index 553a8bb..9e0cc3e 100644 > --- a/ryu/app/simple_switch_snort.py > +++ b/ryu/app/simple_switch_snort.py > @@ -117,7 +117,12 @@ class SimpleSwitchSnort(app_manager.RyuApp): > src = eth.src > > dpid = datapath.id > - self.mac_to_port.setdefault(dpid, {}) > + m2p_entry = self.mac_to_port.setdefault(dpid, {}) > + m2p_datapath = m2p_entry.get('datapath') > + if (m2p_datapath and > + (m2p_datapath is not datapath)): > + m2p_datapath.close() > + m2p_entry['datapath'] = datapath > > # self.logger.info("packet in %s %s %s %s", dpid, src, dst, in_port) > > diff --git a/ryu/app/simple_switch_stp.py b/ryu/app/simple_switch_stp.py > index a86c8a5..8d18432 100644 > --- a/ryu/app/simple_switch_stp.py > +++ b/ryu/app/simple_switch_stp.py > @@ -85,7 +85,12 @@ class SimpleSwitchStp(app_manager.RyuApp): > dst, src, _eth_type = struct.unpack_from('!6s6sH', buffer(msg.data), > 0) > > dpid = datapath.id > - self.mac_to_port.setdefault(dpid, {}) > + m2p_entry = self.mac_to_port.setdefault(dpid, {}) > + m2p_datapath = m2p_entry.get('datapath') > + if (m2p_datapath and > + (m2p_datapath is not datapath)): > + m2p_datapath.close() > + m2p_entry['datapath'] = datapath > > self.logger.debug("packet in %s %s %s %s", > dpid, haddr_to_str(src), haddr_to_str(dst), > -- > > Best, > Victor > -- > Victor J. Orlikowski <> vjo@[cs.]duke.edu > ------------------------------------------------------------------------------ Site24x7 APM Insight: Get Deep Visibility into Application Performance APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor end-to-end web transactions and take corrective actions now Troubleshoot faster and improve end-user experience. Signup Now! http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140 _______________________________________________ Ryu-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ryu-devel
