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

Reply via email to