The following causes an error at mod_flow_entry command

  - ofctl_v1_2.py
    * match field: metadata, mpls_label

  - ofctl_v1_3.py
    * match field: in_phy_port

and the following causes an error at get_flow_stats command

  - ofctl_v1_2.py
    * action: POP_MPLS
    * match field: metadata, ipv6_nd_target

  - ofctl_v1_3.py
    * action: POP_MPLS
    * match field: ipv6_nd_target

this patch fixes them.

Signed-off-by: TAKAHASHI Minoru <takahashi.mino...@gmail.com>
---
 ryu/lib/ofctl_v1_2.py |   28 +++++++++++++++++++++++++++-
 ryu/lib/ofctl_v1_3.py |    7 ++++++-
 2 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/ryu/lib/ofctl_v1_2.py b/ryu/lib/ofctl_v1_2.py
index ce49a45..41f0b93 100644
--- a/ryu/lib/ofctl_v1_2.py
+++ b/ryu/lib/ofctl_v1_2.py
@@ -145,7 +145,7 @@ def action_to_str(act):
     elif action_type == ofproto_v1_2.OFPAT_PUSH_MPLS:
         buf = 'PUSH_MPLS:' + str(act.ethertype)
     elif action_type == ofproto_v1_2.OFPAT_POP_MPLS:
-        buf = 'POP_MPLS'
+        buf = 'POP_MPLS:' + str(act.ethertype)
     elif action_type == ofproto_v1_2.OFPAT_SET_QUEUE:
         buf = 'SET_QUEUE:' + str(act.queue_id)
     elif action_type == ofproto_v1_2.OFPAT_GROUP:
@@ -206,6 +206,8 @@ def to_match(dp, attrs):
                'nw_proto': int,
                'tp_src': int,
                'tp_dst': int,
+               'mpls_label': int,
+               'metadata': to_match_metadata,
                'eth_src': to_match_eth,
                'eth_dst': to_match_eth,
                'eth_type': int,
@@ -248,6 +250,8 @@ def to_match(dp, attrs):
                     'nw_proto': match.set_ip_proto,
                     'tp_src': to_match_tpsrc,
                     'tp_dst': to_match_tpdst,
+                    'mpls_label': match.set_mpls_label,
+                    'metadata': match.set_metadata_masked,
                     'eth_src': match.set_dl_src_masked,
                     'eth_dst': match.set_dl_dst_masked,
                     'eth_type': match.set_dl_type,
@@ -308,11 +312,18 @@ def to_match(dp, attrs):
                 ip = value[0]
                 mask = value[1]
                 match_append[key](ip, mask)
+            elif key == 'ipv6_nd_target':
+                match_append[key](value[0])
             elif key == 'tp_src' or key == 'tp_dst' or \
                     key == 'tcp_src' or key == 'tcp_dst' or \
                     key == 'udp_src' or key == 'udp_dst':
                 # tp_src/dst
                 match_append[key](value, match, attrs)
+            elif key == 'metadata':
+                # metadata
+                metadata = value[0]
+                metadata_mask = value[1]
+                match_append[key](metadata, metadata_mask)
             else:
                 # others
                 match_append[key](value)
@@ -390,6 +401,14 @@ def to_match_ipv6(value):
     return ipv6, netmask


+def to_match_metadata(value):
+    if '/' in value:
+        metadata = value.split('/')
+        return str_to_int(metadata[0]), str_to_int(metadata[1])
+    else:
+        return str_to_int(value), ofproto_v1_2_parser.UINT64_MAX
+
+
 def match_to_str(ofmatch):
     keys = {ofproto_v1_2.OXM_OF_IN_PORT: 'in_port',
             ofproto_v1_2.OXM_OF_IN_PHY_PORT: 'in_phy_port',
@@ -417,6 +436,8 @@ def match_to_str(ofmatch):
             ofproto_v1_2.OXM_OF_ICMPV4_CODE: 'icmpv4_code',
             ofproto_v1_2.OXM_OF_MPLS_LABEL: 'mpls_label',
             ofproto_v1_2.OXM_OF_MPLS_TC: 'mpls_tc',
+            ofproto_v1_2.OXM_OF_METADATA: 'metadata',
+            ofproto_v1_2.OXM_OF_METADATA_W: 'metadata',
             ofproto_v1_2.OXM_OF_ARP_OP: 'arp_op',
             ofproto_v1_2.OXM_OF_ARP_SPA: 'arp_spa',
             ofproto_v1_2.OXM_OF_ARP_TPA: 'arp_tpa',
@@ -450,6 +471,11 @@ def match_to_str(ofmatch):
             value = match_ip_to_str(match_field.value, match_field.mask)
         elif key == 'ipv6_src' or key == 'ipv6_dst':
             value = match_ipv6_to_str(match_field.value, match_field.mask)
+        elif key == 'ipv6_nd_target':
+            value = match_ipv6_to_str(match_field.value, None)
+        elif key == 'metadata':
+            value = ('%d/%d' % (match_field.value, match_field.mask)
+                     if match_field.mask else '%d' % match_field.value)
         else:
             value = match_field.value
         match.setdefault(key, value)
diff --git a/ryu/lib/ofctl_v1_3.py b/ryu/lib/ofctl_v1_3.py
index c63c4e1..dda1090 100644
--- a/ryu/lib/ofctl_v1_3.py
+++ b/ryu/lib/ofctl_v1_3.py
@@ -153,7 +153,7 @@ def action_to_str(act):
     elif action_type == ofproto_v1_3.OFPAT_PUSH_MPLS:
         buf = 'PUSH_MPLS:' + str(act.ethertype)
     elif action_type == ofproto_v1_3.OFPAT_POP_MPLS:
-        buf = 'POP_MPLS'
+        buf = 'POP_MPLS:' + str(act.ethertype)
     elif action_type == ofproto_v1_3.OFPAT_SET_QUEUE:
         buf = 'SET_QUEUE:' + str(act.queue_id)
     elif action_type == ofproto_v1_3.OFPAT_GROUP:
@@ -259,6 +259,7 @@ def to_match(dp, attrs):
                'ipv6_exthdr': int}

     match_append = {'in_port': match.set_in_port,
+                    'in_phy_port': match.set_in_phy_port,
                     'dl_src': match.set_dl_src_masked,
                     'dl_dst': match.set_dl_dst_masked,
                     'dl_type': match.set_dl_type,
@@ -335,6 +336,8 @@ def to_match(dp, attrs):
                 ip = value[0]
                 mask = value[1]
                 match_append[key](ip, mask)
+            elif key == 'ipv6_nd_target':
+                match_append[key](value[0])
             elif key == 'tp_src' or key == 'tp_dst' or \
                     key == 'tcp_src' or key == 'tcp_dst' or \
                     key == 'udp_src' or key == 'udp_dst':
@@ -496,6 +499,8 @@ def match_to_str(ofmatch):
             value = match_ip_to_str(match_field.value, match_field.mask)
         elif key == 'ipv6_src' or key == 'ipv6_dst':
             value = match_ipv6_to_str(match_field.value, match_field.mask)
+        elif key == 'ipv6_nd_target':
+            value = match_ipv6_to_str(match_field.value, None)
         elif key == 'metadata':
             value = ('%d/%d' % (match_field.value, match_field.mask)
                      if match_field.mask else '%d' % match_field.value)
-- 
1.7.10.4


------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to