This hack allows CIDR notations for OFPMatch. For example:
    ofpp.OFPMatch(ipv4_src="198.51.100.0/24")

Signed-off-by: IWAMOTO Toshihiro <iwam...@valinux.co.jp>
---
 ryu/lib/addrconv.py       | 20 ++++++++++++++++----
 ryu/ofproto/oxx_fields.py |  3 +++
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/ryu/lib/addrconv.py b/ryu/lib/addrconv.py
index 7641750..36a00fa 100644
--- a/ryu/lib/addrconv.py
+++ b/ryu/lib/addrconv.py
@@ -18,20 +18,32 @@ import netaddr
 
 
 class AddressConverter(object):
-    def __init__(self, addr, strat, **kwargs):
+    def __init__(self, addr, strat, fallback=None, **kwargs):
         self._addr = addr
         self._strat = strat
+        self._fallback = fallback
         self._addr_kwargs = kwargs
 
     def text_to_bin(self, text):
-        return self._addr(text, **self._addr_kwargs).packed
+        try:
+            return self._addr(text, **self._addr_kwargs).packed
+        except Exception as e:
+            if self._fallback is None:
+                raise e
+
+            # text_to_bin is expected to return binary string under
+            # normal circumstances. See ofproto.oxx_fields._from_user.
+            ip = self._fallback(text, **self._addr_kwargs)
+            return ip.ip.packed, ip.netmask.packed
 
     def bin_to_text(self, bin):
         return str(self._addr(self._strat.packed_to_int(bin),
                               **self._addr_kwargs))
 
-ipv4 = AddressConverter(netaddr.IPAddress, netaddr.strategy.ipv4, version=4)
-ipv6 = AddressConverter(netaddr.IPAddress, netaddr.strategy.ipv6, version=6)
+ipv4 = AddressConverter(netaddr.IPAddress, netaddr.strategy.ipv4,
+                        fallback=netaddr.IPNetwork, version=4)
+ipv6 = AddressConverter(netaddr.IPAddress, netaddr.strategy.ipv6,
+                        fallback=netaddr.IPNetwork, version=6)
 
 
 class mac_mydialect(netaddr.mac_unix):
diff --git a/ryu/ofproto/oxx_fields.py b/ryu/ofproto/oxx_fields.py
index e9c1fb9..e8477de 100644
--- a/ryu/ofproto/oxx_fields.py
+++ b/ryu/ofproto/oxx_fields.py
@@ -72,6 +72,9 @@ def _from_user(oxx, name_to_field, name, user_value):
         value = t.from_user(value)
     if mask is not None:
         mask = t.from_user(mask)
+    elif isinstance(value, tuple):
+        # This hack is to accomodate CIDR notations with IPv[46]Addr.
+        value, mask = value
     return num, value, mask
 
 
-- 
2.1.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to