diff options
-rw-r--r-- | ryu/lib/addrconv.py | 20 | ||||
-rw-r--r-- | 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 76417501..36a00fa2 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 e9c1fb97..e8477de6 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 |