summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--doc/source/app/ofctl_rest.rst16
-rw-r--r--ryu/lib/ofctl_v1_2.py16
-rw-r--r--ryu/lib/ofctl_v1_3.py14
-rw-r--r--ryu/tests/unit/lib/test_ofctl.py54
4 files changed, 44 insertions, 56 deletions
diff --git a/doc/source/app/ofctl_rest.rst b/doc/source/app/ofctl_rest.rst
index 65d0623a..6e90e619 100644
--- a/doc/source/app/ofctl_rest.rst
+++ b/doc/source/app/ofctl_rest.rst
@@ -1585,7 +1585,9 @@ Description of Match on request messages
=============== ================================================== =======================================================================================================
in_port Switch input port (int) {"in_port": 7}
in_phy_port Switch physical input port (int) {"in_phy_port": 5, "in_port": 3}
- metadata Metadata passed between tables (string) {"metadata": "0x1212121212121212"}
+ metadata Metadata passed between tables (int or string) {"metadata": 12345}
+
+ | {"metadata": "0x1212/0xffff"}
dl_dst Ethernet destination address (string) {"dl_dst": "aa:bb:cc:11:22:33/00:00:00:00:ff:ff"}
dl_src Ethernet source address (string) {"dl_src": "aa:bb:cc:11:22:33"}
eth_dst Ethernet destination address (string) {"eth_dst": "aa:bb:cc:11:22:33/00:00:00:00:ff:ff"}
@@ -1629,9 +1631,15 @@ Description of Match on request messages
mpls_label MPLS label (int) {"mpls_label": 3, "eth_type": 34888}
mpls_tc MPLS Traffic Class (int) {"mpls_tc": 2, "eth_type": 34888}
mpls_bos MPLS BoS bit (int) {"mpls_bos": 1, "eth_type": 34888}
- pbb_isid PBB I-SID (int) {"pbb_isid": 5, "eth_type": 35047}
- tunnel_id Logical Port Metadata (int) {"tunnel_id": 7}
- ipv6_exthdr IPv6 Extension Header pseudo-field (string) {"ipv6_exthdr": "0x40/0x1F0", "eth_type": 34525}
+ pbb_isid PBB I-SID (int or string) {"pbb_isid": 5, "eth_type": 35047}
+
+ | {"pbb_isid": "0x05/0xff", "eth_type": 35047}
+ tunnel_id Logical Port Metadata (int or string) {"tunnel_id": 7}
+
+ | {"tunnel_id": "0x07/0xff"}
+ ipv6_exthdr IPv6 Extension Header pseudo-field (int or string) {"ipv6_exthdr": 3, "eth_type": 34525}
+
+ | {"ipv6_exthdr": "0x40/0x1F0", "eth_type": 34525}
=============== ================================================== =======================================================================================================
.. NOTE::
diff --git a/ryu/lib/ofctl_v1_2.py b/ryu/lib/ofctl_v1_2.py
index 038bb494..7308e1c1 100644
--- a/ryu/lib/ofctl_v1_2.py
+++ b/ryu/lib/ofctl_v1_2.py
@@ -188,7 +188,7 @@ def actions_to_str(instructions):
def to_match(dp, attrs):
convert = {'in_port': int,
'in_phy_port': int,
- 'metadata': to_match_metadata,
+ 'metadata': to_match_masked_int,
'dl_dst': to_match_eth,
'dl_src': to_match_eth,
'eth_dst': to_match_eth,
@@ -316,8 +316,8 @@ def to_match_vid(value):
return int(value, 0)
-def to_match_metadata(value):
- if '/' in value:
+def to_match_masked_int(value):
+ if isinstance(value, str) and '/' in value:
value = value.split('/')
return str_to_int(value[0]), str_to_int(value[1])
else:
@@ -351,22 +351,14 @@ def match_to_str(ofmatch):
value = match_field['OXMTlv']['value']
if key == 'dl_vlan':
value = match_vid_to_str(value, mask)
- elif key == 'metadata':
- value = match_metadata_to_str(value, mask)
else:
if mask is not None:
- value = value + '/' + mask
- else:
- value = value
+ value = str(value) + '/' + str(mask)
match.setdefault(key, value)
return match
-def match_metadata_to_str(value, mask):
- return '%d/%d' % (value, mask) if mask else '%d' % value
-
-
def match_vid_to_str(value, mask):
if mask is not None:
value = '0x%04x/0x%04x' % (value, mask)
diff --git a/ryu/lib/ofctl_v1_3.py b/ryu/lib/ofctl_v1_3.py
index 5b709f3a..15452e6e 100644
--- a/ryu/lib/ofctl_v1_3.py
+++ b/ryu/lib/ofctl_v1_3.py
@@ -249,8 +249,8 @@ def to_match(dp, attrs):
'mpls_label': int,
'mpls_tc': int,
'mpls_bos': int,
- 'pbb_isid': int,
- 'tunnel_id': int,
+ 'pbb_isid': to_match_masked_int,
+ 'tunnel_id': to_match_masked_int,
'ipv6_exthdr': to_match_masked_int}
keys = {'dl_dst': 'eth_dst',
@@ -373,22 +373,14 @@ def match_to_str(ofmatch):
value = match_field['OXMTlv']['value']
if key == 'dl_vlan':
value = match_vid_to_str(value, mask)
- elif key == 'metadata' or key == 'ipv6_exthdr':
- value = match_masked_int_to_str(value, mask)
else:
if mask is not None:
- value = value + '/' + mask
- else:
- value = value
+ value = str(value) + '/' + str(mask)
match.setdefault(key, value)
return match
-def match_masked_int_to_str(value, mask):
- return '%d/%d' % (value, mask) if mask else '%d' % value
-
-
def match_vid_to_str(value, mask):
if mask is not None:
value = '0x%04x/0x%04x' % (value, mask)
diff --git a/ryu/tests/unit/lib/test_ofctl.py b/ryu/tests/unit/lib/test_ofctl.py
index 1c02f354..d63a1da0 100644
--- a/ryu/tests/unit/lib/test_ofctl.py
+++ b/ryu/tests/unit/lib/test_ofctl.py
@@ -37,15 +37,11 @@ LOG = logging.getLogger('test_ofctl_v1_2, v1_3')
""" Common Functions """
-def _str_to_int(src):
- if isinstance(src, str):
- if src.startswith("0x") or src.startswith("0X"):
- dst = int(src, 16)
- else:
- dst = int(src)
- else:
- dst = src
- return dst
+def _str_to_int(v):
+ try:
+ return int(v, 0)
+ except (ValueError, TypeError):
+ return v
def _to_match_eth(value):
@@ -74,6 +70,12 @@ def _to_match_masked_int(value):
return _str_to_int(value), None
+def _to_masked_int_str(value):
+ v, m = _to_match_masked_int(value)
+ v &= m
+ return '%d/%d' % (v, m)
+
+
conv_of10_to_of12_dict = {
'dl_dst': 'eth_dst',
'dl_src': 'eth_src',
@@ -323,20 +325,16 @@ class Test_ofctl(unittest.TestCase):
eq_(test.expected_value['vlan_vid'][
value]['to_match'], field_value)
return
- elif key == 'metadata' or key == 'ipv6_exthdr':
- # Metadata or IPv6 Extension Header pseudo-field
- value, mask = _to_match_masked_int(value)
- if mask is not None:
+ else:
+ if isinstance(value, str) and '/' in value:
# with mask
+ value, mask = _to_match_masked_int(value)
value &= mask
eq_(value, field_value[0])
eq_(mask, field_value[1])
else:
# without mask
- eq_(value, field_value)
- return
- else:
- eq_(value, field_value)
+ eq_(_str_to_int(value), field_value)
return
for key, value in attrs.items():
@@ -403,21 +401,14 @@ class Test_ofctl(unittest.TestCase):
eq_(test.expected_value['vlan_vid'][
value]['to_str'], field_value)
return
- elif key == 'metadata' or key == 'ipv6_exthdr':
- # Metadata or IPv6 Extension Header pseudo-field
- value, mask = _to_match_masked_int(value)
- if mask is not None:
+ else:
+ if isinstance(value, str) and '/' in value:
# with mask
- field_value = field_value.split('/')
- value &= mask
- eq_(str(value), field_value[0])
- eq_(str(mask), field_value[1])
+ value = _to_masked_int_str(value)
+ eq_(value, field_value)
else:
# without mask
- eq_(str(value), field_value)
- return
- else:
- eq_(value, field_value)
+ eq_(_str_to_int(value), field_value)
return
for key, value in attrs.items():
@@ -565,6 +556,7 @@ class test_data_v1_2(test_data_base):
self.attr_list = [
{'in_port': 7},
{'in_phy_port': 5, 'in_port': 3},
+ {'metadata': 12345},
{'metadata': '0x1212121212121212'},
{'metadata': '0x19af28be37fa91b/0x1010101010101010'},
{'dl_src': "aa:bb:cc:11:22:33"},
@@ -757,7 +749,11 @@ class test_data_v1_3(test_data_v1_2):
[
{'mpls_bos': 3, 'eth_type': 0x8848},
{'pbb_isid': 5, 'eth_type': 0x88E7},
+ {'pbb_isid': "0x05", 'eth_type': 0x88E7},
+ {'pbb_isid': "0x05/0xff", 'eth_type': 0x88E7},
{'tunnel_id': 7},
+ {'tunnel_id': "0x07"},
+ {'tunnel_id': "0x07/0xff"},
{'ipv6_exthdr': 3, 'eth_type': 0x86dd},
{'ipv6_exthdr': "0x40", 'eth_type': 0x86dd},
{'ipv6_exthdr': "0x40/0x1F0", 'eth_type': 0x86dd},