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

Attachment: 0001-Update-applications-to-remember-and-close-old-Datapa.patch
Description: 0001-Update-applications-to-remember-and-close-old-Datapa.patch

------------------------------------------------------------------------------
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