diff options
Diffstat (limited to 'ryu/lib/ofctl_v1_2.py')
-rw-r--r-- | ryu/lib/ofctl_v1_2.py | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/ryu/lib/ofctl_v1_2.py b/ryu/lib/ofctl_v1_2.py index 335709db..e6023ed2 100644 --- a/ryu/lib/ofctl_v1_2.py +++ b/ryu/lib/ofctl_v1_2.py @@ -380,8 +380,11 @@ def match_ip_to_str(value, mask): ip = socket.inet_ntoa(struct.pack('!I', value)) if mask is not None and mask != 0: - binary_str = bin(mask)[2:].zfill(8) - netmask = '/%d' % len(binary_str.rstrip('0')) + binary_str = bin(mask)[2:].zfill(32).rstrip('0') + if binary_str.find('0') >= 0: + netmask = '/%s' % socket.inet_ntoa(struct.pack('!I', mask)) + else: + netmask = '/%d' % len(binary_str) else: netmask = '' @@ -395,14 +398,21 @@ def match_ipv6_to_str(value, mask): ip = netaddr.IPNetwork(':'.join(ip_list)) netmask = 128 + netmask_str = None if mask is not None: mask_list = [] for word in mask: mask_list.append('%04x' % word) mask_v = netaddr.IPNetwork(':'.join(mask_list)) - netmask = len(mask_v.ip.bits().replace(':', '').rstrip('0')) + binary_str = mask_v.ip.bits().replace(':', '').zfill(128).rstrip('0') + if binary_str.find('0') >= 0: + netmask_str = str(mask_v.ip) + else: + netmask = len(binary_str) - if netmask == 128: + if netmask_str is not None: + ip_str = str(ip.ip) + '/' + netmask_str + elif netmask == 128: ip_str = str(ip.ip) else: ip.prefixlen = netmask |