diff options
author | takahashi.minoru <takahashi.minoru7@gmail.com> | 2014-07-10 13:21:16 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2014-07-17 15:04:17 +0900 |
commit | bfe4b79a1f1773dccad696bf04f342b1786a24cb (patch) | |
tree | f311ef7155233f0423164d1aba1ca6f5f2d3a0fc | |
parent | 261cda51a985f8be2785cc67ad26505c4b15355c (diff) |
ofctl_v1_2/3: fix POP_MPLS action and some match fields
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.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r-- | ryu/lib/ofctl_v1_2.py | 28 | ||||
-rw-r--r-- | 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 ce49a45f..41f0b939 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 c63c4e18..dda1090b 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) |