summaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/__init__.py0
-rw-r--r--tests/integrated/__init__.py0
-rw-r--r--tests/integrated/bgp/__init__.py0
-rw-r--r--tests/integrated/bgp/base.py84
-rw-r--r--tests/integrated/bgp/base_ip6.py84
-rw-r--r--tests/integrated/bgp/test_basic.py49
-rw-r--r--tests/integrated/bgp/test_ip6_basic.py49
-rw-r--r--tests/integrated/common/__init__.py0
-rw-r--r--tests/integrated/common/docker_base.py801
-rw-r--r--tests/integrated/common/install_docker_test_pkg.sh43
-rw-r--r--tests/integrated/common/install_docker_test_pkg_common.sh39
-rw-r--r--tests/integrated/common/install_docker_test_pkg_for_travis.sh12
-rw-r--r--tests/integrated/common/quagga.py332
-rw-r--r--tests/integrated/common/ryubgp.py212
-rw-r--r--tests/integrated/run_test.py54
-rwxr-xr-xtests/integrated/run_tests_with_ovs12.py110
-rw-r--r--tests/integrated/test_add_flow_v10.py258
-rw-r--r--tests/integrated/test_add_flow_v12_actions.py496
-rw-r--r--tests/integrated/test_add_flow_v12_matches.py1200
-rw-r--r--tests/integrated/test_of_config.py328
-rw-r--r--tests/integrated/test_request_reply_v12.py1055
-rw-r--r--tests/integrated/test_vrrp_linux_multi.py103
-rw-r--r--tests/integrated/test_vrrp_linux_multi.sh34
-rw-r--r--tests/integrated/test_vrrp_multi.py143
-rw-r--r--tests/integrated/test_vrrp_multi.sh42
-rw-r--r--tests/integrated/tester.py214
-rw-r--r--tests/integrated/vrrp_common.py221
-rw-r--r--tests/mininet/l2/mpls/PopMPLS_mpls.mn6
-rw-r--r--tests/mininet/l2/mpls/PushMPLS_ip.mn6
-rw-r--r--tests/mininet/l2/mpls/PushMPLS_mpls.mn6
-rw-r--r--tests/mininet/l2/mpls/test_mpls.py127
-rw-r--r--tests/mininet/l2/vlan/PopVLAN_vlan.mn6
-rw-r--r--tests/mininet/l2/vlan/PopVLAN_vlanvlan.mn6
-rw-r--r--tests/mininet/l2/vlan/PushVLAN_icmp.mn6
-rw-r--r--tests/mininet/l2/vlan/test_vlan.py130
-rw-r--r--tests/mininet/l3/icmp/ICMP_ping.mn6
-rw-r--r--tests/mininet/l3/icmp/ICMP_reply.mn6
-rw-r--r--tests/mininet/l3/icmp/test_icmp.py84
-rw-r--r--tests/mininet/l3/ip_ttl/DecNwTtl.mn6
-rw-r--r--tests/mininet/l3/ip_ttl/test_ip_ttl.py84
-rw-r--r--tests/mininet/packet_lib/arp/ARP_gratuitous.mn7
-rw-r--r--tests/mininet/packet_lib/arp/ARP_reply.mn7
-rw-r--r--tests/mininet/packet_lib/arp/ARP_request.mn7
-rw-r--r--tests/mininet/packet_lib/arp/test_arp.py199
-rwxr-xr-xtests/mininet/run_mnet-test.sh274
-rw-r--r--tests/packet_data/bgp4/bgp4-keepalive.pcapbin0 -> 113 bytes
-rw-r--r--tests/packet_data/bgp4/bgp4-open.pcapbin0 -> 147 bytes
-rw-r--r--tests/packet_data/bgp4/bgp4-update.pcapbin0 -> 146 bytes
-rw-r--r--tests/packet_data/bgp4/bgp4-update_ipv6.pcapbin0 -> 233 bytes
-rw-r--r--tests/packet_data/bgp4/bgp4-update_vpnv6.pcapbin0 -> 209 bytes
-rw-r--r--tests/packet_data/bgp4/evpn_esi_arbitrary.pcapbin0 -> 156 bytes
-rw-r--r--tests/packet_data/bgp4/evpn_esi_as_based.pcapbin0 -> 156 bytes
-rw-r--r--tests/packet_data/bgp4/evpn_esi_l2_bridge.pcapbin0 -> 156 bytes
-rw-r--r--tests/packet_data/bgp4/evpn_esi_lacp.pcapbin0 -> 156 bytes
-rw-r--r--tests/packet_data/bgp4/evpn_esi_mac_base.pcapbin0 -> 156 bytes
-rw-r--r--tests/packet_data/bgp4/evpn_esi_router_id.pcapbin0 -> 156 bytes
-rw-r--r--tests/packet_data/bgp4/evpn_nlri_eth_a-d.pcapbin0 -> 156 bytes
-rw-r--r--tests/packet_data/bgp4/evpn_nlri_eth_seg.pcapbin0 -> 154 bytes
-rw-r--r--tests/packet_data/bgp4/evpn_nlri_inc_multi_eth_tag.pcapbin0 -> 148 bytes
-rw-r--r--tests/packet_data/bgp4/evpn_nlri_ip_prefix.pcapbin0 -> 190 bytes
-rw-r--r--tests/packet_data/bgp4/evpn_nlri_mac_ip_ad.pcapbin0 -> 168 bytes
-rw-r--r--tests/packet_data/bgp4/flowspec_action_redirect.pcapbin0 -> 173 bytes
-rw-r--r--tests/packet_data/bgp4/flowspec_action_traffic_action.pcapbin0 -> 173 bytes
-rw-r--r--tests/packet_data/bgp4/flowspec_action_traffic_marking.pcapbin0 -> 173 bytes
-rw-r--r--tests/packet_data/bgp4/flowspec_action_traffic_rate.pcapbin0 -> 173 bytes
-rw-r--r--tests/packet_data/bgp4/flowspec_nlri_ipv4.pcapbin0 -> 273 bytes
-rw-r--r--tests/packet_data/bgp4/flowspec_nlri_ipv6.pcapbin0 -> 264 bytes
-rw-r--r--tests/packet_data/bgp4/flowspec_nlri_l2vpn.pcapbin0 -> 241 bytes
-rw-r--r--tests/packet_data/bgp4/flowspec_nlri_vpn4.pcapbin0 -> 289 bytes
-rw-r--r--tests/packet_data/bgp4/flowspec_nlri_vpn6.pcapbin0 -> 273 bytes
-rw-r--r--tests/packet_data/mrt/rib.20161101.0000_pick.bz2bin0 -> 271 bytes
-rw-r--r--tests/packet_data/mrt/updates.20161101.0000.bz2bin0 -> 20939 bytes
-rw-r--r--tests/packet_data/of10/1-1-ofp_packet_out.packetbin0 -> 122 bytes
-rw-r--r--tests/packet_data/of10/1-2-ofp_flow_mod.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of10/1-4-ofp_packet_in.packetbin0 -> 60 bytes
-rw-r--r--tests/packet_data/of10/1-5-features_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of10/1-6-ofp_switch_features.packetbin0 -> 128 bytes
-rw-r--r--tests/packet_data/of10/libofproto-OFP10-ofp_packet_out_packet_library.packetbin0 -> 122 bytes
-rw-r--r--tests/packet_data/of10/ovs-ofctl-of10-action_dec_mpls_ttl.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of10/ovs-ofctl-of10-action_dec_nw_ttl.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of10/ovs-ofctl-of10-action_pop_mpls.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of10/ovs-ofctl-of10-action_push_mpls.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_label.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_tc.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_ttl.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of12/3-0-ofp_desc_stats_reply.packetbin0 -> 1072 bytes
-rw-r--r--tests/packet_data/of12/3-1-ofp_packet_out.packetbin0 -> 138 bytes
-rw-r--r--tests/packet_data/of12/3-10-ofp_hello.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of12/3-11-ofp_flow_stats_request.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of12/3-12-ofp_flow_stats_reply.packetbin0 -> 320 bytes
-rw-r--r--tests/packet_data/of12/3-13-ofp_echo_request.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of12/3-14-ofp_echo_reply.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of12/3-15-ofp_error_msg.packetbin0 -> 20 bytes
-rw-r--r--tests/packet_data/of12/3-16-ofp_experimenter.packetbin0 -> 20 bytes
-rw-r--r--tests/packet_data/of12/3-17-ofp_barrier_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of12/3-18-ofp_barrier_reply.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of12/3-19-ofp_role_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of12/3-2-ofp_flow_mod.packetbin0 -> 128 bytes
-rw-r--r--tests/packet_data/of12/3-20-ofp_role_reply.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of12/3-21-ofp_group_mod.packetbin0 -> 48 bytes
-rw-r--r--tests/packet_data/of12/3-22-ofp_port_mod.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of12/3-23-ofp_table_mod.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of12/3-24-ofp_desc_stats_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of12/3-25-ofp_aggregate_stats_request.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of12/3-26-ofp_aggregate_stats_reply.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of12/3-27-ofp_table_stats_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of12/3-28-ofp_table_stats_reply.packetbin0 -> 32656 bytes
-rw-r--r--tests/packet_data/of12/3-29-ofp_port_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of12/3-3-ofp_flow_mod.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of12/3-30-ofp_port_stats_reply.packetbin0 -> 224 bytes
-rw-r--r--tests/packet_data/of12/3-31-ofp_group_features_stats_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of12/3-32-ofp_group_features_stats_reply.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of12/3-33-ofp_group_desc_stats_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of12/3-34-ofp_group_desc_stats_reply.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of12/3-35-ofp_queue_get_config_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of12/3-36-ofp_queue_get_config_reply.packetbin0 -> 112 bytes
-rw-r--r--tests/packet_data/of12/3-37-ofp_queue_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of12/3-38-ofp_queue_stats_reply.packetbin0 -> 112 bytes
-rw-r--r--tests/packet_data/of12/3-39-ofp_port_status.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of12/3-4-ofp_packet_in.packetbin0 -> 140 bytes
-rw-r--r--tests/packet_data/of12/3-40-ofp_flow_removed.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of12/3-41-ofp_error_msg_experimenter.packetbin0 -> 27 bytes
-rw-r--r--tests/packet_data/of12/3-5-ofp_features_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of12/3-59-ofp_packet_in.packetbin0 -> 314 bytes
-rw-r--r--tests/packet_data/of12/3-6-ofp_features_reply.packetbin0 -> 160 bytes
-rw-r--r--tests/packet_data/of12/3-60-ofp_flow_mod.packetbin0 -> 344 bytes
-rw-r--r--tests/packet_data/of12/3-61-ofp_group_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of12/3-62-ofp_group_stats_reply.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of12/3-7-ofp_set_config.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of12/3-8-ofp_get_config_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of12/3-9-ofp_get_config_reply.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of12/libofproto-OFP12-ofp_packet_out_packet_library.packetbin0 -> 138 bytes
-rw-r--r--tests/packet_data/of13/4-0-ofp_desc_reply.packetbin0 -> 1072 bytes
-rw-r--r--tests/packet_data/of13/4-1-ofp_packet_out.packetbin0 -> 138 bytes
-rw-r--r--tests/packet_data/of13/4-10-ofp_hello.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of13/4-11-ofp_flow_stats_request.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of13/4-12-ofp_flow_stats_reply.packetbin0 -> 552 bytes
-rw-r--r--tests/packet_data/of13/4-13-ofp_echo_request.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of13/4-14-ofp_echo_reply.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of13/4-15-ofp_error_msg.packetbin0 -> 20 bytes
-rw-r--r--tests/packet_data/of13/4-16-ofp_experimenter.packetbin0 -> 20 bytes
-rw-r--r--tests/packet_data/of13/4-17-ofp_barrier_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of13/4-18-ofp_barrier_reply.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of13/4-19-ofp_role_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of13/4-2-ofp_flow_mod.packetbin0 -> 280 bytes
-rw-r--r--tests/packet_data/of13/4-20-ofp_role_reply.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of13/4-21-ofp_group_mod.packetbin0 -> 48 bytes
-rw-r--r--tests/packet_data/of13/4-22-ofp_port_mod.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of13/4-23-ofp_table_mod.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of13/4-24-ofp_desc_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of13/4-25-ofp_aggregate_stats_request.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of13/4-26-ofp_aggregate_stats_reply.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of13/4-27-ofp_table_stats_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of13/4-28-ofp_table_stats_reply.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of13/4-29-ofp_port_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of13/4-3-ofp_flow_mod.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of13/4-30-ofp_port_stats_reply.packetbin0 -> 240 bytes
-rw-r--r--tests/packet_data/of13/4-31-ofp_group_features_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of13/4-32-ofp_group_features_reply.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of13/4-33-ofp_group_desc_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of13/4-34-ofp_group_desc_reply.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of13/4-35-ofp_queue_get_config_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of13/4-36-ofp_queue_get_config_reply.packetbin0 -> 211 bytes
-rw-r--r--tests/packet_data/of13/4-37-ofp_queue_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of13/4-38-ofp_queue_stats_reply.packetbin0 -> 136 bytes
-rw-r--r--tests/packet_data/of13/4-39-ofp_port_status.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of13/4-4-ofp_packet_in.packetbin0 -> 148 bytes
-rw-r--r--tests/packet_data/of13/4-40-ofp_flow_removed.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of13/4-41-ofp_error_msg_experimenter.packetbin0 -> 27 bytes
-rw-r--r--tests/packet_data/of13/4-42-ofp_get_async_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of13/4-43-ofp_get_async_reply.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of13/4-44-ofp_set_async.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of13/4-45-ofp_meter_mod.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of13/4-46-ofp_flow_mod.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of13/4-47-ofp_meter_config_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of13/4-48-ofp_meter_config_reply.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of13/4-49-ofp_meter_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of13/4-5-ofp_features_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of13/4-50-ofp_meter_stats_reply.packetbin0 -> 72 bytes
-rw-r--r--tests/packet_data/of13/4-51-ofp_meter_features_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of13/4-52-ofp_meter_features_reply.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of13/4-53-ofp_port_desc_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of13/4-54-ofp_port_desc_reply.packetbin0 -> 144 bytes
-rw-r--r--tests/packet_data/of13/4-55-ofp_table_features_request.packetbin0 -> 11128 bytes
-rw-r--r--tests/packet_data/of13/4-56-ofp_table_features_reply.packetbin0 -> 11128 bytes
-rw-r--r--tests/packet_data/of13/4-57-ofp_group_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of13/4-58-ofp_group_stats_reply.packetbin0 -> 72 bytes
-rw-r--r--tests/packet_data/of13/4-59-ofp_packet_in.packetbin0 -> 378 bytes
-rw-r--r--tests/packet_data/of13/4-6-ofp_features_reply.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of13/4-60-ofp_flow_mod.packetbin0 -> 400 bytes
-rw-r--r--tests/packet_data/of13/4-61-ofp_experimenter_request.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of13/4-62-ofp_experimenter_reply.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of13/4-63-onf_flow_monitor_request.packetbin0 -> 408 bytes
-rw-r--r--tests/packet_data/of13/4-7-ofp_set_config.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of13/4-8-ofp_get_config_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of13/4-9-ofp_get_config_reply.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-echo_reply.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-echo_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-error_msg.packetbin0 -> 20 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-features_reply.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-flow_mod.packetbin0 -> 256 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-flow_mod.truncated640
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-flow_mod_conjunction.packetbin0 -> 144 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-flow_mod_match_conj.packetbin0 -> 104 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-flow_removed.packetbin0 -> 120 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-get_config_reply.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-hello.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-meter_mod.packetbin0 -> 48 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-ofp_packet_out_packet_library.packetbin0 -> 138 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-packet_in.packetbin0 -> 70 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-port_mod.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-port_status.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-set_config.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of13/libofproto-OFP13-table_mod.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_conjunction.packetbin0 -> 144 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_controller.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_controller2.packetbin0 -> 128 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_ct.packetbin0 -> 104 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_ct_exec.packetbin0 -> 120 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_ct_nat.packetbin0 -> 128 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_ct_nat_v6.packetbin0 -> 144 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_dec_ttl_cnt_ids.packetbin0 -> 104 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_fintimeout.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_learn.packetbin0 -> 256 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_note.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_output_trunc.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_resubmit.packetbin0 -> 144 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_sample.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_sample2.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_stack_pop.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-action_stack_push.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-match_conj.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-match_load_nx_register.packetbin0 -> 104 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-match_move_nx_register.packetbin0 -> 104 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-match_pkt_mark.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of13/ovs-ofctl-of13-match_pkt_mark_masked.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of14/5-0-ofp_desc_reply.packetbin0 -> 1072 bytes
-rw-r--r--tests/packet_data/of14/5-1-ofp_packet_out.packetbin0 -> 138 bytes
-rw-r--r--tests/packet_data/of14/5-10-ofp_hello.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of14/5-11-ofp_flow_stats_request.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of14/5-12-ofp_flow_stats_reply.packetbin0 -> 552 bytes
-rw-r--r--tests/packet_data/of14/5-13-ofp_echo_request.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of14/5-14-ofp_echo_reply.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of14/5-15-ofp_error_msg.packetbin0 -> 20 bytes
-rw-r--r--tests/packet_data/of14/5-16-ofp_experimenter.packetbin0 -> 20 bytes
-rw-r--r--tests/packet_data/of14/5-17-ofp_barrier_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of14/5-18-ofp_barrier_reply.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of14/5-19-ofp_role_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of14/5-2-ofp_flow_mod.packetbin0 -> 280 bytes
-rw-r--r--tests/packet_data/of14/5-20-ofp_role_reply.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of14/5-21-ofp_group_mod.packetbin0 -> 48 bytes
-rw-r--r--tests/packet_data/of14/5-22-ofp_port_mod.packetbin0 -> 120 bytes
-rw-r--r--tests/packet_data/of14/5-23-ofp_table_mod.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of14/5-24-ofp_desc_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of14/5-25-ofp_aggregate_stats_request.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of14/5-26-ofp_aggregate_stats_reply.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of14/5-27-ofp_table_stats_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of14/5-28-ofp_table_stats_reply.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of14/5-29-ofp_port_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of14/5-3-ofp_flow_mod.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of14/5-30-ofp_port_stats_reply.packetbin0 -> 360 bytes
-rw-r--r--tests/packet_data/of14/5-31-ofp_group_features_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of14/5-32-ofp_group_features_reply.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of14/5-33-ofp_group_desc_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of14/5-34-ofp_group_desc_reply.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of14/5-35-ofp_queue_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of14/5-36-ofp_queue_stats_reply.packetbin0 -> 216 bytes
-rw-r--r--tests/packet_data/of14/5-37-ofp_port_status.packetbin0 -> 184 bytes
-rw-r--r--tests/packet_data/of14/5-38-ofp_flow_removed.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of14/5-39-ofp_error_msg_experimenter.packetbin0 -> 27 bytes
-rw-r--r--tests/packet_data/of14/5-4-ofp_packet_in.packetbin0 -> 148 bytes
-rw-r--r--tests/packet_data/of14/5-40-ofp_get_async_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of14/5-41-ofp_get_async_reply.packetbin0 -> 160 bytes
-rw-r--r--tests/packet_data/of14/5-42-ofp_set_async.packetbin0 -> 160 bytes
-rw-r--r--tests/packet_data/of14/5-43-ofp_meter_mod.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of14/5-44-ofp_flow_mod.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of14/5-45-ofp_meter_config_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of14/5-46-ofp_meter_config_reply.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of14/5-47-ofp_meter_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of14/5-48-ofp_meter_stats_reply.packetbin0 -> 72 bytes
-rw-r--r--tests/packet_data/of14/5-49-ofp_meter_features_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of14/5-5-ofp_features_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of14/5-50-ofp_meter_features_reply.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of14/5-51-ofp_port_desc_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of14/5-52-ofp_port_desc_reply.packetbin0 -> 256 bytes
-rw-r--r--tests/packet_data/of14/5-53-ofp_table_features_request.packetbin0 -> 11128 bytes
-rw-r--r--tests/packet_data/of14/5-54-ofp_table_features_reply.packetbin0 -> 11128 bytes
-rw-r--r--tests/packet_data/of14/5-55-ofp_group_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of14/5-56-ofp_group_stats_reply.packetbin0 -> 72 bytes
-rw-r--r--tests/packet_data/of14/5-57-ofp_packet_in.packetbin0 -> 362 bytes
-rw-r--r--tests/packet_data/of14/5-58-ofp_flow_mod.packetbin0 -> 384 bytes
-rw-r--r--tests/packet_data/of14/5-59-ofp_experimenter_request.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of14/5-6-ofp_features_reply.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of14/5-60-ofp_experimenter_reply.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of14/5-61-ofp_table_desc_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of14/5-62-ofp_table_desc_reply.packetbin0 -> 120 bytes
-rw-r--r--tests/packet_data/of14/5-63-ofp_queue_desc_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of14/5-64-ofp_queue_desc_reply.packetbin0 -> 136 bytes
-rw-r--r--tests/packet_data/of14/5-65-ofp_role_status.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of14/5-66-ofp_flow_monitor_request.packetbin0 -> 48 bytes
-rw-r--r--tests/packet_data/of14/5-67-ofp_flow_monitor_reply.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of14/5-68-ofp_table_status.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of14/5-69-ofp_bundle_ctrl_msg.packetbin0 -> 72 bytes
-rw-r--r--tests/packet_data/of14/5-7-ofp_set_config.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of14/5-70-ofp_bundle_add_msg.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of14/5-71-ofp_requestforward.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of14/5-8-ofp_get_config_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of14/5-9-ofp_get_config_reply.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of14/libofproto-OFP14-ofp_packet_out_packet_library.packetbin0 -> 138 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-aggregate_stats_reply.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-aggregate_stats_request.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-barrier_reply.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-barrier_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-bundle_add.packetbin0 -> 272 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-bundle_ctrl.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-bundle_features_reply.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-bundle_features_request.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-controller_status.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-controller_status_reply.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-controller_status_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-desc_reply.packetbin0 -> 1072 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-desc_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-echo_reply.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-echo_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-error_msg.packetbin0 -> 20 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-error_msg_experimenter.packetbin0 -> 27 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-experimenter.packetbin0 -> 20 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-experimenter_reply.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-experimenter_request.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-features_reply.packetbin0 -> 32 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-features_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-flow_desc_reply.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-flow_desc_request.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-flow_mod.packetbin0 -> 256 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-flow_mod_conjunction.packetbin0 -> 144 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-flow_mod_match_conj.packetbin0 -> 104 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-flow_monitor_reply.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-flow_monitor_request.packetbin0 -> 48 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-flow_removed.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-flow_stats_reply.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-flow_stats_request.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-get_async_reply.packetbin0 -> 160 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-get_async_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-get_config_reply.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-get_config_request.packetbin0 -> 8 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-group_desc_reply.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-group_desc_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-group_features_reply.packetbin0 -> 56 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-group_features_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-group_mod.packetbin0 -> 80 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-group_stats_reply.packetbin0 -> 72 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-group_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-hello.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-meter_desc_reply.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-meter_desc_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-meter_features_reply.packetbin0 -> 40 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-meter_features_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-meter_mod.packetbin0 -> 48 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-meter_stats_reply.packetbin0 -> 72 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-meter_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-packet_in.packetbin0 -> 70 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-packet_out.packetbin0 -> 52 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-port_desc_reply.packetbin0 -> 256 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-port_desc_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-port_mod.packetbin0 -> 120 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-port_stats_reply.packetbin0 -> 360 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-port_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-port_status.packetbin0 -> 184 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-queue_desc_reply.packetbin0 -> 136 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-queue_desc_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-queue_stats_reply.packetbin0 -> 216 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-queue_stats_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-requestforward.packetbin0 -> 88 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-role_reply.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-role_request.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-role_status.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-set_async.packetbin0 -> 160 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-set_config.packetbin0 -> 12 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-table_desc_reply.packetbin0 -> 120 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-table_desc_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-table_features_reply.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-table_features_request.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-table_mod.packetbin0 -> 24 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-table_stats_reply.packetbin0 -> 64 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-table_stats_request.packetbin0 -> 16 bytes
-rw-r--r--tests/packet_data/of15/libofproto-OFP15-table_status.packetbin0 -> 96 bytes
-rw-r--r--tests/packet_data/pcap/big_endian.pcapbin0 -> 78 bytes
-rw-r--r--tests/packet_data/pcap/geneve_unknown.pcapbin0 -> 196 bytes
-rw-r--r--tests/packet_data/pcap/gre_full_options.pcapbin0 -> 190 bytes
-rw-r--r--tests/packet_data/pcap/gre_no_option.pcapbin0 -> 178 bytes
-rw-r--r--tests/packet_data/pcap/gre_nvgre_option.pcapbin0 -> 190 bytes
-rw-r--r--tests/packet_data/pcap/little_endian.pcapbin0 -> 78 bytes
-rw-r--r--tests/packet_data/pcap/openflow_flowmod.pcapbin0 -> 186 bytes
-rw-r--r--tests/packet_data/pcap/openflow_flowstats_req.pcapbin0 -> 162 bytes
-rw-r--r--tests/packet_data/pcap/openflow_invalid_version.pcapbin0 -> 186 bytes
-rw-r--r--tests/packet_data/pcap/zebra_v2.pcapbin0 -> 1236 bytes
-rw-r--r--tests/packet_data/pcap/zebra_v3.pcapbin0 -> 1250 bytes
-rw-r--r--tests/packet_data_generator/Makefile5
-rw-r--r--tests/packet_data_generator/rebar.config29
-rw-r--r--tests/packet_data_generator/src/er.app.src24
-rw-r--r--tests/packet_data_generator/src/x.erl63
-rw-r--r--tests/packet_data_generator/src/x1.erl90
-rw-r--r--tests/packet_data_generator/src/x3.erl8749
-rw-r--r--tests/packet_data_generator/src/x4.erl2657
-rw-r--r--tests/packet_data_generator/src/x5.erl3024
-rw-r--r--tests/packet_data_generator/src/x_flower_packet.erl61
-rw-r--r--tests/packet_data_generator/src/x_of_protocol.erl33
-rw-r--r--tests/packet_data_generator2/Makefile.BSD35
-rw-r--r--tests/packet_data_generator2/Makefile.GNU39
-rw-r--r--tests/packet_data_generator2/README15
-rw-r--r--tests/packet_data_generator2/gen.c963
-rw-r--r--tests/packet_data_generator3/gen.py329
-rwxr-xr-xtests/run_tests.py35
-rw-r--r--tests/test_lib.py270
-rw-r--r--tests/unit/__init__.py6
-rw-r--r--tests/unit/app/__init__.py0
-rw-r--r--tests/unit/app/ofctl_rest_json/of10.json101
-rw-r--r--tests/unit/app/ofctl_rest_json/of12.json150
-rw-r--r--tests/unit/app/ofctl_rest_json/of13.json191
-rw-r--r--tests/unit/app/ofctl_rest_json/of14.json195
-rw-r--r--tests/unit/app/ofctl_rest_json/of15.json203
-rw-r--r--tests/unit/app/test_ofctl_rest.py138
-rw-r--r--tests/unit/app/test_tester.py464
-rw-r--r--tests/unit/app/test_ws_topology.py54
-rw-r--r--tests/unit/app/test_wsgi.py104
-rw-r--r--tests/unit/cmd/__init__.py15
-rw-r--r--tests/unit/cmd/dummy_app.py21
-rw-r--r--tests/unit/cmd/dummy_openflow_app.py22
-rw-r--r--tests/unit/cmd/test_manager.py77
-rw-r--r--tests/unit/controller/__init__.py0
-rw-r--r--tests/unit/controller/test_controller.py145
-rw-r--r--tests/unit/lib/__init__.py0
-rw-r--r--tests/unit/lib/ofctl_json/of10/1-2-ofp_flow_mod.packet.json23
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-0-ofp_desc_stats_reply.packet.json9
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-11-ofp_flow_stats_request.packet.json11
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-12-ofp_flow_stats_reply.packet.json75
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-16-ofp_experimenter.packet.json8
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-2-ofp_flow_mod.packet.json41
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-21-ofp_group_mod.packet.json22
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-22-ofp_port_mod.packet.json9
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-25-ofp_aggregate_stats_request.packet.json11
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-26-ofp_aggregate_stats_reply.packet.json9
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-28-ofp_table_stats_reply.packet.json32134
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-30-ofp_port_stats_reply.packet.json34
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-32-ofp_group_features_stats_reply.packet.json104
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-34-ofp_group_desc_stats_reply.packet.json20
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-35-ofp_queue_get_config_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-36-ofp_queue_get_config_reply.packet.json43
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-38-ofp_queue_stats_reply.packet.json25
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-6-ofp_features_reply.packet.json30
-rw-r--r--tests/unit/lib/ofctl_json/of12/3-62-ofp_group_stats_reply.packet.json17
-rw-r--r--tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_group_stats_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_port_stats_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_get_config_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet1.json3
-rw-r--r--tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet2.json4
-rw-r--r--tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet3.json3
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-0-ofp_desc_reply.packet.json9
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-11-ofp_flow_stats_request.packet.json11
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-12-ofp_flow_stats_reply.packet.json104
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-16-ofp_experimenter.packet.json8
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-2-ofp_flow_mod.packet.json97
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-21-ofp_group_mod.packet.json21
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-22-ofp_port_mod.packet.json9
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-25-ofp_aggregate_stats_request.packet.json11
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-26-ofp_aggregate_stats_reply.packet.json9
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-28-ofp_table_stats_reply.packet.json16
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-30-ofp_port_stats_reply.packet.json38
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-32-ofp_group_features_reply.packet.json104
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-34-ofp_group_desc_reply.packet.json20
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-35-ofp_queue_get_config_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-36-ofp_queue_get_config_reply.packet.json83
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-38-ofp_queue_stats_reply.packet.json31
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-45-ofp_meter_mod.packet.json31
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-48-ofp_meter_config_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-50-ofp_meter_stats_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-52-ofp_meter_features_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-54-ofp_port_desc_reply.packet.json30
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-56-ofp_table_features_reply.packet.json11928
-rw-r--r--tests/unit/lib/ofctl_json/of13/4-58-ofp_group_stats_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_group_stats_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_meter_config_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_meter_stats_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_port_stats_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_get_config_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet1.json3
-rw-r--r--tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet2.json4
-rw-r--r--tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet3.json3
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-0-ofp_desc_reply.packet.json9
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-11-ofp_flow_stats_request.packet.json11
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-12-ofp_flow_stats_reply.packet.json197
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-16-ofp_experimenter.packet.json8
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-2-ofp_flow_mod.packet.json103
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-21-ofp_group_mod.packet.json21
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-22-ofp_port_mod.packet.json50
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-25-ofp_aggregate_stats_request.packet.json11
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-26-ofp_aggregate_stats_reply.packet.json9
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-28-ofp_table_stats_reply.packet.json16
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-30-ofp_port_stats_reply.packet.json85
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-32-ofp_group_features_reply.packet.json104
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-34-ofp_group_desc_reply.packet.json24
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-36-ofp_queue_stats_reply.packet.json64
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-43-ofp_meter_mod.packet.json31
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-46-ofp_meter_config_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-48-ofp_meter_stats_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-50-ofp_meter_features_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-52-ofp_port_desc_reply.packet.json83
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-54-ofp_table_features_reply.packet.json11928
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-56-ofp_group_stats_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-63-ofp_queue_desc_request.packet.json4
-rw-r--r--tests/unit/lib/ofctl_json/of14/5-64-ofp_queue_desc_reply.packet.json61
-rw-r--r--tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_desc_reply.packet.json48
-rw-r--r--tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_desc_request.packet.json13
-rw-r--r--tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_mod.packet.json115
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-aggregate_stats_reply.packet.json10
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-aggregate_stats_request.packet.json11
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-desc_reply.packet.json9
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-experimenter.packet.json8
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_desc_reply.packet.json26
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_desc_request.packet.json13
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_mod_no_nx.packet.json103
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_stats_reply.packet.json16
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_stats_request.packet.json11
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_desc_reply.packet.json27
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_desc_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_features_reply.packet.json104
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_mod.packet.json42
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_stats_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_desc_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_features_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_mod.packet.json24
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_stats_reply.packet.json19
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_desc_reply.packet.json83
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_desc_request.packet.json3
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_mod.packet.json50
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_stats_reply.packet.json93
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_desc_reply.packet.json61
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_desc_request.packet.json4
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_stats_reply.packet.json64
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-table_features_reply.packet.json25
-rw-r--r--tests/unit/lib/ofctl_json/of15/libofproto-OFP15-table_stats_reply.packet.json16
-rw-r--r--tests/unit/lib/ovs/__init__.py0
-rw-r--r--tests/unit/lib/ovs/test_vsctl.py789
-rw-r--r--tests/unit/lib/test_addrconv.py56
-rw-r--r--tests/unit/lib/test_hub.py239
-rw-r--r--tests/unit/lib/test_import_module.py66
-rw-r--r--tests/unit/lib/test_ip.py156
-rw-r--r--tests/unit/lib/test_mac.py95
-rw-r--r--tests/unit/lib/test_mod/__init__.py15
-rw-r--r--tests/unit/lib/test_mod/aaa/__init__.py15
-rw-r--r--tests/unit/lib/test_mod/aaa/mod.py17
-rw-r--r--tests/unit/lib/test_mod/bbb/__init__.py15
-rw-r--r--tests/unit/lib/test_mod/bbb/mod.py17
-rw-r--r--tests/unit/lib/test_mod/ccc/__init__.py14
-rw-r--r--tests/unit/lib/test_mod/ccc/mod.py16
-rw-r--r--tests/unit/lib/test_mod/ddd/__init__.py14
-rw-r--r--tests/unit/lib/test_mod/ddd/mod.py16
-rw-r--r--tests/unit/lib/test_mod/eee.py16
-rw-r--r--tests/unit/lib/test_mod/fff.py16
-rw-r--r--tests/unit/lib/test_mod/ggg.py16
-rw-r--r--tests/unit/lib/test_mrtlib.py765
-rw-r--r--tests/unit/lib/test_of_config_classes.py442
-rw-r--r--tests/unit/lib/test_ofctl.py643
-rw-r--r--tests/unit/lib/test_ofctl_action_match.py869
-rw-r--r--tests/unit/lib/test_ofctl_string.py151
-rw-r--r--tests/unit/lib/test_ofctl_utils.py142
-rw-r--r--tests/unit/lib/test_ofctl_v1_3.py54
-rw-r--r--tests/unit/lib/test_ofp_pktinfilter.py92
-rw-r--r--tests/unit/lib/test_pack_utils.py59
-rw-r--r--tests/unit/lib/test_pcaplib.py230
-rw-r--r--tests/unit/lib/test_rpc.py360
-rw-r--r--tests/unit/lib/test_stringify.py75
-rw-r--r--tests/unit/ofproto/__init__.py0
-rw-r--r--tests/unit/ofproto/json/of10/1-1-ofp_packet_out.packet.json15
-rw-r--r--tests/unit/ofproto/json/of10/1-2-ofp_flow_mod.packet.json37
-rw-r--r--tests/unit/ofproto/json/of10/1-4-ofp_packet_in.packet.json9
-rw-r--r--tests/unit/ofproto/json/of10/1-5-features_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of10/1-6-ofp_switch_features.packet.json37
-rw-r--r--tests/unit/ofproto/json/of10/libofproto-OFP10-ofp_packet_out_packet_library.packet.json58
-rw-r--r--tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_dec_mpls_ttl.packet.json37
-rw-r--r--tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_dec_nw_ttl.packet.json37
-rw-r--r--tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_pop_mpls.packet.json38
-rw-r--r--tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_push_mpls.packet.json38
-rw-r--r--tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_label.packet.json38
-rw-r--r--tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_tc.packet.json38
-rw-r--r--tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_ttl.packet.json38
-rw-r--r--tests/unit/ofproto/json/of12/3-0-ofp_desc_stats_reply.packet.json15
-rw-r--r--tests/unit/ofproto/json/of12/3-1-ofp_packet_out.packet.json18
-rw-r--r--tests/unit/ofproto/json/of12/3-10-ofp_hello.packet.json3
-rw-r--r--tests/unit/ofproto/json/of12/3-11-ofp_flow_stats_request.packet.json17
-rw-r--r--tests/unit/ofproto/json/of12/3-12-ofp_flow_stats_reply.packet.json161
-rw-r--r--tests/unit/ofproto/json/of12/3-13-ofp_echo_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of12/3-14-ofp_echo_reply.packet.json5
-rw-r--r--tests/unit/ofproto/json/of12/3-15-ofp_error_msg.packet.json7
-rw-r--r--tests/unit/ofproto/json/of12/3-16-ofp_experimenter.packet.json7
-rw-r--r--tests/unit/ofproto/json/of12/3-17-ofp_barrier_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of12/3-18-ofp_barrier_reply.packet.json3
-rw-r--r--tests/unit/ofproto/json/of12/3-19-ofp_role_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of12/3-2-ofp_flow_mod.packet.json82
-rw-r--r--tests/unit/ofproto/json/of12/3-20-ofp_role_reply.packet.json6
-rw-r--r--tests/unit/ofproto/json/of12/3-21-ofp_group_mod.packet.json27
-rw-r--r--tests/unit/ofproto/json/of12/3-22-ofp_port_mod.packet.json9
-rw-r--r--tests/unit/ofproto/json/of12/3-23-ofp_table_mod.packet.json6
-rw-r--r--tests/unit/ofproto/json/of12/3-24-ofp_desc_stats_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of12/3-25-ofp_aggregate_stats_request.packet.json17
-rw-r--r--tests/unit/ofproto/json/of12/3-26-ofp_aggregate_stats_reply.packet.json13
-rw-r--r--tests/unit/ofproto/json/of12/3-27-ofp_table_stats_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of12/3-28-ofp_table_stats_reply.packet.json5108
-rw-r--r--tests/unit/ofproto/json/of12/3-29-ofp_port_stats_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of12/3-3-ofp_flow_mod.packet.json46
-rw-r--r--tests/unit/ofproto/json/of12/3-30-ofp_port_stats_reply.packet.json42
-rw-r--r--tests/unit/ofproto/json/of12/3-31-ofp_group_features_stats_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of12/3-32-ofp_group_features_stats_reply.packet.json25
-rw-r--r--tests/unit/ofproto/json/of12/3-33-ofp_group_desc_stats_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of12/3-34-ofp_group_desc_stats_reply.packet.json35
-rw-r--r--tests/unit/ofproto/json/of12/3-35-ofp_queue_get_config_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of12/3-36-ofp_queue_get_config_reply.packet.json53
-rw-r--r--tests/unit/ofproto/json/of12/3-37-ofp_queue_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of12/3-38-ofp_queue_stats_reply.packet.json35
-rw-r--r--tests/unit/ofproto/json/of12/3-39-ofp_port_status.packet.json20
-rw-r--r--tests/unit/ofproto/json/of12/3-4-ofp_packet_in.packet.json80
-rw-r--r--tests/unit/ofproto/json/of12/3-40-ofp_flow_removed.packet.json29
-rw-r--r--tests/unit/ofproto/json/of12/3-41-ofp_error_msg_experimenter.packet.json8
-rw-r--r--tests/unit/ofproto/json/of12/3-5-ofp_features_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of12/3-59-ofp_packet_in.packet.json262
-rw-r--r--tests/unit/ofproto/json/of12/3-6-ofp_features_reply.packet.json40
-rw-r--r--tests/unit/ofproto/json/of12/3-60-ofp_flow_mod.packet.json269
-rw-r--r--tests/unit/ofproto/json/of12/3-61-ofp_group_stats_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of12/3-62-ofp_group_stats_reply.packet.json25
-rw-r--r--tests/unit/ofproto/json/of12/3-7-ofp_set_config.packet.json6
-rw-r--r--tests/unit/ofproto/json/of12/3-8-ofp_get_config_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of12/3-9-ofp_get_config_reply.packet.json6
-rw-r--r--tests/unit/ofproto/json/of12/lib-ofctl-ofp_group_stats_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of12/lib-ofctl-ofp_port_stats_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_get_config_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet1.json7
-rw-r--r--tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet2.json7
-rw-r--r--tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet3.json7
-rw-r--r--tests/unit/ofproto/json/of12/libofproto-OFP12-ofp_packet_out_packet_library.packet.json61
-rw-r--r--tests/unit/ofproto/json/of13/4-0-ofp_desc_reply.packet.json15
-rw-r--r--tests/unit/ofproto/json/of13/4-1-ofp_packet_out.packet.json18
-rw-r--r--tests/unit/ofproto/json/of13/4-10-ofp_hello.packet.json20
-rw-r--r--tests/unit/ofproto/json/of13/4-11-ofp_flow_stats_request.packet.json18
-rw-r--r--tests/unit/ofproto/json/of13/4-12-ofp_flow_stats_reply.packet.json343
-rw-r--r--tests/unit/ofproto/json/of13/4-13-ofp_echo_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of13/4-14-ofp_echo_reply.packet.json5
-rw-r--r--tests/unit/ofproto/json/of13/4-15-ofp_error_msg.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/4-16-ofp_experimenter.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/4-17-ofp_barrier_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of13/4-18-ofp_barrier_reply.packet.json3
-rw-r--r--tests/unit/ofproto/json/of13/4-19-ofp_role_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/4-2-ofp_flow_mod.packet.json201
-rw-r--r--tests/unit/ofproto/json/of13/4-20-ofp_role_reply.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/4-21-ofp_group_mod.packet.json27
-rw-r--r--tests/unit/ofproto/json/of13/4-22-ofp_port_mod.packet.json9
-rw-r--r--tests/unit/ofproto/json/of13/4-23-ofp_table_mod.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/4-24-ofp_desc_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/4-25-ofp_aggregate_stats_request.packet.json18
-rw-r--r--tests/unit/ofproto/json/of13/4-26-ofp_aggregate_stats_reply.packet.json13
-rw-r--r--tests/unit/ofproto/json/of13/4-27-ofp_table_stats_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/4-28-ofp_table_stats_reply.packet.json24
-rw-r--r--tests/unit/ofproto/json/of13/4-29-ofp_port_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/4-3-ofp_flow_mod.packet.json46
-rw-r--r--tests/unit/ofproto/json/of13/4-30-ofp_port_stats_reply.packet.json46
-rw-r--r--tests/unit/ofproto/json/of13/4-31-ofp_group_features_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/4-32-ofp_group_features_reply.packet.json24
-rw-r--r--tests/unit/ofproto/json/of13/4-33-ofp_group_desc_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/4-34-ofp_group_desc_reply.packet.json35
-rw-r--r--tests/unit/ofproto/json/of13/4-35-ofp_queue_get_config_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of13/4-36-ofp_queue_get_config_reply.packet.json105
-rw-r--r--tests/unit/ofproto/json/of13/4-37-ofp_queue_stats_request.packet.json8
-rw-r--r--tests/unit/ofproto/json/of13/4-38-ofp_queue_stats_reply.packet.json41
-rw-r--r--tests/unit/ofproto/json/of13/4-39-ofp_port_status.packet.json20
-rw-r--r--tests/unit/ofproto/json/of13/4-4-ofp_packet_in.packet.json81
-rw-r--r--tests/unit/ofproto/json/of13/4-40-ofp_flow_removed.packet.json29
-rw-r--r--tests/unit/ofproto/json/of13/4-41-ofp_error_msg_experimenter.packet.json8
-rw-r--r--tests/unit/ofproto/json/of13/4-42-ofp_get_async_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of13/4-43-ofp_get_async_reply.packet.json16
-rw-r--r--tests/unit/ofproto/json/of13/4-44-ofp_set_async.packet.json16
-rw-r--r--tests/unit/ofproto/json/of13/4-45-ofp_meter_mod.packet.json35
-rw-r--r--tests/unit/ofproto/json/of13/4-46-ofp_flow_mod.packet.json55
-rw-r--r--tests/unit/ofproto/json/of13/4-47-ofp_meter_config_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/4-48-ofp_meter_config_reply.packet.json25
-rw-r--r--tests/unit/ofproto/json/of13/4-49-ofp_meter_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/4-5-ofp_features_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of13/4-50-ofp_meter_stats_reply.packet.json27
-rw-r--r--tests/unit/ofproto/json/of13/4-51-ofp_meter_features_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/4-52-ofp_meter_features_reply.packet.json17
-rw-r--r--tests/unit/ofproto/json/of13/4-53-ofp_port_desc_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/4-54-ofp_port_desc_reply.packet.json38
-rw-r--r--tests/unit/ofproto/json/of13/4-55-ofp_table_features_request.packet.json15945
-rw-r--r--tests/unit/ofproto/json/of13/4-56-ofp_table_features_reply.packet.json15945
-rw-r--r--tests/unit/ofproto/json/of13/4-57-ofp_group_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/4-58-ofp_group_stats_reply.packet.json27
-rw-r--r--tests/unit/ofproto/json/of13/4-59-ofp_packet_in.packet.json312
-rw-r--r--tests/unit/ofproto/json/of13/4-6-ofp_features_reply.packet.json9
-rw-r--r--tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json318
-rw-r--r--tests/unit/ofproto/json/of13/4-61-ofp_experimenter_request.packet.json9
-rw-r--r--tests/unit/ofproto/json/of13/4-62-ofp_experimenter_reply.packet.json13
-rw-r--r--tests/unit/ofproto/json/of13/4-63-onf_flow_monitor_request.packet.json337
-rw-r--r--tests/unit/ofproto/json/of13/4-7-ofp_set_config.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/4-8-ofp_get_config_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of13/4-9-ofp_get_config_reply.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/lib-ofctl-ofp_group_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/lib-ofctl-ofp_meter_config_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/lib-ofctl-ofp_meter_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/lib-ofctl-ofp_port_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_get_config_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet1.json8
-rw-r--r--tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet2.json8
-rw-r--r--tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet3.json8
-rw-r--r--tests/unit/ofproto/json/of13/lib-ofctl-ofp_table_features_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-echo_reply.packet.json5
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-echo_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-error_msg.packet.json7
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-features_reply.packet.json9
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod.packet.json192
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod.packet.truncated64.json33
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod_conjunction.packet.json100
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod_match_conj.packet.json66
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-flow_removed.packet.json78
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-get_config_reply.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-hello.packet.json15
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-meter_mod.packet.json26
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-ofp_packet_out_packet_library.packet.json61
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-packet_in.packet.json46
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-port_mod.packet.json9
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-port_status.packet.json20
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-set_config.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/libofproto-OFP13-table_mod.packet.json6
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_conjunction.packet.json100
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_controller.packet.json43
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_controller2.packet.json51
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json61
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json75
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json70
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json70
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_dec_ttl_cnt_ids.packet.json62
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_fintimeout.packet.json57
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_learn.packet.json192
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_note.packet.json48
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_output_trunc.packet.json42
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_resubmit.packet.json99
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_sample.packet.json44
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_sample2.packet.json45
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_stack_pop.packet.json43
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_stack_push.packet.json43
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_conj.packet.json60
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json58
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_move_nx_register.packet.json60
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_pkt_mark.packet.json60
-rw-r--r--tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_pkt_mark_masked.packet.json60
-rw-r--r--tests/unit/ofproto/json/of14/5-0-ofp_desc_reply.packet.json15
-rw-r--r--tests/unit/ofproto/json/of14/5-1-ofp_packet_out.packet.json18
-rw-r--r--tests/unit/ofproto/json/of14/5-10-ofp_hello.packet.json20
-rw-r--r--tests/unit/ofproto/json/of14/5-11-ofp_flow_stats_request.packet.json18
-rw-r--r--tests/unit/ofproto/json/of14/5-12-ofp_flow_stats_reply.packet.json347
-rw-r--r--tests/unit/ofproto/json/of14/5-13-ofp_echo_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of14/5-14-ofp_echo_reply.packet.json5
-rw-r--r--tests/unit/ofproto/json/of14/5-15-ofp_error_msg.packet.json7
-rw-r--r--tests/unit/ofproto/json/of14/5-16-ofp_experimenter.packet.json7
-rw-r--r--tests/unit/ofproto/json/of14/5-17-ofp_barrier_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of14/5-18-ofp_barrier_reply.packet.json3
-rw-r--r--tests/unit/ofproto/json/of14/5-19-ofp_role_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of14/5-2-ofp_flow_mod.packet.json202
-rw-r--r--tests/unit/ofproto/json/of14/5-20-ofp_role_reply.packet.json6
-rw-r--r--tests/unit/ofproto/json/of14/5-21-ofp_group_mod.packet.json27
-rw-r--r--tests/unit/ofproto/json/of14/5-22-ofp_port_mod.packet.json60
-rw-r--r--tests/unit/ofproto/json/of14/5-23-ofp_table_mod.packet.json56
-rw-r--r--tests/unit/ofproto/json/of14/5-24-ofp_desc_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of14/5-25-ofp_aggregate_stats_request.packet.json18
-rw-r--r--tests/unit/ofproto/json/of14/5-26-ofp_aggregate_stats_reply.packet.json13
-rw-r--r--tests/unit/ofproto/json/of14/5-27-ofp_table_stats_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of14/5-28-ofp_table_stats_reply.packet.json24
-rw-r--r--tests/unit/ofproto/json/of14/5-29-ofp_port_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of14/5-3-ofp_flow_mod.packet.json47
-rw-r--r--tests/unit/ofproto/json/of14/5-30-ofp_port_stats_reply.packet.json113
-rw-r--r--tests/unit/ofproto/json/of14/5-31-ofp_group_features_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of14/5-32-ofp_group_features_reply.packet.json24
-rw-r--r--tests/unit/ofproto/json/of14/5-33-ofp_group_desc_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of14/5-34-ofp_group_desc_reply.packet.json35
-rw-r--r--tests/unit/ofproto/json/of14/5-35-ofp_queue_stats_request.packet.json8
-rw-r--r--tests/unit/ofproto/json/of14/5-36-ofp_queue_stats_reply.packet.json80
-rw-r--r--tests/unit/ofproto/json/of14/5-37-ofp_port_status.packet.json76
-rw-r--r--tests/unit/ofproto/json/of14/5-38-ofp_flow_removed.packet.json29
-rw-r--r--tests/unit/ofproto/json/of14/5-39-ofp_error_msg_experimenter.packet.json8
-rw-r--r--tests/unit/ofproto/json/of14/5-4-ofp_packet_in.packet.json81
-rw-r--r--tests/unit/ofproto/json/of14/5-40-ofp_get_async_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of14/5-41-ofp_get_async_reply.packet.json122
-rw-r--r--tests/unit/ofproto/json/of14/5-42-ofp_set_async.packet.json122
-rw-r--r--tests/unit/ofproto/json/of14/5-43-ofp_meter_mod.packet.json35
-rw-r--r--tests/unit/ofproto/json/of14/5-44-ofp_flow_mod.packet.json56
-rw-r--r--tests/unit/ofproto/json/of14/5-45-ofp_meter_config_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of14/5-46-ofp_meter_config_reply.packet.json25
-rw-r--r--tests/unit/ofproto/json/of14/5-47-ofp_meter_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of14/5-48-ofp_meter_stats_reply.packet.json27
-rw-r--r--tests/unit/ofproto/json/of14/5-49-ofp_meter_features_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of14/5-5-ofp_features_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of14/5-50-ofp_meter_features_reply.packet.json17
-rw-r--r--tests/unit/ofproto/json/of14/5-51-ofp_port_desc_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of14/5-52-ofp_port_desc_reply.packet.json103
-rw-r--r--tests/unit/ofproto/json/of14/5-53-ofp_table_features_request.packet.json15945
-rw-r--r--tests/unit/ofproto/json/of14/5-54-ofp_table_features_reply.packet.json15945
-rw-r--r--tests/unit/ofproto/json/of14/5-55-ofp_group_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of14/5-56-ofp_group_stats_reply.packet.json27
-rw-r--r--tests/unit/ofproto/json/of14/5-57-ofp_packet_in.packet.json298
-rw-r--r--tests/unit/ofproto/json/of14/5-58-ofp_flow_mod.packet.json305
-rw-r--r--tests/unit/ofproto/json/of14/5-59-ofp_experimenter_request.packet.json9
-rw-r--r--tests/unit/ofproto/json/of14/5-6-ofp_features_reply.packet.json9
-rw-r--r--tests/unit/ofproto/json/of14/5-60-ofp_experimenter_reply.packet.json13
-rw-r--r--tests/unit/ofproto/json/of14/5-61-ofp_table_desc_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of14/5-62-ofp_table_desc_reply.packet.json83
-rw-r--r--tests/unit/ofproto/json/of14/5-63-ofp_queue_desc_request.packet.json8
-rw-r--r--tests/unit/ofproto/json/of14/5-64-ofp_queue_desc_reply.packet.json81
-rw-r--r--tests/unit/ofproto/json/of14/5-65-ofp_role_status.packet.json41
-rw-r--r--tests/unit/ofproto/json/of14/5-66-ofp_flow_monitor_request.packet.json27
-rw-r--r--tests/unit/ofproto/json/of14/5-67-ofp_flow_monitor_reply.packet.json66
-rw-r--r--tests/unit/ofproto/json/of14/5-68-ofp_table_status.packet.json62
-rw-r--r--tests/unit/ofproto/json/of14/5-69-ofp_bundle_ctrl_msg.packet.json41
-rw-r--r--tests/unit/ofproto/json/of14/5-7-ofp_set_config.packet.json6
-rw-r--r--tests/unit/ofproto/json/of14/5-70-ofp_bundle_add_msg.packet.json45
-rw-r--r--tests/unit/ofproto/json/of14/5-71-ofp_requestforward.packet.json31
-rw-r--r--tests/unit/ofproto/json/of14/5-8-ofp_get_config_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of14/5-9-ofp_get_config_reply.packet.json6
-rw-r--r--tests/unit/ofproto/json/of14/lib-ofctl-ofp_table_features_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of14/libofproto-OFP14-ofp_packet_out_packet_library.packet.json61
-rw-r--r--tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_desc_reply.packet.json105
-rw-r--r--tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_desc_request.packet.json26
-rw-r--r--tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_mod.packet.json234
-rw-r--r--tests/unit/ofproto/json/of15/lib-ofctl-ofp_queue_stats_request.packet.json8
-rw-r--r--tests/unit/ofproto/json/of15/lib-ofctl-ofp_table_features_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-aggregate_stats_reply.packet.json24
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-aggregate_stats_request.packet.json18
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-barrier_reply.packet.json3
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-barrier_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_add.packet.json200
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_ctrl.packet.json8
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_features_reply.packet.json43
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_features_request.packet.json39
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status.packet.json22
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status_reply.packet.json26
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-desc_reply.packet.json15
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-desc_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-echo_reply.packet.json5
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-echo_request.packet.json5
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-error_msg.packet.json7
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-error_msg_experimenter.packet.json8
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter.packet.json7
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter_reply.packet.json13
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter_request.packet.json9
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-features_reply.packet.json9
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-features_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-flow_desc_reply.packet.json57
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-flow_desc_request.packet.json26
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod.packet.json193
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_conjunction.packet.json101
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_match_conj.packet.json67
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_no_nx.packet.json202
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-flow_monitor_reply.packet.json66
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-flow_monitor_request.packet.json27
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-flow_removed.packet.json38
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-flow_stats_reply.packet.json44
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-flow_stats_request.packet.json18
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-get_async_reply.packet.json122
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-get_async_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-get_config_reply.packet.json6
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-get_config_request.packet.json3
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-group_desc_reply.packet.json45
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-group_desc_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-group_features_reply.packet.json24
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-group_features_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-group_mod.packet.json63
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-group_stats_reply.packet.json27
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-group_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-hello.packet.json15
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-meter_desc_reply.packet.json25
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-meter_desc_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-meter_features_reply.packet.json18
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-meter_features_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-meter_mod.packet.json26
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-meter_stats_reply.packet.json27
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-meter_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-packet_in.packet.json46
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-packet_out.packet.json32
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-port_desc_reply.packet.json103
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-port_desc_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-port_mod.packet.json60
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-port_stats_reply.packet.json113
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-port_stats_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-port_status.packet.json76
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-queue_desc_reply.packet.json81
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-queue_desc_request.packet.json8
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-queue_stats_reply.packet.json80
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-queue_stats_request.packet.json8
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-requestforward.packet.json67
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-role_reply.packet.json7
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-role_request.packet.json7
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-role_status.packet.json8
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-set_async.packet.json122
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-set_config.packet.json6
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-table_desc_reply.packet.json83
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-table_desc_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-table_features_reply.packet.json38
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-table_features_request.packet.json38
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-table_mod.packet.json15
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-table_stats_reply.packet.json24
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-table_stats_request.packet.json6
-rw-r--r--tests/unit/ofproto/json/of15/libofproto-OFP15-table_status.packet.json62
-rw-r--r--tests/unit/ofproto/test_ether.py37
-rw-r--r--tests/unit/ofproto/test_inet.py43
-rw-r--r--tests/unit/ofproto/test_nx_flow_spec.py95
-rw-r--r--tests/unit/ofproto/test_ofproto.py81
-rw-r--r--tests/unit/ofproto/test_ofproto_common.py37
-rw-r--r--tests/unit/ofproto/test_ofproto_parser.py244
-rw-r--r--tests/unit/ofproto/test_ofproto_v12.py717
-rw-r--r--tests/unit/ofproto/test_oxm.py188
-rw-r--r--tests/unit/ofproto/test_oxs.py116
-rw-r--r--tests/unit/ofproto/test_parser.py312
-rw-r--r--tests/unit/ofproto/test_parser_compat.py159
-rw-r--r--tests/unit/ofproto/test_parser_ofpmatch.py292
-rw-r--r--tests/unit/ofproto/test_parser_ofpstats.py208
-rw-r--r--tests/unit/ofproto/test_parser_v10.py5556
-rw-r--r--tests/unit/ofproto/test_parser_v12.py7560
-rw-r--r--tests/unit/ofproto/test_parser_v13.py164
-rw-r--r--tests/unit/packet/__init__.py0
-rw-r--r--tests/unit/packet/test_arp.py183
-rw-r--r--tests/unit/packet/test_bfd.py320
-rw-r--r--tests/unit/packet/test_bgp.py813
-rw-r--r--tests/unit/packet/test_bmp.py136
-rw-r--r--tests/unit/packet/test_bpdu.py469
-rw-r--r--tests/unit/packet/test_cfm.py1761
-rw-r--r--tests/unit/packet/test_dhcp.py218
-rw-r--r--tests/unit/packet/test_ethernet.py103
-rw-r--r--tests/unit/packet/test_geneve.py62
-rw-r--r--tests/unit/packet/test_gre.py115
-rw-r--r--tests/unit/packet/test_icmp.py380
-rw-r--r--tests/unit/packet/test_icmpv6.py2039
-rw-r--r--tests/unit/packet/test_igmp.py997
-rw-r--r--tests/unit/packet/test_ipv4.py137
-rw-r--r--tests/unit/packet/test_ipv6.py1128
-rw-r--r--tests/unit/packet/test_llc.py42
-rw-r--r--tests/unit/packet/test_lldp.py533
-rw-r--r--tests/unit/packet/test_mpls.py92
-rw-r--r--tests/unit/packet/test_openflow.py64
-rw-r--r--tests/unit/packet/test_ospf.py120
-rw-r--r--tests/unit/packet/test_packet.py1553
-rw-r--r--tests/unit/packet/test_pbb.py172
-rw-r--r--tests/unit/packet/test_sctp.py1454
-rw-r--r--tests/unit/packet/test_slow.py1104
-rw-r--r--tests/unit/packet/test_tcp.py267
-rw-r--r--tests/unit/packet/test_udp.py110
-rw-r--r--tests/unit/packet/test_vlan.py265
-rw-r--r--tests/unit/packet/test_vrrp.py496
-rw-r--r--tests/unit/packet/test_vxlan.py82
-rw-r--r--tests/unit/packet/test_zebra.py66
-rw-r--r--tests/unit/sample/__init__.py0
-rw-r--r--tests/unit/sample/test_sample1.py20
-rw-r--r--tests/unit/sample/test_sample2.py14
-rw-r--r--tests/unit/services/__init__.py0
-rw-r--r--tests/unit/services/protocols/__init__.py0
-rw-r--r--tests/unit/services/protocols/bgp/__init__.py0
-rw-r--r--tests/unit/services/protocols/bgp/core_managers/__init__.py0
-rw-r--r--tests/unit/services/protocols/bgp/core_managers/test_table_manager.py937
-rw-r--r--tests/unit/services/protocols/bgp/test_bgpspeaker.py1088
-rw-r--r--tests/unit/services/protocols/bgp/test_peer.py375
-rw-r--r--tests/unit/services/protocols/bgp/utils/__init__.py0
-rw-r--r--tests/unit/services/protocols/bgp/utils/test_bgp.py211
-rw-r--r--tests/unit/services/protocols/bgp/utils/test_validation.py215
-rw-r--r--tests/unit/test_requirements.py85
-rw-r--r--tests/unit/test_utils.py84
971 files changed, 206110 insertions, 0 deletions
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/__init__.py
diff --git a/tests/integrated/__init__.py b/tests/integrated/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/integrated/__init__.py
diff --git a/tests/integrated/bgp/__init__.py b/tests/integrated/bgp/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/integrated/bgp/__init__.py
diff --git a/tests/integrated/bgp/base.py b/tests/integrated/bgp/base.py
new file mode 100644
index 00000000..9d057075
--- /dev/null
+++ b/tests/integrated/bgp/base.py
@@ -0,0 +1,84 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2016 Fumihiko Kakuma <kakuma at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+
+import logging
+import sys
+import unittest
+
+from tests.integrated.common import docker_base as ctn_base
+from tests.integrated.common import ryubgp
+from tests.integrated.common import quagga
+
+
+LOG = logging.getLogger(__name__)
+
+
+class BgpSpeakerTestBase(unittest.TestCase):
+ images = []
+ containers = []
+ bridges = []
+ checktime = 120
+
+ @classmethod
+ def setUpClass(cls):
+ cls.brdc1 = ctn_base.Bridge(name='brdc1',
+ subnet='192.168.10.0/24')
+ cls.bridges.append(cls.brdc1)
+
+ cls.dockerimg = ctn_base.DockerImage()
+ image = 'python:%d.%d' % (
+ sys.version_info.major, sys.version_info.minor)
+ cls.r_img = cls.dockerimg.create_ryu(image=image, check_exist=True)
+ cls.images.append(cls.r_img)
+ cls.q_img = 'osrg/quagga'
+ cls.images.append(cls.q_img)
+
+ cls.r1 = ryubgp.RyuBGPContainer(name='r1', asn=64512,
+ router_id='192.168.0.1',
+ ctn_image_name=cls.r_img)
+ cls.containers.append(cls.r1)
+ cls.r1.add_route('10.10.0.0/28')
+ cls.r1.run(wait=True)
+ cls.r1_ip_cidr = cls.brdc1.addif(cls.r1)
+ cls.r1_ip = cls.r1_ip_cidr.split('/')[0]
+
+ cls.q1 = quagga.QuaggaBGPContainer(name='q1', asn=64522,
+ router_id='192.168.0.2',
+ ctn_image_name=cls.q_img)
+ cls.containers.append(cls.q1)
+ cls.q1.add_route('192.168.160.0/24')
+ cls.q1.run(wait=True)
+ cls.q1_ip_cidr = cls.brdc1.addif(cls.q1)
+ cls.q1_ip = cls.q1_ip_cidr.split('/')[0]
+
+ cls.r1.add_peer(cls.q1, bridge=cls.brdc1.name)
+ cls.q1.add_peer(cls.r1, bridge=cls.brdc1.name)
+
+ super(BgpSpeakerTestBase, cls).setUpClass()
+
+ @classmethod
+ def tearDownClass(cls):
+ for ctn in cls.containers:
+ try:
+ ctn.stop()
+ except ctn_base.CommandError as e:
+ LOG.exception('Exception when stopping containers: %s', e)
+ ctn.remove()
+ for br in cls.bridges:
+ br.delete()
+ super(BgpSpeakerTestBase, cls).tearDownClass()
diff --git a/tests/integrated/bgp/base_ip6.py b/tests/integrated/bgp/base_ip6.py
new file mode 100644
index 00000000..8d3ef419
--- /dev/null
+++ b/tests/integrated/bgp/base_ip6.py
@@ -0,0 +1,84 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2016 Fumihiko Kakuma <kakuma at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+
+import logging
+import sys
+import unittest
+
+from tests.integrated.common import docker_base as ctn_base
+from tests.integrated.common import ryubgp
+from tests.integrated.common import quagga
+
+
+LOG = logging.getLogger(__name__)
+
+
+class BgpSpeakerTestBase(unittest.TestCase):
+ images = []
+ containers = []
+ bridges = []
+ checktime = 120
+
+ @classmethod
+ def setUpClass(cls):
+ cls.brdc1 = ctn_base.Bridge(name='brip6dc1',
+ subnet='2001:10::/32')
+ cls.bridges.append(cls.brdc1)
+
+ cls.dockerimg = ctn_base.DockerImage()
+ image = 'python:%d.%d' % (
+ sys.version_info.major, sys.version_info.minor)
+ cls.r_img = cls.dockerimg.create_ryu(image=image, check_exist=True)
+ cls.images.append(cls.r_img)
+ cls.q_img = 'osrg/quagga'
+ cls.images.append(cls.q_img)
+
+ cls.r1 = ryubgp.RyuBGPContainer(name='r1', asn=64512,
+ router_id='192.168.0.1',
+ ctn_image_name=cls.r_img)
+ cls.containers.append(cls.r1)
+ cls.r1.add_route('fc00:10::/64', route_info={'rf': 'ipv6'})
+ cls.r1.run(wait=True)
+ cls.r1_ip_cidr = cls.brdc1.addif(cls.r1)
+ cls.r1_ip = cls.r1_ip_cidr.split('/')[0]
+
+ cls.q1 = quagga.QuaggaBGPContainer(name='q1', asn=64522,
+ router_id='192.168.0.2',
+ ctn_image_name=cls.q_img)
+ cls.containers.append(cls.q1)
+ cls.q1.add_route('fc00:100::/64', route_info={'rf': 'ipv6'})
+ cls.q1.run(wait=True)
+ cls.q1_ip_cidr = cls.brdc1.addif(cls.q1)
+ cls.q1_ip = cls.q1_ip_cidr.split('/')[0]
+
+ cls.r1.add_peer(cls.q1, bridge=cls.brdc1.name, v6=True)
+ cls.q1.add_peer(cls.r1, bridge=cls.brdc1.name, v6=True)
+
+ super(BgpSpeakerTestBase, cls).setUpClass()
+
+ @classmethod
+ def tearDownClass(cls):
+ for ctn in cls.containers:
+ try:
+ ctn.stop()
+ except ctn_base.CommandError as e:
+ LOG.exception('Exception when stopping containers: %s', e)
+ ctn.remove()
+ for br in cls.bridges:
+ br.delete()
+ super(BgpSpeakerTestBase, cls).tearDownClass()
diff --git a/tests/integrated/bgp/test_basic.py b/tests/integrated/bgp/test_basic.py
new file mode 100644
index 00000000..9ef430c7
--- /dev/null
+++ b/tests/integrated/bgp/test_basic.py
@@ -0,0 +1,49 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2016 Fumihiko Kakuma <kakuma at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+
+import time
+
+from tests.integrated.common import docker_base as ctn_base
+from . import base
+
+
+class BgpSpeakerBasicTest(base.BgpSpeakerTestBase):
+ def setUp(self):
+ super(BgpSpeakerBasicTest, self).setUp()
+ self.r1.stop_ryubgp(retry=True)
+ self.r1.start_ryubgp(retry=True)
+
+ def test_check_neighbor_established(self):
+ neighbor_state = ctn_base.BGP_FSM_IDLE
+ for _ in range(0, self.checktime):
+ neighbor_state = self.q1.get_neighbor_state(self.r1)
+ if neighbor_state == ctn_base.BGP_FSM_ESTABLISHED:
+ break
+ time.sleep(1)
+ self.assertEqual(neighbor_state, ctn_base.BGP_FSM_ESTABLISHED)
+
+ def test_check_rib_nexthop(self):
+ neighbor_state = ctn_base.BGP_FSM_IDLE
+ for _ in range(0, self.checktime):
+ neighbor_state = self.q1.get_neighbor_state(self.r1)
+ if neighbor_state == ctn_base.BGP_FSM_ESTABLISHED:
+ break
+ time.sleep(1)
+ self.assertEqual(neighbor_state, ctn_base.BGP_FSM_ESTABLISHED)
+ rib = self.q1.get_global_rib(prefix='10.10.0.0/28')
+ self.assertEqual(self.r1_ip, rib[0]['nexthop'])
diff --git a/tests/integrated/bgp/test_ip6_basic.py b/tests/integrated/bgp/test_ip6_basic.py
new file mode 100644
index 00000000..a92e4edb
--- /dev/null
+++ b/tests/integrated/bgp/test_ip6_basic.py
@@ -0,0 +1,49 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2016 Fumihiko Kakuma <kakuma at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+
+import time
+
+from tests.integrated.common import docker_base as ctn_base
+from . import base_ip6 as base
+
+
+class BgpSpeakerBasicTest(base.BgpSpeakerTestBase):
+ def setUp(self):
+ super(BgpSpeakerBasicTest, self).setUp()
+ self.r1.stop_ryubgp(retry=True)
+ self.r1.start_ryubgp(retry=True)
+
+ def test_check_neighbor_established(self):
+ neighbor_state = ctn_base.BGP_FSM_IDLE
+ for _ in range(0, self.checktime):
+ neighbor_state = self.q1.get_neighbor_state(self.r1)
+ if neighbor_state == ctn_base.BGP_FSM_ESTABLISHED:
+ break
+ time.sleep(1)
+ self.assertEqual(neighbor_state, ctn_base.BGP_FSM_ESTABLISHED)
+
+ def test_check_rib_nexthop(self):
+ neighbor_state = ctn_base.BGP_FSM_IDLE
+ for _ in range(0, self.checktime):
+ neighbor_state = self.q1.get_neighbor_state(self.r1)
+ if neighbor_state == ctn_base.BGP_FSM_ESTABLISHED:
+ break
+ time.sleep(1)
+ self.assertEqual(neighbor_state, ctn_base.BGP_FSM_ESTABLISHED)
+ rib = self.q1.get_global_rib(prefix='fc00:10::/64', rf='ipv6')
+ self.assertEqual(self.r1_ip, rib[0]['nexthop'])
diff --git a/tests/integrated/common/__init__.py b/tests/integrated/common/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/integrated/common/__init__.py
diff --git a/tests/integrated/common/docker_base.py b/tests/integrated/common/docker_base.py
new file mode 100644
index 00000000..1ae2cc27
--- /dev/null
+++ b/tests/integrated/common/docker_base.py
@@ -0,0 +1,801 @@
+# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+#
+# This is based on the following
+# https://github.com/osrg/gobgp/test/lib/base.py
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+
+import itertools
+import logging
+import os
+import subprocess
+import time
+
+import netaddr
+import six
+
+LOG = logging.getLogger(__name__)
+
+DEFAULT_TEST_PREFIX = ''
+DEFAULT_TEST_BASE_DIR = '/tmp/ctn_docker/bgp'
+TEST_PREFIX = DEFAULT_TEST_PREFIX
+TEST_BASE_DIR = DEFAULT_TEST_BASE_DIR
+
+BGP_FSM_IDLE = 'BGP_FSM_IDLE'
+BGP_FSM_ACTIVE = 'BGP_FSM_ACTIVE'
+BGP_FSM_ESTABLISHED = 'BGP_FSM_ESTABLISHED'
+
+BGP_ATTR_TYPE_ORIGIN = 1
+BGP_ATTR_TYPE_AS_PATH = 2
+BGP_ATTR_TYPE_NEXT_HOP = 3
+BGP_ATTR_TYPE_MULTI_EXIT_DISC = 4
+BGP_ATTR_TYPE_LOCAL_PREF = 5
+BGP_ATTR_TYPE_COMMUNITIES = 8
+BGP_ATTR_TYPE_ORIGINATOR_ID = 9
+BGP_ATTR_TYPE_CLUSTER_LIST = 10
+BGP_ATTR_TYPE_MP_REACH_NLRI = 14
+BGP_ATTR_TYPE_EXTENDED_COMMUNITIES = 16
+
+BRIDGE_TYPE_DOCKER = 'docker'
+BRIDGE_TYPE_BRCTL = 'brctl'
+BRIDGE_TYPE_OVS = 'ovs'
+
+
+class CommandError(Exception):
+ def __init__(self, out):
+ super(CommandError, self).__init__()
+ self.out = out
+
+
+def try_several_times(f, t=3, s=1):
+ e = RuntimeError()
+ for _ in range(t):
+ try:
+ r = f()
+ except RuntimeError as e:
+ time.sleep(s)
+ else:
+ return r
+ raise e
+
+
+class CmdBuffer(list):
+ def __init__(self, delim='\n'):
+ super(CmdBuffer, self).__init__()
+ self.delim = delim
+
+ def __lshift__(self, value):
+ self.append(value)
+
+ def __str__(self):
+ return self.delim.join(self)
+
+
+class CommandOut(str):
+
+ def __new__(cls, stdout, stderr, command, returncode, **kwargs):
+ stdout = stdout or ''
+ obj = super(CommandOut, cls).__new__(cls, stdout, **kwargs)
+ obj.stderr = stderr or ''
+ obj.command = command
+ obj.returncode = returncode
+ return obj
+
+
+class Command(object):
+
+ def _execute(self, cmd, capture=False, executable=None):
+ """Execute a command using subprocess.Popen()
+ :Parameters:
+ - out: stdout from subprocess.Popen()
+ out has some attributes.
+ out.returncode: returncode of subprocess.Popen()
+ out.stderr: stderr from subprocess.Popen()
+ """
+ if capture:
+ p_stdout = subprocess.PIPE
+ p_stderr = subprocess.PIPE
+ else:
+ p_stdout = None
+ p_stderr = None
+ pop = subprocess.Popen(cmd, shell=True, executable=executable,
+ stdout=p_stdout,
+ stderr=p_stderr)
+ __stdout, __stderr = pop.communicate()
+ _stdout = six.text_type(__stdout, 'utf-8')
+ _stderr = six.text_type(__stderr, 'utf-8')
+ out = CommandOut(_stdout, _stderr, cmd, pop.returncode)
+ return out
+
+ def execute(self, cmd, capture=True, try_times=1, interval=1):
+ out = None
+ for i in range(try_times):
+ out = self._execute(cmd, capture=capture)
+ LOG.info(out.command)
+ if out.returncode == 0:
+ return out
+ LOG.error("stdout: %s", out)
+ LOG.error("stderr: %s", out.stderr)
+ if i + 1 >= try_times:
+ break
+ time.sleep(interval)
+ raise CommandError(out)
+
+ def sudo(self, cmd, capture=True, try_times=1, interval=1):
+ cmd = 'sudo %s' % cmd
+ return self.execute(cmd, capture=capture,
+ try_times=try_times, interval=interval)
+
+
+class DockerImage(object):
+ def __init__(self, baseimage='ubuntu:16.04'):
+ self.baseimage = baseimage
+ self.cmd = Command()
+
+ def get_images(self):
+ out = self.cmd.sudo('sudo docker images')
+ images = []
+ for line in out.splitlines()[1:]:
+ images.append(line.split()[0])
+ return images
+
+ def exist(self, name):
+ return name in self.get_images()
+
+ def build(self, tagname, dockerfile_dir):
+ self.cmd.sudo(
+ "docker build -t {0} {1}".format(tagname, dockerfile_dir),
+ try_times=3)
+
+ def remove(self, tagname, check_exist=False):
+ if check_exist and not self.exist(tagname):
+ return tagname
+ self.cmd.sudo("docker rmi -f %s" % tagname, try_times=3)
+
+ def create_quagga(self, tagname='quagga', image=None, check_exist=False):
+ if check_exist and self.exist(tagname):
+ return tagname
+ workdir = os.path.join(TEST_BASE_DIR, tagname)
+ pkges = ' '.join([
+ 'telnet',
+ 'tcpdump',
+ 'quagga',
+ ])
+ if image:
+ use_image = image
+ else:
+ use_image = self.baseimage
+ c = CmdBuffer()
+ c << 'FROM %s' % use_image
+ c << 'RUN apt-get update'
+ c << 'RUN apt-get install -qy --no-install-recommends %s' % pkges
+ c << 'CMD /usr/lib/quagga/bgpd'
+
+ self.cmd.sudo('rm -rf %s' % workdir)
+ self.cmd.execute('mkdir -p %s' % workdir)
+ self.cmd.execute("echo '%s' > %s/Dockerfile" % (str(c), workdir))
+ self.build(tagname, workdir)
+ return tagname
+
+ def create_ryu(self, tagname='ryu', image=None, check_exist=False):
+ if check_exist and self.exist(tagname):
+ return tagname
+ workdir = os.path.join(TEST_BASE_DIR, tagname)
+ workdir_ctn = '/root/osrg/ryu'
+ pkges = ' '.join([
+ 'tcpdump',
+ 'iproute2',
+ ])
+ if image:
+ use_image = image
+ else:
+ use_image = self.baseimage
+ c = CmdBuffer()
+ c << 'FROM %s' % use_image
+ c << 'ADD ryu %s' % workdir_ctn
+ install = ' '.join([
+ 'RUN apt-get update',
+ '&& apt-get install -qy --no-install-recommends %s' % pkges,
+ '&& cd %s' % workdir_ctn,
+ # Note: Clean previous builds, because "python setup.py install"
+ # might fail if the current directory contains the symlink to
+ # Docker host file systems.
+ '&& rm -rf *.egg-info/ build/ dist/ .tox/ *.log'
+ '&& pip install -r tools/pip-requires -r tools/optional-requires',
+ '&& python setup.py install',
+ ])
+ c << install
+
+ self.cmd.sudo('rm -rf %s' % workdir)
+ self.cmd.execute('mkdir -p %s' % workdir)
+ self.cmd.execute("echo '%s' > %s/Dockerfile" % (str(c), workdir))
+ self.cmd.execute('cp -r ../ryu %s/' % workdir)
+ self.build(tagname, workdir)
+ return tagname
+
+
+class Bridge(object):
+ def __init__(self, name, subnet='', start_ip=None, end_ip=None,
+ with_ip=True, self_ip=False,
+ fixed_ip=None, reuse=False,
+ br_type='docker'):
+ """Manage a bridge
+ :Parameters:
+ - name: bridge name
+ - subnet: network cider to be used in this bridge
+ - start_ip: start address of an ip to be used in the subnet
+ - end_ip: end address of an ip to be used in the subnet
+ - with_ip: specify if assign automatically an ip address
+ - self_ip: specify if assign an ip address for the bridge
+ - fixed_ip: an ip address to be assigned to the bridge
+ - reuse: specify if use an existing bridge
+ - br_type: One either in a 'docker', 'brctl' or 'ovs'
+ """
+ self.cmd = Command()
+ self.name = name
+ if br_type not in (BRIDGE_TYPE_DOCKER, BRIDGE_TYPE_BRCTL,
+ BRIDGE_TYPE_OVS):
+ raise Exception("argument error br_type: %s" % br_type)
+ self.br_type = br_type
+ self.docker_nw = bool(self.br_type == BRIDGE_TYPE_DOCKER)
+ if TEST_PREFIX != '':
+ self.name = '{0}_{1}'.format(TEST_PREFIX, name)
+ self.with_ip = with_ip
+ if with_ip:
+ self.subnet = netaddr.IPNetwork(subnet)
+ if start_ip:
+ self.start_ip = start_ip
+ else:
+ self.start_ip = netaddr.IPAddress(self.subnet.first)
+ if end_ip:
+ self.end_ip = end_ip
+ else:
+ self.end_ip = netaddr.IPAddress(self.subnet.last)
+
+ def _ip_gen():
+ for host in netaddr.IPRange(self.start_ip, self.end_ip):
+ yield host
+ self._ip_generator = _ip_gen()
+ # throw away first network address
+ self.next_ip_address()
+
+ self.self_ip = self_ip
+ if fixed_ip:
+ self.ip_addr = fixed_ip
+ else:
+ self.ip_addr = self.next_ip_address()
+ if not reuse:
+ def f():
+ if self.br_type == BRIDGE_TYPE_DOCKER:
+ gw = "--gateway %s" % self.ip_addr.split('/')[0]
+ v6 = ''
+ if self.subnet.version == 6:
+ v6 = '--ipv6'
+ cmd = ("docker network create --driver bridge %s "
+ "%s --subnet %s %s" % (v6, gw, subnet, self.name))
+ elif self.br_type == BRIDGE_TYPE_BRCTL:
+ cmd = "ip link add {0} type bridge".format(self.name)
+ elif self.br_type == BRIDGE_TYPE_OVS:
+ cmd = "ovs-vsctl add-br {0}".format(self.name)
+ else:
+ raise ValueError('Unsupported br_type: %s' % self.br_type)
+ self.delete()
+ self.execute(cmd, sudo=True, retry=True)
+ try_several_times(f)
+ if not self.docker_nw:
+ self.execute("ip link set up dev {0}".format(self.name),
+ sudo=True, retry=True)
+
+ if not self.docker_nw and self_ip:
+ ips = self.check_br_addr(self.name)
+ for key, ip in ips.items():
+ if self.subnet.version == key:
+ self.execute(
+ "ip addr del {0} dev {1}".format(ip, self.name),
+ sudo=True, retry=True)
+ self.execute(
+ "ip addr add {0} dev {1}".format(self.ip_addr, self.name),
+ sudo=True, retry=True)
+ self.ctns = []
+
+ def get_bridges_dc(self):
+ out = self.execute('docker network ls', sudo=True, retry=True)
+ bridges = []
+ for line in out.splitlines()[1:]:
+ bridges.append(line.split()[1])
+ return bridges
+
+ def get_bridges_brctl(self):
+ out = self.execute('brctl show', retry=True)
+ bridges = []
+ for line in out.splitlines()[1:]:
+ bridges.append(line.split()[0])
+ return bridges
+
+ def get_bridges_ovs(self):
+ out = self.execute('ovs-vsctl list-br', sudo=True, retry=True)
+ return out.splitlines()
+
+ def get_bridges(self):
+ if self.br_type == BRIDGE_TYPE_DOCKER:
+ return self.get_bridges_dc()
+ elif self.br_type == BRIDGE_TYPE_BRCTL:
+ return self.get_bridges_brctl()
+ elif self.br_type == BRIDGE_TYPE_OVS:
+ return self.get_bridges_ovs()
+
+ def exist(self):
+ return self.name in self.get_bridges()
+
+ def execute(self, cmd, capture=True, sudo=False, retry=False):
+ if sudo:
+ m = self.cmd.sudo
+ else:
+ m = self.cmd.execute
+ if retry:
+ return m(cmd, capture=capture, try_times=3, interval=1)
+ else:
+ return m(cmd, capture=capture)
+
+ def check_br_addr(self, br):
+ ips = {}
+ cmd = "ip a show dev %s" % br
+ for line in self.execute(cmd, sudo=True).split('\n'):
+ if line.strip().startswith("inet "):
+ elems = [e.strip() for e in line.strip().split(' ')]
+ ips[4] = elems[1]
+ elif line.strip().startswith("inet6 "):
+ elems = [e.strip() for e in line.strip().split(' ')]
+ ips[6] = elems[1]
+ return ips
+
+ def next_ip_address(self):
+ return "{0}/{1}".format(next(self._ip_generator),
+ self.subnet.prefixlen)
+
+ def addif(self, ctn):
+ name = ctn.next_if_name()
+ self.ctns.append(ctn)
+ ip_address = None
+ if self.docker_nw:
+ ipv4 = None
+ ipv6 = None
+ ip_address = self.next_ip_address()
+ ip_address_ip = ip_address.split('/')[0]
+ version = 4
+ if netaddr.IPNetwork(ip_address).version == 6:
+ version = 6
+ opt_ip = "--ip %s" % ip_address_ip
+ if version == 4:
+ ipv4 = ip_address
+ else:
+ opt_ip = "--ip6 %s" % ip_address_ip
+ ipv6 = ip_address
+ cmd = "docker network connect %s %s %s" % (
+ opt_ip, self.name, ctn.docker_name())
+ self.execute(cmd, sudo=True)
+ ctn.set_addr_info(bridge=self.name, ipv4=ipv4, ipv6=ipv6,
+ ifname=name)
+ else:
+ if self.with_ip:
+ ip_address = self.next_ip_address()
+ version = 4
+ if netaddr.IPNetwork(ip_address).version == 6:
+ version = 6
+ ctn.pipework(self, ip_address, name, version=version)
+ else:
+ ctn.pipework(self, '0/0', name)
+ return ip_address
+
+ def delete(self, check_exist=True):
+ if check_exist:
+ if not self.exist():
+ return
+ if self.br_type == BRIDGE_TYPE_DOCKER:
+ self.execute("docker network rm %s" % self.name,
+ sudo=True, retry=True)
+ elif self.br_type == BRIDGE_TYPE_BRCTL:
+ self.execute("ip link set down dev %s" % self.name,
+ sudo=True, retry=True)
+ self.execute(
+ "ip link delete %s type bridge" % self.name,
+ sudo=True, retry=True)
+ elif self.br_type == BRIDGE_TYPE_OVS:
+ self.execute(
+ "ovs-vsctl del-br %s" % self.name,
+ sudo=True, retry=True)
+
+
+class Container(object):
+ def __init__(self, name, image=None):
+ self.name = name
+ self.image = image
+ self.shared_volumes = []
+ self.ip_addrs = []
+ self.ip6_addrs = []
+ self.is_running = False
+ self.eths = []
+ self.id = None
+
+ self.cmd = Command()
+ self.remove()
+
+ def docker_name(self):
+ if TEST_PREFIX == DEFAULT_TEST_PREFIX:
+ return self.name
+ return '{0}_{1}'.format(TEST_PREFIX, self.name)
+
+ def get_docker_id(self):
+ if self.id:
+ return self.id
+ else:
+ return self.docker_name()
+
+ def next_if_name(self):
+ name = 'eth{0}'.format(len(self.eths) + 1)
+ self.eths.append(name)
+ return name
+
+ def set_addr_info(self, bridge, ipv4=None, ipv6=None, ifname='eth0'):
+ if ipv4:
+ self.ip_addrs.append((ifname, ipv4, bridge))
+ if ipv6:
+ self.ip6_addrs.append((ifname, ipv6, bridge))
+
+ def get_addr_info(self, bridge, ipv=4):
+ addrinfo = {}
+ if ipv == 4:
+ ip_addrs = self.ip_addrs
+ elif ipv == 6:
+ ip_addrs = self.ip6_addrs
+ else:
+ return None
+ for addr in ip_addrs:
+ if addr[2] == bridge:
+ addrinfo[addr[1]] = addr[0]
+ return addrinfo
+
+ def execute(self, cmd, capture=True, sudo=False, retry=False):
+ if sudo:
+ m = self.cmd.sudo
+ else:
+ m = self.cmd.execute
+ if retry:
+ return m(cmd, capture=capture, try_times=3, interval=1)
+ else:
+ return m(cmd, capture=capture)
+
+ def dcexec(self, cmd, capture=True, retry=False):
+ if retry:
+ return self.cmd.sudo(cmd, capture=capture, try_times=3, interval=1)
+ else:
+ return self.cmd.sudo(cmd, capture=capture)
+
+ def exec_on_ctn(self, cmd, capture=True, detach=False):
+ name = self.docker_name()
+ flag = '-d' if detach else ''
+ return self.dcexec('docker exec {0} {1} {2}'.format(
+ flag, name, cmd), capture=capture)
+
+ def get_containers(self, allctn=False):
+ cmd = 'docker ps --no-trunc=true'
+ if allctn:
+ cmd += ' --all=true'
+ out = self.dcexec(cmd, retry=True)
+ containers = []
+ for line in out.splitlines()[1:]:
+ containers.append(line.split()[-1])
+ return containers
+
+ def exist(self, allctn=False):
+ return self.docker_name() in self.get_containers(allctn=allctn)
+
+ def run(self):
+ c = CmdBuffer(' ')
+ c << "docker run --privileged=true"
+ for sv in self.shared_volumes:
+ c << "-v {0}:{1}".format(sv[0], sv[1])
+ c << "--name {0} --hostname {0} -id {1}".format(self.docker_name(),
+ self.image)
+ self.id = self.dcexec(str(c), retry=True)
+ self.is_running = True
+ self.exec_on_ctn("ip li set up dev lo")
+ ipv4 = None
+ ipv6 = None
+ for line in self.exec_on_ctn("ip a show dev eth0").split('\n'):
+ if line.strip().startswith("inet "):
+ elems = [e.strip() for e in line.strip().split(' ')]
+ ipv4 = elems[1]
+ elif line.strip().startswith("inet6 "):
+ elems = [e.strip() for e in line.strip().split(' ')]
+ ipv6 = elems[1]
+ self.set_addr_info(bridge='docker0', ipv4=ipv4, ipv6=ipv6,
+ ifname='eth0')
+ return 0
+
+ def stop(self, check_exist=True):
+ if check_exist:
+ if not self.exist(allctn=False):
+ return
+ ctn_id = self.get_docker_id()
+ out = self.dcexec('docker stop -t 0 %s' % ctn_id, retry=True)
+ self.is_running = False
+ return out
+
+ def remove(self, check_exist=True):
+ if check_exist:
+ if not self.exist(allctn=True):
+ return
+ ctn_id = self.get_docker_id()
+ out = self.dcexec('docker rm -f %s' % ctn_id, retry=True)
+ self.is_running = False
+ return out
+
+ def pipework(self, bridge, ip_addr, intf_name="", version=4):
+ if not self.is_running:
+ LOG.warning('Call run() before pipeworking')
+ return
+ c = CmdBuffer(' ')
+ c << "pipework {0}".format(bridge.name)
+
+ if intf_name != "":
+ c << "-i {0}".format(intf_name)
+ else:
+ intf_name = "eth1"
+ ipv4 = None
+ ipv6 = None
+ if version == 4:
+ ipv4 = ip_addr
+ else:
+ c << '-a 6'
+ ipv6 = ip_addr
+ c << "{0} {1}".format(self.docker_name(), ip_addr)
+ self.set_addr_info(bridge=bridge.name, ipv4=ipv4, ipv6=ipv6,
+ ifname=intf_name)
+ self.execute(str(c), sudo=True, retry=True)
+
+ def get_pid(self):
+ if self.is_running:
+ cmd = "docker inspect -f '{{.State.Pid}}' %s" % self.docker_name()
+ return int(self.dcexec(cmd))
+ return -1
+
+ def start_tcpdump(self, interface=None, filename=None):
+ if not interface:
+ interface = "eth0"
+ if not filename:
+ filename = "{0}/{1}.dump".format(
+ self.shared_volumes[0][1], interface)
+ self.exec_on_ctn(
+ "tcpdump -i {0} -w {1}".format(interface, filename),
+ detach=True)
+
+
+class BGPContainer(Container):
+
+ WAIT_FOR_BOOT = 1
+ RETRY_INTERVAL = 5
+ DEFAULT_PEER_ARG = {'neigh_addr': '',
+ 'passwd': None,
+ 'vpn': False,
+ 'flowspec': False,
+ 'is_rs_client': False,
+ 'is_rr_client': False,
+ 'cluster_id': None,
+ 'policies': None,
+ 'passive': False,
+ 'local_addr': '',
+ 'as2': False,
+ 'graceful_restart': None,
+ 'local_as': None,
+ 'prefix_limit': None}
+ default_peer_keys = sorted(DEFAULT_PEER_ARG.keys())
+ DEFAULT_ROUTE_ARG = {'prefix': None,
+ 'rf': 'ipv4',
+ 'attr': None,
+ 'next-hop': None,
+ 'as-path': None,
+ 'community': None,
+ 'med': None,
+ 'local-pref': None,
+ 'extended-community': None,
+ 'matchs': None,
+ 'thens': None}
+ default_route_keys = sorted(DEFAULT_ROUTE_ARG.keys())
+
+ def __init__(self, name, asn, router_id, ctn_image_name=None):
+ self.config_dir = TEST_BASE_DIR
+ if TEST_PREFIX:
+ self.config_dir = os.path.join(self.config_dir, TEST_PREFIX)
+ self.config_dir = os.path.join(self.config_dir, name)
+ self.asn = asn
+ self.router_id = router_id
+ self.peers = {}
+ self.routes = {}
+ self.policies = {}
+ super(BGPContainer, self).__init__(name, ctn_image_name)
+ self.execute(
+ 'rm -rf {0}'.format(self.config_dir), sudo=True)
+ self.execute('mkdir -p {0}'.format(self.config_dir))
+ self.execute('chmod 777 {0}'.format(self.config_dir))
+
+ def __repr__(self):
+ return str({'name': self.name, 'asn': self.asn,
+ 'router_id': self.router_id})
+
+ def run(self, wait=False, w_time=WAIT_FOR_BOOT):
+ self.create_config()
+ super(BGPContainer, self).run()
+ if wait:
+ time.sleep(w_time)
+ return w_time
+
+ def add_peer(self, peer, bridge='', reload_config=True, v6=False,
+ peer_info=None):
+ peer_info = peer_info or {}
+ self.peers[peer] = self.DEFAULT_PEER_ARG.copy()
+ self.peers[peer].update(peer_info)
+ peer_keys = sorted(self.peers[peer].keys())
+ if peer_keys != self.default_peer_keys:
+ raise Exception("argument error peer_info: %s" % peer_info)
+
+ neigh_addr = ''
+ local_addr = ''
+ it = itertools.product(self.ip_addrs, peer.ip_addrs)
+ if v6:
+ it = itertools.product(self.ip6_addrs, peer.ip6_addrs)
+
+ for me, you in it:
+ if bridge != '' and bridge != me[2]:
+ continue
+ if me[2] == you[2]:
+ neigh_addr = you[1]
+ local_addr = me[1]
+ if v6:
+ addr, mask = local_addr.split('/')
+ local_addr = "{0}%{1}/{2}".format(addr, me[0], mask)
+ break
+
+ if neigh_addr == '':
+ raise Exception('peer {0} seems not ip reachable'.format(peer))
+
+ if not self.peers[peer]['policies']:
+ self.peers[peer]['policies'] = {}
+
+ self.peers[peer]['neigh_addr'] = neigh_addr
+ self.peers[peer]['local_addr'] = local_addr
+ if self.is_running and reload_config:
+ self.create_config()
+ self.reload_config()
+
+ def del_peer(self, peer, reload_config=True):
+ del self.peers[peer]
+ if self.is_running and reload_config:
+ self.create_config()
+ self.reload_config()
+
+ def disable_peer(self, peer):
+ raise NotImplementedError()
+
+ def enable_peer(self, peer):
+ raise NotImplementedError()
+
+ def log(self):
+ return self.execute('cat {0}/*.log'.format(self.config_dir))
+
+ def add_route(self, route, reload_config=True, route_info=None):
+ route_info = route_info or {}
+ self.routes[route] = self.DEFAULT_ROUTE_ARG.copy()
+ self.routes[route].update(route_info)
+ route_keys = sorted(self.routes[route].keys())
+ if route_keys != self.default_route_keys:
+ raise Exception("argument error route_info: %s" % route_info)
+ self.routes[route]['prefix'] = route
+ if self.is_running and reload_config:
+ self.create_config()
+ self.reload_config()
+
+ def add_policy(self, policy, peer, typ, default='accept',
+ reload_config=True):
+ self.set_default_policy(peer, typ, default)
+ self.define_policy(policy)
+ self.assign_policy(peer, policy, typ)
+ if self.is_running and reload_config:
+ self.create_config()
+ self.reload_config()
+
+ def set_default_policy(self, peer, typ, default):
+ if (typ in ['in', 'out', 'import', 'export'] and
+ default in ['reject', 'accept']):
+ if 'default-policy' not in self.peers[peer]:
+ self.peers[peer]['default-policy'] = {}
+ self.peers[peer]['default-policy'][typ] = default
+ else:
+ raise Exception('wrong type or default')
+
+ def define_policy(self, policy):
+ self.policies[policy['name']] = policy
+
+ def assign_policy(self, peer, policy, typ):
+ if peer not in self.peers:
+ raise Exception('peer {0} not found'.format(peer.name))
+ name = policy['name']
+ if name not in self.policies:
+ raise Exception('policy {0} not found'.format(name))
+ self.peers[peer]['policies'][typ] = policy
+
+ def get_local_rib(self, peer, rf):
+ raise NotImplementedError()
+
+ def get_global_rib(self, rf):
+ raise NotImplementedError()
+
+ def get_neighbor_state(self, peer_id):
+ raise NotImplementedError()
+
+ def get_reachablily(self, prefix, timeout=20):
+ version = netaddr.IPNetwork(prefix).version
+ addr = prefix.split('/')[0]
+ if version == 4:
+ ping_cmd = 'ping'
+ elif version == 6:
+ ping_cmd = 'ping6'
+ else:
+ raise Exception(
+ 'unsupported route family: {0}'.format(version))
+ cmd = '/bin/bash -c "/bin/{0} -c 1 -w 1 {1} | xargs echo"'.format(
+ ping_cmd, addr)
+ interval = 1
+ count = 0
+ while True:
+ res = self.exec_on_ctn(cmd)
+ LOG.info(res)
+ if '1 packets received' in res and '0% packet loss':
+ break
+ time.sleep(interval)
+ count += interval
+ if count >= timeout:
+ raise Exception('timeout')
+ return True
+
+ def wait_for(self, expected_state, peer, timeout=120):
+ interval = 1
+ count = 0
+ while True:
+ state = self.get_neighbor_state(peer)
+ LOG.info("%s's peer %s state: %s",
+ self.router_id, peer.router_id, state)
+ if state == expected_state:
+ return
+
+ time.sleep(interval)
+ count += interval
+ if count >= timeout:
+ raise Exception('timeout')
+
+ def add_static_route(self, network, next_hop):
+ cmd = '/sbin/ip route add {0} via {1}'.format(network, next_hop)
+ self.exec_on_ctn(cmd)
+
+ def set_ipv6_forward(self):
+ cmd = 'sysctl -w net.ipv6.conf.all.forwarding=1'
+ self.exec_on_ctn(cmd)
+
+ def create_config(self):
+ raise NotImplementedError()
+
+ def reload_config(self):
+ raise NotImplementedError()
diff --git a/tests/integrated/common/install_docker_test_pkg.sh b/tests/integrated/common/install_docker_test_pkg.sh
new file mode 100644
index 00000000..a771dfc1
--- /dev/null
+++ b/tests/integrated/common/install_docker_test_pkg.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+set -ex
+
+RYU_PATH=`dirname $0`
+
+source ${RYU_PATH}/install_docker_test_pkg_common.sh
+
+function add_docker_aptline {
+ sudo apt-get update
+ if ! apt-cache search docker-engine | grep docker-engine; then
+ VER=`lsb_release -r`
+ if echo $VER | grep 12.04; then
+ REL_NAME=precise
+ elif echo $VER | grep 14.04; then
+ REL_NAME=trusty
+ elif echo $VER | grep 15.10; then
+ REL_NAME=wily
+ elif echo $VER | grep 16.04; then
+ REL_NAME=xenial
+ else
+ retrun 1
+ fi
+ RELEASE=ubuntu-$REL_NAME
+ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
+ sudo sh -c "echo deb https://apt.dockerproject.org/repo $RELEASE main > /etc/apt/sources.list.d/docker.list"
+ fi
+}
+
+init_variables
+process_options "$@"
+
+if [ $APTLINE_DOCKER -eq 1 ]; then
+ add_docker_aptline
+fi
+
+sudo apt-get update
+if apt-cache search docker-engine | grep docker-engine; then
+ DOCKER_PKG=docker-engine
+else
+ DOCKER_PKG=docker.io
+fi
+sudo apt-get install -y $DOCKER_PKG
+install_depends_pkg
diff --git a/tests/integrated/common/install_docker_test_pkg_common.sh b/tests/integrated/common/install_docker_test_pkg_common.sh
new file mode 100644
index 00000000..44a3e107
--- /dev/null
+++ b/tests/integrated/common/install_docker_test_pkg_common.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+set -ex
+
+function init_variables {
+ APTLINE_DOCKER=0
+ DIR_BASE=/tmp
+}
+
+function process_options {
+ local max
+ local i
+ max=$#
+ i=1
+ while [ $i -le $max ]; do
+ case "$1" in
+ -a|--add-docker-aptline)
+ APTLINE_DOCKER=1
+ ;;
+ -d|--download-dir)
+ shift; ((i++))
+ DIR_BASE=$1
+ ;;
+ esac
+ shift; ((i++))
+ done
+}
+
+function install_pipework {
+ if ! which /usr/local/bin/pipework >/dev/null
+ then
+ sudo rm -rf $DIR_BASE/pipework
+ git clone https://github.com/jpetazzo/pipework.git $DIR_BASE/pipework
+ sudo install -m 0755 $DIR_BASE/pipework/pipework /usr/local/bin/pipework
+ fi
+}
+
+function install_depends_pkg {
+ install_pipework
+}
diff --git a/tests/integrated/common/install_docker_test_pkg_for_travis.sh b/tests/integrated/common/install_docker_test_pkg_for_travis.sh
new file mode 100644
index 00000000..d8c3b499
--- /dev/null
+++ b/tests/integrated/common/install_docker_test_pkg_for_travis.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -ex
+
+RYU_PATH=`dirname $0`
+
+source ${RYU_PATH}/install_docker_test_pkg_common.sh
+
+init_variables
+process_options "$@"
+
+sudo apt-get update
+install_depends_pkg
diff --git a/tests/integrated/common/quagga.py b/tests/integrated/common/quagga.py
new file mode 100644
index 00000000..9b6d2183
--- /dev/null
+++ b/tests/integrated/common/quagga.py
@@ -0,0 +1,332 @@
+# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+#
+# This is based on the following
+# https://github.com/osrg/gobgp/test/lib/quagga.py
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+
+import logging
+import os
+
+import netaddr
+
+from . import docker_base as base
+
+LOG = logging.getLogger(__name__)
+
+
+class QuaggaBGPContainer(base.BGPContainer):
+
+ WAIT_FOR_BOOT = 1
+ SHARED_VOLUME = '/etc/quagga'
+
+ def __init__(self, name, asn, router_id, ctn_image_name, zebra=False):
+ super(QuaggaBGPContainer, self).__init__(name, asn, router_id,
+ ctn_image_name)
+ self.shared_volumes.append((self.config_dir, self.SHARED_VOLUME))
+ self.zebra = zebra
+ self._create_config_debian()
+
+ def run(self, wait=False, w_time=WAIT_FOR_BOOT):
+ w_time = super(QuaggaBGPContainer,
+ self).run(wait=wait, w_time=self.WAIT_FOR_BOOT)
+ return w_time
+
+ def get_global_rib(self, prefix='', rf='ipv4'):
+ rib = []
+ if prefix != '':
+ return self.get_global_rib_with_prefix(prefix, rf)
+
+ out = self.vtysh('show bgp {0} unicast'.format(rf), config=False)
+ if out.startswith('No BGP network exists'):
+ return rib
+
+ read_next = False
+
+ for line in out.split('\n'):
+ ibgp = False
+ if line[:2] == '*>':
+ line = line[2:]
+ if line[0] == 'i':
+ line = line[1:]
+ ibgp = True
+ elif not read_next:
+ continue
+
+ elems = line.split()
+
+ if len(elems) == 1:
+ read_next = True
+ prefix = elems[0]
+ continue
+ elif read_next:
+ nexthop = elems[0]
+ else:
+ prefix = elems[0]
+ nexthop = elems[1]
+ read_next = False
+
+ rib.append({'prefix': prefix, 'nexthop': nexthop,
+ 'ibgp': ibgp})
+
+ return rib
+
+ def get_global_rib_with_prefix(self, prefix, rf):
+ rib = []
+
+ lines = [line.strip() for line in self.vtysh(
+ 'show bgp {0} unicast {1}'.format(rf, prefix),
+ config=False).split('\n')]
+
+ if lines[0] == '% Network not in table':
+ return rib
+
+ lines = lines[2:]
+
+ if lines[0].startswith('Not advertised'):
+ lines.pop(0) # another useless line
+ elif lines[0].startswith('Advertised to non peer-group peers:'):
+ lines = lines[2:] # other useless lines
+ else:
+ raise Exception('unknown output format {0}'.format(lines))
+
+ if lines[0] == 'Local':
+ aspath = []
+ else:
+ aspath = [int(asn) for asn in lines[0].split()]
+
+ nexthop = lines[1].split()[0].strip()
+ info = [s.strip(',') for s in lines[2].split()]
+ attrs = []
+ if 'metric' in info:
+ med = info[info.index('metric') + 1]
+ attrs.append({'type': base.BGP_ATTR_TYPE_MULTI_EXIT_DISC,
+ 'metric': int(med)})
+ if 'localpref' in info:
+ localpref = info[info.index('localpref') + 1]
+ attrs.append({'type': base.BGP_ATTR_TYPE_LOCAL_PREF,
+ 'value': int(localpref)})
+
+ rib.append({'prefix': prefix, 'nexthop': nexthop,
+ 'aspath': aspath, 'attrs': attrs})
+
+ return rib
+
+ def get_neighbor_state(self, peer):
+ if peer not in self.peers:
+ raise Exception('not found peer {0}'.format(peer.router_id))
+
+ neigh_addr = self.peers[peer]['neigh_addr'].split('/')[0]
+
+ info = [l.strip() for l in self.vtysh(
+ 'show bgp neighbors {0}'.format(neigh_addr),
+ config=False).split('\n')]
+
+ if not info[0].startswith('BGP neighbor is'):
+ raise Exception('unknown format')
+
+ idx1 = info[0].index('BGP neighbor is ')
+ idx2 = info[0].index(',')
+ n_addr = info[0][idx1 + len('BGP neighbor is '):idx2]
+ if n_addr == neigh_addr:
+ idx1 = info[2].index('= ')
+ state = info[2][idx1 + len('= '):]
+ if state.startswith('Idle'):
+ return base.BGP_FSM_IDLE
+ elif state.startswith('Active'):
+ return base.BGP_FSM_ACTIVE
+ elif state.startswith('Established'):
+ return base.BGP_FSM_ESTABLISHED
+ else:
+ return state
+
+ raise Exception('not found peer {0}'.format(peer.router_id))
+
+ def send_route_refresh(self):
+ self.vtysh('clear ip bgp * soft', config=False)
+
+ def create_config(self):
+ zebra = 'no'
+ self._create_config_bgp()
+ if self.zebra:
+ zebra = 'yes'
+ self._create_config_zebra()
+ self._create_config_daemons(zebra)
+
+ def _create_config_debian(self):
+ c = base.CmdBuffer()
+ c << 'vtysh_enable=yes'
+ c << 'zebra_options=" --daemon -A 127.0.0.1"'
+ c << 'bgpd_options=" --daemon -A 127.0.0.1"'
+ c << 'ospfd_options=" --daemon -A 127.0.0.1"'
+ c << 'ospf6d_options=" --daemon -A ::1"'
+ c << 'ripd_options=" --daemon -A 127.0.0.1"'
+ c << 'ripngd_options=" --daemon -A ::1"'
+ c << 'isisd_options=" --daemon -A 127.0.0.1"'
+ c << 'babeld_options=" --daemon -A 127.0.0.1"'
+ c << 'watchquagga_enable=yes'
+ c << 'watchquagga_options=(--daemon)'
+ with open('{0}/debian.conf'.format(self.config_dir), 'w') as f:
+ LOG.info("[%s's new config]", self.name)
+ LOG.info(str(c))
+ f.writelines(str(c))
+
+ def _create_config_daemons(self, zebra='no'):
+ c = base.CmdBuffer()
+ c << 'zebra=%s' % zebra
+ c << 'bgpd=yes'
+ c << 'ospfd=no'
+ c << 'ospf6d=no'
+ c << 'ripd=no'
+ c << 'ripngd=no'
+ c << 'isisd=no'
+ c << 'babeld=no'
+ with open('{0}/daemons'.format(self.config_dir), 'w') as f:
+ LOG.info("[%s's new config]", self.name)
+ LOG.info(str(c))
+ f.writelines(str(c))
+
+ def _create_config_bgp(self):
+
+ c = base.CmdBuffer()
+ c << 'hostname bgpd'
+ c << 'password zebra'
+ c << 'router bgp {0}'.format(self.asn)
+ c << 'bgp router-id {0}'.format(self.router_id)
+ if any(info['graceful_restart'] for info in self.peers.values()):
+ c << 'bgp graceful-restart'
+
+ version = 4
+ for peer, info in self.peers.items():
+ version = netaddr.IPNetwork(info['neigh_addr']).version
+ n_addr = info['neigh_addr'].split('/')[0]
+ if version == 6:
+ c << 'no bgp default ipv4-unicast'
+
+ c << 'neighbor {0} remote-as {1}'.format(n_addr, peer.asn)
+ if info['is_rs_client']:
+ c << 'neighbor {0} route-server-client'.format(n_addr)
+ for typ, p in info['policies'].items():
+ c << 'neighbor {0} route-map {1} {2}'.format(n_addr, p['name'],
+ typ)
+ if info['passwd']:
+ c << 'neighbor {0} password {1}'.format(n_addr, info['passwd'])
+ if info['passive']:
+ c << 'neighbor {0} passive'.format(n_addr)
+ if version == 6:
+ c << 'address-family ipv6 unicast'
+ c << 'neighbor {0} activate'.format(n_addr)
+ c << 'exit-address-family'
+
+ for route in self.routes.values():
+ if route['rf'] == 'ipv4':
+ c << 'network {0}'.format(route['prefix'])
+ elif route['rf'] == 'ipv6':
+ c << 'address-family ipv6 unicast'
+ c << 'network {0}'.format(route['prefix'])
+ c << 'exit-address-family'
+ else:
+ raise Exception(
+ 'unsupported route faily: {0}'.format(route['rf']))
+
+ if self.zebra:
+ if version == 6:
+ c << 'address-family ipv6 unicast'
+ c << 'redistribute connected'
+ c << 'exit-address-family'
+ else:
+ c << 'redistribute connected'
+
+ for name, policy in self.policies.items():
+ c << 'access-list {0} {1} {2}'.format(name, policy['type'],
+ policy['match'])
+ c << 'route-map {0} permit 10'.format(name)
+ c << 'match ip address {0}'.format(name)
+ c << 'set metric {0}'.format(policy['med'])
+
+ c << 'debug bgp as4'
+ c << 'debug bgp fsm'
+ c << 'debug bgp updates'
+ c << 'debug bgp events'
+ c << 'log file {0}/bgpd.log'.format(self.SHARED_VOLUME)
+
+ with open('{0}/bgpd.conf'.format(self.config_dir), 'w') as f:
+ LOG.info("[%s's new config]", self.name)
+ LOG.info(str(c))
+ f.writelines(str(c))
+
+ def _create_config_zebra(self):
+ c = base.CmdBuffer()
+ c << 'hostname zebra'
+ c << 'password zebra'
+ c << 'log file {0}/zebra.log'.format(self.SHARED_VOLUME)
+ c << 'debug zebra packet'
+ c << 'debug zebra kernel'
+ c << 'debug zebra rib'
+ c << ''
+
+ with open('{0}/zebra.conf'.format(self.config_dir), 'w') as f:
+ LOG.info("[%s's new config]", self.name)
+ LOG.info(str(c))
+ f.writelines(str(c))
+
+ def vtysh(self, cmd, config=True):
+ if not isinstance(cmd, list):
+ cmd = [cmd]
+ cmd = ' '.join("-c '{0}'".format(c) for c in cmd)
+ if config:
+ return self.exec_on_ctn(
+ "vtysh -d bgpd -c 'en' -c 'conf t' -c "
+ "'router bgp {0}' {1}".format(self.asn, cmd),
+ capture=True)
+ else:
+ return self.exec_on_ctn("vtysh -d bgpd {0}".format(cmd),
+ capture=True)
+
+ def reload_config(self):
+ daemon = []
+ daemon.append('bgpd')
+ if self.zebra:
+ daemon.append('zebra')
+ for d in daemon:
+ cmd = '/usr/bin/pkill {0} -SIGHUP'.format(d)
+ self.exec_on_ctn(cmd, capture=True)
+
+
+class RawQuaggaBGPContainer(QuaggaBGPContainer):
+ def __init__(self, name, config, ctn_image_name,
+ zebra=False):
+ asn = None
+ router_id = None
+ for line in config.split('\n'):
+ line = line.strip()
+ if line.startswith('router bgp'):
+ asn = int(line[len('router bgp'):].strip())
+ if line.startswith('bgp router-id'):
+ router_id = line[len('bgp router-id'):].strip()
+ if not asn:
+ raise Exception('asn not in quagga config')
+ if not router_id:
+ raise Exception('router-id not in quagga config')
+ self.config = config
+ super(RawQuaggaBGPContainer, self).__init__(name, asn, router_id,
+ ctn_image_name, zebra)
+
+ def create_config(self):
+ with open(os.path.join(self.config_dir, 'bgpd.conf'), 'w') as f:
+ LOG.info("[%s's new config]", self.name)
+ LOG.info(self.config)
+ f.writelines(self.config)
diff --git a/tests/integrated/common/ryubgp.py b/tests/integrated/common/ryubgp.py
new file mode 100644
index 00000000..8fe16f49
--- /dev/null
+++ b/tests/integrated/common/ryubgp.py
@@ -0,0 +1,212 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+
+import logging
+import os
+import time
+
+from . import docker_base as base
+
+LOG = logging.getLogger(__name__)
+
+
+class RyuBGPContainer(base.BGPContainer):
+
+ WAIT_FOR_BOOT = 1
+ SHARED_VOLUME = '/etc/ryu'
+
+ def __init__(self, name, asn, router_id, ctn_image_name):
+ super(RyuBGPContainer, self).__init__(name, asn, router_id,
+ ctn_image_name)
+ self.RYU_CONF = os.path.join(self.config_dir, 'ryu.conf')
+ self.SHARED_RYU_CONF = os.path.join(self.SHARED_VOLUME, 'ryu.conf')
+ self.SHARED_BGP_CONF = os.path.join(self.SHARED_VOLUME, 'bgp_conf.py')
+ self.shared_volumes.append((self.config_dir, self.SHARED_VOLUME))
+
+ def _create_config_ryu(self):
+ c = base.CmdBuffer()
+ c << '[DEFAULT]'
+ c << 'verbose=True'
+ c << 'log_file=/etc/ryu/manager.log'
+ with open(self.RYU_CONF, 'w') as f:
+ LOG.info("[%s's new config]" % self.name)
+ LOG.info(str(c))
+ f.writelines(str(c))
+
+ def _create_config_ryu_bgp(self):
+ c = base.CmdBuffer()
+ c << 'import os'
+ c << ''
+ c << 'BGP = {'
+ c << " 'local_as': %s," % str(self.asn)
+ c << " 'router_id': '%s'," % self.router_id
+ c << " 'neighbors': ["
+ c << " {"
+ for peer, info in self.peers.items():
+ n_addr = info['neigh_addr'].split('/')[0]
+ c << " 'address': '%s'," % n_addr
+ c << " 'remote_as': %s," % str(peer.asn)
+ c << " 'enable_ipv4': True,"
+ c << " 'enable_ipv6': True,"
+ c << " 'enable_vpnv4': True,"
+ c << " 'enable_vpnv6': True,"
+ c << ' },'
+ c << ' ],'
+ c << " 'routes': ["
+ for route in self.routes.values():
+ c << " {"
+ c << " 'prefix': '%s'," % route['prefix']
+ c << " },"
+ c << " ],"
+ c << "}"
+ log_conf = """LOGGING = {
+
+ # We use python logging package for logging.
+ 'version': 1,
+ 'disable_existing_loggers': False,
+
+ 'formatters': {
+ 'verbose': {
+ 'format': '%(levelname)s %(asctime)s %(module)s ' +
+ '[%(process)d %(thread)d] %(message)s'
+ },
+ 'simple': {
+ 'format': '%(levelname)s %(asctime)s %(module)s %(lineno)s ' +
+ '%(message)s'
+ },
+ 'stats': {
+ 'format': '%(message)s'
+ },
+ },
+
+ 'handlers': {
+ # Outputs log to console.
+ 'console': {
+ 'level': 'DEBUG',
+ 'class': 'logging.StreamHandler',
+ 'formatter': 'simple'
+ },
+ 'console_stats': {
+ 'level': 'DEBUG',
+ 'class': 'logging.StreamHandler',
+ 'formatter': 'stats'
+ },
+ # Rotates log file when its size reaches 10MB.
+ 'log_file': {
+ 'level': 'DEBUG',
+ 'class': 'logging.handlers.RotatingFileHandler',
+ 'filename': os.path.join('.', 'bgpspeaker.log'),
+ 'maxBytes': '10000000',
+ 'formatter': 'verbose'
+ },
+ 'stats_file': {
+ 'level': 'DEBUG',
+ 'class': 'logging.handlers.RotatingFileHandler',
+ 'filename': os.path.join('.', 'statistics_bgps.log'),
+ 'maxBytes': '10000000',
+ 'formatter': 'stats'
+ },
+ },
+
+ # Fine-grained control of logging per instance.
+ 'loggers': {
+ 'bgpspeaker': {
+ 'handlers': ['console', 'log_file'],
+ 'handlers': ['console'],
+ 'level': 'DEBUG',
+ 'propagate': False,
+ },
+ 'stats': {
+ 'handlers': ['stats_file', 'console_stats'],
+ 'level': 'INFO',
+ 'propagate': False,
+ 'formatter': 'stats',
+ },
+ },
+
+ # Root loggers.
+ 'root': {
+ 'handlers': ['console', 'log_file'],
+ 'level': 'DEBUG',
+ 'propagate': True,
+ },
+}"""
+ c << log_conf
+ with open(os.path.join(self.config_dir, 'bgp_conf.py'), 'w') as f:
+ LOG.info("[%s's new config]", self.name)
+ LOG.info(str(c))
+ f.writelines(str(c))
+
+ def create_config(self):
+ self._create_config_ryu()
+ self._create_config_ryu_bgp()
+
+ def is_running_ryu(self):
+ results = self.exec_on_ctn('ps ax')
+ running = False
+ for line in results.split('\n')[1:]:
+ if 'ryu-manager' in line:
+ running = True
+ return running
+
+ def start_ryubgp(self, check_running=True, retry=False):
+ if check_running:
+ if self.is_running_ryu():
+ return True
+ result = False
+ if retry:
+ try_times = 3
+ else:
+ try_times = 1
+ cmd = "ryu-manager --verbose "
+ cmd += "--config-file %s " % self.SHARED_RYU_CONF
+ cmd += "--bgp-app-config-file %s " % self.SHARED_BGP_CONF
+ cmd += "ryu.services.protocols.bgp.application"
+ for _ in range(try_times):
+ self.exec_on_ctn(cmd, detach=True)
+ if self.is_running_ryu():
+ result = True
+ break
+ time.sleep(1)
+ return result
+
+ def stop_ryubgp(self, check_running=True, retry=False):
+ if check_running:
+ if not self.is_running_ryu():
+ return True
+ result = False
+ if retry:
+ try_times = 3
+ else:
+ try_times = 1
+ for _ in range(try_times):
+ cmd = '/usr/bin/pkill ryu-manager -SIGTERM'
+ self.exec_on_ctn(cmd)
+ if not self.is_running_ryu():
+ result = True
+ break
+ time.sleep(1)
+ return result
+
+ def run(self, wait=False, w_time=WAIT_FOR_BOOT):
+ w_time = super(RyuBGPContainer,
+ self).run(wait=wait, w_time=self.WAIT_FOR_BOOT)
+ return w_time
+
+ def reload_config(self):
+ self.stop_ryubgp(retry=True)
+ self.start_ryubgp(retry=True)
diff --git a/tests/integrated/run_test.py b/tests/integrated/run_test.py
new file mode 100644
index 00000000..77d39345
--- /dev/null
+++ b/tests/integrated/run_test.py
@@ -0,0 +1,54 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2016 Fumihiko Kakuma <kakuma at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+
+import logging
+import os
+import sys
+import unittest
+
+from ryu import log
+
+
+def load_tests(loader, tests, pattern):
+ dirname = os.path.dirname(os.path.abspath(__file__))
+ base_path = os.path.abspath(dirname + '/../..')
+ suite = unittest.TestSuite()
+ for test_dir in ['tests/integrated/bgp']:
+ if not pattern:
+ suite.addTests(loader.discover(test_dir,
+ top_level_dir=base_path))
+ else:
+ suite.addTests(loader.discover(test_dir, pattern=pattern,
+ top_level_dir=base_path))
+ return suite
+
+
+if __name__ == '__main__':
+ log.early_init_log(logging.DEBUG)
+ log.init_log()
+ LOG = logging.getLogger(__name__)
+ pattern = None
+ if len(sys.argv) == 2:
+ pattern = sys.argv[1]
+ loader = unittest.defaultTestLoader
+ suite = load_tests(loader, None, pattern)
+ res = unittest.TextTestRunner(verbosity=2).run(suite)
+ ret = 0
+ if res.errors or res.failures:
+ ret = 1
+ sys.exit(ret)
diff --git a/tests/integrated/run_tests_with_ovs12.py b/tests/integrated/run_tests_with_ovs12.py
new file mode 100755
index 00000000..b6393c43
--- /dev/null
+++ b/tests/integrated/run_tests_with_ovs12.py
@@ -0,0 +1,110 @@
+#!/usr/bin/env python
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import unittest
+from nose.tools import ok_, eq_, timed, nottest
+
+from subprocess import Popen, PIPE, STDOUT
+import time
+
+from mininet.net import Mininet
+from mininet.node import RemoteController, OVSKernelSwitch
+
+TIMEOUT = 60
+RYU_HOST = '127.0.0.1'
+RYU_PORT = 6633
+PYTHON_BIN = '.venv/bin/python'
+RYU_MGR = './bin/ryu-manager'
+
+
+class OVS12KernelSwitch(OVSKernelSwitch):
+ """Set protocols parameter for OVS version 1.10"""
+ def start(self, controllers):
+ super(OVS12KernelSwitch, self).start(controllers)
+ self.cmd('ovs-vsctl set Bridge', self,
+ "protocols='[OpenFlow10, OpenFlow12]'")
+
+
+class TestWithOVS12(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ cls.mn = Mininet()
+ c = cls.mn.addController(controller=RemoteController,
+ ip=RYU_HOST, port=RYU_PORT)
+ c.start()
+
+ s1 = cls.mn.addSwitch('s1', cls=OVS12KernelSwitch)
+ s1.start(cls.mn.controllers)
+
+ h1 = cls.mn.addHost('h1', ip='0.0.0.0/0')
+
+ link = cls.mn.addLink(h1, s1)
+ s1.attach(link.intf2)
+
+ @classmethod
+ def tearDownClass(cls):
+ cls.mn.stop()
+
+ @timed(TIMEOUT)
+ def test_add_flow_v10(self):
+ app = 'test/integrated/test_add_flow_v10.py'
+ self._run_ryu_manager_and_check_output(app)
+
+ @timed(TIMEOUT)
+ def test_request_reply_v12(self):
+ app = 'test/integrated/test_request_reply_v12.py'
+ self._run_ryu_manager_and_check_output(app)
+
+ @timed(TIMEOUT)
+ def test_add_flow_v12_actions(self):
+ app = 'test/integrated/test_add_flow_v12_actions.py'
+ self._run_ryu_manager_and_check_output(app)
+
+ @timed(TIMEOUT)
+ def test_add_flow_v12_matches(self):
+ app = 'test/integrated/test_add_flow_v12_matches.py'
+ self._run_ryu_manager_and_check_output(app)
+
+ @nottest
+ def test_of_config(self):
+ # OVS 1.10 does not support of_config
+ pass
+
+ def _run_ryu_manager_and_check_output(self, app):
+ cmd = [PYTHON_BIN, RYU_MGR, app]
+ p = Popen(cmd, stdout=PIPE, stderr=STDOUT)
+
+ while True:
+ if p.poll() is not None:
+ raise Exception('Another ryu-manager already running?')
+
+ line = p.stdout.readline().strip()
+ if line == '':
+ time.sleep(1)
+ continue
+
+ print("ryu-manager: %s" % line)
+ if line.find('TEST_FINISHED') != -1:
+ ok_(line.find('Completed=[True]') != -1)
+ p.terminate()
+ p.communicate() # wait for subprocess is terminated
+ break
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/integrated/test_add_flow_v10.py b/tests/integrated/test_add_flow_v10.py
new file mode 100644
index 00000000..895cf15d
--- /dev/null
+++ b/tests/integrated/test_add_flow_v10.py
@@ -0,0 +1,258 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import logging
+
+from ryu.ofproto import ofproto_v1_0
+from ryu.ofproto import ether
+from ryu.ofproto import nx_match
+
+from tests.integrated import tester
+
+LOG = logging.getLogger(__name__)
+
+
+class RunTest(tester.TestFlowBase):
+ """ Test case for add flows of1.0
+ """
+ OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]
+
+ def __init__(self, *args, **kwargs):
+ super(RunTest, self).__init__(*args, **kwargs)
+ self._verify = []
+
+ def add_action(self, dp, action):
+ rule = nx_match.ClsRule()
+ self.send_flow_mod(
+ dp, rule, 0, dp.ofproto.OFPFC_ADD, 0, 0, None,
+ 0xffffffff, None, dp.ofproto.OFPFF_SEND_FLOW_REM, action)
+
+ def add_rule(self, dp, rule):
+ self.send_flow_mod(
+ dp, rule, 0, dp.ofproto.OFPFC_ADD, 0, 0, None,
+ 0xffffffff, None, dp.ofproto.OFPFF_SEND_FLOW_REM, [])
+
+ def send_flow_mod(self, dp, rule, cookie, command, idle_timeout,
+ hard_timeout, priority=None, buffer_id=0xffffffff,
+ out_port=None, flags=0, actions=None):
+
+ if priority is None:
+ priority = dp.ofproto.OFP_DEFAULT_PRIORITY
+ if out_port is None:
+ out_port = dp.ofproto.OFPP_NONE
+
+ match_tuple = rule.match_tuple()
+ match = dp.ofproto_parser.OFPMatch(*match_tuple)
+
+ m = dp.ofproto_parser.OFPFlowMod(
+ dp, match, cookie, command, idle_timeout, hard_timeout,
+ priority, buffer_id, out_port, flags, actions)
+
+ dp.send_msg(m)
+
+ def _verify_action(self, actions, type_, name, value):
+ try:
+ action = actions[0]
+ if action.cls_action_type != type_:
+ return "Action type error. send:%s, val:%s" \
+ % (type_, action.cls_action_type)
+ except IndexError:
+ return "Action is not setting."
+
+ f_value = None
+ if name:
+ try:
+ if isinstance(name, list):
+ f_value = [getattr(action, n) for n in name]
+ else:
+ f_value = getattr(action, name)
+ except AttributeError:
+ pass
+
+ if f_value != value:
+ return "Value error. send:%s=%s val:%s" \
+ % (name, value, f_value)
+ return True
+
+ def _verify_rule(self, rule, name, value):
+ f_value = getattr(rule, name)
+ if f_value != value:
+ return "Value error. send:%s=%s val:%s" \
+ % (name, value, f_value)
+ return True
+
+ def verify_default(self, dp, stats):
+ verify = self._verify
+ self._verify = []
+ match = stats[0].match
+ actions = stats[0].actions
+
+ if len(verify) == 2:
+ return self._verify_rule(match, *verify)
+ elif len(verify) == 3:
+ return self._verify_action(actions, *verify)
+ else:
+ return "self._verify is invalid."
+
+ # Test of Actions
+ def test_action_output(self, dp):
+ out_port = 2
+ self._verify = [dp.ofproto.OFPAT_OUTPUT,
+ 'port', out_port]
+ action = dp.ofproto_parser.OFPActionOutput(out_port)
+ self.add_action(dp, [action, ])
+
+ def test_action_vlan_vid(self, dp):
+ vlan_vid = 2
+ self._verify = [dp.ofproto.OFPAT_SET_VLAN_VID,
+ 'vlan_vid', vlan_vid]
+ action = dp.ofproto_parser.OFPActionVlanVid(vlan_vid)
+ self.add_action(dp, [action, ])
+
+ def test_action_vlan_pcp(self, dp):
+ vlan_pcp = 4
+ self._verify = [dp.ofproto.OFPAT_SET_VLAN_PCP,
+ 'vlan_pcp', vlan_pcp]
+ action = dp.ofproto_parser.OFPActionVlanPcp(vlan_pcp)
+ self.add_action(dp, [action, ])
+
+ def test_action_strip_vlan(self, dp):
+ vlan_pcp = 4
+ self._verify = [dp.ofproto.OFPAT_STRIP_VLAN,
+ None, None]
+ action = dp.ofproto_parser.OFPActionStripVlan()
+ self.add_action(dp, [action, ])
+
+ def test_action_set_dl_src(self, dp):
+ dl_src = '56:b3:42:04:b2:7a'
+ dl_src_bin = self.haddr_to_bin(dl_src)
+ self._verify = [dp.ofproto.OFPAT_SET_DL_SRC,
+ 'dl_addr', dl_src_bin]
+ action = dp.ofproto_parser.OFPActionSetDlSrc(dl_src_bin)
+ self.add_action(dp, [action, ])
+
+ def test_action_set_dl_dst(self, dp):
+ dl_dst = 'c2:93:a2:fb:d0:f4'
+ dl_dst_bin = self.haddr_to_bin(dl_dst)
+ self._verify = [dp.ofproto.OFPAT_SET_DL_DST,
+ 'dl_addr', dl_dst_bin]
+ action = dp.ofproto_parser.OFPActionSetDlDst(dl_dst_bin)
+ self.add_action(dp, [action, ])
+
+ def test_action_set_nw_src(self, dp):
+ nw_src = '216.132.81.105'
+ nw_src_int = self.ipv4_to_int(nw_src)
+ self._verify = [dp.ofproto.OFPAT_SET_NW_SRC,
+ 'nw_addr', nw_src_int]
+ action = dp.ofproto_parser.OFPActionSetNwSrc(nw_src_int)
+ self.add_action(dp, [action, ])
+
+ def test_action_set_nw_dst(self, dp):
+ nw_dst = '223.201.206.3'
+ nw_dst_int = self.ipv4_to_int(nw_dst)
+ self._verify = [dp.ofproto.OFPAT_SET_NW_DST,
+ 'nw_addr', nw_dst_int]
+ action = dp.ofproto_parser.OFPActionSetNwDst(nw_dst_int)
+ self.add_action(dp, [action, ])
+
+ def test_action_set_nw_tos(self, dp):
+ # lowest two bits must be zero
+ nw_tos = 1 << 2
+ self._verify = [dp.ofproto.OFPAT_SET_NW_TOS,
+ 'tos', nw_tos]
+ action = dp.ofproto_parser.OFPActionSetNwTos(nw_tos)
+ self.add_action(dp, [action, ])
+
+ def test_action_set_tp_src(self, dp):
+ tp_src = 55420
+ self._verify = [dp.ofproto.OFPAT_SET_TP_SRC,
+ 'tp', tp_src]
+ action = dp.ofproto_parser.OFPActionSetTpSrc(tp_src)
+ self.add_action(dp, [action, ])
+
+ def test_action_set_tp_dst(self, dp):
+ tp_dst = 15430
+ self._verify = [dp.ofproto.OFPAT_SET_TP_DST,
+ 'tp', tp_dst]
+ action = dp.ofproto_parser.OFPActionSetTpDst(tp_dst)
+ self.add_action(dp, [action, ])
+
+ def test_action_enqueue(self, dp):
+ port = 207
+ queue_id = 4287508753
+ self._verify = [dp.ofproto.OFPAT_ENQUEUE,
+ ['port', 'queue_id'], [port, queue_id]]
+ action = dp.ofproto_parser.OFPActionEnqueue(port, queue_id)
+ self.add_action(dp, [action, ])
+
+ # Test of Rules
+ def test_rule_set_in_port(self, dp):
+ in_port = 32
+ self._verify = ['in_port', in_port]
+
+ rule = nx_match.ClsRule()
+ rule.set_in_port(in_port)
+ self.add_rule(dp, rule)
+
+ def test_rule_set_dl_src(self, dp):
+ dl_src = 'b8:a1:94:51:78:83'
+ dl_src_bin = self.haddr_to_bin(dl_src)
+ self._verify = ['dl_src', dl_src_bin]
+
+ rule = nx_match.ClsRule()
+ rule.set_dl_src(dl_src_bin)
+ self.add_rule(dp, rule)
+
+ def test_rule_set_dl_type_ip(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ self._verify = ['dl_type', dl_type]
+
+ rule = nx_match.ClsRule()
+ rule.set_dl_type(dl_type)
+ self.add_rule(dp, rule)
+
+ def test_rule_set_dl_type_arp(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ self._verify = ['dl_type', dl_type]
+
+ rule = nx_match.ClsRule()
+ rule.set_dl_type(dl_type)
+ self.add_rule(dp, rule)
+
+ def test_rule_set_dl_type_vlan(self, dp):
+ dl_type = ether.ETH_TYPE_8021Q
+ self._verify = ['dl_type', dl_type]
+
+ rule = nx_match.ClsRule()
+ rule.set_dl_type(dl_type)
+ self.add_rule(dp, rule)
+
+ def test_rule_set_dl_type_ipv6(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ self._verify = ['dl_type', dl_type]
+
+ rule = nx_match.ClsRule()
+ rule.set_dl_type(dl_type)
+ self.add_rule(dp, rule)
+
+ def test_rule_set_dl_type_lacp(self, dp):
+ dl_type = ether.ETH_TYPE_SLOW
+ self._verify = ['dl_type', dl_type]
+
+ rule = nx_match.ClsRule()
+ rule.set_dl_type(dl_type)
+ self.add_rule(dp, rule)
diff --git a/tests/integrated/test_add_flow_v12_actions.py b/tests/integrated/test_add_flow_v12_actions.py
new file mode 100644
index 00000000..3c1625ad
--- /dev/null
+++ b/tests/integrated/test_add_flow_v12_actions.py
@@ -0,0 +1,496 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import logging
+
+from ryu.ofproto import ofproto_v1_2
+from ryu.ofproto import ether
+from ryu.ofproto import inet
+
+from tests.integrated import tester
+
+LOG = logging.getLogger(__name__)
+
+
+class RunTest(tester.TestFlowBase):
+ """ Test case for add flows of Actions
+ """
+ OFP_VERSIONS = [ofproto_v1_2.OFP_VERSION]
+
+ def __init__(self, *args, **kwargs):
+ super(RunTest, self).__init__(*args, **kwargs)
+
+ self._verify = []
+
+ def add_apply_actions(self, dp, actions, match=None):
+ inst = [dp.ofproto_parser.OFPInstructionActions(
+ dp.ofproto.OFPIT_APPLY_ACTIONS, actions)]
+ if match is None:
+ match = dp.ofproto_parser.OFPMatch()
+ m = dp.ofproto_parser.OFPFlowMod(dp, 0, 0, 0,
+ dp.ofproto.OFPFC_ADD,
+ 0, 0, 0xff, 0xffffffff,
+ dp.ofproto.OFPP_ANY,
+ dp.ofproto.OFPG_ANY,
+ 0, match, inst)
+ dp.send_msg(m)
+
+ def add_set_field_action(self, dp, field, value, match=None):
+ self._verify = [dp.ofproto.OFPAT_SET_FIELD,
+ 'field', field, value]
+ f = dp.ofproto_parser.OFPMatchField.make(field, value)
+ actions = [dp.ofproto_parser.OFPActionSetField(f), ]
+ self.add_apply_actions(dp, actions, match=match)
+
+ def verify_default(self, dp, stats):
+ verify = self._verify
+ self._verify = []
+
+ type_ = name = field = value = None
+ if len(verify) == 1:
+ (type_, ) = verify
+ elif len(verify) == 3:
+ (type_, name, value) = verify
+ elif len(verify) == 4:
+ (type_, name, field, value) = verify
+ else:
+ return "self._verify is invalid."
+
+ try:
+ action = stats[0].instructions[0].actions[0]
+ if action.cls_action_type != type_:
+ return "Action type error. send:%s, val:%s" \
+ % (type_, action.cls_action_type)
+ except IndexError:
+ return "Action is not setting."
+
+ s_val = None
+ if name:
+ try:
+ s_val = getattr(action, name)
+ except AttributeError:
+ pass
+
+ if name == 'field':
+ if s_val.header != field:
+ return "Field error. send:%s val:%s" \
+ % (field, s_val.header)
+ s_val = s_val.value
+
+ if name and s_val != value:
+ return "Value error. send:%s=%s val:%s" \
+ % (name, value, s_val)
+
+ return True
+
+ def verify_action_drop(self, dp, stats):
+ for s in stats:
+ for i in s.instructions:
+ if len(i.actions):
+ return "has actions. %s" % (i.actions)
+ return True
+
+ # Test of General Actions
+ def test_action_output(self, dp):
+ out_port = 255
+ self._verify = [dp.ofproto.OFPAT_OUTPUT,
+ 'port', out_port]
+
+ actions = [dp.ofproto_parser.OFPActionOutput(out_port, 0), ]
+ self.add_apply_actions(dp, actions)
+
+ def test_action_drop(self, dp):
+ self.add_apply_actions(dp, [])
+
+ # Test of Push-Tag/Pop-Tag Actions
+ def test_action_push_vlan(self, dp):
+ ethertype = ether.ETH_TYPE_8021Q
+ self._verify = [dp.ofproto.OFPAT_PUSH_VLAN,
+ 'ethertype', ethertype]
+
+ actions = [dp.ofproto_parser.OFPActionPushVlan(ethertype)]
+ self.add_apply_actions(dp, actions)
+
+ def test_action_pop_vlan(self, dp):
+ self._verify = [dp.ofproto.OFPAT_POP_VLAN, ]
+
+ actions = [dp.ofproto_parser.OFPActionPopVlan(), ]
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_vlan_vid(1)
+ self.add_apply_actions(dp, actions, match)
+
+ def test_action_push_mpls(self, dp):
+ ethertype = ether.ETH_TYPE_MPLS
+ self._verify = [dp.ofproto.OFPAT_PUSH_MPLS,
+ 'ethertype', ethertype]
+
+ actions = [dp.ofproto_parser.OFPActionPushMpls(ethertype), ]
+ self.add_apply_actions(dp, actions)
+
+ def test_action_pop_mpls(self, dp):
+ ethertype = ether.ETH_TYPE_8021Q
+ self._verify = [dp.ofproto.OFPAT_POP_MPLS,
+ 'ethertype', ethertype]
+ actions = [dp.ofproto_parser.OFPActionPopMpls(ethertype), ]
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_MPLS)
+ self.add_apply_actions(dp, actions, match)
+
+ # Test of Set-Filed Actions
+ def test_action_set_field_dl_dst(self, dp):
+ field = dp.ofproto.OXM_OF_ETH_DST
+ dl_dst = 'e2:7a:09:79:0b:0f'
+ value = self.haddr_to_bin(dl_dst)
+
+ self.add_set_field_action(dp, field, value)
+
+ def test_action_set_field_dl_src(self, dp):
+ field = dp.ofproto.OXM_OF_ETH_SRC
+ dl_src = '08:82:63:b6:62:05'
+ value = self.haddr_to_bin(dl_src)
+
+ self.add_set_field_action(dp, field, value)
+
+ def test_action_set_field_dl_type(self, dp):
+ field = dp.ofproto.OXM_OF_ETH_TYPE
+ value = ether.ETH_TYPE_IPV6
+
+ self.add_set_field_action(dp, field, value)
+
+ def test_action_set_field_vlan_vid(self, dp):
+ field = dp.ofproto.OXM_OF_VLAN_VID
+ value = 0x1e4
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_vlan_vid(1)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_vlan_pcp(self, dp):
+ field = dp.ofproto.OXM_OF_VLAN_PCP
+ value = 3
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_vlan_vid(1)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_nw_dscp(self, dp):
+ field = dp.ofproto.OXM_OF_IP_DSCP
+ value = 32
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_IP)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_nw_ecn(self, dp):
+ field = dp.ofproto.OXM_OF_IP_ECN
+ value = 1
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_IP)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_ip_proto(self, dp):
+ field = dp.ofproto.OXM_OF_IP_PROTO
+ value = inet.IPPROTO_TCP
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_IP)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_ipv4_src(self, dp):
+ field = dp.ofproto.OXM_OF_IPV4_SRC
+ ipv4_src = '192.168.3.92'
+ value = self.ipv4_to_int(ipv4_src)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_IP)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_ipv4_dst(self, dp):
+ field = dp.ofproto.OXM_OF_IPV4_DST
+ ipv4_dst = '192.168.74.122'
+ value = self.ipv4_to_int(ipv4_dst)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_IP)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_tcp_src(self, dp):
+ field = dp.ofproto.OXM_OF_TCP_SRC
+ value = 105
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_IP)
+ match.set_ip_proto(inet.IPPROTO_TCP)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_tcp_dst(self, dp):
+ field = dp.ofproto.OXM_OF_TCP_DST
+ value = 75
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_IP)
+ match.set_ip_proto(inet.IPPROTO_TCP)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_udp_src(self, dp):
+ field = dp.ofproto.OXM_OF_UDP_SRC
+ value = 197
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_IP)
+ match.set_ip_proto(inet.IPPROTO_UDP)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_udp_dst(self, dp):
+ field = dp.ofproto.OXM_OF_UDP_DST
+ value = 17
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_IP)
+ match.set_ip_proto(inet.IPPROTO_UDP)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_icmpv4_type(self, dp):
+ field = dp.ofproto.OXM_OF_ICMPV4_TYPE
+ value = 8
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_ip_proto(inet.IPPROTO_ICMP)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_icmpv4_code(self, dp):
+ field = dp.ofproto.OXM_OF_ICMPV4_CODE
+ value = 2
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_ip_proto(inet.IPPROTO_ICMP)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_arp_op(self, dp):
+ field = dp.ofproto.OXM_OF_ARP_OP
+ value = 2
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_ARP)
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_arp_spa(self, dp):
+ field = dp.ofproto.OXM_OF_ARP_SPA
+ nw_src = '192.168.132.179'
+ value = self.ipv4_to_int(nw_src)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_ARP)
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_arp_tpa(self, dp):
+ field = dp.ofproto.OXM_OF_ARP_TPA
+ nw_dst = '192.168.118.85'
+ value = self.ipv4_to_int(nw_dst)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_ARP)
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_arp_sha(self, dp):
+ field = dp.ofproto.OXM_OF_ARP_SHA
+ arp_sha = '50:29:e7:7f:6c:7f'
+ value = self.haddr_to_bin(arp_sha)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_ARP)
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_arp_tha(self, dp):
+ field = dp.ofproto.OXM_OF_ARP_THA
+ arp_tha = '71:c8:72:2f:47:fd'
+ value = self.haddr_to_bin(arp_tha)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_ARP)
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_ipv6_src(self, dp):
+ field = dp.ofproto.OXM_OF_IPV6_SRC
+ ipv6_src = '7527:c798:c772:4a18:117a:14ff:c1b6:e4ef'
+ value = self.ipv6_to_int(ipv6_src)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(0x86dd)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_ipv6_dst(self, dp):
+ field = dp.ofproto.OXM_OF_IPV6_DST
+ ipv6_dst = '8893:65b3:6b49:3bdb:3d2:9401:866c:c96'
+ value = self.ipv6_to_int(ipv6_dst)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(0x86dd)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_ipv6_flabel(self, dp):
+ field = dp.ofproto.OXM_OF_IPV6_FLABEL
+ value = 0x2c12
+
+ self.add_set_field_action(dp, field, value)
+
+ def test_action_set_field_icmpv6_type(self, dp):
+ field = dp.ofproto.OXM_OF_ICMPV6_TYPE
+ value = 129
+
+ self.add_set_field_action(dp, field, value)
+
+ def test_action_set_field_icmpv6_code(self, dp):
+ field = dp.ofproto.OXM_OF_ICMPV6_CODE
+ value = 2
+
+ self.add_set_field_action(dp, field, value)
+
+ def test_action_set_field_ipv6_nd_target(self, dp):
+ field = dp.ofproto.OXM_OF_IPV6_ND_TARGET
+ target = "5420:db3f:921b:3e33:2791:98f:dd7f:2e19"
+ value = self.ipv6_to_int(target)
+
+ self.add_set_field_action(dp, field, value)
+
+ def test_action_set_field_ipv6_nd_sll(self, dp):
+ field = dp.ofproto.OXM_OF_IPV6_ND_SLL
+ sll = "54:db:3f:3e:27:19"
+ value = self.haddr_to_bin(sll)
+
+ self.add_set_field_action(dp, field, value)
+
+ def test_action_set_field_ipv6_nd_tll(self, dp):
+ field = dp.ofproto.OXM_OF_IPV6_ND_TLL
+ tll = "83:13:48:1e:d0:b0"
+ value = self.haddr_to_bin(tll)
+
+ self.add_set_field_action(dp, field, value)
+
+ def test_action_set_field_mpls_label(self, dp):
+ field = dp.ofproto.OXM_OF_MPLS_LABEL
+ value = 0x4c
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_MPLS)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ def test_action_set_field_mpls_tc(self, dp):
+ field = dp.ofproto.OXM_OF_MPLS_TC
+ value = 0b101
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_MPLS)
+
+ self.add_set_field_action(dp, field, value, match)
+
+ # Test of Change-TTL Actions
+ def test_action_set_mpls_ttl(self, dp):
+ mpls_ttl = 8
+ self._verify = [dp.ofproto.OFPAT_SET_MPLS_TTL,
+ 'mpls_ttl', mpls_ttl]
+ actions = [dp.ofproto_parser.OFPActionSetMplsTtl(mpls_ttl), ]
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_MPLS)
+ self.add_apply_actions(dp, actions, match)
+
+ def test_action_dec_mpls_ttl(self, dp):
+ self._verify = [dp.ofproto.OFPAT_DEC_MPLS_TTL]
+ actions = [dp.ofproto_parser.OFPActionDecMplsTtl(), ]
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(ether.ETH_TYPE_MPLS)
+ self.add_apply_actions(dp, actions, match)
+
+ def test_action_set_nw_ttl_ipv4(self, dp):
+ nw_ttl = 64
+ self._verify = [dp.ofproto.OFPAT_SET_NW_TTL,
+ 'nw_ttl', nw_ttl]
+ actions = [dp.ofproto_parser.OFPActionSetNwTtl(nw_ttl), ]
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(0x0800)
+ self.add_apply_actions(dp, actions, match)
+
+ def test_action_set_nw_ttl_ipv6(self, dp):
+ nw_ttl = 64
+ self._verify = [dp.ofproto.OFPAT_SET_NW_TTL,
+ 'nw_ttl', nw_ttl]
+ actions = [dp.ofproto_parser.OFPActionSetNwTtl(nw_ttl), ]
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(0x86dd)
+ self.add_apply_actions(dp, actions, match)
+
+ def test_action_dec_nw_ttl_ipv4(self, dp):
+ self._verify = [dp.ofproto.OFPAT_DEC_NW_TTL]
+ actions = [dp.ofproto_parser.OFPActionDecNwTtl(), ]
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(0x0800)
+ self.add_apply_actions(dp, actions, match)
+
+ def test_action_dec_nw_ttl_ipv6(self, dp):
+ self._verify = [dp.ofproto.OFPAT_DEC_NW_TTL]
+ actions = [dp.ofproto_parser.OFPActionDecNwTtl(), ]
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(0x86dd)
+ self.add_apply_actions(dp, actions, match)
+
+ def test_action_copy_ttl_out(self, dp):
+ self._verify = [dp.ofproto.OFPAT_COPY_TTL_OUT]
+ actions = [dp.ofproto_parser.OFPActionCopyTtlOut(), ]
+ self.add_apply_actions(dp, actions)
+
+ def test_action_copy_ttl_in(self, dp):
+ self._verify = [dp.ofproto.OFPAT_COPY_TTL_IN]
+ actions = [dp.ofproto_parser.OFPActionCopyTtlIn(), ]
+ self.add_apply_actions(dp, actions)
+
+ def is_supported(self, t):
+ # Open vSwitch 1.10 does not support MPLS yet.
+ unsupported = [
+ 'test_action_set_field_ip_proto',
+ 'test_action_set_field_dl_type',
+ 'test_action_set_field_icmp',
+ 'test_action_set_field_icmpv6_code',
+ 'test_action_set_field_icmpv6_type',
+ 'test_action_set_field_ipv6_flabel',
+ 'test_action_set_field_ipv6_nd_sll',
+ 'test_action_set_field_ipv6_nd_target',
+ 'test_action_set_field_ipv6_nd_tll',
+ 'test_action_copy_ttl_in',
+ 'test_action_copy_ttl_out'
+ ]
+ for u in unsupported:
+ if t.find(u) != -1:
+ return False
+
+ return True
diff --git a/tests/integrated/test_add_flow_v12_matches.py b/tests/integrated/test_add_flow_v12_matches.py
new file mode 100644
index 00000000..404e45ef
--- /dev/null
+++ b/tests/integrated/test_add_flow_v12_matches.py
@@ -0,0 +1,1200 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import logging
+
+from ryu.ofproto import ofproto_v1_2
+from ryu.ofproto import ether
+from ryu.ofproto import inet
+
+from tests.integrated import tester
+
+LOG = logging.getLogger(__name__)
+
+
+class RunTest(tester.TestFlowBase):
+ """ Test case for add flows of Matches
+ """
+ OFP_VERSIONS = [ofproto_v1_2.OFP_VERSION]
+
+ def __init__(self, *args, **kwargs):
+ super(RunTest, self).__init__(*args, **kwargs)
+
+ self._verify = {}
+
+ def add_matches(self, dp, match):
+ m = dp.ofproto_parser.OFPFlowMod(dp, 0, 0, 0,
+ dp.ofproto.OFPFC_ADD,
+ 0, 0, 0, 0xffffffff,
+ dp.ofproto.OFPP_ANY,
+ 0xffffffff, 0, match, [])
+ dp.send_msg(m)
+
+ def _set_verify(self, headers, value, mask=None,
+ all_bits_masked=False, type_='int'):
+ self._verify = {}
+ self._verify['headers'] = headers
+ self._verify['value'] = value
+ self._verify['mask'] = mask
+ self._verify['all_bits_masked'] = all_bits_masked
+ self._verify['type'] = type_
+
+ def verify_default(self, dp, stats):
+ type_ = self._verify['type']
+ headers = self._verify['headers']
+ value = self._verify['value']
+ mask = self._verify['mask']
+ value_masked = self._masked(type_, value, mask)
+ all_bits_masked = self._verify['all_bits_masked']
+
+ field = None
+ for s in stats:
+ for f in s.match.fields:
+ if f.header in headers:
+ field = f
+ break
+
+ if field is None:
+ if self._is_all_zero_bit(type_, mask):
+ return True
+ return 'Field not found.'
+
+ f_value = field.value
+ if hasattr(field, 'mask'):
+ f_mask = field.mask
+ else:
+ f_mask = None
+
+ if (f_value == value) or (f_value == value_masked):
+ if (f_mask == mask) or (all_bits_masked and f_mask is None):
+ return True
+
+ return "send: %s/%s, reply: %s/%s" \
+ % (self._cnv_to_str(type_, value, mask, f_value, f_mask))
+
+ def _masked(self, type_, value, mask):
+ if mask is None:
+ v = value
+ elif type_ == 'int':
+ v = value & mask
+ elif type_ == 'mac':
+ v = self.haddr_masked(value, mask)
+ elif type_ == 'ipv4':
+ v = self.ipv4_masked(value, mask)
+ elif type_ == 'ipv6':
+ v = self.ipv6_masked(value, mask)
+ else:
+ raise Exception('Unknown type')
+ return v
+
+ def _is_all_zero_bit(self, type_, val):
+ if type_ == 'int' or type_ == 'ipv4':
+ return val == 0
+ elif type_ == 'mac':
+ for v in val:
+ if v != b'\x00':
+ return False
+ return True
+ elif type_ == 'ipv6':
+ for v in val:
+ if v != 0:
+ return False
+ return True
+ else:
+ raise Exception('Unknown type')
+
+ def _cnv_to_str(self, type_, value, mask, f_value, f_mask):
+ func = None
+ if type_ == 'int':
+ pass
+ elif type_ == 'mac':
+ func = self.haddr_to_str
+ elif type_ == 'ipv4':
+ func = self.ipv4_to_str
+ elif type_ == 'ipv6':
+ func = self.ipv6_to_str
+ else:
+ raise Exception('Unknown type')
+
+ if func:
+ value = func(value)
+ f_value = func(f_value)
+ if mask:
+ mask = func(mask)
+ if f_mask:
+ f_mask = func(f_mask)
+
+ return value, mask, f_value, f_mask
+
+ def test_rule_set_dl_dst(self, dp):
+ dl_dst = 'e2:7a:09:79:0b:0f'
+ dl_dst_bin = self.haddr_to_bin(dl_dst)
+
+ headers = [dp.ofproto.OXM_OF_ETH_DST, dp.ofproto.OXM_OF_ETH_DST_W]
+ self._set_verify(headers, dl_dst_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_dst(dl_dst_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_dst_masked_ff(self, dp):
+ dl_dst = 'd0:98:79:b4:75:b5'
+ dl_dst_bin = self.haddr_to_bin(dl_dst)
+ mask = 'ff:ff:ff:ff:ff:ff'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ETH_DST, dp.ofproto.OXM_OF_ETH_DST_W]
+ self._set_verify(headers, dl_dst_bin, mask_bin, True, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_dst_masked(dl_dst_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_dst_masked_f0(self, dp):
+ dl_dst = 'e2:7a:09:79:0b:0f'
+ dl_dst_bin = self.haddr_to_bin(dl_dst)
+ mask = 'ff:ff:ff:ff:ff:00'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ETH_DST, dp.ofproto.OXM_OF_ETH_DST_W]
+ self._set_verify(headers, dl_dst_bin, mask_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_dst_masked(dl_dst_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_dst_masked_00(self, dp):
+ dl_dst = 'e2:7a:09:79:0b:0f'
+ dl_dst_bin = self.haddr_to_bin(dl_dst)
+ mask = '00:00:00:00:00:00'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ETH_DST, dp.ofproto.OXM_OF_ETH_DST_W]
+ self._set_verify(headers, dl_dst_bin, mask_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_dst_masked(dl_dst_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_src(self, dp):
+ dl_src = 'e2:7a:09:79:0b:0f'
+ dl_src_bin = self.haddr_to_bin(dl_src)
+
+ headers = [dp.ofproto.OXM_OF_ETH_SRC, dp.ofproto.OXM_OF_ETH_SRC_W]
+ self._set_verify(headers, dl_src_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_src(dl_src_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_src_masked_ff(self, dp):
+ dl_src = 'e2:7a:09:79:0b:0f'
+ dl_src_bin = self.haddr_to_bin(dl_src)
+ mask = 'ff:ff:ff:ff:ff:ff'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ETH_SRC, dp.ofproto.OXM_OF_ETH_SRC_W]
+ self._set_verify(headers, dl_src_bin, mask_bin, True, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_src_masked(dl_src_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_src_masked_f0(self, dp):
+ dl_src = 'e2:7a:09:79:0b:0f'
+ dl_src_bin = self.haddr_to_bin(dl_src)
+ mask = 'ff:ff:ff:ff:ff:00'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ETH_SRC, dp.ofproto.OXM_OF_ETH_SRC_W]
+ self._set_verify(headers, dl_src_bin, mask_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_src_masked(dl_src_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_src_masked_00(self, dp):
+ dl_src = 'e2:7a:09:79:0b:0f'
+ dl_src_bin = self.haddr_to_bin(dl_src)
+ mask = '00:00:00:00:00:00'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ETH_SRC, dp.ofproto.OXM_OF_ETH_SRC_W]
+ self._set_verify(headers, dl_src_bin, mask_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_src_masked(dl_src_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_type_ip(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+
+ headers = [dp.ofproto.OXM_OF_ETH_TYPE]
+ self._set_verify(headers, dl_type)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_type_arp(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+
+ headers = [dp.ofproto.OXM_OF_ETH_TYPE]
+ self._set_verify(headers, dl_type)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_type_vlan(self, dp):
+ dl_type = ether.ETH_TYPE_8021Q
+
+ headers = [dp.ofproto.OXM_OF_ETH_TYPE]
+ self._set_verify(headers, dl_type)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_type_ipv6(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+
+ headers = [dp.ofproto.OXM_OF_ETH_TYPE]
+ self._set_verify(headers, dl_type)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ self.add_matches(dp, match)
+
+ def test_rule_set_dl_type_lacp(self, dp):
+ dl_type = ether.ETH_TYPE_SLOW
+
+ headers = [dp.ofproto.OXM_OF_ETH_TYPE]
+ self._set_verify(headers, dl_type)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ip_dscp(self, dp):
+ ip_dscp = 36
+ dl_type = ether.ETH_TYPE_IP
+
+ headers = [dp.ofproto.OXM_OF_IP_DSCP]
+ self._set_verify(headers, ip_dscp)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_dscp(ip_dscp)
+ self.add_matches(dp, match)
+
+ def test_rule_set_vlan_vid(self, dp):
+ vlan_vid = 0x4ef
+
+ headers = [dp.ofproto.OXM_OF_VLAN_VID, dp.ofproto.OXM_OF_VLAN_VID_W]
+ self._set_verify(headers, vlan_vid)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_vlan_vid(vlan_vid)
+ self.add_matches(dp, match)
+
+ def test_rule_set_vlan_vid_masked_ff(self, dp):
+ vlan_vid = 0x4ef
+ mask = 0xfff
+
+ headers = [dp.ofproto.OXM_OF_VLAN_VID, dp.ofproto.OXM_OF_VLAN_VID_W]
+ self._set_verify(headers, vlan_vid, mask, True)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_vlan_vid_masked(vlan_vid, mask)
+ self.add_matches(dp, match)
+
+ def test_rule_set_vlan_vid_masked_f0(self, dp):
+ vlan_vid = 0x4ef
+ mask = 0xff0
+
+ headers = [dp.ofproto.OXM_OF_VLAN_VID, dp.ofproto.OXM_OF_VLAN_VID_W]
+ self._set_verify(headers, vlan_vid, mask)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_vlan_vid_masked(vlan_vid, mask)
+ self.add_matches(dp, match)
+
+ def test_rule_set_vlan_vid_masked_00(self, dp):
+ vlan_vid = 0x4ef
+ mask = 0x000
+
+ headers = [dp.ofproto.OXM_OF_VLAN_VID, dp.ofproto.OXM_OF_VLAN_VID_W]
+ self._set_verify(headers, vlan_vid, mask)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_vlan_vid_masked(vlan_vid, mask)
+ self.add_matches(dp, match)
+
+ def test_rule_set_vlan_pcp(self, dp):
+ vlan_vid = 0x4ef
+ vlan_pcp = 5
+
+ headers = [dp.ofproto.OXM_OF_VLAN_PCP]
+ self._set_verify(headers, vlan_pcp)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_vlan_vid(vlan_vid)
+ match.set_vlan_pcp(vlan_pcp)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ip_ecn(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ ip_ecn = 3
+
+ headers = [dp.ofproto.OXM_OF_IP_ECN]
+ self._set_verify(headers, ip_ecn)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_ecn(ip_ecn)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ip_proto_icmp(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ ip_proto = inet.IPPROTO_ICMP
+
+ headers = [dp.ofproto.OXM_OF_IP_PROTO]
+ self._set_verify(headers, ip_proto)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ip_proto_tcp(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ ip_proto = inet.IPPROTO_TCP
+
+ headers = [dp.ofproto.OXM_OF_IP_PROTO]
+ self._set_verify(headers, ip_proto)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ip_proto_udp(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ ip_proto = inet.IPPROTO_UDP
+
+ headers = [dp.ofproto.OXM_OF_IP_PROTO]
+ self._set_verify(headers, ip_proto)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ip_proto_ipv6_route(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ip_proto = inet.IPPROTO_ROUTING
+
+ headers = [dp.ofproto.OXM_OF_IP_PROTO]
+ self._set_verify(headers, ip_proto)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ip_proto_ipv6_frag(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ip_proto = inet.IPPROTO_FRAGMENT
+
+ headers = [dp.ofproto.OXM_OF_IP_PROTO]
+ self._set_verify(headers, ip_proto)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ip_proto_ipv6_icmp(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ip_proto = inet.IPPROTO_ICMPV6
+
+ headers = [dp.ofproto.OXM_OF_IP_PROTO]
+ self._set_verify(headers, ip_proto)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ip_proto_ipv6_none(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ip_proto = inet.IPPROTO_NONE
+
+ headers = [dp.ofproto.OXM_OF_IP_PROTO]
+ self._set_verify(headers, ip_proto)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ip_proto_ipv6_dstopts(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ip_proto = inet.IPPROTO_DSTOPTS
+
+ headers = [dp.ofproto.OXM_OF_IP_PROTO]
+ self._set_verify(headers, ip_proto)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv4_src(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ src = '192.168.196.250'
+ src_int = self.ipv4_to_int(src)
+
+ headers = [dp.ofproto.OXM_OF_IPV4_SRC, dp.ofproto.OXM_OF_IPV4_SRC_W]
+ self._set_verify(headers, src_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv4_src(src_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv4_src_masked_32(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ src = '192.168.196.250'
+ src_int = self.ipv4_to_int(src)
+ mask = '255.255.255.255'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV4_SRC, dp.ofproto.OXM_OF_IPV4_SRC_W]
+ self._set_verify(headers, src_int, mask_int, True, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv4_src_masked(src_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv4_src_masked_24(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ src = '192.168.196.250'
+ src_int = self.ipv4_to_int(src)
+ mask = '255.255.255.0'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV4_SRC, dp.ofproto.OXM_OF_IPV4_SRC_W]
+ self._set_verify(headers, src_int, mask_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv4_src_masked(src_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv4_src_masked_0(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ src = '192.168.196.250'
+ src_int = self.ipv4_to_int(src)
+ mask = '0.0.0.0'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV4_SRC, dp.ofproto.OXM_OF_IPV4_SRC_W]
+ self._set_verify(headers, src_int, mask_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv4_src_masked(src_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv4_dst(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ dst = '192.168.54.155'
+ dst_int = self.ipv4_to_int(dst)
+
+ headers = [dp.ofproto.OXM_OF_IPV4_DST, dp.ofproto.OXM_OF_IPV4_DST_W]
+ self._set_verify(headers, dst_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv4_dst(dst_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv4_dst_masked_32(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ dst = '192.168.54.155'
+ dst_int = self.ipv4_to_int(dst)
+ mask = '255.255.255.255'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV4_DST, dp.ofproto.OXM_OF_IPV4_DST_W]
+ self._set_verify(headers, dst_int, mask_int, True, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv4_dst_masked(dst_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv4_dst_masked_24(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ dst = '192.168.54.155'
+ dst_int = self.ipv4_to_int(dst)
+ mask = '255.255.255.0'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV4_DST, dp.ofproto.OXM_OF_IPV4_DST_W]
+ self._set_verify(headers, dst_int, mask_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv4_dst_masked(dst_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv4_dst_masked_0(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ dst = '192.168.54.155'
+ dst_int = self.ipv4_to_int(dst)
+ mask = '0.0.0.0'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV4_DST, dp.ofproto.OXM_OF_IPV4_DST_W]
+ self._set_verify(headers, dst_int, mask_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv4_dst_masked(dst_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_tcp_src(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ ip_proto = inet.IPPROTO_TCP
+ tp_src = 1103
+
+ headers = [dp.ofproto.OXM_OF_TCP_SRC]
+ self._set_verify(headers, tp_src)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ match.set_tcp_src(tp_src)
+ self.add_matches(dp, match)
+
+ def test_rule_set_tcp_dst(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ ip_proto = inet.IPPROTO_TCP
+ tp_dst = 236
+
+ headers = [dp.ofproto.OXM_OF_TCP_DST]
+ self._set_verify(headers, tp_dst)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ match.set_tcp_dst(tp_dst)
+ self.add_matches(dp, match)
+
+ def test_rule_set_udp_src(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ ip_proto = inet.IPPROTO_UDP
+ tp_src = 56617
+
+ headers = [dp.ofproto.OXM_OF_UDP_SRC]
+ self._set_verify(headers, tp_src)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ match.set_udp_src(tp_src)
+ self.add_matches(dp, match)
+
+ def test_rule_set_udp_dst(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ ip_proto = inet.IPPROTO_UDP
+ tp_dst = 61278
+
+ headers = [dp.ofproto.OXM_OF_UDP_DST]
+ self._set_verify(headers, tp_dst)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ match.set_udp_dst(tp_dst)
+ self.add_matches(dp, match)
+
+ def test_rule_set_icmpv4_type(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ ip_proto = inet.IPPROTO_ICMP
+ icmp_type = 8
+
+ headers = [dp.ofproto.OXM_OF_ICMPV4_TYPE]
+ self._set_verify(headers, icmp_type)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ match.set_icmpv4_type(icmp_type)
+ self.add_matches(dp, match)
+
+ def test_rule_set_icmpv4_code(self, dp):
+ dl_type = ether.ETH_TYPE_IP
+ ip_proto = inet.IPPROTO_ICMP
+ icmp_type = 9
+ icmp_code = 16
+
+ headers = [dp.ofproto.OXM_OF_ICMPV4_CODE]
+ self._set_verify(headers, icmp_code)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ match.set_icmpv4_type(icmp_type)
+ match.set_icmpv4_code(icmp_code)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_opcode(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ arp_op = 1
+
+ headers = [dp.ofproto.OXM_OF_ARP_OP]
+ self._set_verify(headers, arp_op)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_opcode(arp_op)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_spa(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ nw_src = '192.168.222.57'
+ nw_src_int = self.ipv4_to_int(nw_src)
+
+ headers = [dp.ofproto.OXM_OF_ARP_SPA, dp.ofproto.OXM_OF_ARP_SPA_W]
+ self._set_verify(headers, nw_src_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_spa(nw_src_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_spa_masked_32(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ nw_src = '192.168.222.57'
+ nw_src_int = self.ipv4_to_int(nw_src)
+ mask = '255.255.255.255'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_SPA, dp.ofproto.OXM_OF_ARP_SPA_W]
+ self._set_verify(headers, nw_src_int, mask_int, True, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_spa_masked(nw_src_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_spa_masked_24(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ nw_src = '192.168.222.57'
+ nw_src_int = self.ipv4_to_int(nw_src)
+ mask = '255.255.255.0'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_SPA, dp.ofproto.OXM_OF_ARP_SPA_W]
+ self._set_verify(headers, nw_src_int, mask_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_spa_masked(nw_src_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_spa_masked_00(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ nw_src = '192.168.222.57'
+ nw_src_int = self.ipv4_to_int(nw_src)
+ mask = '0.0.0.0'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_SPA, dp.ofproto.OXM_OF_ARP_SPA_W]
+ self._set_verify(headers, nw_src_int, mask_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_spa_masked(nw_src_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_tpa(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ nw_dst = '192.168.198.233'
+ nw_dst_int = self.ipv4_to_int(nw_dst)
+
+ headers = [dp.ofproto.OXM_OF_ARP_TPA, dp.ofproto.OXM_OF_ARP_TPA_W]
+ self._set_verify(headers, nw_dst_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_tpa(nw_dst_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_tpa_masked_32(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ nw_dst = '192.168.198.233'
+ nw_dst_int = self.ipv4_to_int(nw_dst)
+ mask = '255.255.255.255'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_TPA, dp.ofproto.OXM_OF_ARP_TPA_W]
+ self._set_verify(headers, nw_dst_int, mask_int, True, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_tpa_masked(nw_dst_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_tpa_masked_24(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ nw_dst = '192.168.198.233'
+ nw_dst_int = self.ipv4_to_int(nw_dst)
+ mask = '255.255.255.0'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_TPA, dp.ofproto.OXM_OF_ARP_TPA_W]
+ self._set_verify(headers, nw_dst_int, mask_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_tpa_masked(nw_dst_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_tpa_masked_00(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ nw_dst = '192.168.198.233'
+ nw_dst_int = self.ipv4_to_int(nw_dst)
+ mask = '0.0.0.0'
+ mask_int = self.ipv4_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_TPA, dp.ofproto.OXM_OF_ARP_TPA_W]
+ self._set_verify(headers, nw_dst_int, mask_int, type_='ipv4')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_tpa_masked(nw_dst_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_sha(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ arp_sha = '3e:ec:13:9b:f3:0b'
+ arp_sha_bin = self.haddr_to_bin(arp_sha)
+
+ headers = [dp.ofproto.OXM_OF_ARP_SHA, dp.ofproto.OXM_OF_ARP_SHA_W]
+ self._set_verify(headers, arp_sha_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_sha(arp_sha_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_sha_masked_ff(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ arp_sha = '3e:ec:13:9b:f3:0b'
+ arp_sha_bin = self.haddr_to_bin(arp_sha)
+ mask = 'ff:ff:ff:ff:ff:ff'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_SHA, dp.ofproto.OXM_OF_ARP_SHA_W]
+ self._set_verify(headers, arp_sha_bin, mask_bin, True, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_sha_masked(arp_sha_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_sha_masked_f0(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ arp_sha = '3e:ec:13:9b:f3:0b'
+ arp_sha_bin = self.haddr_to_bin(arp_sha)
+ mask = 'ff:ff:ff:ff:ff:00'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_SHA, dp.ofproto.OXM_OF_ARP_SHA_W]
+ self._set_verify(headers, arp_sha_bin, mask_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_sha_masked(arp_sha_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_sha_masked_00(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ arp_sha = '3e:ec:13:9b:f3:0b'
+ arp_sha_bin = self.haddr_to_bin(arp_sha)
+ mask = '00:00:00:00:00:00'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_SHA, dp.ofproto.OXM_OF_ARP_SHA_W]
+ self._set_verify(headers, arp_sha_bin, mask_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_sha_masked(arp_sha_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_tha(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ arp_tha = '83:6c:21:52:49:68'
+ arp_tha_bin = self.haddr_to_bin(arp_tha)
+
+ headers = [dp.ofproto.OXM_OF_ARP_THA, dp.ofproto.OXM_OF_ARP_THA_W]
+ self._set_verify(headers, arp_tha_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_tha(arp_tha_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_tha_masked_ff(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ arp_tha = '83:6c:21:52:49:68'
+ arp_tha_bin = self.haddr_to_bin(arp_tha)
+ mask = 'ff:ff:ff:ff:ff:ff'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_THA, dp.ofproto.OXM_OF_ARP_THA_W]
+ self._set_verify(headers, arp_tha_bin, mask_bin, True, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_tha_masked(arp_tha_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_tha_masked_f0(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ arp_tha = '83:6c:21:52:49:68'
+ arp_tha_bin = self.haddr_to_bin(arp_tha)
+ mask = 'ff:ff:ff:ff:ff:00'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_THA, dp.ofproto.OXM_OF_ARP_THA_W]
+ self._set_verify(headers, arp_tha_bin, mask_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_tha_masked(arp_tha_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_arp_tha_masked_00(self, dp):
+ dl_type = ether.ETH_TYPE_ARP
+ arp_tha = '83:6c:21:52:49:68'
+ arp_tha_bin = self.haddr_to_bin(arp_tha)
+ mask = '00:00:00:00:00:00'
+ mask_bin = self.haddr_to_bin(mask)
+
+ headers = [dp.ofproto.OXM_OF_ARP_THA, dp.ofproto.OXM_OF_ARP_THA_W]
+ self._set_verify(headers, arp_tha_bin, mask_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_arp_tha_masked(arp_tha_bin, mask_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_src(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_src = '2001:db8:bd05:1d2:288a:1fc0:1:10ee'
+ ipv6_src_int = self.ipv6_to_int(ipv6_src)
+
+ headers = [dp.ofproto.OXM_OF_IPV6_SRC, dp.ofproto.OXM_OF_IPV6_SRC_W]
+ self._set_verify(headers, ipv6_src_int, type_='ipv6')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_src(ipv6_src_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_src_masked_ff(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_src = '2001:db8:bd05:1d2:288a:1fc0:1:10ee'
+ ipv6_src_int = self.ipv6_to_int(ipv6_src)
+ mask = 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'
+ mask_int = self.ipv6_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV6_SRC, dp.ofproto.OXM_OF_IPV6_SRC_W]
+ self._set_verify(headers, ipv6_src_int, mask_int, True, type_='ipv6')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_src_masked(ipv6_src_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_src_masked_f0(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_src = '2001:db8:bd05:1d2:288a:1fc0:1:10ee'
+ ipv6_src_int = self.ipv6_to_int(ipv6_src)
+ mask = 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0'
+ mask_int = self.ipv6_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV6_SRC, dp.ofproto.OXM_OF_IPV6_SRC_W]
+ self._set_verify(headers, ipv6_src_int, mask_int, type_='ipv6')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_src_masked(ipv6_src_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_src_masked_00(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_src = '2001:db8:bd05:1d2:288a:1fc0:1:10ee'
+ ipv6_src_int = self.ipv6_to_int(ipv6_src)
+ mask = '0:0:0:0:0:0:0:0'
+ mask_int = self.ipv6_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV6_SRC, dp.ofproto.OXM_OF_IPV6_SRC_W]
+ self._set_verify(headers, ipv6_src_int, mask_int, type_='ipv6')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_src_masked(ipv6_src_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_dst(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_dst = 'e9e8:9ea5:7d67:82cc:ca54:1fc0:2d24:f038'
+ ipv6_dst_int = self.ipv6_to_int(ipv6_dst)
+
+ headers = [dp.ofproto.OXM_OF_IPV6_DST, dp.ofproto.OXM_OF_IPV6_DST_W]
+ self._set_verify(headers, ipv6_dst_int, type_='ipv6')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_dst(ipv6_dst_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_dst_masked_ff(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_dst = 'e9e8:9ea5:7d67:82cc:ca54:1fc0:2d24:f038'
+ ipv6_dst_int = self.ipv6_to_int(ipv6_dst)
+ mask = 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'
+ mask_int = self.ipv6_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV6_DST, dp.ofproto.OXM_OF_IPV6_DST_W]
+ self._set_verify(headers, ipv6_dst_int, mask_int, True, type_='ipv6')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_dst_masked(ipv6_dst_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_dst_masked_f0(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_dst = 'e9e8:9ea5:7d67:82cc:ca54:1fc0:2d24:f038'
+ ipv6_dst_int = self.ipv6_to_int(ipv6_dst)
+ mask = 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0'
+ mask_int = self.ipv6_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV6_DST, dp.ofproto.OXM_OF_IPV6_DST_W]
+ self._set_verify(headers, ipv6_dst_int, mask_int, type_='ipv6')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_dst_masked(ipv6_dst_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_dst_masked_00(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_dst = 'e9e8:9ea5:7d67:82cc:ca54:1fc0:2d24:f038'
+ ipv6_dst_int = self.ipv6_to_int(ipv6_dst)
+ mask = '0:0:0:0:0:0:0:0'
+ mask_int = self.ipv6_to_int(mask)
+
+ headers = [dp.ofproto.OXM_OF_IPV6_DST, dp.ofproto.OXM_OF_IPV6_DST_W]
+ self._set_verify(headers, ipv6_dst_int, mask_int, type_='ipv6')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_dst_masked(ipv6_dst_int, mask_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_flabel(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_label = 0xc5384
+
+ headers = [dp.ofproto.OXM_OF_IPV6_FLABEL,
+ dp.ofproto.OXM_OF_IPV6_FLABEL_W]
+ self._set_verify(headers, ipv6_label)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_flabel(ipv6_label)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_flabel_masked_ff(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_label = 0xc5384
+ mask = 0xfffff
+
+ headers = [dp.ofproto.OXM_OF_IPV6_FLABEL,
+ dp.ofproto.OXM_OF_IPV6_FLABEL_W]
+ self._set_verify(headers, ipv6_label, mask, True)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_flabel_masked(ipv6_label, mask)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_flabel_masked_f0(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_label = 0xc5384
+ mask = 0xffff0
+
+ headers = [dp.ofproto.OXM_OF_IPV6_FLABEL,
+ dp.ofproto.OXM_OF_IPV6_FLABEL_W]
+ self._set_verify(headers, ipv6_label, mask)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_flabel_masked(ipv6_label, mask)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_flabel_masked_00(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ipv6_label = 0xc5384
+ mask = 0x0
+
+ headers = [dp.ofproto.OXM_OF_IPV6_FLABEL,
+ dp.ofproto.OXM_OF_IPV6_FLABEL_W]
+ self._set_verify(headers, ipv6_label, mask)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ipv6_flabel_masked(ipv6_label, mask)
+ self.add_matches(dp, match)
+
+ def test_rule_set_icmpv6_type(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ip_proto = inet.IPPROTO_ICMPV6
+ icmp_type = 129
+
+ headers = [dp.ofproto.OXM_OF_ICMPV6_TYPE]
+ self._set_verify(headers, icmp_type)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ match.set_icmpv6_type(icmp_type)
+ self.add_matches(dp, match)
+
+ def test_rule_set_icmpv6_code(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ip_proto = inet.IPPROTO_ICMPV6
+ icmp_type = 138
+ icmp_code = 1
+
+ headers = [dp.ofproto.OXM_OF_ICMPV6_CODE]
+ self._set_verify(headers, icmp_code)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ match.set_icmpv6_type(icmp_type)
+ match.set_icmpv6_code(icmp_code)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_nd_target(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ip_proto = inet.IPPROTO_ICMPV6
+ icmp_type = 135
+ target = "5420:db3f:921b:3e33:2791:98f:dd7f:2e19"
+ target_int = self.ipv6_to_int(target)
+
+ headers = [dp.ofproto.OXM_OF_IPV6_ND_TARGET]
+ self._set_verify(headers, target_int, type_='ipv6')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ match.set_icmpv6_type(icmp_type)
+ match.set_ipv6_nd_target(target_int)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_nd_sll(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ip_proto = inet.IPPROTO_ICMPV6
+ icmp_type = 135
+ nd_sll = "93:6d:d0:d4:e8:36"
+ nd_sll_bin = self.haddr_to_bin(nd_sll)
+
+ headers = [dp.ofproto.OXM_OF_IPV6_ND_SLL]
+ self._set_verify(headers, nd_sll_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ match.set_icmpv6_type(icmp_type)
+ match.set_ipv6_nd_sll(nd_sll_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_ipv6_nd_tll(self, dp):
+ dl_type = ether.ETH_TYPE_IPV6
+ ip_proto = inet.IPPROTO_ICMPV6
+ icmp_type = 136
+ nd_tll = "18:f6:66:b6:f1:b3"
+ nd_tll_bin = self.haddr_to_bin(nd_tll)
+
+ headers = [dp.ofproto.OXM_OF_IPV6_ND_TLL]
+ self._set_verify(headers, nd_tll_bin, type_='mac')
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_ip_proto(ip_proto)
+ match.set_icmpv6_type(icmp_type)
+ match.set_ipv6_nd_tll(nd_tll_bin)
+ self.add_matches(dp, match)
+
+ def test_rule_set_mpls_label(self, dp):
+ dl_type = 0x8847
+ label = 2144
+
+ headers = [dp.ofproto.OXM_OF_MPLS_LABEL]
+ self._set_verify(headers, label)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_mpls_label(label)
+ self.add_matches(dp, match)
+
+ def test_rule_set_mpls_tc(self, dp):
+ dl_type = 0x8847
+ tc = 3
+
+ headers = [dp.ofproto.OXM_OF_MPLS_TC]
+ self._set_verify(headers, tc)
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_type(dl_type)
+ match.set_mpls_tc(tc)
+ self.add_matches(dp, match)
+
+ def is_supported(self, t):
+ # Open vSwitch 1.10 does not support MPLS yet.
+ unsupported = [
+ 'test_rule_set_mpls_label',
+ 'test_rule_set_mpls_tc',
+ ]
+ for u in unsupported:
+ if t.find(u) != -1:
+ return False
+
+ return True
diff --git a/tests/integrated/test_of_config.py b/tests/integrated/test_of_config.py
new file mode 100644
index 00000000..654b1489
--- /dev/null
+++ b/tests/integrated/test_of_config.py
@@ -0,0 +1,328 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 Isaku Yamahata <yamahata at private email ne jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+How to run this test
+
+edit linc config file. LINC-Switch/rel/linc/releases/1.0/sys.config
+You can find the sample config I used for the test below
+
+For this following config to work, the network interface
+linc-port and linc-port2 must be created before hand.
+(Or edit the port name depending on your environment)
+An easy way is to create them as follows
+# ip link add linc-port type veth peer name linc-port-peer
+# ip link set linc-port up
+# ip link add linc-port2 type veth peer name linc-port-peer2
+# ip link set linc-port2 up
+
+Then run linc
+# rel/linc/bin/linc console
+
+Then run ryu
+# PYTHONPATH=. ./bin/ryu-manager --verbose \
+ tests/integrated/test_of_config.py
+
+
+Here is my sys.config used for this test.
+-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8---
+[
+ {linc,
+ [
+ {of_config, enabled},
+
+ {logical_switches,
+ [
+ {switch, 0,
+ [
+ {backend, linc_us4},
+
+ {controllers,
+ [
+ {"Switch0-DefaultController", "localhost", 6633, tcp}
+ ]},
+
+ {ports,
+ [
+ {port, 1, [{interface, "linc-port"}]},
+ {port, 2, [{interface, "linc-port2"}]}
+ ]},
+
+ {queues_status, disabled},
+
+ {queues,
+ [
+ ]}
+ ]}
+ ]}
+ ]},
+
+ {enetconf,
+ [
+ {capabilities, [{base, {1, 1}},
+ {startup, {1, 0}},
+ {'writable-running', {1, 0}}]},
+ {callback_module, linc_ofconfig},
+ {sshd_ip, any},
+ {sshd_port, 1830},
+ {sshd_user_passwords,
+ [
+ {"linc", "linc"}
+ ]}
+ ]},
+
+ {lager,
+ [
+ {handlers,
+ [
+ {lager_console_backend, info},
+ {lager_file_backend,
+ [
+ {"log/error.log", error, 10485760, "$D0", 5},
+ {"log/console.log", info, 10485760, "$D0", 5}
+ ]}
+ ]}
+ ]},
+
+ {sasl,
+ [
+ {sasl_error_logger, {file, "log/sasl-error.log"}},
+ {errlog_type, error},
+ {error_logger_mf_dir, "log/sasl"}, % Log directory
+ {error_logger_mf_maxbytes, 10485760}, % 10 MB max file size
+ {error_logger_mf_maxfiles, 5} % 5 files max
+ ]}
+].
+-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8-->8--
+
+"""
+
+from __future__ import print_function
+
+import traceback
+
+import lxml.etree
+import ncclient
+
+from ryu.base import app_manager
+from ryu.lib.netconf import constants as nc_consts
+from ryu.lib import hub
+from ryu.lib import of_config
+from ryu.lib.of_config import capable_switch
+from ryu.lib.of_config import constants as ofc_consts
+
+
+# Change those depending on switch configuration
+HOST = '127.0.0.1'
+PORT = 1830
+USERNAME = 'linc'
+PASSWORD = 'linc'
+
+CAPABLE_SWITCH_ID = 'CapableSwitch0'
+LOGICAL_SWITCH = 'LogicalSwitch0'
+PORT_ID = 'LogicalSwitch0-Port2'
+CONTROLLER_ID = 'Switch0-DefaultController'
+
+PORT_DICT = {
+ 'capable_switch': CAPABLE_SWITCH_ID,
+ 'port_id': PORT_ID,
+ 'logical_switch': LOGICAL_SWITCH,
+ 'controller_id': CONTROLLER_ID,
+ 'ip': HOST,
+}
+
+SWITCH_PORT_DOWN = '''
+<nc:config xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <capable-switch xmlns="urn:onf:of111:config:yang">
+ <id>%(capable_switch)s</id>
+ <resources>
+ <port>
+ <resource-id>%(port_id)s</resource-id>
+ <configuration operation="merge">
+ <admin-state>down</admin-state>
+ <no-receive>false</no-receive>
+ <no-forward>false</no-forward>
+ <no-packet-in>false</no-packet-in>
+ </configuration>
+ </port>
+ </resources>
+ </capable-switch>
+</nc:config>
+''' % PORT_DICT
+
+SWITCH_ADVERTISED = '''
+<nc:config xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <capable-switch xmlns="urn:onf:of111:config:yang">
+ <id>%(capable_switch)s</id>
+ <resources>
+ <port>
+ <resource-id>%(port_id)s</resource-id>
+ <features>
+ <advertised operation="merge">
+ <rate>10Mb-FD</rate>
+ <auto-negotiate>true</auto-negotiate>
+ <medium>copper</medium>
+ <pause>unsupported</pause>
+ </advertised>
+ </features>
+ </port>
+ </resources>
+ </capable-switch>
+</nc:config>
+''' % PORT_DICT
+
+SWITCH_CONTROLLER = '''
+<nc:config xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <capable-switch xmlns="urn:onf:of111:config:yang">
+ <id>%(capable_switch)s</id>
+ <logical-switches>
+ <switch>
+ <id>%(logical_switch)s</id>
+ <controllers>
+ <controller operation="merge">
+ <id>%(controller_id)s</id>
+ <role>master</role>
+ <ip-address>%(ip)s</ip-address>
+ <port>6633</port>
+ <protocol>tcp</protocol>
+ </controller>
+ </controllers>
+ </switch>
+ </logical-switches>
+ </capable-switch>
+</nc:config>
+''' % PORT_DICT
+
+
+def _get_schema():
+ # file_name = of_config.OF_CONFIG_1_0_XSD
+ # file_name = of_config.OF_CONFIG_1_1_XSD
+ file_name = of_config.OF_CONFIG_1_1_1_XSD
+ return lxml.etree.XMLSchema(file=file_name)
+
+
+class OFConfigClient(app_manager.RyuApp):
+ def __init__(self, *args, **kwargs):
+ super(OFConfigClient, self).__init__(*args, **kwargs)
+ self.switch = capable_switch.OFCapableSwitch(
+ host=HOST, port=PORT, username=USERNAME, password=PASSWORD,
+ unknown_host_cb=lambda host, fingeprint: True)
+ hub.spawn(self._do_of_config)
+
+ def _validate(self, tree):
+ xmlschema = _get_schema()
+ try:
+ xmlschema.assertValid(tree)
+ except:
+ traceback.print_exc()
+
+ def _do_get(self):
+ data_xml = self.switch.raw_get()
+
+ tree = lxml.etree.fromstring(data_xml)
+ # print(lxml.etree.tostring(tree, pretty_print=True))
+ self._validate(tree)
+
+ name_spaces = set()
+ for e in tree.getiterator():
+ name_spaces.add(capable_switch.get_ns_tag(e.tag)[0])
+ print(name_spaces)
+
+ return tree
+
+ def _do_get_config(self, source):
+ print('source = %s' % source)
+ config_xml = self.switch.raw_get_config(source)
+
+ tree = lxml.etree.fromstring(config_xml)
+ # print(lxml.etree.tostring(tree, pretty_print=True))
+ self._validate(tree)
+
+ def _do_edit_config(self, config):
+ tree = lxml.etree.fromstring(config)
+ self._validate(tree)
+ self.switch.raw_edit_config(target='running', config=config)
+
+ def _print_ports(self, tree, ns):
+ for port in tree.findall('{%s}%s/{%s}%s' % (ns, ofc_consts.RESOURCES,
+ ns, ofc_consts.PORT)):
+ print(lxml.etree.tostring(port, pretty_print=True))
+
+ def _set_ports_down(self):
+ """try to set all ports down with etree operation"""
+ tree = self._do_get()
+ print(lxml.etree.tostring(tree, pretty_print=True))
+
+ qname = lxml.etree.QName(tree.tag)
+ ns = qname.namespace
+ self._print_ports(tree, ns)
+
+ switch_id = tree.find('{%s}%s' % (ns, ofc_consts.ID))
+ resources = tree.find('{%s}%s' % (ns, ofc_consts.RESOURCES))
+ configuration = tree.find(
+ '{%s}%s/{%s}%s/{%s}%s' % (ns, ofc_consts.RESOURCES,
+ ns, ofc_consts.PORT,
+ ns, ofc_consts.CONFIGURATION))
+ admin_state = tree.find(
+ '{%s}%s/{%s}%s/{%s}%s/{%s}%s' % (ns, ofc_consts.RESOURCES,
+ ns, ofc_consts.PORT,
+ ns, ofc_consts.CONFIGURATION,
+ ns, ofc_consts.ADMIN_STATE))
+
+ config_ = lxml.etree.Element(
+ '{%s}%s' % (ncclient.xml_.BASE_NS_1_0, nc_consts.CONFIG))
+ capable_switch_ = lxml.etree.SubElement(config_, tree.tag)
+ switch_id_ = lxml.etree.SubElement(capable_switch_, switch_id.tag)
+ switch_id_.text = switch_id.text
+ resources_ = lxml.etree.SubElement(capable_switch_,
+ resources.tag)
+ for port in tree.findall(
+ '{%s}%s/{%s}%s' % (ns, ofc_consts.RESOURCES,
+ ns, ofc_consts.PORT)):
+ resource_id = port.find('{%s}%s' % (ns, ofc_consts.RESOURCE_ID))
+
+ port_ = lxml.etree.SubElement(resources_, port.tag)
+ resource_id_ = lxml.etree.SubElement(port_, resource_id.tag)
+ resource_id_.text = resource_id.text
+ configuration_ = lxml.etree.SubElement(port_, configuration.tag)
+ configuration_.set(ofc_consts.OPERATION, nc_consts.MERGE)
+ admin_state_ = lxml.etree.SubElement(configuration_,
+ admin_state.tag)
+ admin_state_.text = ofc_consts.DOWN
+ self._do_edit_config(lxml.etree.tostring(config_, pretty_print=True))
+
+ tree = self._do_get()
+ self._print_ports(tree, ns)
+
+ def _do_of_config(self):
+ self._do_get()
+ self._do_get_config('running')
+ self._do_get_config('startup')
+
+ # LINC doesn't support 'candidate' datastore
+ try:
+ self._do_get_config('candidate')
+ except ncclient.NCClientError:
+ traceback.print_exc()
+
+ # use raw XML format
+ self._do_edit_config(SWITCH_PORT_DOWN)
+ self._do_edit_config(SWITCH_ADVERTISED)
+ self._do_edit_config(SWITCH_CONTROLLER)
+
+ self._set_ports_down()
+
+ self.switch.close_session()
diff --git a/tests/integrated/test_request_reply_v12.py b/tests/integrated/test_request_reply_v12.py
new file mode 100644
index 00000000..ea031182
--- /dev/null
+++ b/tests/integrated/test_request_reply_v12.py
@@ -0,0 +1,1055 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import time
+import logging
+
+from ryu.controller import ofp_event
+from ryu.controller.handler import MAIN_DISPATCHER
+from ryu.controller.handler import set_ev_cls
+from ryu.ofproto import ofproto_v1_2
+
+from tests.integrated import tester
+
+LOG = logging.getLogger(__name__)
+
+
+class RunTest(tester.TestFlowBase):
+ """ Test case for Request-Reply messages.
+
+ Some tests need attached port to switch.
+ If use the OVS, can do it with the following commands.
+ # ip link add <port> type dummy
+ # ovs-vsctl add-port <bridge> <port>
+ """
+
+ OFP_VERSIONS = [ofproto_v1_2.OFP_VERSION]
+
+ def __init__(self, *args, **kwargs):
+ super(RunTest, self).__init__(*args, **kwargs)
+
+ self._verify = None
+ self.n_tables = ofproto_v1_2.OFPTT_MAX
+
+ def start_next_test(self, dp):
+ self._verify = None
+ self.delete_all_flows(dp)
+ dp.send_barrier()
+ if len(self.pending):
+ t = self.pending.pop()
+ if self.is_supported(t):
+ LOG.info(tester.LOG_TEST_START, t)
+ self.current = t
+ getattr(self, t)(dp)
+ else:
+ self.results[t] = 'SKIP (unsupported)'
+ self.unclear -= 1
+ self.start_next_test(dp)
+ else:
+ self.print_results()
+
+ def run_verify(self, ev):
+ msg = ev.msg
+ dp = msg.datapath
+
+ verify_func = self.verify_default
+ v = "verify" + self.current[4:]
+ if v in dir(self):
+ verify_func = getattr(self, v)
+
+ result = verify_func(dp, msg)
+ if result is True:
+ self.unclear -= 1
+
+ self.results[self.current] = result
+ self.start_next_test(dp)
+
+ def verify_default(self, dp, msg):
+ type_ = self._verify
+
+ if msg.msg_type == dp.ofproto.OFPT_STATS_REPLY:
+ return self.verify_stats(dp, msg.body, type_)
+ elif msg.msg_type == type_:
+ return True
+ else:
+ return 'Reply msg_type %s expected %s' \
+ % (msg.msg_type, type_)
+
+ def verify_stats(self, dp, stats, type_):
+ stats_types = dp.ofproto_parser.OFPStatsReply._STATS_TYPES
+ expect = stats_types.get(type_).__name__
+
+ if isinstance(stats, list):
+ for s in stats:
+ if expect == s.__class__.__name__:
+ return True
+ else:
+ if expect == stats.__class__.__name__:
+ return True
+ return 'Reply msg has not \'%s\' class.\n%s' % (expect, stats)
+
+ def mod_flow(self, dp, cookie=0, cookie_mask=0, table_id=0,
+ command=None, idle_timeout=0, hard_timeout=0,
+ priority=0xff, buffer_id=0xffffffff, match=None,
+ actions=None, inst_type=None, out_port=None,
+ out_group=None, flags=0, inst=None):
+
+ if command is None:
+ command = dp.ofproto.OFPFC_ADD
+
+ if inst is None:
+ if inst_type is None:
+ inst_type = dp.ofproto.OFPIT_APPLY_ACTIONS
+
+ inst = []
+ if actions is not None:
+ inst = [dp.ofproto_parser.OFPInstructionActions(
+ inst_type, actions)]
+
+ if match is None:
+ match = dp.ofproto_parser.OFPMatch()
+
+ if out_port is None:
+ out_port = dp.ofproto.OFPP_ANY
+
+ if out_group is None:
+ out_group = dp.ofproto.OFPG_ANY
+
+ m = dp.ofproto_parser.OFPFlowMod(dp, cookie, cookie_mask,
+ table_id, command,
+ idle_timeout, hard_timeout,
+ priority, buffer_id,
+ out_port, out_group,
+ flags, match, inst)
+
+ dp.send_msg(m)
+
+ def get_port(self, dp):
+ for port_no, port in dp.ports.items():
+ if port_no != dp.ofproto.OFPP_LOCAL:
+ return port
+ return None
+
+ # Test for Reply message type
+ def test_desc_stats_request(self, dp):
+ self._verify = dp.ofproto.OFPST_DESC
+ m = dp.ofproto_parser.OFPDescStatsRequest(dp)
+ dp.send_msg(m)
+
+ def test_flow_stats_request(self, dp):
+ self._verify = dp.ofproto.OFPST_FLOW
+ self.mod_flow(dp)
+ self.send_flow_stats(dp)
+
+ def test_aggregate_stats_request(self, dp):
+ self._verify = dp.ofproto.OFPST_AGGREGATE
+ match = dp.ofproto_parser.OFPMatch()
+ m = dp.ofproto_parser.OFPAggregateStatsRequest(
+ dp, dp.ofproto.OFPTT_ALL, dp.ofproto.OFPP_ANY,
+ dp.ofproto.OFPG_ANY, 0, 0, match)
+ dp.send_msg(m)
+
+ def test_table_stats_request(self, dp):
+ self._verify = dp.ofproto.OFPST_TABLE
+ m = dp.ofproto_parser.OFPTableStatsRequest(dp)
+ dp.send_msg(m)
+
+ def test_port_stats_request(self, dp):
+ self._verify = dp.ofproto.OFPST_PORT
+ m = dp.ofproto_parser.OFPPortStatsRequest(dp, dp.ofproto.OFPP_ANY)
+ dp.send_msg(m)
+
+ def test_echo_request(self, dp):
+ self._verify = dp.ofproto.OFPT_ECHO_REPLY
+ m = dp.ofproto_parser.OFPEchoRequest(dp)
+ dp.send_msg(m)
+
+ def test_features_request(self, dp):
+ self._verify = dp.ofproto.OFPT_FEATURES_REPLY
+ m = dp.ofproto_parser.OFPFeaturesRequest(dp)
+ dp.send_msg(m)
+
+ def test_get_config_request(self, dp):
+ self._verify = dp.ofproto.OFPT_GET_CONFIG_REPLY
+ m = dp.ofproto_parser.OFPGetConfigRequest(dp)
+ dp.send_msg(m)
+
+ def test_barrier_request(self, dp):
+ self._verify = dp.ofproto.OFPT_BARRIER_REPLY
+ dp.send_barrier()
+
+ def test_error_reply(self, dp):
+ ports = [0]
+ for p in dp.ports:
+ if p != dp.ofproto.OFPP_LOCAL:
+ ports.append(p)
+
+ port_no = max(ports) + 1
+ self._verify = dp.ofproto.OFPT_ERROR
+ m = dp.ofproto_parser.OFPPortMod(
+ dp, port_no, 'ff:ff:ff:ff:ff:ff', 0, 0, 0)
+ dp.send_msg(m)
+
+ # Test for reply value
+ def test_flow_stats_none(self, dp):
+ self.send_flow_stats(dp)
+
+ def verify_flow_stats_none(self, dp, msg):
+ stats = msg.body
+ if len(stats):
+ return 'Reply msg has body. %s' % (stats, )
+ return True
+
+ def test_flow_stats_reply_value(self, dp):
+ self._verify = []
+ c = 0
+ while c < self.n_tables:
+ # value = (talbe_id, cookie, idle_timeout, hard_timeout, priority)
+ v = (c, c + 1, c + 2, c + 3, c + 4)
+ self._verify.append(v)
+ self.mod_flow(dp, table_id=v[0], cookie=v[1],
+ idle_timeout=v[2], hard_timeout=v[3], priority=v[4])
+ c += 1
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_stats_reply_value(self, dp, msg):
+ c = 0
+ for f in msg.body:
+ f_value = (f.table_id, f.cookie, f.idle_timeout,
+ f.hard_timeout, f.priority, )
+ if f_value != self._verify[c]:
+ return 'param is mismatched. verify=%s, reply=%s' \
+ % (self._verify[c], f_value,)
+ c += 1
+ return len(msg.body) == self.n_tables
+
+ def test_echo_request_has_data(self, dp):
+ data = 'test'
+ self._verify = data
+ m = dp.ofproto_parser.OFPEchoRequest(dp)
+ m.data = data
+ dp.send_msg(m)
+
+ def verify_echo_request_has_data(self, dp, msg):
+ data = msg.data
+ return self._verify == data
+
+ def test_aggregate_stats_flow_count(self, dp):
+ c = 0
+ while c < self.n_tables:
+ self.mod_flow(dp, table_id=c)
+ c += 1
+ dp.send_barrier()
+ match = dp.ofproto_parser.OFPMatch()
+ m = dp.ofproto_parser.OFPAggregateStatsRequest(
+ dp, dp.ofproto.OFPTT_ALL, dp.ofproto.OFPP_ANY,
+ dp.ofproto.OFPG_ANY, 0, 0, match)
+ dp.send_msg(m)
+
+ def verify_aggregate_stats_flow_count(self, dp, msg):
+ stats = msg.body
+ return stats.flow_count == self.n_tables
+
+ def test_aggregate_stats_flow_count_out_port(self, dp):
+ actions = [dp.ofproto_parser.OFPActionOutput(1, 1500)]
+ self.mod_flow(dp, table_id=1, actions=actions)
+
+ actions = [dp.ofproto_parser.OFPActionOutput(2, 1500)]
+ self.mod_flow(dp, table_id=2, actions=actions)
+ dp.send_barrier()
+
+ out_port = 2
+ match = dp.ofproto_parser.OFPMatch()
+ m = dp.ofproto_parser.OFPAggregateStatsRequest(
+ dp, dp.ofproto.OFPTT_ALL, out_port,
+ dp.ofproto.OFPG_ANY, 0, 0, match)
+ dp.send_msg(m)
+
+ def verify_aggregate_stats_flow_count_out_port(self, dp, msg):
+ stats = msg.body
+ return stats.flow_count == 1
+
+ def test_aggregate_stats_packet_count(self, dp):
+ in_port = 1
+ data = 'test'
+ self._verify = {'packet_count': 1,
+ 'byte_count': len(data)}
+
+ # add flow
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ self.mod_flow(dp, table_id=0, match=match)
+
+ # packet out
+ output = dp.ofproto.OFPP_TABLE
+ actions = [dp.ofproto_parser.OFPActionOutput(output, 0)]
+ m = dp.ofproto_parser.OFPPacketOut(dp, 0xffffffff, in_port,
+ actions, data)
+ dp.send_msg(m)
+ dp.send_barrier()
+
+ match = dp.ofproto_parser.OFPMatch()
+ m = dp.ofproto_parser.OFPAggregateStatsRequest(
+ dp, dp.ofproto.OFPTT_ALL, dp.ofproto.OFPP_ANY,
+ dp.ofproto.OFPG_ANY, 0, 0, match)
+ dp.send_msg(m)
+
+ def verify_aggregate_stats_packet_count(self, dp, msg):
+ for name, val in self._verify.items():
+ r_val = getattr(msg.body, name)
+ if val != r_val:
+ return '%s is mismatched. verify=%s, reply=%s' \
+ % (name, val, r_val)
+ return True
+
+ def test_set_config_nomal(self, dp):
+ flags = dp.ofproto.OFPC_FRAG_NORMAL
+ self._verify = flags
+ m = dp.ofproto_parser.OFPSetConfig(dp, flags, 0)
+ dp.send_msg(m)
+ dp.send_barrier()
+
+ m = dp.ofproto_parser.OFPGetConfigRequest(dp)
+ dp.send_msg(m)
+
+ def verify_set_config_nomal(self, dp, msg):
+ return self._verify == msg.flags
+
+ def test_set_config_drop(self, dp):
+ flags = dp.ofproto.OFPC_FRAG_DROP
+ self._verify = flags
+ m = dp.ofproto_parser.OFPSetConfig(dp, flags, 0)
+ dp.send_msg(m)
+ dp.send_barrier()
+
+ m = dp.ofproto_parser.OFPGetConfigRequest(dp)
+ dp.send_msg(m)
+
+ def verify_set_config_drop(self, dp, msg):
+ return self._verify == msg.flags
+
+ def test_set_config_mask(self, dp):
+ flags = dp.ofproto.OFPC_FRAG_MASK
+ self._verify = flags
+ m = dp.ofproto_parser.OFPSetConfig(dp, flags, 0)
+ dp.send_msg(m)
+ dp.send_barrier()
+
+ m = dp.ofproto_parser.OFPGetConfigRequest(dp)
+ dp.send_msg(m)
+
+ def verify_set_config_mask(self, dp, msg):
+ return self._verify == msg.flags
+
+ def test_set_config_ttl_to_controller(self, dp):
+ flags = dp.ofproto.OFPC_INVALID_TTL_TO_CONTROLLER
+ self._verify = flags
+ m = dp.ofproto_parser.OFPSetConfig(dp, flags, 0)
+ dp.send_msg(m)
+ dp.send_barrier()
+
+ m = dp.ofproto_parser.OFPGetConfigRequest(dp)
+ dp.send_msg(m)
+
+ def verify_set_config_ttl_to_controller(self, dp, msg):
+ return self._verify == msg.flags
+
+ def test_set_config_miss_send_len(self, dp):
+ flags = dp.ofproto.OFPC_FRAG_NORMAL
+ ms_len = 256
+ self._verify = ms_len
+ m = dp.ofproto_parser.OFPSetConfig(dp, flags, ms_len)
+ dp.send_msg(m)
+ dp.send_barrier()
+
+ m = dp.ofproto_parser.OFPGetConfigRequest(dp)
+ dp.send_msg(m)
+
+ def verify_set_config_miss_send_len(self, dp, msg):
+ return self._verify == msg.miss_send_len
+
+ def test_set_config_miss_send_len_max(self, dp):
+ flags = dp.ofproto.OFPC_FRAG_NORMAL
+ ms_len = dp.ofproto.OFPCML_MAX
+ self._verify = ms_len
+ m = dp.ofproto_parser.OFPSetConfig(dp, flags, ms_len)
+ dp.send_msg(m)
+ dp.send_barrier()
+
+ m = dp.ofproto_parser.OFPGetConfigRequest(dp)
+ dp.send_msg(m)
+
+ def verify_set_config_miss_send_len_max(self, dp, msg):
+ return self._verify == msg.miss_send_len
+
+ def test_set_config_no_buffer(self, dp):
+ flags = dp.ofproto.OFPC_FRAG_NORMAL
+ ms_len = dp.ofproto.OFPCML_NO_BUFFER
+ self._verify = ms_len
+ m = dp.ofproto_parser.OFPSetConfig(dp, flags, ms_len)
+ dp.send_msg(m)
+ dp.send_barrier()
+
+ m = dp.ofproto_parser.OFPGetConfigRequest(dp)
+ dp.send_msg(m)
+
+ def verify_set_config_no_buffer(self, dp, msg):
+ return self._verify == msg.miss_send_len
+
+ def _verify_flow_inst_type(self, dp, msg):
+ inst_type = self._verify
+ stats = msg.body
+
+ for s in stats:
+ for i in s.instructions:
+ if i.type == inst_type:
+ return True
+ return 'not found inst_type[%s]' % (inst_type, )
+
+ def test_flow_add_apply_actions(self, dp):
+ inst_type = dp.ofproto.OFPIT_APPLY_ACTIONS
+ self._verify = inst_type
+
+ actions = [dp.ofproto_parser.OFPActionOutput(1, 1500)]
+ self.mod_flow(dp, actions=actions, inst_type=inst_type)
+ self.send_flow_stats(dp)
+
+ def verify_flow_add_apply_actions(self, dp, msg):
+ return self._verify_flow_inst_type(dp, msg)
+
+ def test_flow_add_goto_table(self, dp):
+ self._verify = dp.ofproto.OFPIT_GOTO_TABLE
+
+ inst = [dp.ofproto_parser.OFPInstructionGotoTable(1), ]
+ self.mod_flow(dp, inst=inst)
+ self.send_flow_stats(dp)
+
+ def verify_flow_add_goto_table(self, dp, msg):
+ return self._verify_flow_inst_type(dp, msg)
+
+ def _verify_flow_value(self, dp, msg):
+ stats = msg.body
+ verify = self._verify
+
+ if len(verify) != len(stats):
+ return 'flow_count is mismatched. verify=%s stats=%s' \
+ % (len(verify), len(stats))
+
+ for s in stats:
+ v_port = -1
+ v = verify.get(s.table_id, None)
+ if v:
+ v_port = v[3].port
+
+ s_port = s.instructions[0].actions[0].port
+
+ if v_port != s_port:
+ return 'port is mismatched. table_id=%s verify=%s, stats=%s' \
+ % (s.table_id, v_port, s_port)
+ return True
+
+ def _add_flow_for_flow_mod_tests(self, dp):
+ a1 = dp.ofproto_parser.OFPActionOutput(1, 1500)
+ a2 = dp.ofproto_parser.OFPActionOutput(2, 1500)
+
+ # table_id, cookie, priority, dl_dst, action)
+ tables = {0: [0xffff, 10, b'\xee' * 6, a1],
+ 1: [0xff00, 10, b'\xee' * 6, a2],
+ 2: [0xf000, 100, b'\xee' * 6, a1],
+ 3: [0x0000, 10, b'\xff' * 6, a1]}
+
+ self._verify = tables
+ for table_id, val in tables.items():
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_dst(val[2])
+ self.mod_flow(dp, match=match, actions=[val[3]],
+ table_id=table_id, cookie=val[0], priority=val[1])
+ dp.send_barrier()
+
+ def test_flow_mod_table_id(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # modify flow of table_id=3
+ action = dp.ofproto_parser.OFPActionOutput(3, 1500)
+ self._verify[3][3] = action
+
+ table_id = 3
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_MODIFY,
+ actions=[action], table_id=table_id)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_mod_table_id(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def test_flow_mod_cookie(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # modify flow of table_id=1
+ action = dp.ofproto_parser.OFPActionOutput(3, 1500)
+ self._verify[1][3] = action
+
+ cookie = 0xff00
+ cookie_mask = 0xffff
+ table_id = 1
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_MODIFY,
+ actions=[action], table_id=table_id,
+ cookie=cookie, cookie_mask=cookie_mask)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_mod_cookie(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def test_flow_mod_cookie_mask(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # modify flow of table_id=0,1
+ action = dp.ofproto_parser.OFPActionOutput(3, 1500)
+ self._verify[0][3] = action
+ self._verify[1][3] = action
+
+ cookie = 0xffff
+ cookie_mask = 0xff00
+ for table_id in range(2):
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_MODIFY,
+ actions=[action], table_id=table_id,
+ cookie=cookie, cookie_mask=cookie_mask)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_mod_cookie_mask(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def test_flow_mod_match(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # modify flow of table_id=3
+ action = dp.ofproto_parser.OFPActionOutput(3, 1500)
+ self._verify[3][3] = action
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_dst(b'\xff' * 6)
+ table_id = 3
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_MODIFY,
+ actions=[action], table_id=table_id, match=match)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_mod_match(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def test_flow_mod_strict(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # modify flow of table_id=2
+ action = dp.ofproto_parser.OFPActionOutput(3, 1500)
+ self._verify[2][3] = action
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_dst(b'\xee' * 6)
+ priority = 100
+ table_id = 2
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_MODIFY_STRICT,
+ actions=[action], table_id=table_id,
+ match=match, priority=priority)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_mod_strict(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def test_flow_del_table_id(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # delete flow of table_id=3
+ del self._verify[3]
+
+ table_id = 3
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_DELETE,
+ table_id=table_id)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_del_table_id(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def test_flow_del_table_id_all(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # delete all flows
+ self._verify = {}
+
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_DELETE,
+ table_id=dp.ofproto.OFPTT_ALL)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_del_table_id_all(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def test_flow_del_cookie(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # delete flow of table_id=1
+ del self._verify[1]
+
+ cookie = 0xff00
+ cookie_mask = 0xffff
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_DELETE,
+ table_id=dp.ofproto.OFPTT_ALL,
+ cookie=cookie, cookie_mask=cookie_mask)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_del_cookie(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def test_flow_del_cookie_mask(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # delete flow of table_id=0,1
+ del self._verify[0]
+ del self._verify[1]
+
+ cookie = 0xffff
+ cookie_mask = 0xff00
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_DELETE,
+ table_id=dp.ofproto.OFPTT_ALL,
+ cookie=cookie, cookie_mask=cookie_mask)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_del_cookie_mask(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def test_flow_del_match(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # delete flow of table_id=3
+ del self._verify[3]
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_dst(b'\xff' * 6)
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_DELETE,
+ table_id=dp.ofproto.OFPTT_ALL, match=match)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_del_match(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def test_flow_del_out_port(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # delete flow of table_id=1
+ del self._verify[1]
+
+ out_port = 2
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_DELETE,
+ table_id=dp.ofproto.OFPTT_ALL, out_port=out_port)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_del_out_port(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def test_flow_del_strict(self, dp):
+ self._add_flow_for_flow_mod_tests(dp)
+
+ # delete flow of table_id=2
+ del self._verify[2]
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_dl_dst(b'\xee' * 6)
+ priority = 100
+ self.mod_flow(dp, command=dp.ofproto.OFPFC_DELETE_STRICT,
+ table_id=dp.ofproto.OFPTT_ALL,
+ match=match, priority=priority)
+
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+
+ def verify_flow_del_strict(self, dp, msg):
+ return self._verify_flow_value(dp, msg)
+
+ def _send_port_mod(self, dp, config, mask):
+ p = self.get_port(dp)
+ if not p:
+ err = 'need attached port to switch.'
+ self.results[self.current] = err
+ self.start_next_test(dp)
+ return
+
+ self._verify = [p.port_no, config & mask]
+ m = dp.ofproto_parser.OFPPortMod(dp, p.port_no, p.hw_addr,
+ config, mask, 0)
+ dp.send_msg(m)
+ dp.send_barrier()
+
+ # TODO: waiting to port UP|DOWN.
+ time.sleep(1)
+ m = dp.ofproto_parser.OFPFeaturesRequest(dp)
+ dp.send_msg(m)
+
+ def _verify_port_mod_config(self, dp, msg):
+ port_no = self._verify[0]
+ config = self._verify[1]
+
+ port = msg.ports[port_no]
+ if config != port.config:
+ return "config is mismatched. verify=%s, stats=%s" \
+ % (bin(config), bin(port.config))
+ return True
+
+ def test_port_mod_config_01_all(self, dp):
+ config = 0b1100101
+ mask = 0b1111111
+ self._send_port_mod(dp, config, mask)
+
+ def verify_port_mod_config_01_all(self, dp, msg):
+ return self._verify_port_mod_config(dp, msg)
+
+ def test_port_mod_config_02_none(self, dp):
+ config = 0
+ mask = 0b1111111
+ self._send_port_mod(dp, config, mask)
+
+ def verify_port_mod_config_02_none(self, dp, msg):
+ return self._verify_port_mod_config(dp, msg)
+
+ def test_port_mod_config_03_mask(self, dp):
+ config = 0b1100101
+ mask = 0b1111000
+ self._send_port_mod(dp, config, mask)
+
+ def verify_port_mod_config_03_mask(self, dp, msg):
+ res = self._verify_port_mod_config(dp, msg)
+ # reset port config
+ port_no = self._verify[0]
+ p = msg.ports[port_no]
+ m = dp.ofproto_parser.OFPPortMod(dp, p.port_no, p.hw_addr,
+ 0, 0b1111111, 0)
+ dp.send_msg(m)
+ dp.send_barrier()
+ return res
+
+ def test_port_stats_port_no(self, dp):
+ p = self.get_port(dp)
+ if not p:
+ err = 'need attached port to switch.'
+ self.results[self.current] = err
+ self.start_next_test(dp)
+ return
+
+ self._verify = p.port_no
+ m = dp.ofproto_parser.OFPPortStatsRequest(dp, p.port_no)
+ dp.send_msg(m)
+
+ def verify_port_stats_port_no(self, dp, msg):
+ ports = msg.body
+ if len(ports) > 1:
+ return 'reply some ports.\n%s' % (ports)
+
+ if ports[0].port_no != self._verify:
+ return 'port_no is mismatched. request=%s reply=%s' \
+ % (self._verify, ports[0].port_no)
+
+ return True
+
+ def _add_flow_flow_removed(self, dp, reason, table_id=0,
+ cookie=0xff, priority=100, in_port=1,
+ idle_timeout=0, hard_timeout=0):
+ self._verify = {}
+ self._verify['params'] = {'reason': reason,
+ 'table_id': table_id,
+ 'cookie': cookie,
+ 'priority': priority}
+ self._verify['in_port'] = in_port
+ self._verify['timeout'] = idle_timeout
+ if hard_timeout:
+ if (idle_timeout == 0 or idle_timeout > hard_timeout):
+ self._verify['timeout'] = hard_timeout
+
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ self.mod_flow(dp, match=match, cookie=cookie,
+ priority=priority, table_id=table_id,
+ idle_timeout=idle_timeout, hard_timeout=hard_timeout,
+ flags=dp.ofproto.OFPFF_SEND_FLOW_REM)
+
+ def _verify_flow_removed(self, dp, msg):
+ params = self._verify['params']
+ in_port = self._verify['in_port']
+ timeout = self._verify['timeout']
+
+ if timeout:
+ duration_nsec = (msg.duration_sec * 10 ** 9) + msg.duration_nsec
+ timeout_nsec = timeout * 10 ** 9
+
+ # grace of -0.5 and +1.5 second to timeout.
+ l = (timeout - 0.5) * 10 ** 9
+ h = (timeout + 1.5) * 10 ** 9
+ if not l < duration_nsec < h:
+ return 'bad duration time. set=%s(nsec), duration=%s(nsec)' \
+ % (timeout_nsec, duration_nsec)
+
+ for name, val in params.items():
+ r_val = getattr(msg, name)
+ if val != r_val:
+ return '%s is mismatched. verify=%s, reply=%s' \
+ % (name, val, r_val)
+
+ for f in msg.match.fields:
+ if f.header == ofproto_v1_2.OXM_OF_IN_PORT:
+ if f.value != in_port:
+ return 'in_port is mismatched. verify=%s, reply=%s' \
+ % (in_port, f.value)
+ return True
+
+ def test_flow_removed_idle_timeout(self, dp):
+ reason = dp.ofproto.OFPRR_IDLE_TIMEOUT
+ idle_timeout = 2
+ self._add_flow_flow_removed(dp, reason,
+ idle_timeout=idle_timeout)
+
+ def verify_flow_removed_idle_timeout(self, dp, msg):
+ return self._verify_flow_removed(dp, msg)
+
+ def test_flow_removed_idle_timeout_hit(self, dp):
+ reason = dp.ofproto.OFPRR_IDLE_TIMEOUT
+ idle_timeout = 5
+ in_port = 1
+ sleep = 2
+
+ # add target flow
+ self._add_flow_flow_removed(dp, reason, in_port=in_port,
+ idle_timeout=idle_timeout)
+ self._verify['timeout'] = idle_timeout + sleep
+
+ # sleep
+ time.sleep(sleep)
+
+ # packet out
+ output = dp.ofproto.OFPP_TABLE
+ actions = [dp.ofproto_parser.OFPActionOutput(output, 0)]
+ m = dp.ofproto_parser.OFPPacketOut(dp, 0xffffffff, in_port,
+ actions, None)
+ dp.send_msg(m)
+
+ def verify_flow_removed_idle_timeout_hit(self, dp, msg):
+ return self._verify_flow_removed(dp, msg)
+
+ def test_flow_removed_hard_timeout(self, dp):
+ reason = dp.ofproto.OFPRR_HARD_TIMEOUT
+ hard_timeout = 2
+ self._add_flow_flow_removed(dp, reason,
+ hard_timeout=hard_timeout)
+
+ def verify_flow_removed_hard_timeout(self, dp, msg):
+ return self._verify_flow_removed(dp, msg)
+
+ def test_flow_removed_hard_timeout_hit(self, dp):
+ reason = dp.ofproto.OFPRR_HARD_TIMEOUT
+ hard_timeout = 5
+ in_port = 1
+ sleep = 2
+
+ self._add_flow_flow_removed(dp, reason, in_port=in_port,
+ hard_timeout=hard_timeout)
+ dp.send_barrier()
+
+ # sleep
+ time.sleep(sleep)
+
+ # packet out
+ output = dp.ofproto.OFPP_TABLE
+ actions = [dp.ofproto_parser.OFPActionOutput(output, 0)]
+ m = dp.ofproto_parser.OFPPacketOut(dp, 0xffffffff, in_port,
+ actions, None)
+ dp.send_msg(m)
+
+ def verify_flow_removed_hard_timeout_hit(self, dp, msg):
+ return self._verify_flow_removed(dp, msg)
+
+ def test_flow_removed_delete(self, dp):
+ reason = dp.ofproto.OFPRR_DELETE
+ self._add_flow_flow_removed(dp, reason)
+ dp.send_barrier()
+ self.delete_all_flows(dp)
+
+ def verify_flow_removed_delete(self, dp, msg):
+ return self._verify_flow_removed(dp, msg)
+
+ def test_flow_removed_table_id(self, dp):
+ reason = dp.ofproto.OFPRR_DELETE
+ table_id = 1
+ self._add_flow_flow_removed(dp, reason, table_id=table_id)
+ dp.send_barrier()
+ self.delete_all_flows(dp)
+
+ def verify_flow_removed_table_id(self, dp, msg):
+ return self._verify_flow_removed(dp, msg)
+
+ def _send_packet_out(self, dp, buffer_id=0xffffffff,
+ in_port=None, output=None, data=''):
+ if in_port is None:
+ in_port = dp.ofproto.OFPP_LOCAL
+
+ if output is None:
+ output = dp.ofproto.OFPP_CONTROLLER
+
+ self._verify['in_port'] = in_port
+ self._verify['data'] = data
+
+ actions = [dp.ofproto_parser.OFPActionOutput(output, len(data))]
+ m = dp.ofproto_parser.OFPPacketOut(dp, buffer_id, in_port,
+ actions, data)
+ dp.send_msg(m)
+
+ def _verify_packet_in(self, dp, msg):
+ for name, val in self._verify.items():
+ if name == 'in_port':
+ for f in msg.match.fields:
+ if f.header == ofproto_v1_2.OXM_OF_IN_PORT:
+ r_val = f.value
+ else:
+ r_val = getattr(msg, name)
+
+ if val != r_val:
+ return '%s is mismatched. verify=%s, reply=%s' \
+ % (name, val, r_val)
+ return True
+
+ def test_packet_in_action(self, dp):
+ self._verify = {}
+ self._verify['reason'] = dp.ofproto.OFPR_ACTION
+ self._send_packet_out(dp)
+
+ def verify_packet_in_action(self, dp, msg):
+ return self._verify_packet_in(dp, msg)
+
+ def test_packet_in_data(self, dp):
+ self._verify = {}
+ self._verify['reason'] = dp.ofproto.OFPR_ACTION
+ data = 'test'
+ self._send_packet_out(dp, data=data)
+
+ def verify_packet_in_data(self, dp, msg):
+ return self._verify_packet_in(dp, msg)
+
+ def test_packet_in_table_id(self, dp):
+ in_port = 1
+ table_id = 2
+ output = dp.ofproto.OFPP_TABLE
+
+ self._verify = {}
+ self._verify['reason'] = dp.ofproto.OFPR_ACTION
+ self._verify['table_id'] = table_id
+
+ # add flow (goto_table)
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ inst = [dp.ofproto_parser.OFPInstructionGotoTable(table_id)]
+ self.mod_flow(dp, inst=inst, match=match)
+
+ # add flow (output)
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ out = dp.ofproto.OFPP_CONTROLLER
+ actions = [dp.ofproto_parser.OFPActionOutput(out, 0)]
+ self.mod_flow(dp, actions=actions, match=match, table_id=table_id)
+ dp.send_barrier()
+
+ # packet out
+ self._send_packet_out(dp, in_port=in_port, output=output)
+
+ def verify_packet_in_table_id(self, dp, msg):
+ return self._verify_packet_in(dp, msg)
+
+ # handler
+ @set_ev_cls(ofp_event.EventOFPEchoReply, MAIN_DISPATCHER)
+ def echo_replay_handler(self, ev):
+ if self.current.find('echo_request') > 0:
+ self.run_verify(ev)
+
+ @set_ev_cls(ofp_event.EventOFPStatsReply, MAIN_DISPATCHER)
+ def stats_reply_handler(self, ev):
+ if self.current is None:
+ msg = ev.msg
+ dp = msg.datapath
+ if self._verify == dp.ofproto.OFPST_TABLE:
+ self.table_stats = msg.body
+ self.start_next_test(dp)
+ else:
+ self.run_verify(ev)
+
+ @set_ev_cls(ofp_event.EventOFPSwitchFeatures, MAIN_DISPATCHER)
+ def features_replay_handler(self, ev):
+ if self.current is None:
+ pass
+ else:
+ self.run_verify(ev)
+
+ @set_ev_cls(ofp_event.EventOFPGetConfigReply, MAIN_DISPATCHER)
+ def get_config_replay_handler(self, ev):
+ self.run_verify(ev)
+
+ @set_ev_cls(ofp_event.EventOFPBarrierReply, MAIN_DISPATCHER)
+ def barrier_replay_handler(self, ev):
+ if self.current == 'test_barrier_request':
+ self.run_verify(ev)
+
+ @set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
+ def port_status_handler(self, ev):
+ pass
+
+ @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
+ def packet_in_handler(self, ev):
+ if self.current.find('packet_in'):
+ self.run_verify(ev)
+
+ @set_ev_cls(ofp_event.EventOFPFlowRemoved, MAIN_DISPATCHER)
+ def flow_removed_handler(self, ev):
+ if self.current.find('flow_removed') > 0:
+ self.run_verify(ev)
+
+ @set_ev_cls(ofp_event.EventOFPErrorMsg, MAIN_DISPATCHER)
+ def error_handler(self, ev):
+ if self.current.find('error') > 0:
+ self.run_verify(ev)
+
+ def is_supported(self, t):
+ unsupported = [
+ ]
+ for u in unsupported:
+ if t.find(u) != -1:
+ return False
+
+ return True
diff --git a/tests/integrated/test_vrrp_linux_multi.py b/tests/integrated/test_vrrp_linux_multi.py
new file mode 100644
index 00000000..ae4d837a
--- /dev/null
+++ b/tests/integrated/test_vrrp_linux_multi.py
@@ -0,0 +1,103 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 Isaku Yamahata <yamahata at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+Usage:
+PYTHONPATH=. ./bin/ryu-manager --verbose \
+ ryu.services.protocols.vrrp.dumper \
+ ryu.services.protocols.vrrp.sample_manager.py \
+ ryu.app.rest \
+ tests.integrated.test_vrrp_linux_multi
+
+ryu.services.protocols.vrrp.dumper is optional.
+ryu.app.rest is merely to prevent ryu-manager from exiting.
+
+ ----------------
+ /--<--veth0-->| |
+ Ryu | linux bridge |<--veth2--> command to generate packets
+ \--<--veth1-->| (vrrpbr) |
+ ----------------
+
+
+# ip link add veth0 type veth peer name veth0-br
+# ip link add veth1 type veth peer name veth1-br
+# ip link add veth2 type veth peer name veth2-br
+
+# brctl addbr vrrpbr
+# brctl addif vrrpbr veth0-br
+# brctl addif vrrpbr veth1-br
+# brctl addif vrrpbr veth2-br
+
+
+# ip link set veth0 up
+# ip link set veth0-br up
+# ip link set veth1 up
+# ip link set veth1-br up
+# ip link set veth2 up
+# ip link set veth2-br up
+# ip link set vrrpbr up
+
+if you like, capture packets on each interfaces like
+# tshark -i vrrpbr
+# tshark -i veth0
+# tshark -i veth1
+# tshark -i veth2
+
+virtual router mac address: 00:00:5E:00:01:{VRID} = 00:00:5E:00:01:07
+during working, send packets destined to mac address 00:00:5E:00:01:07
+from veth2 by packet generator like packeth
+
+NOTE: vrid: 7 and ip address: 10.0.0.1... are hardcoded below
+"""
+
+from ryu.base import app_manager
+from ryu.lib import hub
+from ryu.lib import mac as lib_mac
+from ryu.lib.packet import vrrp
+from ryu.services.protocols.vrrp import api as vrrp_api
+from ryu.services.protocols.vrrp import event as vrrp_event
+from ryu.services.protocols.vrrp import monitor_linux
+
+from . import vrrp_common
+
+
+class VRRPConfigApp(vrrp_common.VRRPCommon):
+ _IFNAME0 = 'veth0'
+ _IFNAME1 = 'veth1'
+
+ def __init__(self, *args, **kwargs):
+ super(VRRPConfigApp, self).__init__(*args, **kwargs)
+
+ def start(self):
+ hub.spawn(self._main)
+
+ def _configure_vrrp_router(self, vrrp_version, priority,
+ primary_ip_address, ifname, vrid):
+ interface = vrrp_event.VRRPInterfaceNetworkDevice(
+ lib_mac.DONTCARE_STR, primary_ip_address, None, ifname)
+ self.logger.debug('%s', interface)
+
+ vip = '10.0.%d.1' % vrid
+ ip_addresses = [vip]
+ config = vrrp_event.VRRPConfig(
+ version=vrrp_version, vrid=vrid, priority=priority,
+ ip_addresses=ip_addresses)
+ self.logger.debug('%s', config)
+
+ rep = vrrp_api.vrrp_config(self, interface, config)
+ self.logger.debug('%s', rep)
+
+ return rep
diff --git a/tests/integrated/test_vrrp_linux_multi.sh b/tests/integrated/test_vrrp_linux_multi.sh
new file mode 100644
index 00000000..b1dba4bc
--- /dev/null
+++ b/tests/integrated/test_vrrp_linux_multi.sh
@@ -0,0 +1,34 @@
+#! /bin/sh
+
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+ip link add veth0 type veth peer name veth0-br
+ip link add veth1 type veth peer name veth1-br
+ip link add veth2 type veth peer name veth2-br
+
+brctl addbr vrrpbr
+brctl addif vrrpbr veth0-br
+brctl addif vrrpbr veth1-br
+brctl addif vrrpbr veth2-br
+
+ip link set veth0 up
+ip link set veth0-br up
+ip link set veth1 up
+ip link set veth1-br up
+ip link set veth2 up
+ip link set veth2-br up
+ip link set vrrpbr up
diff --git a/tests/integrated/test_vrrp_multi.py b/tests/integrated/test_vrrp_multi.py
new file mode 100644
index 00000000..9d586119
--- /dev/null
+++ b/tests/integrated/test_vrrp_multi.py
@@ -0,0 +1,143 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 Isaku Yamahata <yamahata at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+Usage:
+PYTHONPATH=. ./bin/ryu-manager --verbose \
+ ryu.topology.switches \
+ ryu.services.protocols.vrrp.dumper \
+ tests.integrated.test_vrrp_multi
+
+ryu.services.protocols.vrrp.dumper is optional.
+
+ +---+ ----------------
+ /--|OVS|<--veth-->| |
+ Ryu +---+ | linux bridge |<--veth--> command to generate packets
+ \--|OVS|<--veth-->| |
+ +---+ ----------------
+
+configure OVSs to connect ryu
+example
+# brctl addbr b0
+# ip link add veth0-ovs type veth peer name veth0-br
+# ip link add veth1-ovs type veth peer name veth1-br
+# brctl addif b0 veth0-br
+# brctl addif b0 veth1-br
+# brctl show
+bridge name bridge id STP enabled interfaces
+b0 8000.6642e5822497 no veth0-br
+ veth1-br
+ovs-system 0000.122038293b55 no
+
+# ovs-vsctl add-br s0
+# ovs-vsctl add-port s0 veth0-ovs
+# ovs-vsctl add-br s1
+# ovs-vsctl add-port s1 veth1-ovs
+# ovs-vsctl set-controller s0 tcp:127.0.0.1:6633
+# ovs-vsctl set bridge s0 protocols='[OpenFlow12]'
+# ovs-vsctl set-controller s1 tcp:127.0.0.1:6633
+# ovs-vsctl set bridge s1 protocols='[OpenFlow12]'
+# ovs-vsctl show
+20c2a046-ae7e-4453-a576-11034db24985
+ Manager "ptcp:6634"
+ Bridge "s0"
+ Controller "tcp:127.0.0.1:6633"
+ is_connected: true
+ Port "veth0-ovs"
+ Interface "veth0-ovs"
+ Port "s0"
+ Interface "s0"
+ type: internal
+ Bridge "s1"
+ Controller "tcp:127.0.0.1:6633"
+ is_connected: true
+ Port "veth1-ovs"
+ Interface "veth1-ovs"
+ Port "s1"
+ Interface "s1"
+ type: internal
+ ovs_version: "1.9.90"
+# ip link veth0-br set up
+# ip link veth0-ovs set up
+# ip link veth1-br set up
+# ip link veth1-ovs set up
+# ip link b0 set up
+"""
+
+from ryu.base import app_manager
+from ryu.controller import handler
+from ryu.lib import dpid as lib_dpid
+from ryu.lib import hub
+from ryu.lib.packet import vrrp
+from ryu.services.protocols.vrrp import api as vrrp_api
+from ryu.services.protocols.vrrp import event as vrrp_event
+from ryu.services.protocols.vrrp import monitor_openflow
+from ryu.topology import event as topo_event
+from ryu.topology import api as topo_api
+
+from . import vrrp_common
+
+
+class VRRPConfigApp(vrrp_common.VRRPCommon):
+ _IFNAME0 = 0
+ _IFNAME1 = 1
+
+ def __init__(self, *args, **kwargs):
+ super(VRRPConfigApp, self).__init__(*args, **kwargs)
+ self.start_main = False
+
+ @handler.set_ev_cls(topo_event.EventSwitchEnter)
+ def _switch_enter_handler(self, ev):
+ if self.start_main:
+ return
+
+ switches = topo_api.get_switch(self)
+ if len(switches) < 2:
+ return
+
+ self.start_main = True
+ app_mgr = app_manager.AppManager.get_instance()
+ self.logger.debug('%s', app_mgr.applications)
+ self.switches = app_mgr.applications['switches']
+ hub.spawn(self._main)
+
+ def _configure_vrrp_router(self, vrrp_version, priority,
+ ip_addr, switch_index, vrid):
+ switches = self.switches
+ self.logger.debug('%s', switches.dps)
+ dpid = sorted(switches.dps.keys())[switch_index]
+ self.logger.debug('%s', lib_dpid.dpid_to_str(dpid))
+ self.logger.debug('%s', switches.port_state)
+ # hack: use the smallest port no to avoid picking OVS local port
+ port_no = sorted(switches.port_state[dpid].keys())[0]
+ self.logger.debug('%d', port_no)
+ port = switches.port_state[dpid][port_no]
+ self.logger.debug('%s', port)
+ mac = port.hw_addr
+ self.logger.debug('%s', mac)
+
+ interface = vrrp_event.VRRPInterfaceOpenFlow(
+ mac, ip_addr, None, dpid, port_no)
+ self.logger.debug('%s', interface)
+
+ config = vrrp_event.VRRPConfig(
+ version=vrrp_version, vrid=vrid, priority=priority,
+ ip_addresses=[ip_addr])
+ self.logger.debug('%s', config)
+
+ rep = vrrp_api.vrrp_config(self, interface, config)
+ self.logger.debug('%s', rep)
+ return rep
diff --git a/tests/integrated/test_vrrp_multi.sh b/tests/integrated/test_vrrp_multi.sh
new file mode 100644
index 00000000..5118cf7d
--- /dev/null
+++ b/tests/integrated/test_vrrp_multi.sh
@@ -0,0 +1,42 @@
+#! /bin/sh
+
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+if [ -z "$VSCTL" ]; then
+ VSCTL=ovs-vsctl
+fi
+
+# create two bridges.
+# conncect them using patch ports.
+
+create() {
+ BR=$1
+ LOCAL_PORT=patch$2
+ PEER_PORT=patch$3
+ CONT=$4
+ ${VSCTL} add-br ${BR} -- set bridge ${BR} datapath_type=netdev
+ ${VSCTL} add-port ${BR} ${LOCAL_PORT}
+ ${VSCTL} set interface ${LOCAL_PORT} type=patch
+ ${VSCTL} set interface ${LOCAL_PORT} options:peer=${PEER_PORT}
+ ${VSCTL} set bridge ${BR} protocols='[OpenFlow12]'
+ ${VSCTL} set-controller ${BR} ${CONT}
+}
+
+CONT=tcp:127.0.0.1:6633
+
+create s0 0 1 ${CONT}
+create s1 1 0 ${CONT}
diff --git a/tests/integrated/tester.py b/tests/integrated/tester.py
new file mode 100644
index 00000000..f052c6cc
--- /dev/null
+++ b/tests/integrated/tester.py
@@ -0,0 +1,214 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import sys
+import logging
+import itertools
+
+from ryu import utils
+from ryu.lib import mac
+from ryu.base import app_manager
+from ryu.controller import ofp_event
+from ryu.controller import handler
+from ryu.controller import dpset
+from ryu.controller.handler import MAIN_DISPATCHER
+from ryu.controller.handler import CONFIG_DISPATCHER
+from ryu.controller.handler import set_ev_cls
+from ryu.ofproto import ofproto_v1_0
+from ryu.ofproto import ofproto_v1_2
+
+
+LOG = logging.getLogger(__name__)
+
+
+LOG_TEST_START = 'TEST_START: %s'
+LOG_TEST_RESULTS = 'TEST_RESULTS:'
+LOG_TEST_FINISH = 'TEST_FINISHED: Completed=[%s] (OK=%s NG=%s SKIP=%s)'
+LOG_TEST_UNSUPPORTED = 'SKIP (unsupported)'
+
+
+class TestFlowBase(app_manager.RyuApp):
+ """
+ To run the tests is required for the following pair of functions.
+ 1. test_<test name>()
+ To send flows to switch.
+
+ 2. verify_<test name>() or _verify_default()
+ To check flows of switch.
+ """
+
+ _CONTEXTS = {'dpset': dpset.DPSet}
+
+ def __init__(self, *args, **kwargs):
+ super(TestFlowBase, self).__init__(*args, **kwargs)
+ self.pending = []
+ self.results = {}
+ self.current = None
+ self.unclear = 0
+
+ for t in dir(self):
+ if t.startswith("test_"):
+ self.pending.append(t)
+ self.pending.sort(reverse=True)
+ self.unclear = len(self.pending)
+
+ def delete_all_flows(self, dp):
+ if dp.ofproto == ofproto_v1_0:
+ match = dp.ofproto_parser.OFPMatch(dp.ofproto.OFPFW_ALL,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0)
+ m = dp.ofproto_parser.OFPFlowMod(dp, match, 0,
+ dp.ofproto.OFPFC_DELETE,
+ 0, 0, 0, 0,
+ dp.ofproto.OFPP_NONE, 0, None)
+ elif dp.ofproto == ofproto_v1_2:
+ match = dp.ofproto_parser.OFPMatch()
+ m = dp.ofproto_parser.OFPFlowMod(dp, 0, 0, dp.ofproto.OFPTT_ALL,
+ dp.ofproto.OFPFC_DELETE,
+ 0, 0, 0, 0xffffffff,
+ dp.ofproto.OFPP_ANY,
+ dp.ofproto.OFPG_ANY,
+ 0, match, [])
+
+ dp.send_msg(m)
+
+ def send_flow_stats(self, dp):
+ if dp.ofproto == ofproto_v1_0:
+ match = dp.ofproto_parser.OFPMatch(dp.ofproto.OFPFW_ALL,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0)
+ m = dp.ofproto_parser.OFPFlowStatsRequest(dp, 0, match,
+ 0, dp.ofproto.OFPP_NONE)
+ elif dp.ofproto == ofproto_v1_2:
+ match = dp.ofproto_parser.OFPMatch()
+ m = dp.ofproto_parser.OFPFlowStatsRequest(dp, dp.ofproto.OFPTT_ALL,
+ dp.ofproto.OFPP_ANY,
+ dp.ofproto.OFPG_ANY,
+ 0, 0, match)
+
+ dp.send_msg(m)
+
+ def verify_default(self, dp, stats):
+ return 'function %s() is not found.' % ("verify" + self.current[4:], )
+
+ def start_next_test(self, dp):
+ self.delete_all_flows(dp)
+ dp.send_barrier()
+ if len(self.pending):
+ t = self.pending.pop()
+ if self.is_supported(t):
+ LOG.info(LOG_TEST_START, t)
+ self.current = t
+ getattr(self, t)(dp)
+ dp.send_barrier()
+ self.send_flow_stats(dp)
+ else:
+ self.results[t] = LOG_TEST_UNSUPPORTED
+ self.unclear -= 1
+ self.start_next_test(dp)
+ else:
+ self.print_results()
+
+ def print_results(self):
+ LOG.info("TEST_RESULTS:")
+ ok = 0
+ ng = 0
+ skip = 0
+ for t in sorted(self.results.keys()):
+ if self.results[t] is True:
+ ok += 1
+ elif self.results[t] == LOG_TEST_UNSUPPORTED:
+ skip += 1
+ else:
+ ng += 1
+ LOG.info(" %s: %s", t, self.results[t])
+ LOG.info(LOG_TEST_FINISH, self.unclear == 0, ok, ng, skip)
+
+ @handler.set_ev_cls(ofp_event.EventOFPFlowStatsReply,
+ handler.MAIN_DISPATCHER)
+ def flow_reply_handler(self, ev):
+ self.run_verify(ev)
+
+ @handler.set_ev_cls(ofp_event.EventOFPStatsReply,
+ handler.MAIN_DISPATCHER)
+ def stats_reply_handler(self, ev):
+ self.run_verify(ev)
+
+ def run_verify(self, ev):
+ msg = ev.msg
+ dp = msg.datapath
+
+ verify_func = self.verify_default
+ v = "verify" + self.current[4:]
+ if hasattr(self, v):
+ verify_func = getattr(self, v)
+
+ result = verify_func(dp, msg.body)
+ if result is True:
+ self.unclear -= 1
+
+ self.results[self.current] = result
+ self.start_next_test(dp)
+
+ @handler.set_ev_cls(dpset.EventDP)
+ def handler_datapath(self, ev):
+ if ev.enter:
+ self.start_next_test(ev.dp)
+
+ @set_ev_cls(ofp_event.EventOFPBarrierReply, MAIN_DISPATCHER)
+ def barrier_replay_handler(self, ev):
+ pass
+
+ def haddr_to_str(self, addr):
+ return mac.haddr_to_str(addr)
+
+ def haddr_to_bin(self, string):
+ return mac.haddr_to_bin(string)
+
+ def haddr_masked(self, haddr_bin, mask_bin):
+ return mac.haddr_bitand(haddr_bin, mask_bin)
+
+ def ipv4_to_str(self, integre):
+ ip_list = [str((integre >> (24 - (n * 8)) & 255)) for n in range(4)]
+ return '.'.join(ip_list)
+
+ def ipv4_to_int(self, string):
+ ip = string.split('.')
+ assert len(ip) == 4
+ i = 0
+ for b in ip:
+ b = int(b)
+ i = (i << 8) | b
+ return i
+
+ def ipv4_masked(self, ip_int, mask_int):
+ return ip_int & mask_int
+
+ def ipv6_to_str(self, integres):
+ return ':'.join(hex(x)[2:] for x in integres)
+
+ def ipv6_to_int(self, string):
+ ip = string.split(':')
+ assert len(ip) == 8
+ return [int(x, 16) for x in ip]
+
+ def ipv6_masked(self, ipv6_int, mask_int):
+ return [x & y for (x, y) in
+ itertools.izip(ipv6_int, mask_int)]
+
+ def is_supported(self, t):
+ return True
diff --git a/tests/integrated/vrrp_common.py b/tests/integrated/vrrp_common.py
new file mode 100644
index 00000000..58621f45
--- /dev/null
+++ b/tests/integrated/vrrp_common.py
@@ -0,0 +1,221 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 Isaku Yamahata <yamahata at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import time
+import random
+
+from ryu.base import app_manager
+from ryu.lib import hub
+from ryu.lib import mac as lib_mac
+from ryu.lib.packet import vrrp
+from ryu.services.protocols.vrrp import api as vrrp_api
+from ryu.services.protocols.vrrp import event as vrrp_event
+
+
+_VRID = 7
+_PRIMARY_IP_ADDRESS0 = '10.0.0.2'
+_PRIMARY_IP_ADDRESS1 = '10.0.0.3'
+
+
+class VRRPCommon(app_manager.RyuApp):
+ _IFNAME0 = None
+ _IFNAME1 = None
+
+ def __init__(self, *args, **kwargs):
+ super(VRRPCommon, self).__init__(*args, **kwargs)
+
+ def _main(self):
+ self._main_version(vrrp.VRRP_VERSION_V3)
+ self._main_version(vrrp.VRRP_VERSION_V2)
+ print("done!")
+
+ def _main_version(self, vrrp_version):
+ self._main_version_priority(vrrp_version,
+ vrrp.VRRP_PRIORITY_ADDRESS_OWNER)
+ self._main_version_priority(vrrp_version,
+ vrrp.VRRP_PRIORITY_BACKUP_MAX)
+ self._main_version_priority(vrrp_version,
+ vrrp.VRRP_PRIORITY_BACKUP_DEFAULT)
+ self._main_version_priority(vrrp_version,
+ vrrp.VRRP_PRIORITY_BACKUP_MIN)
+
+ def _main_version_priority(self, vrrp_version, priority):
+ self._main_version_priority_sleep(vrrp_version, priority, False)
+ self._main_version_priority_sleep(vrrp_version, priority, True)
+
+ def _check(self, vrrp_api, instances):
+ while True:
+ while True:
+ rep = vrrp_api.vrrp_list(self)
+ if len(rep.instance_list) >= len(instances) * 2:
+ if any(i.state == vrrp_event.VRRP_STATE_INITIALIZE
+ for i in rep.instance_list):
+ continue
+ break
+ print('%s / %s' % (len(rep.instance_list), len(instances) * 2))
+ time.sleep(1)
+
+# for i in rep.instance_list:
+# print('%s %s %s %s %s' % (i.instance_name,
+# i.monitor_name,
+# i.config,
+# i.interface,
+# i.state))
+ assert len(rep.instance_list) == len(instances) * 2
+ num_of_master = 0
+ d = dict(((i.instance_name, i) for i in rep.instance_list))
+ bad = 0
+ for i in rep.instance_list:
+ assert i.state in (vrrp_event.VRRP_STATE_MASTER,
+ vrrp_event.VRRP_STATE_BACKUP)
+ if i.state == vrrp_event.VRRP_STATE_MASTER:
+ num_of_master += 1
+
+ vr = instances[i.config.vrid]
+ if (vr[0].config.priority > vr[1].config.priority and
+ i.instance_name == vr[1].instance_name) or \
+ (vr[0].config.priority < vr[1].config.priority and
+ i.instance_name == vr[0].instance_name):
+ if i.state == vrrp_event.VRRP_STATE_MASTER:
+ print("bad master:")
+ print('%s %s' % (d[vr[0].instance_name].state,
+ d[vr[0].instance_name].config.priority))
+ print('%s %s' % (d[vr[1].instance_name].state,
+ d[vr[1].instance_name].config.priority))
+ bad += 1
+# assert i.state != vrrp_event.VRRP_STATE_MASTER
+ if bad > 0:
+ # this could be a transient state
+ print("%s bad masters" % bad)
+ time.sleep(1)
+ continue
+ if num_of_master >= len(instances):
+ assert num_of_master == len(instances)
+ break
+ print('%s / %s' % (num_of_master, len(instances)))
+ time.sleep(1)
+ continue
+
+ def _main_version_priority_sleep(self, vrrp_version, priority, do_sleep):
+ app_mgr = app_manager.AppManager.get_instance()
+ self.logger.debug('%s', app_mgr.applications)
+ vrrp_mgr = app_mgr.applications['VRRPManager']
+
+ step = 5
+ instances = {}
+ for vrid in range(1, 256, step):
+ if vrid == _VRID:
+ continue
+ print("vrid %s" % vrid)
+ l = {}
+ prio = max(vrrp.VRRP_PRIORITY_BACKUP_MIN,
+ min(vrrp.VRRP_PRIORITY_BACKUP_MAX, vrid))
+ rep0 = self._configure_vrrp_router(vrrp_version,
+ prio,
+ _PRIMARY_IP_ADDRESS0,
+ self._IFNAME0,
+ vrid)
+ assert rep0.instance_name is not None
+ l[0] = rep0
+ prio = max(vrrp.VRRP_PRIORITY_BACKUP_MIN,
+ min(vrrp.VRRP_PRIORITY_BACKUP_MAX, 256 - vrid))
+ rep1 = self._configure_vrrp_router(vrrp_version,
+ prio,
+ _PRIMARY_IP_ADDRESS1,
+ self._IFNAME1,
+ vrid)
+ assert rep1.instance_name is not None
+ l[1] = rep1
+ instances[vrid] = l
+
+ print("vrid %s" % _VRID)
+ l = {}
+ rep0 = self._configure_vrrp_router(vrrp_version, priority,
+ _PRIMARY_IP_ADDRESS0,
+ self._IFNAME0, _VRID)
+ assert rep0.instance_name is not None
+ l[0] = rep0
+ rep1 = self._configure_vrrp_router(
+ vrrp_version, vrrp.VRRP_PRIORITY_BACKUP_DEFAULT,
+ _PRIMARY_IP_ADDRESS1, self._IFNAME1, _VRID)
+ assert rep1.instance_name is not None
+ l[1] = rep1
+ instances[_VRID] = l
+
+ self.logger.debug('%s', vrrp_mgr._instances)
+
+ if do_sleep:
+ print("priority %s" % priority)
+ print("waiting for instances starting")
+
+ self._check(vrrp_api, instances)
+
+ for vrid in instances.keys():
+ if vrid == _VRID:
+ continue
+ which = vrid & 1
+ new_priority = int(random.uniform(vrrp.VRRP_PRIORITY_BACKUP_MIN,
+ vrrp.VRRP_PRIORITY_BACKUP_MAX))
+ i = instances[vrid][which]
+ vrrp_api.vrrp_config_change(self, i.instance_name,
+ priority=new_priority)
+ i.config.priority = new_priority
+
+ if do_sleep:
+ print("priority shuffled")
+
+ self._check(vrrp_api, instances)
+
+ for vrid in instances.keys():
+ if vrid == _VRID:
+ continue
+ which = vrid & 1
+ vrrp_api.vrrp_shutdown(self, instances[vrid][which].instance_name)
+ vrrp_api.vrrp_shutdown(self, instances[_VRID][0].instance_name)
+
+ if do_sleep:
+ print("shutting down instances")
+ while True:
+ rep = vrrp_api.vrrp_list(self)
+ if len(rep.instance_list) <= len(instances):
+ break
+ print("left %s" % len(rep.instance_list))
+ time.sleep(1)
+ assert len(rep.instance_list) == len(instances)
+ print("waiting for the rest becoming master")
+ while True:
+ rep = vrrp_api.vrrp_list(self)
+ if all(i.state == vrrp_event.VRRP_STATE_MASTER
+ for i in rep.instance_list):
+ break
+ time.sleep(1)
+
+ vrrp_api.vrrp_shutdown(self, instances[_VRID][1].instance_name)
+ for vrid in instances.keys():
+ if vrid == _VRID:
+ continue
+ which = 1 - (vrid & 1)
+ vrrp_api.vrrp_shutdown(self, instances[vrid][which].instance_name)
+
+ print("waiting for instances shutting down")
+ while True:
+ rep = vrrp_api.vrrp_list(self)
+ if not rep.instance_list:
+ break
+ print("left %s" % len(rep.instance_list))
+ time.sleep(1)
diff --git a/tests/mininet/l2/mpls/PopMPLS_mpls.mn b/tests/mininet/l2/mpls/PopMPLS_mpls.mn
new file mode 100644
index 00000000..45fa9f96
--- /dev/null
+++ b/tests/mininet/l2/mpls/PopMPLS_mpls.mn
@@ -0,0 +1,6 @@
+TEST_NAME=MPLS-PopMPLS
+DUMP_HOST=h2
+DUMP_IF=h2-eth0
+RYU_APP=test_mpls
+PCAP_MZ="-t tcp -M 80 -P $TEST_NAME -c 3 -r"
+PCAP_FILTER="! mpls && ip.proto==TCP"
diff --git a/tests/mininet/l2/mpls/PushMPLS_ip.mn b/tests/mininet/l2/mpls/PushMPLS_ip.mn
new file mode 100644
index 00000000..2634e788
--- /dev/null
+++ b/tests/mininet/l2/mpls/PushMPLS_ip.mn
@@ -0,0 +1,6 @@
+TEST_NAME=IP-PushMPLS
+DUMP_HOST=h2
+DUMP_IF=h2-eth0
+RYU_APP=test_mpls
+PCAP_MZ="-t tcp -P $TEST_NAME -c 3 -b 00:00:00:00:00:02"
+PCAP_FILTER="mpls && ip.proto==TCP"
diff --git a/tests/mininet/l2/mpls/PushMPLS_mpls.mn b/tests/mininet/l2/mpls/PushMPLS_mpls.mn
new file mode 100644
index 00000000..5ac1702f
--- /dev/null
+++ b/tests/mininet/l2/mpls/PushMPLS_mpls.mn
@@ -0,0 +1,6 @@
+TEST_NAME=MPLS-PushMPLS
+DUMP_HOST=h2
+DUMP_IF=h2-eth0
+RYU_APP=test_mpls
+PCAP_MZ="-t tcp -M 100 -P $TEST_NAME -c 3 -r"
+PCAP_FILTER="mpls.label==100 && mpls.label==200 && ip.proto==TCP"
diff --git a/tests/mininet/l2/mpls/test_mpls.py b/tests/mininet/l2/mpls/test_mpls.py
new file mode 100644
index 00000000..3090a08c
--- /dev/null
+++ b/tests/mininet/l2/mpls/test_mpls.py
@@ -0,0 +1,127 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import struct
+
+from ryu.base import app_manager
+from ryu.controller import ofp_event
+from ryu.controller import dpset
+from ryu.controller.handler import MAIN_DISPATCHER
+from ryu.controller.handler import set_ev_cls
+from ryu.ofproto import ofproto_v1_2
+from ryu.ofproto import ether
+from ryu.lib.mac import haddr_to_str
+
+
+LOG = logging.getLogger(__name__)
+
+
+class RunTestMininet(app_manager.RyuApp):
+
+ _CONTEXTS = {'dpset': dpset.DPSet}
+ OFP_VERSIONS = [ofproto_v1_2.OFP_VERSION]
+
+ def __init__(self, *args, **kwargs):
+ super(RunTestMininet, self).__init__(*args, **kwargs)
+
+ def _add_flow(self, dp, match, actions):
+ inst = [dp.ofproto_parser.OFPInstructionActions(
+ dp.ofproto.OFPIT_APPLY_ACTIONS, actions)]
+
+ mod = dp.ofproto_parser.OFPFlowMod(
+ dp, cookie=0, cookie_mask=0, table_id=0,
+ command=dp.ofproto.OFPFC_ADD, idle_timeout=0, hard_timeout=0,
+ priority=0xff, buffer_id=0xffffffff,
+ out_port=dp.ofproto.OFPP_ANY, out_group=dp.ofproto.OFPG_ANY,
+ flags=0, match=match, instructions=inst)
+
+ dp.send_msg(mod)
+
+ def _define_flow(self, dp):
+ in_port = 1
+ out_port = 2
+
+ eth_IP = ether.ETH_TYPE_IP
+ eth_MPLS = ether.ETH_TYPE_MPLS
+
+ # MPLS(80) -> PopMPLS
+ LOG.debug("--- add_flow PopMPLS")
+ m_label = 80
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ match.set_dl_type(eth_MPLS)
+ match.set_mpls_label(m_label)
+ actions = [dp.ofproto_parser.OFPActionPopMpls(eth_IP),
+ dp.ofproto_parser.OFPActionOutput(out_port, 0)]
+ self._add_flow(dp, match, actions)
+
+ # IP -> PushMPLS(90)
+ LOG.debug("--- add_flow PushMPLS")
+ s_label = 90
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ match.set_dl_type(eth_IP)
+ f = dp.ofproto_parser.OFPMatchField.make(
+ dp.ofproto.OXM_OF_MPLS_LABEL, s_label)
+ actions = [dp.ofproto_parser.OFPActionPushMpls(eth_MPLS),
+ dp.ofproto_parser.OFPActionSetField(f),
+ dp.ofproto_parser.OFPActionOutput(out_port, 0)]
+ self._add_flow(dp, match, actions)
+
+ # MPLS(100) -> PushMPLS(200)
+ LOG.debug("--- add_flow PushMPLS")
+ m_label = 100
+ s_label = 200
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ match.set_dl_type(eth_MPLS)
+ match.set_mpls_label(m_label)
+ f = dp.ofproto_parser.OFPMatchField.make(
+ dp.ofproto.OXM_OF_MPLS_LABEL, s_label)
+ actions = [dp.ofproto_parser.OFPActionPushMpls(eth_MPLS),
+ dp.ofproto_parser.OFPActionSetField(f),
+ dp.ofproto_parser.OFPActionOutput(out_port, 0)]
+ self._add_flow(dp, match, actions)
+
+ # MPLS(1000):MPLS -> PopMPLS
+ # LOG.debug("--- add_flow PopMPLS")
+ # SKIP: ovs not supported
+ m_label = 1000
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ match.set_dl_type(eth_MPLS)
+ match.set_mpls_label(m_label)
+ actions = [dp.ofproto_parser.OFPActionPopMpls(eth_MPLS),
+ dp.ofproto_parser.OFPActionOutput(out_port, 0)]
+ # self._add_flow(dp, match, actions)
+
+ @set_ev_cls(dpset.EventDP, dpset.DPSET_EV_DISPATCHER)
+ def handler_datapath(self, ev):
+ if ev.enter:
+ self._define_flow(ev.dp)
+
+ @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
+ def packet_in_handler(self, ev):
+ msg = ev.msg
+ dst, src, eth_type = struct.unpack_from('!6s6sH', buffer(msg.data), 0)
+ in_port = msg.match.fields[0].value
+
+ LOG.info("----------------------------------------")
+ LOG.info("* PacketIn")
+ LOG.info("in_port=%d, eth_type: %s", in_port, hex(eth_type))
+ LOG.info("packet reason=%d buffer_id=%d", msg.reason, msg.buffer_id)
+ LOG.info("packet in datapath_id=%s src=%s dst=%s",
+ msg.datapath.id, haddr_to_str(src), haddr_to_str(dst))
diff --git a/tests/mininet/l2/vlan/PopVLAN_vlan.mn b/tests/mininet/l2/vlan/PopVLAN_vlan.mn
new file mode 100644
index 00000000..f1d1c6dd
--- /dev/null
+++ b/tests/mininet/l2/vlan/PopVLAN_vlan.mn
@@ -0,0 +1,6 @@
+TEST_NAME=VLAN-PopVLAN
+DUMP_HOST=h2
+DUMP_IF=h2-eth0
+RYU_APP=test_vlan
+PCAP_MZ="-t tcp -Q 8 -P $TEST_NAME -c 3 -r"
+PCAP_FILTER="! vlan && ip.proto==TCP"
diff --git a/tests/mininet/l2/vlan/PopVLAN_vlanvlan.mn b/tests/mininet/l2/vlan/PopVLAN_vlanvlan.mn
new file mode 100644
index 00000000..90444a75
--- /dev/null
+++ b/tests/mininet/l2/vlan/PopVLAN_vlanvlan.mn
@@ -0,0 +1,6 @@
+TEST_NAME=VLAN:VLAN-PopVLAN
+DUMP_HOST=h2
+DUMP_IF=h2-eth0
+RYU_APP=test_vlan
+PCAP_MZ="-t tcp -Q 100,99 -P $TEST_NAME -c 3 -r"
+PCAP_FILTER="vlan.id!=100 && vlan.id==99 && ip.proto==TCP"
diff --git a/tests/mininet/l2/vlan/PushVLAN_icmp.mn b/tests/mininet/l2/vlan/PushVLAN_icmp.mn
new file mode 100644
index 00000000..439ad233
--- /dev/null
+++ b/tests/mininet/l2/vlan/PushVLAN_icmp.mn
@@ -0,0 +1,6 @@
+TEST_NAME=ICMP-PushVLAN
+DUMP_HOST=h2
+DUMP_IF=h2-eth0
+RYU_APP=test_vlan
+PCAP_MZ="-t icmp ping -P $TEST_NAME -c 3 -r -b 00:00:00:00:00:02"
+PCAP_FILTER="vlan && icmp.type==8"
diff --git a/tests/mininet/l2/vlan/test_vlan.py b/tests/mininet/l2/vlan/test_vlan.py
new file mode 100644
index 00000000..0b1be7fc
--- /dev/null
+++ b/tests/mininet/l2/vlan/test_vlan.py
@@ -0,0 +1,130 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import struct
+
+from ryu.base import app_manager
+from ryu.controller import ofp_event
+from ryu.controller import dpset
+from ryu.controller.handler import MAIN_DISPATCHER
+from ryu.controller.handler import set_ev_cls
+from ryu.ofproto import ofproto_v1_2
+from ryu.ofproto import ether
+from ryu.ofproto import inet
+from ryu.lib.mac import haddr_to_str
+
+
+LOG = logging.getLogger(__name__)
+
+
+class RunTestMininet(app_manager.RyuApp):
+
+ _CONTEXTS = {'dpset': dpset.DPSet}
+ OFP_VERSIONS = [ofproto_v1_2.OFP_VERSION]
+
+ def __init__(self, *args, **kwargs):
+ super(RunTestMininet, self).__init__(*args, **kwargs)
+
+ def _add_flow(self, dp, match, actions):
+ inst = [dp.ofproto_parser.OFPInstructionActions(
+ dp.ofproto.OFPIT_APPLY_ACTIONS, actions)]
+
+ mod = dp.ofproto_parser.OFPFlowMod(
+ dp, cookie=0, cookie_mask=0, table_id=0,
+ command=dp.ofproto.OFPFC_ADD, idle_timeout=0, hard_timeout=0,
+ priority=0xff, buffer_id=0xffffffff,
+ out_port=dp.ofproto.OFPP_ANY, out_group=dp.ofproto.OFPG_ANY,
+ flags=0, match=match, instructions=inst)
+
+ dp.send_msg(mod)
+
+ def _define_flow(self, dp):
+ in_port = 1
+ out_port = 2
+
+ eth_IP = ether.ETH_TYPE_IP
+ eth_VLAN = ether.ETH_TYPE_8021Q
+ ip_ICMP = inet.IPPROTO_ICMP
+
+ # VLAN(8) -> PopVLAN
+ LOG.debug("--- add_flow VLAN(8) to PopVLAN")
+ m_vid = 8
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ match.set_dl_type(eth_IP)
+ match.set_vlan_vid(m_vid)
+ actions = [dp.ofproto_parser.OFPActionPopVlan(),
+ dp.ofproto_parser.OFPActionOutput(out_port, 0)]
+ self._add_flow(dp, match, actions)
+
+ # ICMP -> PushVLAN(9)
+ LOG.debug("--- add_flow ICMP to PushVLAN(9)")
+ s_vid = 9
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ match.set_dl_type(eth_IP)
+ match.set_ip_proto(ip_ICMP)
+ f = dp.ofproto_parser.OFPMatchField.make(
+ dp.ofproto.OXM_OF_VLAN_VID, s_vid)
+ actions = [dp.ofproto_parser.OFPActionPushVlan(eth_VLAN),
+ dp.ofproto_parser.OFPActionSetField(f),
+ dp.ofproto_parser.OFPActionOutput(out_port, 0)]
+ self._add_flow(dp, match, actions)
+
+ # VLAN(10) -> PushVLAN(20)
+ # LOG.debug("--- add_flow VLAN(10) to PushVLAN(100)")
+ # SKIP: ovs not supported
+ m_vid = 10
+ s_vid = 20
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ match.set_dl_type(eth_IP)
+ match.set_vlan_vid(m_vid)
+ f = dp.ofproto_parser.OFPMatchField.make(
+ dp.ofproto.OXM_OF_VLAN_VID, s_vid)
+ actions = [dp.ofproto_parser.OFPActionPushVlan(eth_VLAN),
+ dp.ofproto_parser.OFPActionSetField(f),
+ dp.ofproto_parser.OFPActionOutput(out_port, 0)]
+ # self._add_flow(dp, match, actions)
+
+ # VLAN(100):VLAN -> PopVLAN
+ LOG.debug("--- add_flow VLAN(100):VLAN to PopVLAN")
+ m_vid = 100
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ match.set_dl_type(eth_VLAN)
+ match.set_vlan_vid(m_vid)
+ actions = [dp.ofproto_parser.OFPActionPopVlan(),
+ dp.ofproto_parser.OFPActionOutput(out_port, 0)]
+ self._add_flow(dp, match, actions)
+
+ @set_ev_cls(dpset.EventDP, dpset.DPSET_EV_DISPATCHER)
+ def handler_datapath(self, ev):
+ if ev.enter:
+ self._define_flow(ev.dp)
+
+ @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
+ def packet_in_handler(self, ev):
+ msg = ev.msg
+ dst, src, eth_type = struct.unpack_from('!6s6sH', buffer(msg.data), 0)
+ in_port = msg.match.fields[0].value
+
+ LOG.info("----------------------------------------")
+ LOG.info("* PacketIn")
+ LOG.info("in_port=%d, eth_type: %s", in_port, hex(eth_type))
+ LOG.info("packet reason=%d buffer_id=%d", msg.reason, msg.buffer_id)
+ LOG.info("packet in datapath_id=%s src=%s dst=%s",
+ msg.datapath.id, haddr_to_str(src), haddr_to_str(dst))
diff --git a/tests/mininet/l3/icmp/ICMP_ping.mn b/tests/mininet/l3/icmp/ICMP_ping.mn
new file mode 100644
index 00000000..f558693d
--- /dev/null
+++ b/tests/mininet/l3/icmp/ICMP_ping.mn
@@ -0,0 +1,6 @@
+TEST_NAME=ICMP-Req
+DUMP_HOST=h2
+DUMP_IF=h2-eth0
+RYU_APP=test_icmp
+PCAP_MZ="-t icmp ping -c 3 -r -b 00:00:00:00:00:00"
+PCAP_FILTER="icmp.type==8"
diff --git a/tests/mininet/l3/icmp/ICMP_reply.mn b/tests/mininet/l3/icmp/ICMP_reply.mn
new file mode 100644
index 00000000..eb6bc8b6
--- /dev/null
+++ b/tests/mininet/l3/icmp/ICMP_reply.mn
@@ -0,0 +1,6 @@
+TEST_NAME=ICMP-Reply
+DUMP_HOST=h1
+DUMP_IF=h1-eth0
+RYU_APP=test_icmp
+PCAP_MZ="-t icmp ping -c 3 -r -B h2"
+PCAP_FILTER="icmp.type==0"
diff --git a/tests/mininet/l3/icmp/test_icmp.py b/tests/mininet/l3/icmp/test_icmp.py
new file mode 100644
index 00000000..090f83e5
--- /dev/null
+++ b/tests/mininet/l3/icmp/test_icmp.py
@@ -0,0 +1,84 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import struct
+
+from ryu.base import app_manager
+from ryu.controller import ofp_event
+from ryu.controller import dpset
+from ryu.controller.handler import MAIN_DISPATCHER
+from ryu.controller.handler import set_ev_cls
+from ryu.ofproto import ofproto_v1_2
+from ryu.lib.mac import haddr_to_str
+
+
+LOG = logging.getLogger(__name__)
+
+
+class RunTestMininet(app_manager.RyuApp):
+
+ _CONTEXTS = {'dpset': dpset.DPSet}
+ OFP_VERSIONS = [ofproto_v1_2.OFP_VERSION]
+
+ def __init__(self, *args, **kwargs):
+ super(RunTestMininet, self).__init__(*args, **kwargs)
+
+ def _add_flow(self, dp, match, actions):
+ inst = [dp.ofproto_parser.OFPInstructionActions(
+ dp.ofproto.OFPIT_APPLY_ACTIONS, actions)]
+
+ mod = dp.ofproto_parser.OFPFlowMod(
+ dp, cookie=0, cookie_mask=0, table_id=0,
+ command=dp.ofproto.OFPFC_ADD, idle_timeout=0, hard_timeout=0,
+ priority=0xff, buffer_id=0xffffffff,
+ out_port=dp.ofproto.OFPP_ANY, out_group=dp.ofproto.OFPG_ANY,
+ flags=0, match=match, instructions=inst)
+
+ dp.send_msg(mod)
+
+ def _define_flow(self, dp):
+ in_port = 1
+ out_port = 2
+
+ # port:1 -> port:2
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ actions = [dp.ofproto_parser.OFPActionOutput(out_port, 0)]
+ self._add_flow(dp, match, actions)
+
+ # port:1 -> port:2
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(out_port)
+ actions = [dp.ofproto_parser.OFPActionOutput(in_port, 0)]
+ self._add_flow(dp, match, actions)
+
+ @set_ev_cls(dpset.EventDP, dpset.DPSET_EV_DISPATCHER)
+ def handler_datapath(self, ev):
+ if ev.enter:
+ self._define_flow(ev.dp)
+
+ @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
+ def packet_in_handler(self, ev):
+ msg = ev.msg
+ dst, src, eth_type = struct.unpack_from('!6s6sH', buffer(msg.data), 0)
+ in_port = msg.match.fields[0].value
+
+ LOG.info("----------------------------------------")
+ LOG.info("* PacketIn")
+ LOG.info("in_port=%d, eth_type: %s", in_port, hex(eth_type))
+ LOG.info("packet reason=%d buffer_id=%d", msg.reason, msg.buffer_id)
+ LOG.info("packet in datapath_id=%s src=%s dst=%s",
+ msg.datapath.id, haddr_to_str(src), haddr_to_str(dst))
diff --git a/tests/mininet/l3/ip_ttl/DecNwTtl.mn b/tests/mininet/l3/ip_ttl/DecNwTtl.mn
new file mode 100644
index 00000000..60cd4623
--- /dev/null
+++ b/tests/mininet/l3/ip_ttl/DecNwTtl.mn
@@ -0,0 +1,6 @@
+TEST_NAME=DecNwTtl
+DUMP_HOST=h2
+DUMP_IF=h2-eth0
+RYU_APP=test_ip_ttl
+PCAP_MZ="-t icmp ttl=64 -P $TEST_NAME -c 3 -b 00:00:00:00:00:02"
+PCAP_FILTER="icmp && ip.ttl==63"
diff --git a/tests/mininet/l3/ip_ttl/test_ip_ttl.py b/tests/mininet/l3/ip_ttl/test_ip_ttl.py
new file mode 100644
index 00000000..f6f00ab9
--- /dev/null
+++ b/tests/mininet/l3/ip_ttl/test_ip_ttl.py
@@ -0,0 +1,84 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import struct
+
+from ryu.base import app_manager
+from ryu.controller import ofp_event
+from ryu.controller import dpset
+from ryu.controller.handler import MAIN_DISPATCHER
+from ryu.controller.handler import set_ev_cls
+from ryu.ofproto import ofproto_v1_2
+from ryu.ofproto import ether
+from ryu.lib.mac import haddr_to_str
+
+
+LOG = logging.getLogger(__name__)
+
+
+class RunTestMininet(app_manager.RyuApp):
+
+ _CONTEXTS = {'dpset': dpset.DPSet}
+ OFP_VERSIONS = [ofproto_v1_2.OFP_VERSION]
+
+ def __init__(self, *args, **kwargs):
+ super(RunTestMininet, self).__init__(*args, **kwargs)
+
+ def _add_flow(self, dp, match, actions):
+ inst = [dp.ofproto_parser.OFPInstructionActions(
+ dp.ofproto.OFPIT_APPLY_ACTIONS, actions)]
+
+ mod = dp.ofproto_parser.OFPFlowMod(
+ dp, cookie=0, cookie_mask=0, table_id=0,
+ command=dp.ofproto.OFPFC_ADD, idle_timeout=0, hard_timeout=0,
+ priority=0xff, buffer_id=0xffffffff,
+ out_port=dp.ofproto.OFPP_ANY, out_group=dp.ofproto.OFPG_ANY,
+ flags=0, match=match, instructions=inst)
+
+ dp.send_msg(mod)
+
+ def _define_flow(self, dp):
+ in_port = 1
+ out_port = 2
+
+ eth_IP = ether.ETH_TYPE_IP
+
+ # ICMP -> DecNwTtl
+ LOG.debug("--- add_flow DecNwTtl")
+ match = dp.ofproto_parser.OFPMatch()
+ match.set_in_port(in_port)
+ match.set_dl_type(eth_IP)
+ actions = [dp.ofproto_parser.OFPActionDecNwTtl(),
+ dp.ofproto_parser.OFPActionOutput(out_port, 0)]
+ self._add_flow(dp, match, actions)
+
+ @set_ev_cls(dpset.EventDP, dpset.DPSET_EV_DISPATCHER)
+ def handler_datapath(self, ev):
+ if ev.enter:
+ self._define_flow(ev.dp)
+
+ @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
+ def packet_in_handler(self, ev):
+ msg = ev.msg
+ dst, src, eth_type = struct.unpack_from('!6s6sH', buffer(msg.data), 0)
+ in_port = msg.match.fields[0].value
+
+ LOG.info("----------------------------------------")
+ LOG.info("* PacketIn")
+ LOG.info("in_port=%d, eth_type: %s", in_port, hex(eth_type))
+ LOG.info("packet reason=%d buffer_id=%d", msg.reason, msg.buffer_id)
+ LOG.info("packet in datapath_id=%s src=%s dst=%s",
+ msg.datapath.id, haddr_to_str(src), haddr_to_str(dst))
diff --git a/tests/mininet/packet_lib/arp/ARP_gratuitous.mn b/tests/mininet/packet_lib/arp/ARP_gratuitous.mn
new file mode 100644
index 00000000..ca7a30ae
--- /dev/null
+++ b/tests/mininet/packet_lib/arp/ARP_gratuitous.mn
@@ -0,0 +1,7 @@
+# test-GratuitousARP-request
+TEST_NAME=GARP-Request
+DUMP_HOST=h1
+DUMP_IF=h1-eth0
+RYU_APP=test_arp
+PCAP_MZ="-S"
+PCAP_FILTER="arp.isgratuitous && arp.src.proto_ipv4==10.0.0.100 && arp.src.hw_mac==fe:ee:ee:ee:ee:ef"
diff --git a/tests/mininet/packet_lib/arp/ARP_reply.mn b/tests/mininet/packet_lib/arp/ARP_reply.mn
new file mode 100644
index 00000000..3969cba1
--- /dev/null
+++ b/tests/mininet/packet_lib/arp/ARP_reply.mn
@@ -0,0 +1,7 @@
+# test-ARP-reply
+TEST_NAME=ARP-Reply
+DUMP_HOST=h1
+DUMP_IF=h1-eth0
+RYU_APP=test_arp
+PCAP_MZ="-t arp request,targetip=10.0.0.100 -c 3 -r"
+PCAP_FILTER="arp.opcode==reply && arp.src.proto_ipv4==10.0.0.100 && arp.src.hw_mac==fe:ee:ee:ee:ee:ef"
diff --git a/tests/mininet/packet_lib/arp/ARP_request.mn b/tests/mininet/packet_lib/arp/ARP_request.mn
new file mode 100644
index 00000000..b44450ef
--- /dev/null
+++ b/tests/mininet/packet_lib/arp/ARP_request.mn
@@ -0,0 +1,7 @@
+# test-ARP-request
+TEST_NAME=ARP-Request
+DUMP_HOST=h1
+DUMP_IF=h1-eth0
+RYU_APP=test_arp
+PCAP_MZ="-t arp request,targetip=10.0.0.1"
+PCAP_FILTER="arp.opcode==request && arp.src.proto_ipv4==10.0.0.100 && arp.dst.proto_ipv4==10.0.0.1 && arp.src.hw_mac==fe:ee:ee:ee:ee:ef"
diff --git a/tests/mininet/packet_lib/arp/test_arp.py b/tests/mininet/packet_lib/arp/test_arp.py
new file mode 100644
index 00000000..39948f54
--- /dev/null
+++ b/tests/mininet/packet_lib/arp/test_arp.py
@@ -0,0 +1,199 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import logging
+import array
+import netaddr
+
+from ryu.base import app_manager
+from ryu.controller import dpset
+from ryu.controller import ofp_event
+from ryu.controller import handler
+from ryu.ofproto import ofproto_v1_2
+from ryu.ofproto import ether
+from ryu.ofproto import inet
+from ryu.lib import mac
+from ryu.lib.packet import packet
+from ryu.lib.packet import ethernet
+from ryu.lib.packet import arp
+from ryu.lib.packet import ipv4
+from ryu.lib.packet import icmp
+
+
+LOG = logging.getLogger(__name__)
+
+
+class RunTestMininet(app_manager.RyuApp):
+
+ _CONTEXTS = {'dpset': dpset.DPSet}
+ OFP_VERSIONS = [ofproto_v1_2.OFP_VERSION]
+
+ ZERO_MAC = mac.haddr_to_bin('00:00:00:00:00:00')
+ BROADCAST_MAC = mac.haddr_to_bin('ff:ff:ff:ff:ff:ff')
+ RYU_MAC = mac.haddr_to_bin('fe:ee:ee:ee:ee:ef')
+ HOST_MAC = mac.haddr_to_bin('00:00:00:00:00:01')
+ RYU_IP = int(netaddr.IPAddress('10.0.0.100'))
+ HOST_IP = int(netaddr.IPAddress('10.0.0.1'))
+
+ def __init__(self, *args, **kwargs):
+ super(RunTestMininet, self).__init__(*args, **kwargs)
+
+ def _send_msg(self, dp, data):
+ buffer_id = 0xffffffff
+ in_port = dp.ofproto.OFPP_LOCAL
+ actions = [dp.ofproto_parser.OFPActionOutput(1, 0)]
+ msg = dp.ofproto_parser.OFPPacketOut(
+ dp, buffer_id, in_port, actions, data)
+ dp.send_msg(msg)
+
+ def _add_flow(self, dp, match, actions):
+ inst = [dp.ofproto_parser.OFPInstructionActions(
+ dp.ofproto.OFPIT_APPLY_ACTIONS, actions)]
+ mod = dp.ofproto_parser.OFPFlowMod(
+ dp, cookie=0, cookie_mask=0, table_id=0,
+ command=dp.ofproto.OFPFC_ADD, idle_timeout=0, hard_timeout=0,
+ priority=0xff, buffer_id=0xffffffff,
+ out_port=dp.ofproto.OFPP_ANY, out_group=dp.ofproto.OFPG_ANY,
+ flags=0, match=match, instructions=inst)
+ dp.send_msg(mod)
+
+ def _find_protocol(self, pkt, name):
+ for p in pkt.protocols:
+ if hasattr(p, 'protocol_name'):
+ if p.protocol_name == name:
+ return p
+
+ def _get_protocols(self, pkt):
+ protocols = {}
+ for p in pkt:
+ if hasattr(p, 'protocol_name'):
+ protocols[p.protocol_name] = p
+ else:
+ protocols['payload'] = p
+ return protocols
+
+ def _build_ether(self, ethertype, dst_mac=HOST_MAC):
+ e = ethernet.ethernet(dst_mac, self.RYU_MAC, ethertype)
+ return e
+
+ def _build_arp(self, opcode, dst_ip=HOST_IP):
+ if opcode == arp.ARP_REQUEST:
+ _eth_dst_mac = self.BROADCAST_MAC
+ _arp_dst_mac = self.ZERO_MAC
+ elif opcode == arp.ARP_REPLY:
+ _eth_dst_mac = self.HOST_MAC
+ _arp_dst_mac = self.HOST_MAC
+
+ e = self._build_ether(ether.ETH_TYPE_ARP, _eth_dst_mac)
+ a = arp.arp(hwtype=1, proto=ether.ETH_TYPE_IP, hlen=6, plen=4,
+ opcode=opcode, src_mac=self.RYU_MAC, src_ip=self.RYU_IP,
+ dst_mac=_arp_dst_mac, dst_ip=dst_ip)
+ p = packet.Packet()
+ p.add_protocol(e)
+ p.add_protocol(a)
+ p.serialize()
+
+ return p
+
+ def _build_echo(self, _type, echo):
+ e = self._build_ether(ether.ETH_TYPE_IP)
+ ip = ipv4.ipv4(version=4, header_length=5, tos=0, total_length=84,
+ identification=0, flags=0, offset=0, ttl=64,
+ proto=inet.IPPROTO_ICMP, csum=0,
+ src=self.RYU_IP, dst=self.HOST_IP)
+ ping = icmp.icmp(_type, code=0, csum=0, data=echo)
+
+ p = packet.Packet()
+ p.add_protocol(e)
+ p.add_protocol(ip)
+ p.add_protocol(ping)
+ p.serialize()
+ return p
+
+ def _garp(self):
+ p = self._build_arp(arp.ARP_REQUEST, self.RYU_IP)
+ return p.data
+
+ def _arp_request(self):
+ p = self._build_arp(arp.ARP_REQUEST, self.HOST_IP)
+ return p.data
+
+ def _arp_reply(self):
+ p = self._build_arp(arp.ARP_REPLY, self.HOST_IP)
+ return p.data
+
+ def _echo_request(self, echo):
+ p = self._build_echo(icmp.ICMP_ECHO_REQUEST, echo)
+ return p.data
+
+ def _echo_reply(self, echo):
+ p = self._build_echo(icmp.ICMP_ECHO_REPLY, echo)
+ return p.data
+
+ @handler.set_ev_cls(ofp_event.EventOFPPacketIn, handler.MAIN_DISPATCHER)
+ def packet_in_handler(self, ev):
+ msg = ev.msg
+ dp = msg.datapath
+
+ pkt = packet.Packet(array.array('B', msg.data))
+ p_arp = self._find_protocol(pkt, "arp")
+ p_icmp = self._find_protocol(pkt, "icmp")
+ p_ipv4 = self._find_protocol(pkt, "ipv4")
+
+ if p_arp:
+ src_ip = str(netaddr.IPAddress(p_arp.src_ip))
+ dst_ip = str(netaddr.IPAddress(p_arp.dst_ip))
+ if p_arp.opcode == arp.ARP_REQUEST:
+ LOG.debug("--- PacketIn: ARP_Request: %s->%s", src_ip, dst_ip)
+ if p_arp.dst_ip == self.RYU_IP:
+ LOG.debug("--- send Pkt: ARP_Reply")
+ data = self._arp_reply()
+ self._send_msg(dp, data)
+ elif p_arp.dst_ip == self.HOST_IP:
+ LOG.debug(" PacketIn: GARP")
+ LOG.debug("--- send Pkt: ARP_Request")
+ data = self._arp_request()
+ self._send_msg(dp, data)
+ elif p_arp.opcode == arp.ARP_REPLY:
+ LOG.debug("--- PacketIn: ARP_Reply: %s->%s", src_ip, dst_ip)
+ LOG.debug("--- send Pkt: Echo_Request")
+ echo = icmp.echo(id_=66, seq=1)
+ data = self._echo_request(echo)
+ self._send_msg(dp, data)
+
+ if p_icmp:
+ src = str(netaddr.IPAddress(p_ipv4.src))
+ dst = str(netaddr.IPAddress(p_ipv4.dst))
+ if p_icmp.type == icmp.ICMP_ECHO_REQUEST:
+ LOG.debug("--- PacketIn: Echo_Request: %s->%s", src, dst)
+ if p_ipv4.dst == self.RYU_IP:
+ LOG.debug("--- send Pkt: Echo_Reply")
+ echo = p_icmp.data
+ echo.data = bytearray(echo.data)
+ data = self._echo_reply(echo)
+ self._send_msg(dp, data)
+ elif p_icmp.type == icmp.ICMP_ECHO_REPLY:
+ LOG.debug("--- PacketIn: Echo_Reply: %s->%s", src, dst)
+
+ @handler.set_ev_cls(dpset.EventDP, dpset.DPSET_EV_DISPATCHER)
+ def handler_datapath(self, ev):
+ if ev.enter:
+ dp = ev.dp
+
+ LOG.debug("--- send Pkt: Gratuitous ARP_Request")
+ data = self._garp()
+ self._send_msg(dp, data)
diff --git a/tests/mininet/run_mnet-test.sh b/tests/mininet/run_mnet-test.sh
new file mode 100755
index 00000000..c1ecbe23
--- /dev/null
+++ b/tests/mininet/run_mnet-test.sh
@@ -0,0 +1,274 @@
+#!/bin/sh
+
+RUN_DIR=`dirname $0`
+CMD_NAME=`basename $0 .sh`
+CMD_PATH=`readlink -f $0`
+CMD_DIR=`dirname $CMD_PATH`
+DUMP_SEC=10
+DUMP_DELAY=2
+DUMP_DIR=/tmp/test-mn/dump
+TEST_LIST=
+TEST_SUFFIX=.mn
+MN_PRE_FILE=/tmp/test-mn/mn-pre
+MN_POST_FILE=/tmp/test-mn/mn-post
+PKG_LIST="tshark tcpreplay mz"
+RTN=0
+
+# usage
+usage() {
+ echo "Usage: $0 [OPTION] [TEST DIR or FILE]..."
+ echo ""
+ echo "Run Ryu's test in mininet"
+ echo "ex.) $ $0 l2 l3/icmp/ICMP_ping.mn"
+ echo ""
+ echo "Options:"
+ echo " -h, --help show this help message and exit"
+ exit 0
+}
+
+# set default environment
+set_env() {
+ POST_IF=h1-eth0
+ DUMP_HOST=h2
+ DUMP_IF=h2-eth0
+ TEST_NAME=
+ DUMP_FILE=
+ RYU_APP=
+ RYU_LOG=
+ PCAP_MZ=
+ PCAP_FILE=
+ PCAP_FILTER=
+ PCAP_COM=
+ CACHE_HIT=
+}
+
+# making mininet-test-pre-file
+mn_pre() {
+ exec 3>&1
+ exec >$MN_PRE_FILE
+ echo "sh echo '----------------------------------'"
+ echo "sh echo '(pre) mininet topology dump.'"
+ echo "sh echo '----------------------------------'"
+ echo "dump"
+ echo "net"
+ echo "sh echo '----------------------------------'"
+ echo "sh echo '(pre) tshark start.'"
+ echo "sh echo '----------------------------------'"
+ echo "$DUMP_HOST tshark -i $DUMP_IF -a duration:$DUMP_SEC -w $DUMP_FILE &"
+ echo "sh sleep $DUMP_DELAY"
+ echo "sh echo '----------------------------------'"
+ exec 1>&3
+}
+
+# making mininet-test-post-file
+mn_post() {
+ exec 3>&1
+ exec >$MN_POST_FILE
+ echo "sh ovs-vsctl del-controller s1"
+ echo "sh ovs-vsctl set bridge s1 protocols='[OpenFlow10,OpenFlow12]'"
+ echo "sh ovs-vsctl set-controller s1 tcp:127.0.0.1"
+ echo "sh echo '----------------------------------'"
+ echo "sh echo '(post) packet sending...'"
+ echo "sh echo '----------------------------------'"
+ echo $PCAP_COM
+ echo "sh sleep 1"
+ echo "sh echo '----------------------------------'"
+ echo "sh echo '(post) dump flows.'"
+ echo "sh echo '----------------------------------'"
+ echo "sh ovs-ofctl dump-flows s1"
+ echo "sh echo '----------------------------------'"
+ exec 1>&3
+}
+
+# ovs cache-hit incremental check
+ovs_cache_hit() {
+ expr `sudo ovs-dpctl show|sed -n 's|lookups: hit:||gp'|awk '{print $1}'` - ${1:-0}
+}
+
+# starting ryu-manager
+run_ryu() {
+ ERRSTAT=0
+ ERRTAG="run_ryu() :"
+
+ echo "Inf: RYU_APP=$RYU_APP"
+ echo "Inf: ryu-manager starting..."
+ ryu-manager --verbose $RYU_APP 2>$DUMP_DIR/$RYU_LOG &
+ PID_RYU=$!
+ sleep 1
+ [ -d /proc/$PID_RYU ] || err $ERRTAG "failed to start ryu-manager."
+
+ return $ERRSTAT
+}
+
+# starting mininet and test-script
+run_mn() {
+ echo "Info: mininet starting..."
+ sudo mn --mac --test none --pre $MN_PRE_FILE --post $MN_POST_FILE \
+ --controller remote 127.0.0.1
+}
+
+# cleaning after mininet
+clean_mn() {
+ wait_ryu
+ rm -f $MN_PRE_FILE $MN_POST_FILE
+}
+
+# check packet and chache-hit
+check() {
+ PACKET=`tshark -r $DUMP_FILE -R "$PCAP_FILTER" 2>/dev/null`
+ if [ ! "$PACKET" ]; then
+ RESULT=NG
+ REASON="(unmatched packet. please check $DUMP_FILE)"
+ elif [ "$CACHE_HIT" ] && [ `ovs_cache_hit $CACHE_HIT` -eq 0 ]; then
+ RESULT=NG
+ REASON="(ovs cache hit miss.)"
+ else
+ RESULT=OK; REASON=
+ fi
+ echo
+ echo "TEST ${TEST_NAME} : $RESULT $REASON"
+}
+
+# stoping ryu-manager
+wait_ryu() {
+ kill -2 $PID_RYU
+ wait $PID_RYU
+}
+
+# test-main
+test_mn() {
+ DUMP_FILE=$DUMP_DIR/$DUMP_FILE
+ touch $DUMP_FILE
+ sudo chmod o+w $DUMP_FILE
+ [ "$CACHE_HIT" ] && CACHE_HIT=`ovs_cache_hit 0`
+ mn_pre
+ mn_post
+ run_ryu; [ $? -ne 0 ] && return 1
+ run_mn; [ $? -ne 0 ] && return 1
+ check
+
+ return 0
+}
+
+err() {
+ echo Error: $*
+ ERRSTAT=1
+}
+
+mnfile_check() {
+ test=`basename $1 $TEST_SUFFIX`
+ file=`readlink -f $1`
+ TEST_DIR=`dirname $file`
+ ERRSTAT=0
+ ERRTAG="mnfile_check() :"
+
+ # test-file check
+ if [ ! -r $file ]; then
+ err $ERRTAG "cannot open the file: $file"
+ return $ERRSTAT
+ fi
+
+ . $file || err $ERRTAG "failed to include $file"
+
+ # parameter check
+ [ "$RYU_APP" ] || err $ERRTAG: "RYU_APP is not defined"
+ [ "$PCAP_FILE" -o "$PCAP_MZ" ] || err $ERRTAG: "PCAP_FILE or PCAP_MZ is not defined"
+ [ "$PCAP_FILTER" ] || err $ERRTAG "PCAP_FILTER is not defined"
+ [ "$TEST_NAME" ] || TEST_NAME=$test
+ [ "$DUMP_FILE" ] || DUMP_FILE=$test.dump
+ [ "$RYU_LOG" ] || RYU_LOG=ryu-manager.$test.log
+ [ $ERRSTAT -ne 0 ] && return $ERRSTAT
+
+ # pcap check (pcap-file or mz-option)
+ if [ "$PCAP_FILE" ]; then
+ PCAP_FILE=$TEST_DIR/$PCAP_FILE
+ [ -r $PCAP_FILE ] || err $ERRTAG "PCAP_FILE[$PCAP_FILE] cannot read"
+ PCAP_COM="h1 tcpreplay -l 3 -i $POST_IF $PCAP_FILE"
+ elif [ "$PCAP_MZ" ]; then
+ PCAP_COM="h1 mz $POST_IF $PCAP_MZ"
+ fi
+ [ $ERRSTAT -ne 0 ] && return $ERRSTAT
+
+ # ryu-app check
+ [ -r $TEST_DIR/$RYU_APP -o -r $TEST_DIR/${RYU_APP}.py ] && RYU_APP=$TEST_DIR/$RYU_APP
+
+ return $ERRSTAT
+}
+
+arg_check() {
+ ARGLIST=
+ ERRTAG="argcheck() :"
+
+ case "$1" in
+ -h|--help) usage;;
+ esac
+
+ if [ $# -ne 0 ]; then
+ ARGLIST=$*
+ else
+ ARGLIST=`find . -type f -name "*$TEST_SUFFIX"`
+ fi
+
+ for arg in $ARGLIST; do
+ if [ -d $arg ]; then
+ file=`find $arg -type f -name "*$TEST_SUFFIX"`
+ elif [ -f $arg ]; then
+ file=$arg
+ else
+ err $ERRTAG "$arg is not found"
+ file=
+ fi
+
+ TEST_LIST="$TEST_LIST $file"
+ done
+}
+
+pkg_check() {
+ no_pkg=
+ for pkg in $PKG_LIST; do
+ [ ! `which $pkg` ] && no_pkg="$no_pkg $pkg"
+ done
+ for pkg in $no_pkg; do
+ echo "Error: Package [ $pkg ] is not found. Please install."
+ done
+ [ "$no_pkg" ] && exit 1
+}
+
+### main
+[ -d $DUMP_DIR ] || mkdir -p $DUMP_DIR
+
+pkg_check
+arg_check $*
+echo "\n---------- test target ----------"
+for testfile in $TEST_LIST; do echo $testfile; done
+
+count=0
+for testfile in $TEST_LIST; do
+ echo "\n---------- test [$testfile] start ----------"
+ set_env
+ mnfile_check $testfile && test_mn
+ case $? in
+ 0) msg="finished : $RESULT" ;;
+ *) msg="skipped with error"; RESULT="skip" ;;
+ esac
+ eval RESULT_${count}=\$RESULT
+ eval REASON_${count}=\$REASON
+ count=`expr $count + 1`
+ num=`eval echo \\${num_$RESULT:-0}`
+ eval num_${RESULT}=`expr $num + 1`
+ [ "$RESULT" != "OK" ] && RTN=1
+ clean_mn
+ echo "\n---------- test [$testfile] $msg ----------"
+done
+
+# output summary results
+echo "\n---------- test results ----------"
+count=0
+for testfile in $TEST_LIST; do
+ eval echo \$testfile : \$RESULT_${count} \$REASON_${count}
+ count=`expr $count + 1`
+done
+echo "----------------------------------"
+echo "Ran $count tests. Result: ${num_OK:+OK=}$num_OK ${num_NG:+NG=}$num_NG ${num_skip:+skip=}$num_skip"
+
+exit $RTN
diff --git a/tests/packet_data/bgp4/bgp4-keepalive.pcap b/tests/packet_data/bgp4/bgp4-keepalive.pcap
new file mode 100644
index 00000000..355e9dab
--- /dev/null
+++ b/tests/packet_data/bgp4/bgp4-keepalive.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/bgp4-open.pcap b/tests/packet_data/bgp4/bgp4-open.pcap
new file mode 100644
index 00000000..1ef507bb
--- /dev/null
+++ b/tests/packet_data/bgp4/bgp4-open.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/bgp4-update.pcap b/tests/packet_data/bgp4/bgp4-update.pcap
new file mode 100644
index 00000000..37354938
--- /dev/null
+++ b/tests/packet_data/bgp4/bgp4-update.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/bgp4-update_ipv6.pcap b/tests/packet_data/bgp4/bgp4-update_ipv6.pcap
new file mode 100644
index 00000000..49ed4d9e
--- /dev/null
+++ b/tests/packet_data/bgp4/bgp4-update_ipv6.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/bgp4-update_vpnv6.pcap b/tests/packet_data/bgp4/bgp4-update_vpnv6.pcap
new file mode 100644
index 00000000..07e5ebb3
--- /dev/null
+++ b/tests/packet_data/bgp4/bgp4-update_vpnv6.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/evpn_esi_arbitrary.pcap b/tests/packet_data/bgp4/evpn_esi_arbitrary.pcap
new file mode 100644
index 00000000..490ee839
--- /dev/null
+++ b/tests/packet_data/bgp4/evpn_esi_arbitrary.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/evpn_esi_as_based.pcap b/tests/packet_data/bgp4/evpn_esi_as_based.pcap
new file mode 100644
index 00000000..d17183a7
--- /dev/null
+++ b/tests/packet_data/bgp4/evpn_esi_as_based.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/evpn_esi_l2_bridge.pcap b/tests/packet_data/bgp4/evpn_esi_l2_bridge.pcap
new file mode 100644
index 00000000..0f8d3f95
--- /dev/null
+++ b/tests/packet_data/bgp4/evpn_esi_l2_bridge.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/evpn_esi_lacp.pcap b/tests/packet_data/bgp4/evpn_esi_lacp.pcap
new file mode 100644
index 00000000..833109b5
--- /dev/null
+++ b/tests/packet_data/bgp4/evpn_esi_lacp.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/evpn_esi_mac_base.pcap b/tests/packet_data/bgp4/evpn_esi_mac_base.pcap
new file mode 100644
index 00000000..3b6fa798
--- /dev/null
+++ b/tests/packet_data/bgp4/evpn_esi_mac_base.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/evpn_esi_router_id.pcap b/tests/packet_data/bgp4/evpn_esi_router_id.pcap
new file mode 100644
index 00000000..b69ce620
--- /dev/null
+++ b/tests/packet_data/bgp4/evpn_esi_router_id.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/evpn_nlri_eth_a-d.pcap b/tests/packet_data/bgp4/evpn_nlri_eth_a-d.pcap
new file mode 100644
index 00000000..434c898a
--- /dev/null
+++ b/tests/packet_data/bgp4/evpn_nlri_eth_a-d.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/evpn_nlri_eth_seg.pcap b/tests/packet_data/bgp4/evpn_nlri_eth_seg.pcap
new file mode 100644
index 00000000..a99804b3
--- /dev/null
+++ b/tests/packet_data/bgp4/evpn_nlri_eth_seg.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/evpn_nlri_inc_multi_eth_tag.pcap b/tests/packet_data/bgp4/evpn_nlri_inc_multi_eth_tag.pcap
new file mode 100644
index 00000000..293722db
--- /dev/null
+++ b/tests/packet_data/bgp4/evpn_nlri_inc_multi_eth_tag.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/evpn_nlri_ip_prefix.pcap b/tests/packet_data/bgp4/evpn_nlri_ip_prefix.pcap
new file mode 100644
index 00000000..f1598ee8
--- /dev/null
+++ b/tests/packet_data/bgp4/evpn_nlri_ip_prefix.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/evpn_nlri_mac_ip_ad.pcap b/tests/packet_data/bgp4/evpn_nlri_mac_ip_ad.pcap
new file mode 100644
index 00000000..f9152e80
--- /dev/null
+++ b/tests/packet_data/bgp4/evpn_nlri_mac_ip_ad.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/flowspec_action_redirect.pcap b/tests/packet_data/bgp4/flowspec_action_redirect.pcap
new file mode 100644
index 00000000..70d65ee4
--- /dev/null
+++ b/tests/packet_data/bgp4/flowspec_action_redirect.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/flowspec_action_traffic_action.pcap b/tests/packet_data/bgp4/flowspec_action_traffic_action.pcap
new file mode 100644
index 00000000..952723ea
--- /dev/null
+++ b/tests/packet_data/bgp4/flowspec_action_traffic_action.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/flowspec_action_traffic_marking.pcap b/tests/packet_data/bgp4/flowspec_action_traffic_marking.pcap
new file mode 100644
index 00000000..8f00c0f9
--- /dev/null
+++ b/tests/packet_data/bgp4/flowspec_action_traffic_marking.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/flowspec_action_traffic_rate.pcap b/tests/packet_data/bgp4/flowspec_action_traffic_rate.pcap
new file mode 100644
index 00000000..9f20f5e6
--- /dev/null
+++ b/tests/packet_data/bgp4/flowspec_action_traffic_rate.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/flowspec_nlri_ipv4.pcap b/tests/packet_data/bgp4/flowspec_nlri_ipv4.pcap
new file mode 100644
index 00000000..885a106a
--- /dev/null
+++ b/tests/packet_data/bgp4/flowspec_nlri_ipv4.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/flowspec_nlri_ipv6.pcap b/tests/packet_data/bgp4/flowspec_nlri_ipv6.pcap
new file mode 100644
index 00000000..82534a61
--- /dev/null
+++ b/tests/packet_data/bgp4/flowspec_nlri_ipv6.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/flowspec_nlri_l2vpn.pcap b/tests/packet_data/bgp4/flowspec_nlri_l2vpn.pcap
new file mode 100644
index 00000000..5236c831
--- /dev/null
+++ b/tests/packet_data/bgp4/flowspec_nlri_l2vpn.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/flowspec_nlri_vpn4.pcap b/tests/packet_data/bgp4/flowspec_nlri_vpn4.pcap
new file mode 100644
index 00000000..236110db
--- /dev/null
+++ b/tests/packet_data/bgp4/flowspec_nlri_vpn4.pcap
Binary files differ
diff --git a/tests/packet_data/bgp4/flowspec_nlri_vpn6.pcap b/tests/packet_data/bgp4/flowspec_nlri_vpn6.pcap
new file mode 100644
index 00000000..cdf4c1c0
--- /dev/null
+++ b/tests/packet_data/bgp4/flowspec_nlri_vpn6.pcap
Binary files differ
diff --git a/tests/packet_data/mrt/rib.20161101.0000_pick.bz2 b/tests/packet_data/mrt/rib.20161101.0000_pick.bz2
new file mode 100644
index 00000000..0e02ef2d
--- /dev/null
+++ b/tests/packet_data/mrt/rib.20161101.0000_pick.bz2
Binary files differ
diff --git a/tests/packet_data/mrt/updates.20161101.0000.bz2 b/tests/packet_data/mrt/updates.20161101.0000.bz2
new file mode 100644
index 00000000..6caefe23
--- /dev/null
+++ b/tests/packet_data/mrt/updates.20161101.0000.bz2
Binary files differ
diff --git a/tests/packet_data/of10/1-1-ofp_packet_out.packet b/tests/packet_data/of10/1-1-ofp_packet_out.packet
new file mode 100644
index 00000000..8093e84c
--- /dev/null
+++ b/tests/packet_data/of10/1-1-ofp_packet_out.packet
Binary files differ
diff --git a/tests/packet_data/of10/1-2-ofp_flow_mod.packet b/tests/packet_data/of10/1-2-ofp_flow_mod.packet
new file mode 100644
index 00000000..881f4946
--- /dev/null
+++ b/tests/packet_data/of10/1-2-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of10/1-4-ofp_packet_in.packet b/tests/packet_data/of10/1-4-ofp_packet_in.packet
new file mode 100644
index 00000000..9321feb6
--- /dev/null
+++ b/tests/packet_data/of10/1-4-ofp_packet_in.packet
Binary files differ
diff --git a/tests/packet_data/of10/1-5-features_request.packet b/tests/packet_data/of10/1-5-features_request.packet
new file mode 100644
index 00000000..2faaf406
--- /dev/null
+++ b/tests/packet_data/of10/1-5-features_request.packet
Binary files differ
diff --git a/tests/packet_data/of10/1-6-ofp_switch_features.packet b/tests/packet_data/of10/1-6-ofp_switch_features.packet
new file mode 100644
index 00000000..31f17df3
--- /dev/null
+++ b/tests/packet_data/of10/1-6-ofp_switch_features.packet
Binary files differ
diff --git a/tests/packet_data/of10/libofproto-OFP10-ofp_packet_out_packet_library.packet b/tests/packet_data/of10/libofproto-OFP10-ofp_packet_out_packet_library.packet
new file mode 100644
index 00000000..8093e84c
--- /dev/null
+++ b/tests/packet_data/of10/libofproto-OFP10-ofp_packet_out_packet_library.packet
Binary files differ
diff --git a/tests/packet_data/of10/ovs-ofctl-of10-action_dec_mpls_ttl.packet b/tests/packet_data/of10/ovs-ofctl-of10-action_dec_mpls_ttl.packet
new file mode 100644
index 00000000..f2f6c279
--- /dev/null
+++ b/tests/packet_data/of10/ovs-ofctl-of10-action_dec_mpls_ttl.packet
Binary files differ
diff --git a/tests/packet_data/of10/ovs-ofctl-of10-action_dec_nw_ttl.packet b/tests/packet_data/of10/ovs-ofctl-of10-action_dec_nw_ttl.packet
new file mode 100644
index 00000000..38e0a2a2
--- /dev/null
+++ b/tests/packet_data/of10/ovs-ofctl-of10-action_dec_nw_ttl.packet
Binary files differ
diff --git a/tests/packet_data/of10/ovs-ofctl-of10-action_pop_mpls.packet b/tests/packet_data/of10/ovs-ofctl-of10-action_pop_mpls.packet
new file mode 100644
index 00000000..49c4a862
--- /dev/null
+++ b/tests/packet_data/of10/ovs-ofctl-of10-action_pop_mpls.packet
Binary files differ
diff --git a/tests/packet_data/of10/ovs-ofctl-of10-action_push_mpls.packet b/tests/packet_data/of10/ovs-ofctl-of10-action_push_mpls.packet
new file mode 100644
index 00000000..fc478e1f
--- /dev/null
+++ b/tests/packet_data/of10/ovs-ofctl-of10-action_push_mpls.packet
Binary files differ
diff --git a/tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_label.packet b/tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_label.packet
new file mode 100644
index 00000000..4c529139
--- /dev/null
+++ b/tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_label.packet
Binary files differ
diff --git a/tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_tc.packet b/tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_tc.packet
new file mode 100644
index 00000000..0b6dc347
--- /dev/null
+++ b/tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_tc.packet
Binary files differ
diff --git a/tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_ttl.packet b/tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_ttl.packet
new file mode 100644
index 00000000..424f9a74
--- /dev/null
+++ b/tests/packet_data/of10/ovs-ofctl-of10-action_set_mpls_ttl.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-0-ofp_desc_stats_reply.packet b/tests/packet_data/of12/3-0-ofp_desc_stats_reply.packet
new file mode 100644
index 00000000..17cfd664
--- /dev/null
+++ b/tests/packet_data/of12/3-0-ofp_desc_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-1-ofp_packet_out.packet b/tests/packet_data/of12/3-1-ofp_packet_out.packet
new file mode 100644
index 00000000..a9ebe1ef
--- /dev/null
+++ b/tests/packet_data/of12/3-1-ofp_packet_out.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-10-ofp_hello.packet b/tests/packet_data/of12/3-10-ofp_hello.packet
new file mode 100644
index 00000000..8894b8ce
--- /dev/null
+++ b/tests/packet_data/of12/3-10-ofp_hello.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-11-ofp_flow_stats_request.packet b/tests/packet_data/of12/3-11-ofp_flow_stats_request.packet
new file mode 100644
index 00000000..4c825f93
--- /dev/null
+++ b/tests/packet_data/of12/3-11-ofp_flow_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-12-ofp_flow_stats_reply.packet b/tests/packet_data/of12/3-12-ofp_flow_stats_reply.packet
new file mode 100644
index 00000000..73f7221e
--- /dev/null
+++ b/tests/packet_data/of12/3-12-ofp_flow_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-13-ofp_echo_request.packet b/tests/packet_data/of12/3-13-ofp_echo_request.packet
new file mode 100644
index 00000000..f67baba2
--- /dev/null
+++ b/tests/packet_data/of12/3-13-ofp_echo_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-14-ofp_echo_reply.packet b/tests/packet_data/of12/3-14-ofp_echo_reply.packet
new file mode 100644
index 00000000..f227be12
--- /dev/null
+++ b/tests/packet_data/of12/3-14-ofp_echo_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-15-ofp_error_msg.packet b/tests/packet_data/of12/3-15-ofp_error_msg.packet
new file mode 100644
index 00000000..21111bd3
--- /dev/null
+++ b/tests/packet_data/of12/3-15-ofp_error_msg.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-16-ofp_experimenter.packet b/tests/packet_data/of12/3-16-ofp_experimenter.packet
new file mode 100644
index 00000000..f9524ca5
--- /dev/null
+++ b/tests/packet_data/of12/3-16-ofp_experimenter.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-17-ofp_barrier_request.packet b/tests/packet_data/of12/3-17-ofp_barrier_request.packet
new file mode 100644
index 00000000..17a6f76a
--- /dev/null
+++ b/tests/packet_data/of12/3-17-ofp_barrier_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-18-ofp_barrier_reply.packet b/tests/packet_data/of12/3-18-ofp_barrier_reply.packet
new file mode 100644
index 00000000..8cd2f9e7
--- /dev/null
+++ b/tests/packet_data/of12/3-18-ofp_barrier_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-19-ofp_role_request.packet b/tests/packet_data/of12/3-19-ofp_role_request.packet
new file mode 100644
index 00000000..db2f24f5
--- /dev/null
+++ b/tests/packet_data/of12/3-19-ofp_role_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-2-ofp_flow_mod.packet b/tests/packet_data/of12/3-2-ofp_flow_mod.packet
new file mode 100644
index 00000000..f54ec6da
--- /dev/null
+++ b/tests/packet_data/of12/3-2-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-20-ofp_role_reply.packet b/tests/packet_data/of12/3-20-ofp_role_reply.packet
new file mode 100644
index 00000000..3e850878
--- /dev/null
+++ b/tests/packet_data/of12/3-20-ofp_role_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-21-ofp_group_mod.packet b/tests/packet_data/of12/3-21-ofp_group_mod.packet
new file mode 100644
index 00000000..0b45c318
--- /dev/null
+++ b/tests/packet_data/of12/3-21-ofp_group_mod.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-22-ofp_port_mod.packet b/tests/packet_data/of12/3-22-ofp_port_mod.packet
new file mode 100644
index 00000000..7bbbb6a5
--- /dev/null
+++ b/tests/packet_data/of12/3-22-ofp_port_mod.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-23-ofp_table_mod.packet b/tests/packet_data/of12/3-23-ofp_table_mod.packet
new file mode 100644
index 00000000..b6d68a30
--- /dev/null
+++ b/tests/packet_data/of12/3-23-ofp_table_mod.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-24-ofp_desc_stats_request.packet b/tests/packet_data/of12/3-24-ofp_desc_stats_request.packet
new file mode 100644
index 00000000..c59f6366
--- /dev/null
+++ b/tests/packet_data/of12/3-24-ofp_desc_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-25-ofp_aggregate_stats_request.packet b/tests/packet_data/of12/3-25-ofp_aggregate_stats_request.packet
new file mode 100644
index 00000000..05416ffd
--- /dev/null
+++ b/tests/packet_data/of12/3-25-ofp_aggregate_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-26-ofp_aggregate_stats_reply.packet b/tests/packet_data/of12/3-26-ofp_aggregate_stats_reply.packet
new file mode 100644
index 00000000..43c89051
--- /dev/null
+++ b/tests/packet_data/of12/3-26-ofp_aggregate_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-27-ofp_table_stats_request.packet b/tests/packet_data/of12/3-27-ofp_table_stats_request.packet
new file mode 100644
index 00000000..0d426129
--- /dev/null
+++ b/tests/packet_data/of12/3-27-ofp_table_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-28-ofp_table_stats_reply.packet b/tests/packet_data/of12/3-28-ofp_table_stats_reply.packet
new file mode 100644
index 00000000..60e76442
--- /dev/null
+++ b/tests/packet_data/of12/3-28-ofp_table_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-29-ofp_port_stats_request.packet b/tests/packet_data/of12/3-29-ofp_port_stats_request.packet
new file mode 100644
index 00000000..cebaac69
--- /dev/null
+++ b/tests/packet_data/of12/3-29-ofp_port_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-3-ofp_flow_mod.packet b/tests/packet_data/of12/3-3-ofp_flow_mod.packet
new file mode 100644
index 00000000..a3541cc4
--- /dev/null
+++ b/tests/packet_data/of12/3-3-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-30-ofp_port_stats_reply.packet b/tests/packet_data/of12/3-30-ofp_port_stats_reply.packet
new file mode 100644
index 00000000..77d9369f
--- /dev/null
+++ b/tests/packet_data/of12/3-30-ofp_port_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-31-ofp_group_features_stats_request.packet b/tests/packet_data/of12/3-31-ofp_group_features_stats_request.packet
new file mode 100644
index 00000000..9d11b936
--- /dev/null
+++ b/tests/packet_data/of12/3-31-ofp_group_features_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-32-ofp_group_features_stats_reply.packet b/tests/packet_data/of12/3-32-ofp_group_features_stats_reply.packet
new file mode 100644
index 00000000..d1f41595
--- /dev/null
+++ b/tests/packet_data/of12/3-32-ofp_group_features_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-33-ofp_group_desc_stats_request.packet b/tests/packet_data/of12/3-33-ofp_group_desc_stats_request.packet
new file mode 100644
index 00000000..1eef2113
--- /dev/null
+++ b/tests/packet_data/of12/3-33-ofp_group_desc_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-34-ofp_group_desc_stats_reply.packet b/tests/packet_data/of12/3-34-ofp_group_desc_stats_reply.packet
new file mode 100644
index 00000000..e17a933a
--- /dev/null
+++ b/tests/packet_data/of12/3-34-ofp_group_desc_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-35-ofp_queue_get_config_request.packet b/tests/packet_data/of12/3-35-ofp_queue_get_config_request.packet
new file mode 100644
index 00000000..66e380d6
--- /dev/null
+++ b/tests/packet_data/of12/3-35-ofp_queue_get_config_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-36-ofp_queue_get_config_reply.packet b/tests/packet_data/of12/3-36-ofp_queue_get_config_reply.packet
new file mode 100644
index 00000000..757308ee
--- /dev/null
+++ b/tests/packet_data/of12/3-36-ofp_queue_get_config_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-37-ofp_queue_stats_request.packet b/tests/packet_data/of12/3-37-ofp_queue_stats_request.packet
new file mode 100644
index 00000000..0d274478
--- /dev/null
+++ b/tests/packet_data/of12/3-37-ofp_queue_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-38-ofp_queue_stats_reply.packet b/tests/packet_data/of12/3-38-ofp_queue_stats_reply.packet
new file mode 100644
index 00000000..72a8af36
--- /dev/null
+++ b/tests/packet_data/of12/3-38-ofp_queue_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-39-ofp_port_status.packet b/tests/packet_data/of12/3-39-ofp_port_status.packet
new file mode 100644
index 00000000..7e3689ac
--- /dev/null
+++ b/tests/packet_data/of12/3-39-ofp_port_status.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-4-ofp_packet_in.packet b/tests/packet_data/of12/3-4-ofp_packet_in.packet
new file mode 100644
index 00000000..295e4d45
--- /dev/null
+++ b/tests/packet_data/of12/3-4-ofp_packet_in.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-40-ofp_flow_removed.packet b/tests/packet_data/of12/3-40-ofp_flow_removed.packet
new file mode 100644
index 00000000..330e429b
--- /dev/null
+++ b/tests/packet_data/of12/3-40-ofp_flow_removed.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-41-ofp_error_msg_experimenter.packet b/tests/packet_data/of12/3-41-ofp_error_msg_experimenter.packet
new file mode 100644
index 00000000..4b7c9bf4
--- /dev/null
+++ b/tests/packet_data/of12/3-41-ofp_error_msg_experimenter.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-5-ofp_features_request.packet b/tests/packet_data/of12/3-5-ofp_features_request.packet
new file mode 100644
index 00000000..6a81e9b5
--- /dev/null
+++ b/tests/packet_data/of12/3-5-ofp_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-59-ofp_packet_in.packet b/tests/packet_data/of12/3-59-ofp_packet_in.packet
new file mode 100644
index 00000000..e4a92b2a
--- /dev/null
+++ b/tests/packet_data/of12/3-59-ofp_packet_in.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-6-ofp_features_reply.packet b/tests/packet_data/of12/3-6-ofp_features_reply.packet
new file mode 100644
index 00000000..9e6128dc
--- /dev/null
+++ b/tests/packet_data/of12/3-6-ofp_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-60-ofp_flow_mod.packet b/tests/packet_data/of12/3-60-ofp_flow_mod.packet
new file mode 100644
index 00000000..13566ebe
--- /dev/null
+++ b/tests/packet_data/of12/3-60-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-61-ofp_group_stats_request.packet b/tests/packet_data/of12/3-61-ofp_group_stats_request.packet
new file mode 100644
index 00000000..523f4f13
--- /dev/null
+++ b/tests/packet_data/of12/3-61-ofp_group_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-62-ofp_group_stats_reply.packet b/tests/packet_data/of12/3-62-ofp_group_stats_reply.packet
new file mode 100644
index 00000000..33a5c52c
--- /dev/null
+++ b/tests/packet_data/of12/3-62-ofp_group_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-7-ofp_set_config.packet b/tests/packet_data/of12/3-7-ofp_set_config.packet
new file mode 100644
index 00000000..77e2d785
--- /dev/null
+++ b/tests/packet_data/of12/3-7-ofp_set_config.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-8-ofp_get_config_request.packet b/tests/packet_data/of12/3-8-ofp_get_config_request.packet
new file mode 100644
index 00000000..ba897a54
--- /dev/null
+++ b/tests/packet_data/of12/3-8-ofp_get_config_request.packet
Binary files differ
diff --git a/tests/packet_data/of12/3-9-ofp_get_config_reply.packet b/tests/packet_data/of12/3-9-ofp_get_config_reply.packet
new file mode 100644
index 00000000..ebaf895b
--- /dev/null
+++ b/tests/packet_data/of12/3-9-ofp_get_config_reply.packet
Binary files differ
diff --git a/tests/packet_data/of12/libofproto-OFP12-ofp_packet_out_packet_library.packet b/tests/packet_data/of12/libofproto-OFP12-ofp_packet_out_packet_library.packet
new file mode 100644
index 00000000..a9ebe1ef
--- /dev/null
+++ b/tests/packet_data/of12/libofproto-OFP12-ofp_packet_out_packet_library.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-0-ofp_desc_reply.packet b/tests/packet_data/of13/4-0-ofp_desc_reply.packet
new file mode 100644
index 00000000..edfaa375
--- /dev/null
+++ b/tests/packet_data/of13/4-0-ofp_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-1-ofp_packet_out.packet b/tests/packet_data/of13/4-1-ofp_packet_out.packet
new file mode 100644
index 00000000..cf6689f8
--- /dev/null
+++ b/tests/packet_data/of13/4-1-ofp_packet_out.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-10-ofp_hello.packet b/tests/packet_data/of13/4-10-ofp_hello.packet
new file mode 100644
index 00000000..644b4130
--- /dev/null
+++ b/tests/packet_data/of13/4-10-ofp_hello.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-11-ofp_flow_stats_request.packet b/tests/packet_data/of13/4-11-ofp_flow_stats_request.packet
new file mode 100644
index 00000000..6b9e0a90
--- /dev/null
+++ b/tests/packet_data/of13/4-11-ofp_flow_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-12-ofp_flow_stats_reply.packet b/tests/packet_data/of13/4-12-ofp_flow_stats_reply.packet
new file mode 100644
index 00000000..c7c1ac88
--- /dev/null
+++ b/tests/packet_data/of13/4-12-ofp_flow_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-13-ofp_echo_request.packet b/tests/packet_data/of13/4-13-ofp_echo_request.packet
new file mode 100644
index 00000000..d8d8bc42
--- /dev/null
+++ b/tests/packet_data/of13/4-13-ofp_echo_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-14-ofp_echo_reply.packet b/tests/packet_data/of13/4-14-ofp_echo_reply.packet
new file mode 100644
index 00000000..2ac9c0d5
--- /dev/null
+++ b/tests/packet_data/of13/4-14-ofp_echo_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-15-ofp_error_msg.packet b/tests/packet_data/of13/4-15-ofp_error_msg.packet
new file mode 100644
index 00000000..196dad1e
--- /dev/null
+++ b/tests/packet_data/of13/4-15-ofp_error_msg.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-16-ofp_experimenter.packet b/tests/packet_data/of13/4-16-ofp_experimenter.packet
new file mode 100644
index 00000000..0b6e2dd2
--- /dev/null
+++ b/tests/packet_data/of13/4-16-ofp_experimenter.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-17-ofp_barrier_request.packet b/tests/packet_data/of13/4-17-ofp_barrier_request.packet
new file mode 100644
index 00000000..4acb2096
--- /dev/null
+++ b/tests/packet_data/of13/4-17-ofp_barrier_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-18-ofp_barrier_reply.packet b/tests/packet_data/of13/4-18-ofp_barrier_reply.packet
new file mode 100644
index 00000000..04376c07
--- /dev/null
+++ b/tests/packet_data/of13/4-18-ofp_barrier_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-19-ofp_role_request.packet b/tests/packet_data/of13/4-19-ofp_role_request.packet
new file mode 100644
index 00000000..e2f3b381
--- /dev/null
+++ b/tests/packet_data/of13/4-19-ofp_role_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-2-ofp_flow_mod.packet b/tests/packet_data/of13/4-2-ofp_flow_mod.packet
new file mode 100644
index 00000000..0c2029bd
--- /dev/null
+++ b/tests/packet_data/of13/4-2-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-20-ofp_role_reply.packet b/tests/packet_data/of13/4-20-ofp_role_reply.packet
new file mode 100644
index 00000000..3f5ba399
--- /dev/null
+++ b/tests/packet_data/of13/4-20-ofp_role_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-21-ofp_group_mod.packet b/tests/packet_data/of13/4-21-ofp_group_mod.packet
new file mode 100644
index 00000000..39554777
--- /dev/null
+++ b/tests/packet_data/of13/4-21-ofp_group_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-22-ofp_port_mod.packet b/tests/packet_data/of13/4-22-ofp_port_mod.packet
new file mode 100644
index 00000000..be7044e1
--- /dev/null
+++ b/tests/packet_data/of13/4-22-ofp_port_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-23-ofp_table_mod.packet b/tests/packet_data/of13/4-23-ofp_table_mod.packet
new file mode 100644
index 00000000..02b8b020
--- /dev/null
+++ b/tests/packet_data/of13/4-23-ofp_table_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-24-ofp_desc_request.packet b/tests/packet_data/of13/4-24-ofp_desc_request.packet
new file mode 100644
index 00000000..b6de0577
--- /dev/null
+++ b/tests/packet_data/of13/4-24-ofp_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-25-ofp_aggregate_stats_request.packet b/tests/packet_data/of13/4-25-ofp_aggregate_stats_request.packet
new file mode 100644
index 00000000..645ddacf
--- /dev/null
+++ b/tests/packet_data/of13/4-25-ofp_aggregate_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-26-ofp_aggregate_stats_reply.packet b/tests/packet_data/of13/4-26-ofp_aggregate_stats_reply.packet
new file mode 100644
index 00000000..3d5cd801
--- /dev/null
+++ b/tests/packet_data/of13/4-26-ofp_aggregate_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-27-ofp_table_stats_request.packet b/tests/packet_data/of13/4-27-ofp_table_stats_request.packet
new file mode 100644
index 00000000..6fec06a4
--- /dev/null
+++ b/tests/packet_data/of13/4-27-ofp_table_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-28-ofp_table_stats_reply.packet b/tests/packet_data/of13/4-28-ofp_table_stats_reply.packet
new file mode 100644
index 00000000..1da72ab0
--- /dev/null
+++ b/tests/packet_data/of13/4-28-ofp_table_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-29-ofp_port_stats_request.packet b/tests/packet_data/of13/4-29-ofp_port_stats_request.packet
new file mode 100644
index 00000000..d1116401
--- /dev/null
+++ b/tests/packet_data/of13/4-29-ofp_port_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-3-ofp_flow_mod.packet b/tests/packet_data/of13/4-3-ofp_flow_mod.packet
new file mode 100644
index 00000000..8952a5be
--- /dev/null
+++ b/tests/packet_data/of13/4-3-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-30-ofp_port_stats_reply.packet b/tests/packet_data/of13/4-30-ofp_port_stats_reply.packet
new file mode 100644
index 00000000..8b8c182c
--- /dev/null
+++ b/tests/packet_data/of13/4-30-ofp_port_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-31-ofp_group_features_request.packet b/tests/packet_data/of13/4-31-ofp_group_features_request.packet
new file mode 100644
index 00000000..2175bb52
--- /dev/null
+++ b/tests/packet_data/of13/4-31-ofp_group_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-32-ofp_group_features_reply.packet b/tests/packet_data/of13/4-32-ofp_group_features_reply.packet
new file mode 100644
index 00000000..6f7715cd
--- /dev/null
+++ b/tests/packet_data/of13/4-32-ofp_group_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-33-ofp_group_desc_request.packet b/tests/packet_data/of13/4-33-ofp_group_desc_request.packet
new file mode 100644
index 00000000..35add41d
--- /dev/null
+++ b/tests/packet_data/of13/4-33-ofp_group_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-34-ofp_group_desc_reply.packet b/tests/packet_data/of13/4-34-ofp_group_desc_reply.packet
new file mode 100644
index 00000000..f3796cc1
--- /dev/null
+++ b/tests/packet_data/of13/4-34-ofp_group_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-35-ofp_queue_get_config_request.packet b/tests/packet_data/of13/4-35-ofp_queue_get_config_request.packet
new file mode 100644
index 00000000..13072c85
--- /dev/null
+++ b/tests/packet_data/of13/4-35-ofp_queue_get_config_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-36-ofp_queue_get_config_reply.packet b/tests/packet_data/of13/4-36-ofp_queue_get_config_reply.packet
new file mode 100644
index 00000000..898f0b3f
--- /dev/null
+++ b/tests/packet_data/of13/4-36-ofp_queue_get_config_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-37-ofp_queue_stats_request.packet b/tests/packet_data/of13/4-37-ofp_queue_stats_request.packet
new file mode 100644
index 00000000..4baf6d70
--- /dev/null
+++ b/tests/packet_data/of13/4-37-ofp_queue_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-38-ofp_queue_stats_reply.packet b/tests/packet_data/of13/4-38-ofp_queue_stats_reply.packet
new file mode 100644
index 00000000..ad6d1971
--- /dev/null
+++ b/tests/packet_data/of13/4-38-ofp_queue_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-39-ofp_port_status.packet b/tests/packet_data/of13/4-39-ofp_port_status.packet
new file mode 100644
index 00000000..63280c7d
--- /dev/null
+++ b/tests/packet_data/of13/4-39-ofp_port_status.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-4-ofp_packet_in.packet b/tests/packet_data/of13/4-4-ofp_packet_in.packet
new file mode 100644
index 00000000..ebd12b51
--- /dev/null
+++ b/tests/packet_data/of13/4-4-ofp_packet_in.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-40-ofp_flow_removed.packet b/tests/packet_data/of13/4-40-ofp_flow_removed.packet
new file mode 100644
index 00000000..677c2c4a
--- /dev/null
+++ b/tests/packet_data/of13/4-40-ofp_flow_removed.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-41-ofp_error_msg_experimenter.packet b/tests/packet_data/of13/4-41-ofp_error_msg_experimenter.packet
new file mode 100644
index 00000000..6d866b9a
--- /dev/null
+++ b/tests/packet_data/of13/4-41-ofp_error_msg_experimenter.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-42-ofp_get_async_request.packet b/tests/packet_data/of13/4-42-ofp_get_async_request.packet
new file mode 100644
index 00000000..4bffb26f
--- /dev/null
+++ b/tests/packet_data/of13/4-42-ofp_get_async_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-43-ofp_get_async_reply.packet b/tests/packet_data/of13/4-43-ofp_get_async_reply.packet
new file mode 100644
index 00000000..39897a94
--- /dev/null
+++ b/tests/packet_data/of13/4-43-ofp_get_async_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-44-ofp_set_async.packet b/tests/packet_data/of13/4-44-ofp_set_async.packet
new file mode 100644
index 00000000..de0aa1a4
--- /dev/null
+++ b/tests/packet_data/of13/4-44-ofp_set_async.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-45-ofp_meter_mod.packet b/tests/packet_data/of13/4-45-ofp_meter_mod.packet
new file mode 100644
index 00000000..1ffbcf7e
--- /dev/null
+++ b/tests/packet_data/of13/4-45-ofp_meter_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-46-ofp_flow_mod.packet b/tests/packet_data/of13/4-46-ofp_flow_mod.packet
new file mode 100644
index 00000000..496f1da0
--- /dev/null
+++ b/tests/packet_data/of13/4-46-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-47-ofp_meter_config_request.packet b/tests/packet_data/of13/4-47-ofp_meter_config_request.packet
new file mode 100644
index 00000000..21a11e10
--- /dev/null
+++ b/tests/packet_data/of13/4-47-ofp_meter_config_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-48-ofp_meter_config_reply.packet b/tests/packet_data/of13/4-48-ofp_meter_config_reply.packet
new file mode 100644
index 00000000..3f443269
--- /dev/null
+++ b/tests/packet_data/of13/4-48-ofp_meter_config_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-49-ofp_meter_stats_request.packet b/tests/packet_data/of13/4-49-ofp_meter_stats_request.packet
new file mode 100644
index 00000000..3b321aff
--- /dev/null
+++ b/tests/packet_data/of13/4-49-ofp_meter_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-5-ofp_features_request.packet b/tests/packet_data/of13/4-5-ofp_features_request.packet
new file mode 100644
index 00000000..7bb2775a
--- /dev/null
+++ b/tests/packet_data/of13/4-5-ofp_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-50-ofp_meter_stats_reply.packet b/tests/packet_data/of13/4-50-ofp_meter_stats_reply.packet
new file mode 100644
index 00000000..2317fc55
--- /dev/null
+++ b/tests/packet_data/of13/4-50-ofp_meter_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-51-ofp_meter_features_request.packet b/tests/packet_data/of13/4-51-ofp_meter_features_request.packet
new file mode 100644
index 00000000..c4007bfb
--- /dev/null
+++ b/tests/packet_data/of13/4-51-ofp_meter_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-52-ofp_meter_features_reply.packet b/tests/packet_data/of13/4-52-ofp_meter_features_reply.packet
new file mode 100644
index 00000000..fd9e3808
--- /dev/null
+++ b/tests/packet_data/of13/4-52-ofp_meter_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-53-ofp_port_desc_request.packet b/tests/packet_data/of13/4-53-ofp_port_desc_request.packet
new file mode 100644
index 00000000..0d859f1d
--- /dev/null
+++ b/tests/packet_data/of13/4-53-ofp_port_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-54-ofp_port_desc_reply.packet b/tests/packet_data/of13/4-54-ofp_port_desc_reply.packet
new file mode 100644
index 00000000..e30e9ae1
--- /dev/null
+++ b/tests/packet_data/of13/4-54-ofp_port_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-55-ofp_table_features_request.packet b/tests/packet_data/of13/4-55-ofp_table_features_request.packet
new file mode 100644
index 00000000..52b9d3b1
--- /dev/null
+++ b/tests/packet_data/of13/4-55-ofp_table_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-56-ofp_table_features_reply.packet b/tests/packet_data/of13/4-56-ofp_table_features_reply.packet
new file mode 100644
index 00000000..3a467f42
--- /dev/null
+++ b/tests/packet_data/of13/4-56-ofp_table_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-57-ofp_group_stats_request.packet b/tests/packet_data/of13/4-57-ofp_group_stats_request.packet
new file mode 100644
index 00000000..f59329e0
--- /dev/null
+++ b/tests/packet_data/of13/4-57-ofp_group_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-58-ofp_group_stats_reply.packet b/tests/packet_data/of13/4-58-ofp_group_stats_reply.packet
new file mode 100644
index 00000000..fe5a549a
--- /dev/null
+++ b/tests/packet_data/of13/4-58-ofp_group_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-59-ofp_packet_in.packet b/tests/packet_data/of13/4-59-ofp_packet_in.packet
new file mode 100644
index 00000000..f0879a37
--- /dev/null
+++ b/tests/packet_data/of13/4-59-ofp_packet_in.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-6-ofp_features_reply.packet b/tests/packet_data/of13/4-6-ofp_features_reply.packet
new file mode 100644
index 00000000..a9536330
--- /dev/null
+++ b/tests/packet_data/of13/4-6-ofp_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-60-ofp_flow_mod.packet b/tests/packet_data/of13/4-60-ofp_flow_mod.packet
new file mode 100644
index 00000000..0ca98351
--- /dev/null
+++ b/tests/packet_data/of13/4-60-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-61-ofp_experimenter_request.packet b/tests/packet_data/of13/4-61-ofp_experimenter_request.packet
new file mode 100644
index 00000000..2ee17648
--- /dev/null
+++ b/tests/packet_data/of13/4-61-ofp_experimenter_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-62-ofp_experimenter_reply.packet b/tests/packet_data/of13/4-62-ofp_experimenter_reply.packet
new file mode 100644
index 00000000..1f826829
--- /dev/null
+++ b/tests/packet_data/of13/4-62-ofp_experimenter_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-63-onf_flow_monitor_request.packet b/tests/packet_data/of13/4-63-onf_flow_monitor_request.packet
new file mode 100644
index 00000000..bf6d50e1
--- /dev/null
+++ b/tests/packet_data/of13/4-63-onf_flow_monitor_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-7-ofp_set_config.packet b/tests/packet_data/of13/4-7-ofp_set_config.packet
new file mode 100644
index 00000000..43602b3e
--- /dev/null
+++ b/tests/packet_data/of13/4-7-ofp_set_config.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-8-ofp_get_config_request.packet b/tests/packet_data/of13/4-8-ofp_get_config_request.packet
new file mode 100644
index 00000000..78ad5019
--- /dev/null
+++ b/tests/packet_data/of13/4-8-ofp_get_config_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/4-9-ofp_get_config_reply.packet b/tests/packet_data/of13/4-9-ofp_get_config_reply.packet
new file mode 100644
index 00000000..b23f7bf3
--- /dev/null
+++ b/tests/packet_data/of13/4-9-ofp_get_config_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-echo_reply.packet b/tests/packet_data/of13/libofproto-OFP13-echo_reply.packet
new file mode 100644
index 00000000..e54d3802
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-echo_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-echo_request.packet b/tests/packet_data/of13/libofproto-OFP13-echo_request.packet
new file mode 100644
index 00000000..a13c95dd
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-echo_request.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-error_msg.packet b/tests/packet_data/of13/libofproto-OFP13-error_msg.packet
new file mode 100644
index 00000000..33b43ca1
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-error_msg.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-features_reply.packet b/tests/packet_data/of13/libofproto-OFP13-features_reply.packet
new file mode 100644
index 00000000..1e5dee82
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-flow_mod.packet b/tests/packet_data/of13/libofproto-OFP13-flow_mod.packet
new file mode 100644
index 00000000..8c86982f
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-flow_mod.truncated64 b/tests/packet_data/of13/libofproto-OFP13-flow_mod.truncated64
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-flow_mod.truncated64
diff --git a/tests/packet_data/of13/libofproto-OFP13-flow_mod_conjunction.packet b/tests/packet_data/of13/libofproto-OFP13-flow_mod_conjunction.packet
new file mode 100644
index 00000000..e7e0154b
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-flow_mod_conjunction.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-flow_mod_match_conj.packet b/tests/packet_data/of13/libofproto-OFP13-flow_mod_match_conj.packet
new file mode 100644
index 00000000..c377092d
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-flow_mod_match_conj.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-flow_removed.packet b/tests/packet_data/of13/libofproto-OFP13-flow_removed.packet
new file mode 100644
index 00000000..c98a8f2b
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-flow_removed.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-get_config_reply.packet b/tests/packet_data/of13/libofproto-OFP13-get_config_reply.packet
new file mode 100644
index 00000000..b23f7bf3
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-get_config_reply.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-hello.packet b/tests/packet_data/of13/libofproto-OFP13-hello.packet
new file mode 100644
index 00000000..60b3118a
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-hello.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-meter_mod.packet b/tests/packet_data/of13/libofproto-OFP13-meter_mod.packet
new file mode 100644
index 00000000..60870dda
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-meter_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-ofp_packet_out_packet_library.packet b/tests/packet_data/of13/libofproto-OFP13-ofp_packet_out_packet_library.packet
new file mode 100644
index 00000000..cf6689f8
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-ofp_packet_out_packet_library.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-packet_in.packet b/tests/packet_data/of13/libofproto-OFP13-packet_in.packet
new file mode 100644
index 00000000..817b51c0
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-packet_in.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-port_mod.packet b/tests/packet_data/of13/libofproto-OFP13-port_mod.packet
new file mode 100644
index 00000000..105a27ee
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-port_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-port_status.packet b/tests/packet_data/of13/libofproto-OFP13-port_status.packet
new file mode 100644
index 00000000..7a2c14c4
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-port_status.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-set_config.packet b/tests/packet_data/of13/libofproto-OFP13-set_config.packet
new file mode 100644
index 00000000..43602b3e
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-set_config.packet
Binary files differ
diff --git a/tests/packet_data/of13/libofproto-OFP13-table_mod.packet b/tests/packet_data/of13/libofproto-OFP13-table_mod.packet
new file mode 100644
index 00000000..02b8b020
--- /dev/null
+++ b/tests/packet_data/of13/libofproto-OFP13-table_mod.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_conjunction.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_conjunction.packet
new file mode 100644
index 00000000..ba029b2c
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_conjunction.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_controller.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_controller.packet
new file mode 100644
index 00000000..8fba9040
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_controller.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_controller2.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_controller2.packet
new file mode 100644
index 00000000..7e6b046f
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_controller2.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_ct.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_ct.packet
new file mode 100644
index 00000000..5eb733f9
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_ct.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_ct_exec.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_ct_exec.packet
new file mode 100644
index 00000000..3f0b3431
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_ct_exec.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_ct_nat.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_ct_nat.packet
new file mode 100644
index 00000000..e210a38c
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_ct_nat.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_ct_nat_v6.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_ct_nat_v6.packet
new file mode 100644
index 00000000..94b2aaa9
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_ct_nat_v6.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_dec_ttl_cnt_ids.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_dec_ttl_cnt_ids.packet
new file mode 100644
index 00000000..c4308ccb
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_dec_ttl_cnt_ids.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_fintimeout.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_fintimeout.packet
new file mode 100644
index 00000000..78c3eab4
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_fintimeout.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_learn.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_learn.packet
new file mode 100644
index 00000000..39c71e20
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_learn.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_note.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_note.packet
new file mode 100644
index 00000000..9a1491c9
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_note.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_output_trunc.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_output_trunc.packet
new file mode 100644
index 00000000..491cf4c3
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_output_trunc.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_resubmit.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_resubmit.packet
new file mode 100644
index 00000000..690b978b
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_resubmit.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_sample.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_sample.packet
new file mode 100644
index 00000000..c5167ba2
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_sample.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_sample2.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_sample2.packet
new file mode 100644
index 00000000..444f094b
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_sample2.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_stack_pop.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_stack_pop.packet
new file mode 100644
index 00000000..d6f99e2c
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_stack_pop.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-action_stack_push.packet b/tests/packet_data/of13/ovs-ofctl-of13-action_stack_push.packet
new file mode 100644
index 00000000..e5d38a32
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-action_stack_push.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-match_conj.packet b/tests/packet_data/of13/ovs-ofctl-of13-match_conj.packet
new file mode 100644
index 00000000..1f9c57cd
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-match_conj.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-match_load_nx_register.packet b/tests/packet_data/of13/ovs-ofctl-of13-match_load_nx_register.packet
new file mode 100644
index 00000000..03ce7374
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-match_load_nx_register.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-match_move_nx_register.packet b/tests/packet_data/of13/ovs-ofctl-of13-match_move_nx_register.packet
new file mode 100644
index 00000000..eb9cf8a6
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-match_move_nx_register.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-match_pkt_mark.packet b/tests/packet_data/of13/ovs-ofctl-of13-match_pkt_mark.packet
new file mode 100644
index 00000000..46ea0dc9
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-match_pkt_mark.packet
Binary files differ
diff --git a/tests/packet_data/of13/ovs-ofctl-of13-match_pkt_mark_masked.packet b/tests/packet_data/of13/ovs-ofctl-of13-match_pkt_mark_masked.packet
new file mode 100644
index 00000000..26db6b92
--- /dev/null
+++ b/tests/packet_data/of13/ovs-ofctl-of13-match_pkt_mark_masked.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-0-ofp_desc_reply.packet b/tests/packet_data/of14/5-0-ofp_desc_reply.packet
new file mode 100644
index 00000000..8d676ce4
--- /dev/null
+++ b/tests/packet_data/of14/5-0-ofp_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-1-ofp_packet_out.packet b/tests/packet_data/of14/5-1-ofp_packet_out.packet
new file mode 100644
index 00000000..207712f1
--- /dev/null
+++ b/tests/packet_data/of14/5-1-ofp_packet_out.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-10-ofp_hello.packet b/tests/packet_data/of14/5-10-ofp_hello.packet
new file mode 100644
index 00000000..a91b5871
--- /dev/null
+++ b/tests/packet_data/of14/5-10-ofp_hello.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-11-ofp_flow_stats_request.packet b/tests/packet_data/of14/5-11-ofp_flow_stats_request.packet
new file mode 100644
index 00000000..f3ddcb7e
--- /dev/null
+++ b/tests/packet_data/of14/5-11-ofp_flow_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-12-ofp_flow_stats_reply.packet b/tests/packet_data/of14/5-12-ofp_flow_stats_reply.packet
new file mode 100644
index 00000000..aa6462c5
--- /dev/null
+++ b/tests/packet_data/of14/5-12-ofp_flow_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-13-ofp_echo_request.packet b/tests/packet_data/of14/5-13-ofp_echo_request.packet
new file mode 100644
index 00000000..b3f04d75
--- /dev/null
+++ b/tests/packet_data/of14/5-13-ofp_echo_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-14-ofp_echo_reply.packet b/tests/packet_data/of14/5-14-ofp_echo_reply.packet
new file mode 100644
index 00000000..74dcf540
--- /dev/null
+++ b/tests/packet_data/of14/5-14-ofp_echo_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-15-ofp_error_msg.packet b/tests/packet_data/of14/5-15-ofp_error_msg.packet
new file mode 100644
index 00000000..a7888dbd
--- /dev/null
+++ b/tests/packet_data/of14/5-15-ofp_error_msg.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-16-ofp_experimenter.packet b/tests/packet_data/of14/5-16-ofp_experimenter.packet
new file mode 100644
index 00000000..3ccc04a9
--- /dev/null
+++ b/tests/packet_data/of14/5-16-ofp_experimenter.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-17-ofp_barrier_request.packet b/tests/packet_data/of14/5-17-ofp_barrier_request.packet
new file mode 100644
index 00000000..7cbd74b9
--- /dev/null
+++ b/tests/packet_data/of14/5-17-ofp_barrier_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-18-ofp_barrier_reply.packet b/tests/packet_data/of14/5-18-ofp_barrier_reply.packet
new file mode 100644
index 00000000..16d7a23a
--- /dev/null
+++ b/tests/packet_data/of14/5-18-ofp_barrier_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-19-ofp_role_request.packet b/tests/packet_data/of14/5-19-ofp_role_request.packet
new file mode 100644
index 00000000..b6d780be
--- /dev/null
+++ b/tests/packet_data/of14/5-19-ofp_role_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-2-ofp_flow_mod.packet b/tests/packet_data/of14/5-2-ofp_flow_mod.packet
new file mode 100644
index 00000000..f07e8e53
--- /dev/null
+++ b/tests/packet_data/of14/5-2-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-20-ofp_role_reply.packet b/tests/packet_data/of14/5-20-ofp_role_reply.packet
new file mode 100644
index 00000000..3c7f5f74
--- /dev/null
+++ b/tests/packet_data/of14/5-20-ofp_role_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-21-ofp_group_mod.packet b/tests/packet_data/of14/5-21-ofp_group_mod.packet
new file mode 100644
index 00000000..63f6efbb
--- /dev/null
+++ b/tests/packet_data/of14/5-21-ofp_group_mod.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-22-ofp_port_mod.packet b/tests/packet_data/of14/5-22-ofp_port_mod.packet
new file mode 100644
index 00000000..2f733044
--- /dev/null
+++ b/tests/packet_data/of14/5-22-ofp_port_mod.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-23-ofp_table_mod.packet b/tests/packet_data/of14/5-23-ofp_table_mod.packet
new file mode 100644
index 00000000..8df2590c
--- /dev/null
+++ b/tests/packet_data/of14/5-23-ofp_table_mod.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-24-ofp_desc_request.packet b/tests/packet_data/of14/5-24-ofp_desc_request.packet
new file mode 100644
index 00000000..b6440fba
--- /dev/null
+++ b/tests/packet_data/of14/5-24-ofp_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-25-ofp_aggregate_stats_request.packet b/tests/packet_data/of14/5-25-ofp_aggregate_stats_request.packet
new file mode 100644
index 00000000..1adfc206
--- /dev/null
+++ b/tests/packet_data/of14/5-25-ofp_aggregate_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-26-ofp_aggregate_stats_reply.packet b/tests/packet_data/of14/5-26-ofp_aggregate_stats_reply.packet
new file mode 100644
index 00000000..6e1dcff5
--- /dev/null
+++ b/tests/packet_data/of14/5-26-ofp_aggregate_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-27-ofp_table_stats_request.packet b/tests/packet_data/of14/5-27-ofp_table_stats_request.packet
new file mode 100644
index 00000000..909fd9e9
--- /dev/null
+++ b/tests/packet_data/of14/5-27-ofp_table_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-28-ofp_table_stats_reply.packet b/tests/packet_data/of14/5-28-ofp_table_stats_reply.packet
new file mode 100644
index 00000000..66234198
--- /dev/null
+++ b/tests/packet_data/of14/5-28-ofp_table_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-29-ofp_port_stats_request.packet b/tests/packet_data/of14/5-29-ofp_port_stats_request.packet
new file mode 100644
index 00000000..86c828f3
--- /dev/null
+++ b/tests/packet_data/of14/5-29-ofp_port_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-3-ofp_flow_mod.packet b/tests/packet_data/of14/5-3-ofp_flow_mod.packet
new file mode 100644
index 00000000..130f8d14
--- /dev/null
+++ b/tests/packet_data/of14/5-3-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-30-ofp_port_stats_reply.packet b/tests/packet_data/of14/5-30-ofp_port_stats_reply.packet
new file mode 100644
index 00000000..0fd4fea9
--- /dev/null
+++ b/tests/packet_data/of14/5-30-ofp_port_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-31-ofp_group_features_request.packet b/tests/packet_data/of14/5-31-ofp_group_features_request.packet
new file mode 100644
index 00000000..8bd123d0
--- /dev/null
+++ b/tests/packet_data/of14/5-31-ofp_group_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-32-ofp_group_features_reply.packet b/tests/packet_data/of14/5-32-ofp_group_features_reply.packet
new file mode 100644
index 00000000..909b7fa4
--- /dev/null
+++ b/tests/packet_data/of14/5-32-ofp_group_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-33-ofp_group_desc_request.packet b/tests/packet_data/of14/5-33-ofp_group_desc_request.packet
new file mode 100644
index 00000000..2a86948f
--- /dev/null
+++ b/tests/packet_data/of14/5-33-ofp_group_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-34-ofp_group_desc_reply.packet b/tests/packet_data/of14/5-34-ofp_group_desc_reply.packet
new file mode 100644
index 00000000..9b00061a
--- /dev/null
+++ b/tests/packet_data/of14/5-34-ofp_group_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-35-ofp_queue_stats_request.packet b/tests/packet_data/of14/5-35-ofp_queue_stats_request.packet
new file mode 100644
index 00000000..7c52c9b4
--- /dev/null
+++ b/tests/packet_data/of14/5-35-ofp_queue_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-36-ofp_queue_stats_reply.packet b/tests/packet_data/of14/5-36-ofp_queue_stats_reply.packet
new file mode 100644
index 00000000..c0a5dd8c
--- /dev/null
+++ b/tests/packet_data/of14/5-36-ofp_queue_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-37-ofp_port_status.packet b/tests/packet_data/of14/5-37-ofp_port_status.packet
new file mode 100644
index 00000000..e8c67823
--- /dev/null
+++ b/tests/packet_data/of14/5-37-ofp_port_status.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-38-ofp_flow_removed.packet b/tests/packet_data/of14/5-38-ofp_flow_removed.packet
new file mode 100644
index 00000000..b8e35600
--- /dev/null
+++ b/tests/packet_data/of14/5-38-ofp_flow_removed.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-39-ofp_error_msg_experimenter.packet b/tests/packet_data/of14/5-39-ofp_error_msg_experimenter.packet
new file mode 100644
index 00000000..fed58222
--- /dev/null
+++ b/tests/packet_data/of14/5-39-ofp_error_msg_experimenter.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-4-ofp_packet_in.packet b/tests/packet_data/of14/5-4-ofp_packet_in.packet
new file mode 100644
index 00000000..35a91000
--- /dev/null
+++ b/tests/packet_data/of14/5-4-ofp_packet_in.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-40-ofp_get_async_request.packet b/tests/packet_data/of14/5-40-ofp_get_async_request.packet
new file mode 100644
index 00000000..b6e2c616
--- /dev/null
+++ b/tests/packet_data/of14/5-40-ofp_get_async_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-41-ofp_get_async_reply.packet b/tests/packet_data/of14/5-41-ofp_get_async_reply.packet
new file mode 100644
index 00000000..01ad90f6
--- /dev/null
+++ b/tests/packet_data/of14/5-41-ofp_get_async_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-42-ofp_set_async.packet b/tests/packet_data/of14/5-42-ofp_set_async.packet
new file mode 100644
index 00000000..0b3facf7
--- /dev/null
+++ b/tests/packet_data/of14/5-42-ofp_set_async.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-43-ofp_meter_mod.packet b/tests/packet_data/of14/5-43-ofp_meter_mod.packet
new file mode 100644
index 00000000..1e488764
--- /dev/null
+++ b/tests/packet_data/of14/5-43-ofp_meter_mod.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-44-ofp_flow_mod.packet b/tests/packet_data/of14/5-44-ofp_flow_mod.packet
new file mode 100644
index 00000000..6f66406d
--- /dev/null
+++ b/tests/packet_data/of14/5-44-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-45-ofp_meter_config_request.packet b/tests/packet_data/of14/5-45-ofp_meter_config_request.packet
new file mode 100644
index 00000000..af96b87e
--- /dev/null
+++ b/tests/packet_data/of14/5-45-ofp_meter_config_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-46-ofp_meter_config_reply.packet b/tests/packet_data/of14/5-46-ofp_meter_config_reply.packet
new file mode 100644
index 00000000..9611e8c4
--- /dev/null
+++ b/tests/packet_data/of14/5-46-ofp_meter_config_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-47-ofp_meter_stats_request.packet b/tests/packet_data/of14/5-47-ofp_meter_stats_request.packet
new file mode 100644
index 00000000..68145074
--- /dev/null
+++ b/tests/packet_data/of14/5-47-ofp_meter_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-48-ofp_meter_stats_reply.packet b/tests/packet_data/of14/5-48-ofp_meter_stats_reply.packet
new file mode 100644
index 00000000..b20f1784
--- /dev/null
+++ b/tests/packet_data/of14/5-48-ofp_meter_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-49-ofp_meter_features_request.packet b/tests/packet_data/of14/5-49-ofp_meter_features_request.packet
new file mode 100644
index 00000000..72b79cf1
--- /dev/null
+++ b/tests/packet_data/of14/5-49-ofp_meter_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-5-ofp_features_request.packet b/tests/packet_data/of14/5-5-ofp_features_request.packet
new file mode 100644
index 00000000..bc360d55
--- /dev/null
+++ b/tests/packet_data/of14/5-5-ofp_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-50-ofp_meter_features_reply.packet b/tests/packet_data/of14/5-50-ofp_meter_features_reply.packet
new file mode 100644
index 00000000..9d138430
--- /dev/null
+++ b/tests/packet_data/of14/5-50-ofp_meter_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-51-ofp_port_desc_request.packet b/tests/packet_data/of14/5-51-ofp_port_desc_request.packet
new file mode 100644
index 00000000..5aaa40d1
--- /dev/null
+++ b/tests/packet_data/of14/5-51-ofp_port_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-52-ofp_port_desc_reply.packet b/tests/packet_data/of14/5-52-ofp_port_desc_reply.packet
new file mode 100644
index 00000000..c844eef3
--- /dev/null
+++ b/tests/packet_data/of14/5-52-ofp_port_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-53-ofp_table_features_request.packet b/tests/packet_data/of14/5-53-ofp_table_features_request.packet
new file mode 100644
index 00000000..7a7317aa
--- /dev/null
+++ b/tests/packet_data/of14/5-53-ofp_table_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-54-ofp_table_features_reply.packet b/tests/packet_data/of14/5-54-ofp_table_features_reply.packet
new file mode 100644
index 00000000..6b622a36
--- /dev/null
+++ b/tests/packet_data/of14/5-54-ofp_table_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-55-ofp_group_stats_request.packet b/tests/packet_data/of14/5-55-ofp_group_stats_request.packet
new file mode 100644
index 00000000..a3ab88c1
--- /dev/null
+++ b/tests/packet_data/of14/5-55-ofp_group_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-56-ofp_group_stats_reply.packet b/tests/packet_data/of14/5-56-ofp_group_stats_reply.packet
new file mode 100644
index 00000000..2a19c4b6
--- /dev/null
+++ b/tests/packet_data/of14/5-56-ofp_group_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-57-ofp_packet_in.packet b/tests/packet_data/of14/5-57-ofp_packet_in.packet
new file mode 100644
index 00000000..f313389d
--- /dev/null
+++ b/tests/packet_data/of14/5-57-ofp_packet_in.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-58-ofp_flow_mod.packet b/tests/packet_data/of14/5-58-ofp_flow_mod.packet
new file mode 100644
index 00000000..456e89ad
--- /dev/null
+++ b/tests/packet_data/of14/5-58-ofp_flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-59-ofp_experimenter_request.packet b/tests/packet_data/of14/5-59-ofp_experimenter_request.packet
new file mode 100644
index 00000000..c41652e2
--- /dev/null
+++ b/tests/packet_data/of14/5-59-ofp_experimenter_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-6-ofp_features_reply.packet b/tests/packet_data/of14/5-6-ofp_features_reply.packet
new file mode 100644
index 00000000..1236be2d
--- /dev/null
+++ b/tests/packet_data/of14/5-6-ofp_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-60-ofp_experimenter_reply.packet b/tests/packet_data/of14/5-60-ofp_experimenter_reply.packet
new file mode 100644
index 00000000..4f2bdc6b
--- /dev/null
+++ b/tests/packet_data/of14/5-60-ofp_experimenter_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-61-ofp_table_desc_request.packet b/tests/packet_data/of14/5-61-ofp_table_desc_request.packet
new file mode 100644
index 00000000..5e728623
--- /dev/null
+++ b/tests/packet_data/of14/5-61-ofp_table_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-62-ofp_table_desc_reply.packet b/tests/packet_data/of14/5-62-ofp_table_desc_reply.packet
new file mode 100644
index 00000000..2f7b6e2e
--- /dev/null
+++ b/tests/packet_data/of14/5-62-ofp_table_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-63-ofp_queue_desc_request.packet b/tests/packet_data/of14/5-63-ofp_queue_desc_request.packet
new file mode 100644
index 00000000..78e584d8
--- /dev/null
+++ b/tests/packet_data/of14/5-63-ofp_queue_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-64-ofp_queue_desc_reply.packet b/tests/packet_data/of14/5-64-ofp_queue_desc_reply.packet
new file mode 100644
index 00000000..d9f6f11b
--- /dev/null
+++ b/tests/packet_data/of14/5-64-ofp_queue_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-65-ofp_role_status.packet b/tests/packet_data/of14/5-65-ofp_role_status.packet
new file mode 100644
index 00000000..cd753a30
--- /dev/null
+++ b/tests/packet_data/of14/5-65-ofp_role_status.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-66-ofp_flow_monitor_request.packet b/tests/packet_data/of14/5-66-ofp_flow_monitor_request.packet
new file mode 100644
index 00000000..1f8d8598
--- /dev/null
+++ b/tests/packet_data/of14/5-66-ofp_flow_monitor_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-67-ofp_flow_monitor_reply.packet b/tests/packet_data/of14/5-67-ofp_flow_monitor_reply.packet
new file mode 100644
index 00000000..b50fe8f5
--- /dev/null
+++ b/tests/packet_data/of14/5-67-ofp_flow_monitor_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-68-ofp_table_status.packet b/tests/packet_data/of14/5-68-ofp_table_status.packet
new file mode 100644
index 00000000..f630ccc2
--- /dev/null
+++ b/tests/packet_data/of14/5-68-ofp_table_status.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-69-ofp_bundle_ctrl_msg.packet b/tests/packet_data/of14/5-69-ofp_bundle_ctrl_msg.packet
new file mode 100644
index 00000000..8df1e6f8
--- /dev/null
+++ b/tests/packet_data/of14/5-69-ofp_bundle_ctrl_msg.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-7-ofp_set_config.packet b/tests/packet_data/of14/5-7-ofp_set_config.packet
new file mode 100644
index 00000000..0d22cd5a
--- /dev/null
+++ b/tests/packet_data/of14/5-7-ofp_set_config.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-70-ofp_bundle_add_msg.packet b/tests/packet_data/of14/5-70-ofp_bundle_add_msg.packet
new file mode 100644
index 00000000..5565f8d3
--- /dev/null
+++ b/tests/packet_data/of14/5-70-ofp_bundle_add_msg.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-71-ofp_requestforward.packet b/tests/packet_data/of14/5-71-ofp_requestforward.packet
new file mode 100644
index 00000000..d06e8b4a
--- /dev/null
+++ b/tests/packet_data/of14/5-71-ofp_requestforward.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-8-ofp_get_config_request.packet b/tests/packet_data/of14/5-8-ofp_get_config_request.packet
new file mode 100644
index 00000000..9e930df3
--- /dev/null
+++ b/tests/packet_data/of14/5-8-ofp_get_config_request.packet
Binary files differ
diff --git a/tests/packet_data/of14/5-9-ofp_get_config_reply.packet b/tests/packet_data/of14/5-9-ofp_get_config_reply.packet
new file mode 100644
index 00000000..f63f6c29
--- /dev/null
+++ b/tests/packet_data/of14/5-9-ofp_get_config_reply.packet
Binary files differ
diff --git a/tests/packet_data/of14/libofproto-OFP14-ofp_packet_out_packet_library.packet b/tests/packet_data/of14/libofproto-OFP14-ofp_packet_out_packet_library.packet
new file mode 100644
index 00000000..207712f1
--- /dev/null
+++ b/tests/packet_data/of14/libofproto-OFP14-ofp_packet_out_packet_library.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-aggregate_stats_reply.packet b/tests/packet_data/of15/libofproto-OFP15-aggregate_stats_reply.packet
new file mode 100644
index 00000000..bbb51918
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-aggregate_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-aggregate_stats_request.packet b/tests/packet_data/of15/libofproto-OFP15-aggregate_stats_request.packet
new file mode 100644
index 00000000..5abee5b4
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-aggregate_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-barrier_reply.packet b/tests/packet_data/of15/libofproto-OFP15-barrier_reply.packet
new file mode 100644
index 00000000..fc15112c
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-barrier_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-barrier_request.packet b/tests/packet_data/of15/libofproto-OFP15-barrier_request.packet
new file mode 100644
index 00000000..cda0a443
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-barrier_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-bundle_add.packet b/tests/packet_data/of15/libofproto-OFP15-bundle_add.packet
new file mode 100644
index 00000000..744af0fd
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-bundle_add.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-bundle_ctrl.packet b/tests/packet_data/of15/libofproto-OFP15-bundle_ctrl.packet
new file mode 100644
index 00000000..34b2f3bf
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-bundle_ctrl.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-bundle_features_reply.packet b/tests/packet_data/of15/libofproto-OFP15-bundle_features_reply.packet
new file mode 100644
index 00000000..450081e6
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-bundle_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-bundle_features_request.packet b/tests/packet_data/of15/libofproto-OFP15-bundle_features_request.packet
new file mode 100644
index 00000000..8d078ef2
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-bundle_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-controller_status.packet b/tests/packet_data/of15/libofproto-OFP15-controller_status.packet
new file mode 100644
index 00000000..9b63794e
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-controller_status.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-controller_status_reply.packet b/tests/packet_data/of15/libofproto-OFP15-controller_status_reply.packet
new file mode 100644
index 00000000..e859f9b0
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-controller_status_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-controller_status_request.packet b/tests/packet_data/of15/libofproto-OFP15-controller_status_request.packet
new file mode 100644
index 00000000..4c741757
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-controller_status_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-desc_reply.packet b/tests/packet_data/of15/libofproto-OFP15-desc_reply.packet
new file mode 100644
index 00000000..261333c4
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-desc_request.packet b/tests/packet_data/of15/libofproto-OFP15-desc_request.packet
new file mode 100644
index 00000000..11b39877
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-echo_reply.packet b/tests/packet_data/of15/libofproto-OFP15-echo_reply.packet
new file mode 100644
index 00000000..70d03566
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-echo_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-echo_request.packet b/tests/packet_data/of15/libofproto-OFP15-echo_request.packet
new file mode 100644
index 00000000..a72ee3aa
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-echo_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-error_msg.packet b/tests/packet_data/of15/libofproto-OFP15-error_msg.packet
new file mode 100644
index 00000000..596762d8
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-error_msg.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-error_msg_experimenter.packet b/tests/packet_data/of15/libofproto-OFP15-error_msg_experimenter.packet
new file mode 100644
index 00000000..3fba70c2
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-error_msg_experimenter.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-experimenter.packet b/tests/packet_data/of15/libofproto-OFP15-experimenter.packet
new file mode 100644
index 00000000..c96393aa
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-experimenter.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-experimenter_reply.packet b/tests/packet_data/of15/libofproto-OFP15-experimenter_reply.packet
new file mode 100644
index 00000000..9575ae9b
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-experimenter_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-experimenter_request.packet b/tests/packet_data/of15/libofproto-OFP15-experimenter_request.packet
new file mode 100644
index 00000000..739437cb
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-experimenter_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-features_reply.packet b/tests/packet_data/of15/libofproto-OFP15-features_reply.packet
new file mode 100644
index 00000000..6893fd57
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-features_request.packet b/tests/packet_data/of15/libofproto-OFP15-features_request.packet
new file mode 100644
index 00000000..8d7159e5
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-features_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-flow_desc_reply.packet b/tests/packet_data/of15/libofproto-OFP15-flow_desc_reply.packet
new file mode 100644
index 00000000..4bf534cf
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-flow_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-flow_desc_request.packet b/tests/packet_data/of15/libofproto-OFP15-flow_desc_request.packet
new file mode 100644
index 00000000..a5a5bc11
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-flow_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-flow_mod.packet b/tests/packet_data/of15/libofproto-OFP15-flow_mod.packet
new file mode 100644
index 00000000..d70a062c
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-flow_mod.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-flow_mod_conjunction.packet b/tests/packet_data/of15/libofproto-OFP15-flow_mod_conjunction.packet
new file mode 100644
index 00000000..6fee113a
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-flow_mod_conjunction.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-flow_mod_match_conj.packet b/tests/packet_data/of15/libofproto-OFP15-flow_mod_match_conj.packet
new file mode 100644
index 00000000..4bc17eef
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-flow_mod_match_conj.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-flow_monitor_reply.packet b/tests/packet_data/of15/libofproto-OFP15-flow_monitor_reply.packet
new file mode 100644
index 00000000..94129c1c
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-flow_monitor_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-flow_monitor_request.packet b/tests/packet_data/of15/libofproto-OFP15-flow_monitor_request.packet
new file mode 100644
index 00000000..203af31f
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-flow_monitor_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-flow_removed.packet b/tests/packet_data/of15/libofproto-OFP15-flow_removed.packet
new file mode 100644
index 00000000..1df2b2ed
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-flow_removed.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-flow_stats_reply.packet b/tests/packet_data/of15/libofproto-OFP15-flow_stats_reply.packet
new file mode 100644
index 00000000..5ca44bbd
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-flow_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-flow_stats_request.packet b/tests/packet_data/of15/libofproto-OFP15-flow_stats_request.packet
new file mode 100644
index 00000000..8481a1bb
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-flow_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-get_async_reply.packet b/tests/packet_data/of15/libofproto-OFP15-get_async_reply.packet
new file mode 100644
index 00000000..aa14b1e2
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-get_async_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-get_async_request.packet b/tests/packet_data/of15/libofproto-OFP15-get_async_request.packet
new file mode 100644
index 00000000..b8672b82
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-get_async_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-get_config_reply.packet b/tests/packet_data/of15/libofproto-OFP15-get_config_reply.packet
new file mode 100644
index 00000000..6e7b6191
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-get_config_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-get_config_request.packet b/tests/packet_data/of15/libofproto-OFP15-get_config_request.packet
new file mode 100644
index 00000000..15fc95f0
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-get_config_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-group_desc_reply.packet b/tests/packet_data/of15/libofproto-OFP15-group_desc_reply.packet
new file mode 100644
index 00000000..6420c149
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-group_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-group_desc_request.packet b/tests/packet_data/of15/libofproto-OFP15-group_desc_request.packet
new file mode 100644
index 00000000..ee6ee7ce
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-group_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-group_features_reply.packet b/tests/packet_data/of15/libofproto-OFP15-group_features_reply.packet
new file mode 100644
index 00000000..14ddc120
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-group_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-group_features_request.packet b/tests/packet_data/of15/libofproto-OFP15-group_features_request.packet
new file mode 100644
index 00000000..90805651
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-group_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-group_mod.packet b/tests/packet_data/of15/libofproto-OFP15-group_mod.packet
new file mode 100644
index 00000000..65761562
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-group_mod.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-group_stats_reply.packet b/tests/packet_data/of15/libofproto-OFP15-group_stats_reply.packet
new file mode 100644
index 00000000..4853628d
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-group_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-group_stats_request.packet b/tests/packet_data/of15/libofproto-OFP15-group_stats_request.packet
new file mode 100644
index 00000000..3c8dd862
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-group_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-hello.packet b/tests/packet_data/of15/libofproto-OFP15-hello.packet
new file mode 100644
index 00000000..3afdec41
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-hello.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-meter_desc_reply.packet b/tests/packet_data/of15/libofproto-OFP15-meter_desc_reply.packet
new file mode 100644
index 00000000..026199ae
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-meter_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-meter_desc_request.packet b/tests/packet_data/of15/libofproto-OFP15-meter_desc_request.packet
new file mode 100644
index 00000000..3a008900
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-meter_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-meter_features_reply.packet b/tests/packet_data/of15/libofproto-OFP15-meter_features_reply.packet
new file mode 100644
index 00000000..b7e5a935
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-meter_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-meter_features_request.packet b/tests/packet_data/of15/libofproto-OFP15-meter_features_request.packet
new file mode 100644
index 00000000..d85918df
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-meter_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-meter_mod.packet b/tests/packet_data/of15/libofproto-OFP15-meter_mod.packet
new file mode 100644
index 00000000..2f25474f
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-meter_mod.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-meter_stats_reply.packet b/tests/packet_data/of15/libofproto-OFP15-meter_stats_reply.packet
new file mode 100644
index 00000000..2db08d65
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-meter_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-meter_stats_request.packet b/tests/packet_data/of15/libofproto-OFP15-meter_stats_request.packet
new file mode 100644
index 00000000..6cec3f59
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-meter_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-packet_in.packet b/tests/packet_data/of15/libofproto-OFP15-packet_in.packet
new file mode 100644
index 00000000..7a6aab01
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-packet_in.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-packet_out.packet b/tests/packet_data/of15/libofproto-OFP15-packet_out.packet
new file mode 100644
index 00000000..b3569026
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-packet_out.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-port_desc_reply.packet b/tests/packet_data/of15/libofproto-OFP15-port_desc_reply.packet
new file mode 100644
index 00000000..c687e5cd
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-port_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-port_desc_request.packet b/tests/packet_data/of15/libofproto-OFP15-port_desc_request.packet
new file mode 100644
index 00000000..cf9ecc6e
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-port_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-port_mod.packet b/tests/packet_data/of15/libofproto-OFP15-port_mod.packet
new file mode 100644
index 00000000..1aab2c48
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-port_mod.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-port_stats_reply.packet b/tests/packet_data/of15/libofproto-OFP15-port_stats_reply.packet
new file mode 100644
index 00000000..9d190d01
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-port_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-port_stats_request.packet b/tests/packet_data/of15/libofproto-OFP15-port_stats_request.packet
new file mode 100644
index 00000000..af7d6892
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-port_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-port_status.packet b/tests/packet_data/of15/libofproto-OFP15-port_status.packet
new file mode 100644
index 00000000..1d2d5305
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-port_status.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-queue_desc_reply.packet b/tests/packet_data/of15/libofproto-OFP15-queue_desc_reply.packet
new file mode 100644
index 00000000..d8f8e318
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-queue_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-queue_desc_request.packet b/tests/packet_data/of15/libofproto-OFP15-queue_desc_request.packet
new file mode 100644
index 00000000..960dbeff
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-queue_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-queue_stats_reply.packet b/tests/packet_data/of15/libofproto-OFP15-queue_stats_reply.packet
new file mode 100644
index 00000000..11744f90
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-queue_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-queue_stats_request.packet b/tests/packet_data/of15/libofproto-OFP15-queue_stats_request.packet
new file mode 100644
index 00000000..416a6185
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-queue_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-requestforward.packet b/tests/packet_data/of15/libofproto-OFP15-requestforward.packet
new file mode 100644
index 00000000..153a99f2
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-requestforward.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-role_reply.packet b/tests/packet_data/of15/libofproto-OFP15-role_reply.packet
new file mode 100644
index 00000000..c92ba974
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-role_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-role_request.packet b/tests/packet_data/of15/libofproto-OFP15-role_request.packet
new file mode 100644
index 00000000..82c99197
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-role_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-role_status.packet b/tests/packet_data/of15/libofproto-OFP15-role_status.packet
new file mode 100644
index 00000000..de85d1f8
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-role_status.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-set_async.packet b/tests/packet_data/of15/libofproto-OFP15-set_async.packet
new file mode 100644
index 00000000..9fbfd415
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-set_async.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-set_config.packet b/tests/packet_data/of15/libofproto-OFP15-set_config.packet
new file mode 100644
index 00000000..eb3ed3dd
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-set_config.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-table_desc_reply.packet b/tests/packet_data/of15/libofproto-OFP15-table_desc_reply.packet
new file mode 100644
index 00000000..4177a743
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-table_desc_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-table_desc_request.packet b/tests/packet_data/of15/libofproto-OFP15-table_desc_request.packet
new file mode 100644
index 00000000..c2a47776
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-table_desc_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-table_features_reply.packet b/tests/packet_data/of15/libofproto-OFP15-table_features_reply.packet
new file mode 100644
index 00000000..ce826483
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-table_features_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-table_features_request.packet b/tests/packet_data/of15/libofproto-OFP15-table_features_request.packet
new file mode 100644
index 00000000..706d8756
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-table_features_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-table_mod.packet b/tests/packet_data/of15/libofproto-OFP15-table_mod.packet
new file mode 100644
index 00000000..884fc42b
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-table_mod.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-table_stats_reply.packet b/tests/packet_data/of15/libofproto-OFP15-table_stats_reply.packet
new file mode 100644
index 00000000..6693467f
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-table_stats_reply.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-table_stats_request.packet b/tests/packet_data/of15/libofproto-OFP15-table_stats_request.packet
new file mode 100644
index 00000000..aae25d76
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-table_stats_request.packet
Binary files differ
diff --git a/tests/packet_data/of15/libofproto-OFP15-table_status.packet b/tests/packet_data/of15/libofproto-OFP15-table_status.packet
new file mode 100644
index 00000000..3410d23c
--- /dev/null
+++ b/tests/packet_data/of15/libofproto-OFP15-table_status.packet
Binary files differ
diff --git a/tests/packet_data/pcap/big_endian.pcap b/tests/packet_data/pcap/big_endian.pcap
new file mode 100644
index 00000000..1387f5dd
--- /dev/null
+++ b/tests/packet_data/pcap/big_endian.pcap
Binary files differ
diff --git a/tests/packet_data/pcap/geneve_unknown.pcap b/tests/packet_data/pcap/geneve_unknown.pcap
new file mode 100644
index 00000000..dc65d944
--- /dev/null
+++ b/tests/packet_data/pcap/geneve_unknown.pcap
Binary files differ
diff --git a/tests/packet_data/pcap/gre_full_options.pcap b/tests/packet_data/pcap/gre_full_options.pcap
new file mode 100644
index 00000000..cabf5199
--- /dev/null
+++ b/tests/packet_data/pcap/gre_full_options.pcap
Binary files differ
diff --git a/tests/packet_data/pcap/gre_no_option.pcap b/tests/packet_data/pcap/gre_no_option.pcap
new file mode 100644
index 00000000..258126ba
--- /dev/null
+++ b/tests/packet_data/pcap/gre_no_option.pcap
Binary files differ
diff --git a/tests/packet_data/pcap/gre_nvgre_option.pcap b/tests/packet_data/pcap/gre_nvgre_option.pcap
new file mode 100644
index 00000000..fb1b2980
--- /dev/null
+++ b/tests/packet_data/pcap/gre_nvgre_option.pcap
Binary files differ
diff --git a/tests/packet_data/pcap/little_endian.pcap b/tests/packet_data/pcap/little_endian.pcap
new file mode 100644
index 00000000..11072bdd
--- /dev/null
+++ b/tests/packet_data/pcap/little_endian.pcap
Binary files differ
diff --git a/tests/packet_data/pcap/openflow_flowmod.pcap b/tests/packet_data/pcap/openflow_flowmod.pcap
new file mode 100644
index 00000000..e72a0425
--- /dev/null
+++ b/tests/packet_data/pcap/openflow_flowmod.pcap
Binary files differ
diff --git a/tests/packet_data/pcap/openflow_flowstats_req.pcap b/tests/packet_data/pcap/openflow_flowstats_req.pcap
new file mode 100644
index 00000000..7ce270d5
--- /dev/null
+++ b/tests/packet_data/pcap/openflow_flowstats_req.pcap
Binary files differ
diff --git a/tests/packet_data/pcap/openflow_invalid_version.pcap b/tests/packet_data/pcap/openflow_invalid_version.pcap
new file mode 100644
index 00000000..2c22675b
--- /dev/null
+++ b/tests/packet_data/pcap/openflow_invalid_version.pcap
Binary files differ
diff --git a/tests/packet_data/pcap/zebra_v2.pcap b/tests/packet_data/pcap/zebra_v2.pcap
new file mode 100644
index 00000000..b5ca677b
--- /dev/null
+++ b/tests/packet_data/pcap/zebra_v2.pcap
Binary files differ
diff --git a/tests/packet_data/pcap/zebra_v3.pcap b/tests/packet_data/pcap/zebra_v3.pcap
new file mode 100644
index 00000000..f2e01a91
--- /dev/null
+++ b/tests/packet_data/pcap/zebra_v3.pcap
Binary files differ
diff --git a/tests/packet_data_generator/Makefile b/tests/packet_data_generator/Makefile
new file mode 100644
index 00000000..be1e8d85
--- /dev/null
+++ b/tests/packet_data_generator/Makefile
@@ -0,0 +1,5 @@
+
+generate:
+ rebar get-deps
+ rebar compile
+ erl -pa ebin deps/*/ebin -s x x -s init stop
diff --git a/tests/packet_data_generator/rebar.config b/tests/packet_data_generator/rebar.config
new file mode 100644
index 00000000..e060319c
--- /dev/null
+++ b/tests/packet_data_generator/rebar.config
@@ -0,0 +1,29 @@
+%% Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+%% Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+%% implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+
+{deps,
+ [{of_protocol, ".*",
+% {git, "https://github.com/FlowForwarding/of_protocol.git",
+% "5d6a938bcac91d03e4542845bc014a271bab363a"}},
+% use local branch for merge of upstream v5 branch with pull 66 and 71
+% https://github.com/FlowForwarding/of_protocol/tree/v5
+% https://github.com/FlowForwarding/of_protocol/pull/66
+% https://github.com/FlowForwarding/of_protocol/pull/71
+ {git, "https://github.com/horms/of_protocol.git",
+ "6764e8f0ed5c4dee913310bf2bd908ab1768603e"}},
+ {flower, ".*",
+ {git, "http://github.com/travelping/flower.git",
+ "d783d8f722cb1eb2fa598d4521b309cfcc703fdb"}}]}.
diff --git a/tests/packet_data_generator/src/er.app.src b/tests/packet_data_generator/src/er.app.src
new file mode 100644
index 00000000..5252b564
--- /dev/null
+++ b/tests/packet_data_generator/src/er.app.src
@@ -0,0 +1,24 @@
+%% Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+%% Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+%% implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+
+{application, er,
+ [{description, "generate test data"},
+ {vsn, "1.0"},
+ {applications,
+ [kernel,
+ stdlib,
+ of_protocol]}]}.
+
diff --git a/tests/packet_data_generator/src/x.erl b/tests/packet_data_generator/src/x.erl
new file mode 100644
index 00000000..1b624e8f
--- /dev/null
+++ b/tests/packet_data_generator/src/x.erl
@@ -0,0 +1,63 @@
+%% Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+%% Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+%% implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+
+-module(x).
+-export([do/2, x/0]).
+
+% eg. 1 -> of10
+ofp_version_string(Vers) ->
+ ["of", integer_to_list(9 + Vers)].
+
+do(skip, {OFPVersion, N}) ->
+ {OFPVersion, N + 1};
+do(Body, {OFPVersion, N}) ->
+ Mod = case OFPVersion of
+ 1 -> x_flower_packet;
+ _ -> x_of_protocol
+ end,
+ Name = case Body of
+ B when is_tuple(B) ->
+ atom_to_list(element(1, B));
+ _ ->
+ atom_to_list(Body)
+ end,
+ io:format("processing ~B ~B ~s~n", [OFPVersion, N, Name]),
+ Msg = Mod:message(OFPVersion, 0, Body),
+ case Mod:encode(Msg) of
+ {ok, BinMsg} -> ok;
+ {error, Error} -> io:format("~p ~p~n", [Error, Msg]), BinMsg = hoge
+ end,
+ {ok, F} = file:open(["../packet_data/",
+ ofp_version_string(OFPVersion), "/", integer_to_list(OFPVersion), "-",
+ integer_to_list(N), "-", Name, ".packet"], [write, binary]),
+
+ % sanity check
+ % this is fragile because of order of flags.
+ % ofp flags are unorderd but of_protocol keeps them in a list.
+ {ok, Msg2, <<>>} = Mod:decode(BinMsg),
+ {OFPVersion, 0, Body2} = Mod:message_extract(Msg2),
+ case Body == Body2 of
+ false -> io:format("~p~n", [Body]), io:format("~p~n", [Body2]);
+ _ -> hoge
+ end,
+ Body = Body2,
+
+ ok = file:write(F, BinMsg),
+ ok = file:close(F),
+ {OFPVersion, N + 1}.
+
+x() ->
+ lists:map(fun(Mod) -> Mod:x() end, [x1, x3, x4, x5]).
diff --git a/tests/packet_data_generator/src/x1.erl b/tests/packet_data_generator/src/x1.erl
new file mode 100644
index 00000000..6935e021
--- /dev/null
+++ b/tests/packet_data_generator/src/x1.erl
@@ -0,0 +1,90 @@
+%% Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+%% Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+%% implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+
+-module(x1).
+-export([x/0]).
+
+-include_lib("flower/include/flower_packet.hrl").
+
+cookie(Bin) ->
+ <<Int:64>> = Bin,
+ Int.
+
+x() ->
+ List = [
+ skip,
+ #ofp_packet_out{
+ buffer_id = ?OFP_NO_BUFFER,in_port = controller,
+ actions =
+ [#ofp_action_output{port = all,max_len = 65535}],
+ data =
+ <<242,11,164,208,63,112,242,11,164,125,248,234,8,0,69,0,
+ 0,84,248,26,0,0,255,1,175,139,10,0,0,1,10,0,0,2,8,0,2,
+ 8,247,96,0,0,49,214,2,0,0,0,0,0,171,141,45,49,0,0,0,0,
+ 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,
+ 34,35,36,37,38,39,40,41,42,43,44,45,46,47,0,0,0,0,0,0,
+ 0,0>>},
+ #ofp_flow_mod{
+ cookie = cookie(<<0,0,0,0,0,0,0,0>>),
+ command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = all,flags = [],
+ match =
+ #ofp_match{
+ wildcards = 16#3ffff7,
+ dl_dst = <<"\362\v\244}\370\352">>,
+ % XXX ryu and flower have different defaults for the
+ % followin fields.
+ in_port = 0,
+ dl_src = <<0:6/unit:8>>
+ },
+ actions = [#ofp_action_output{port = 6,max_len = 65535}]},
+ skip,
+ #ofp_packet_in{
+ buffer_id = 2,total_len=42,reason = action,in_port = 99,
+ data =
+ <<255,255,255,255,255,255,242,11,164,125,248,234,8,6,0,
+ 1,8,0,6,4,0,1,242,11,164,125,248,234,10,0,0,1,0,0,0,0,
+ 0,0,10,0,0,3>>},
+
+ features_request,
+ #ofp_switch_features{ % features_reply
+ datapath_id = 16#ff12345678,n_buffers = 0,n_tables = 255,
+ capabilities =
+ [arp_match_ip,ip_reasm,stp,flow_stats],
+ actions =
+ [enqueue,set_nw_src,set_vlan_vid,output],
+ ports =
+ [#ofp_phy_port{
+ port_no = 7,hw_addr = <<"\362\v\244\320?p">>,
+ name = <<"Port7">>,
+ config = [],
+ state = [stp_block],
+ curr = [autoneg,copper,'100mb_fd'],
+ advertised = [autoneg,copper],
+ supported = [autoneg,copper,'100mb_fd'],
+ peer = [autoneg,copper,'100mb_fd']},
+ #ofp_phy_port{
+ port_no = 6,hw_addr = <<"\362\v\244}\370\352">>,
+ name = <<"Port6">>,
+ config = [],
+ state = [stp_listen],
+ curr = [autoneg,copper,'100mb_fd'],
+ advertised = [autoneg,copper],
+ supported = [autoneg,copper,'100mb_fd'],
+ peer = [autoneg,copper,'100mb_fd']}]}
+ ],
+ lists:foldl(fun x:do/2, {1, 0}, List).
diff --git a/tests/packet_data_generator/src/x3.erl b/tests/packet_data_generator/src/x3.erl
new file mode 100644
index 00000000..7098fd8d
--- /dev/null
+++ b/tests/packet_data_generator/src/x3.erl
@@ -0,0 +1,8749 @@
+%% Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+%% Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+%% implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+
+-module(x3).
+-export([x/0]).
+
+-include_lib("of_protocol/include/of_protocol.hrl").
+-include_lib("of_protocol/include/ofp_v3.hrl").
+
+x() ->
+ AllFields = [
+ #ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<5,6,7,8>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = in_phy_port,
+ has_mask = false,
+ value = <<1,2,3,4>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = metadata,
+ has_mask = false,
+ value = <<0,1,2,3,4,5,6,7>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_type,
+ has_mask = false,
+ value = <<8,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,value = <<"\377\377\377\377\377\377">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = vlan_vid,
+ has_mask = false,value = <<999:13>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ip_dscp,
+ has_mask = false,value = <<9:6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ip_ecn,
+ has_mask = false,value = <<3:2>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ip_proto,
+ has_mask = false,value = <<99>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv4_src,
+ has_mask = false,value = <<1,2,3,4>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv4_dst,
+ has_mask = false,value = <<1,2,3,4>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = tcp_src,
+ has_mask = false,value = <<8080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = tcp_dst,
+ has_mask = false,value = <<18080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = udp_src,
+ has_mask = false,value = <<28080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = udp_dst,
+ has_mask = false,value = <<318080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = sctp_src,
+ has_mask = false,value = <<48080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = sctp_dst,
+ has_mask = false,value = <<518080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv4_type,
+ has_mask = false,value = <<100>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv4_code,
+ has_mask = false,value = <<101>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_op,
+ has_mask = false,
+ value = <<0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_spa,
+ has_mask = false,
+ value = <<10,0,0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tpa,
+ has_mask = false,
+ value = <<10,0,0,3>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_sha,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tha,
+ has_mask = false,
+ value = <<0,0,0,0,0,0>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_src,
+ has_mask = false,
+ % fe80::f00b:a4ff:fe48:28a5
+ value = <<16#fe80000000000000f00ba4fffe4828a5:128>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_dst,
+ has_mask = false,
+ % fe80::f00b:a4ff:fe05:b7dc
+ value = <<16#fe80000000000000f00ba4fffe05b7dc:128>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_flabel,
+ has_mask = false,
+ value = <<16#84321:20>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv6_type,
+ has_mask = false,
+ value = <<200>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv6_code,
+ has_mask = false,
+ value = <<201>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_nd_target,
+ has_mask = false,
+ % fe80::a60:6eff:fe7f:74e7
+ value = <<16#fe800000000000000a606efffe7f74e7:128>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_nd_sll,
+ has_mask = false,
+ value = <<666:48>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_nd_tll,
+ has_mask = false,
+ value = <<555:48>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = mpls_label,
+ has_mask = false,
+ value = <<16#98765:20>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = mpls_tc,
+ has_mask = false,
+ value = <<5:3>>,
+ mask = undefined}
+ ],
+ List = [
+ #ofp_desc_stats_reply{flags = [], mfr_desc = <<"mfr">>,
+ hw_desc = <<"hw">>, sw_desc = <<"sw">>,
+ serial_num = <<"serial">>,
+ dp_desc = <<"dp">>},
+ #ofp_packet_out{
+ buffer_id = no_buffer,in_port = controller,
+ actions =
+ [#ofp_action_output{port = all,max_len = no_buffer}],
+ data =
+ <<242,11,164,208,63,112,242,11,164,125,248,234,8,0,69,0,
+ 0,84,248,26,0,0,255,1,175,139,10,0,0,1,10,0,0,2,8,0,2,
+ 8,247,96,0,0,49,214,2,0,0,0,0,0,171,141,45,49,0,0,0,0,
+ 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,
+ 34,35,36,37,38,39,40,41,42,43,44,45,46,47,0,0,0,0,0,0,
+ 0,0>>},
+ #ofp_flow_mod{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ table_id = 1,command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = any,out_group = any,flags = [],
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_write_actions{
+ actions =
+ [#ofp_action_set_field{
+ field = #ofp_field{name = vlan_vid,
+ value = <<258:13>> }},
+ #ofp_action_output{port = 6,max_len = no_buffer}]},
+ #ofp_instruction_apply_actions{
+ actions =
+ [#ofp_action_set_field{
+ field = #ofp_field{name = eth_src,
+ value = <<1,2,3,4,5,6>> }}]}]},
+ #ofp_flow_mod{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ table_id = 0,command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = any,out_group = any,flags = [],
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<0,0,0,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_goto_table{table_id = 1}]},
+ #ofp_packet_in{
+ buffer_id = 2,reason = action,table_id = 1,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<0,0,0,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_type,
+ has_mask = false,
+ value = <<8,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,value = <<"\377\377\377\377\377\377">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_op,
+ has_mask = false,
+ value = <<0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_spa,
+ has_mask = false,
+ value = <<10,0,0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tpa,
+ has_mask = false,
+ value = <<10,0,0,3>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_sha,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tha,
+ has_mask = false,
+ value = <<0,0,0,0,0,0>>,
+ mask = undefined}]},
+ data =
+ <<255,255,255,255,255,255,242,11,164,125,248,234,8,6,0,
+ 1,8,0,6,4,0,1,242,11,164,125,248,234,10,0,0,1,0,0,0,0,
+ 0,0,10,0,0,3>>},
+ #ofp_features_request{},
+ #ofp_features_reply{
+ datapath_mac = <<8,96,110,127,116,231>>,
+ datapath_id = 0,n_buffers = 0,n_tables = 255,
+ capabilities =
+ [flow_stats,table_stats,port_stats,group_stats,queue_stats],
+ ports =
+ [#ofp_port{
+ port_no = 7,hw_addr = <<"\362\v\244\320?p">>,
+ name = <<"Port7">>,
+ config = [],
+ state = [live],
+ curr = ['100mb_fd',copper,autoneg],
+ advertised = [copper,autoneg],
+ supported = ['100mb_fd',copper,autoneg],
+ peer = ['100mb_fd',copper,autoneg],
+ curr_speed = 5000,max_speed = 5000},
+ #ofp_port{
+ port_no = 6,hw_addr = <<"\362\v\244}\370\352">>,
+ name = <<"Port6">>,
+ config = [],
+ state = [live],
+ curr = ['100mb_fd',copper,autoneg],
+ advertised = [copper,autoneg],
+ supported = ['100mb_fd',copper,autoneg],
+ peer = ['100mb_fd',copper,autoneg],
+ curr_speed = 5000,max_speed = 5000}]},
+ #ofp_set_config{flags = [],miss_send_len = 128},
+ #ofp_get_config_request{},
+ #ofp_get_config_reply{flags = [],miss_send_len = 128},
+ #ofp_hello{},
+ #ofp_flow_stats_request{
+ flags = [],table_id = 0,out_port = any,out_group = any,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ match = #ofp_match{fields = []}},
+ #ofp_flow_stats_reply{
+ flags = [],
+ stats =
+ [#ofp_flow_stats{
+ table_id = 0,duration_sec = 358,
+ duration_nsec = 115277000,priority = 65535,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 0,byte_count = 0,
+ match = #ofp_match{fields = []},
+ instructions = []},
+ #ofp_flow_stats{
+ table_id = 0,duration_sec = 358,
+ duration_nsec = 115055000,priority = 65534,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 0,byte_count = 0,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_type,
+ has_mask = false,
+ value = <<8,6>>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_apply_actions{
+ actions =
+ [#ofp_action_output{
+ port = normal,max_len = 0}]}]},
+ #ofp_flow_stats{
+ table_id = 0,duration_sec = 316220,
+ duration_nsec = 511582000,priority = 123,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 3,byte_count = 238,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<0,0,0,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_goto_table{table_id = 1}]},
+ #ofp_flow_stats{
+ table_id = 0,duration_sec = 313499,
+ duration_nsec = 980901000,priority = 0,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 1,byte_count = 98,
+ match = #ofp_match{fields = []},
+ instructions =
+ [#ofp_instruction_write_actions{
+ actions =
+ [#ofp_action_output{
+ port = controller,
+ max_len = no_buffer}]}]}]},
+ #ofp_echo_request{
+ data = <<"hoge">>
+ },
+ #ofp_echo_reply{
+ data = <<"hoge">>
+ },
+ #ofp_error_msg{
+ type = bad_action,
+ code = unsupported_order,
+ data = <<"fugafuga">>
+ },
+ #ofp_experimenter{
+ experimenter = 98765432,
+ exp_type = 123456789,
+ data = <<"nazo">>
+ },
+ #ofp_barrier_request{},
+ #ofp_barrier_reply{},
+ #ofp_role_request{
+ role = master,
+ generation_id = 16#f000f000f000f000},
+ #ofp_role_reply{
+ role = slave,
+ generation_id = 16#f000f000f000f000},
+
+ #ofp_group_mod{
+ command = add,type = all,group_id = 1,
+ buckets =
+ [#ofp_bucket{
+ weight = 1,watch_port = 1,watch_group = 1,
+ actions =
+ [#ofp_action_output{port = 2,max_len = no_buffer}]}]},
+ #ofp_port_mod{port_no = 1, hw_addr = <<0,17,0,0,17,17>>,
+ config = [],mask = [], advertise = [fiber]},
+ #ofp_table_mod{table_id = all,config = controller},
+ #ofp_desc_stats_request{},
+ #ofp_aggregate_stats_request{
+ flags = [],table_id = all,out_port = any,out_group = any,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ match = #ofp_match{fields = []}},
+ #ofp_aggregate_stats_reply{flags = [],packet_count = 7,
+ byte_count = 574,flow_count = 6},
+ #ofp_table_stats_request{},
+
+#ofp_table_stats_reply{
+ flags = [],
+ stats =
+ [#ofp_table_stats{
+ table_id = 0,name = <<"\xe7\xa7\x81\xe3\x81\xae\xe3\x83\x86\xe3\x83\xbc\xe3\x83\x96\xe3\x83\xab">>, % "my table" in japanese, utf-8
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 4,
+ lookup_count = 4,matched_count = 4},
+ #ofp_table_stats{
+ table_id = 1,name = <<"Flow Table 0x01">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 2,
+ lookup_count = 3,matched_count = 3},
+ #ofp_table_stats{
+ table_id = 2,name = <<"Flow Table 0x02">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 3,name = <<"Flow Table 0x03">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 4,name = <<"Flow Table 0x04">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 5,name = <<"Flow Table 0x05">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 6,name = <<"Flow Table 0x06">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 7,name = <<"Flow Table 0x07">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 8,name = <<"Flow Table 0x08">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 9,name = <<"Flow Table 0x09">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 10,name = <<"Flow Table 0x0a">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 11,name = <<"Flow Table 0x0b">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 12,name = <<"Flow Table 0x0c">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 13,name = <<"Flow Table 0x0d">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 14,name = <<"Flow Table 0x0e">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 15,name = <<"Flow Table 0x0f">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 16,name = <<"Flow Table 0x10">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 17,name = <<"Flow Table 0x11">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 18,name = <<"Flow Table 0x12">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 19,name = <<"Flow Table 0x13">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 20,name = <<"Flow Table 0x14">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 21,name = <<"Flow Table 0x15">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 22,name = <<"Flow Table 0x16">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 23,name = <<"Flow Table 0x17">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 24,name = <<"Flow Table 0x18">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 25,name = <<"Flow Table 0x19">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 26,name = <<"Flow Table 0x1a">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 27,name = <<"Flow Table 0x1b">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 28,name = <<"Flow Table 0x1c">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 29,name = <<"Flow Table 0x1d">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 30,name = <<"Flow Table 0x1e">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 31,name = <<"Flow Table 0x1f">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 32,name = <<"Flow Table 0x20">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 33,name = <<"Flow Table 0x21">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 34,name = <<"Flow Table 0x22">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 35,name = <<"Flow Table 0x23">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 36,name = <<"Flow Table 0x24">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 37,name = <<"Flow Table 0x25">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 38,name = <<"Flow Table 0x26">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 39,name = <<"Flow Table 0x27">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 40,name = <<"Flow Table 0x28">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 41,name = <<"Flow Table 0x29">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 42,name = <<"Flow Table 0x2a">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 43,name = <<"Flow Table 0x2b">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 44,name = <<"Flow Table 0x2c">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 45,name = <<"Flow Table 0x2d">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 46,name = <<"Flow Table 0x2e">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 47,name = <<"Flow Table 0x2f">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 48,name = <<"Flow Table 0x30">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 49,name = <<"Flow Table 0x31">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 50,name = <<"Flow Table 0x32">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 51,name = <<"Flow Table 0x33">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 52,name = <<"Flow Table 0x34">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 53,name = <<"Flow Table 0x35">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 54,name = <<"Flow Table 0x36">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 55,name = <<"Flow Table 0x37">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 56,name = <<"Flow Table 0x38">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 57,name = <<"Flow Table 0x39">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 58,name = <<"Flow Table 0x3a">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 59,name = <<"Flow Table 0x3b">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 60,name = <<"Flow Table 0x3c">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 61,name = <<"Flow Table 0x3d">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 62,name = <<"Flow Table 0x3e">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 63,name = <<"Flow Table 0x3f">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 64,name = <<"Flow Table 0x40">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 65,name = <<"Flow Table 0x41">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 66,name = <<"Flow Table 0x42">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 67,name = <<"Flow Table 0x43">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 68,name = <<"Flow Table 0x44">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 69,name = <<"Flow Table 0x45">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 70,name = <<"Flow Table 0x46">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 71,name = <<"Flow Table 0x47">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 72,name = <<"Flow Table 0x48">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 73,name = <<"Flow Table 0x49">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 74,name = <<"Flow Table 0x4a">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 75,name = <<"Flow Table 0x4b">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 76,name = <<"Flow Table 0x4c">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 77,name = <<"Flow Table 0x4d">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 78,name = <<"Flow Table 0x4e">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 79,name = <<"Flow Table 0x4f">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 80,name = <<"Flow Table 0x50">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 81,name = <<"Flow Table 0x51">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 82,name = <<"Flow Table 0x52">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 83,name = <<"Flow Table 0x53">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 84,name = <<"Flow Table 0x54">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 85,name = <<"Flow Table 0x55">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 86,name = <<"Flow Table 0x56">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 87,name = <<"Flow Table 0x57">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 88,name = <<"Flow Table 0x58">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 89,name = <<"Flow Table 0x59">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 90,name = <<"Flow Table 0x5a">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 91,name = <<"Flow Table 0x5b">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 92,name = <<"Flow Table 0x5c">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 93,name = <<"Flow Table 0x5d">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 94,name = <<"Flow Table 0x5e">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 95,name = <<"Flow Table 0x5f">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 96,name = <<"Flow Table 0x60">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 97,name = <<"Flow Table 0x61">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 98,name = <<"Flow Table 0x62">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 99,name = <<"Flow Table 0x63">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 100,name = <<"Flow Table 0x64">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 101,name = <<"Flow Table 0x65">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 102,name = <<"Flow Table 0x66">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 103,name = <<"Flow Table 0x67">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 104,name = <<"Flow Table 0x68">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 105,name = <<"Flow Table 0x69">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 106,name = <<"Flow Table 0x6a">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 107,name = <<"Flow Table 0x6b">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 108,name = <<"Flow Table 0x6c">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 109,name = <<"Flow Table 0x6d">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 110,name = <<"Flow Table 0x6e">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 111,name = <<"Flow Table 0x6f">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 112,name = <<"Flow Table 0x70">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 113,name = <<"Flow Table 0x71">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 114,name = <<"Flow Table 0x72">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 115,name = <<"Flow Table 0x73">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 116,name = <<"Flow Table 0x74">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 117,name = <<"Flow Table 0x75">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 118,name = <<"Flow Table 0x76">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 119,name = <<"Flow Table 0x77">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 120,name = <<"Flow Table 0x78">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 121,name = <<"Flow Table 0x79">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 122,name = <<"Flow Table 0x7a">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 123,name = <<"Flow Table 0x7b">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 124,name = <<"Flow Table 0x7c">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 125,name = <<"Flow Table 0x7d">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 126,name = <<"Flow Table 0x7e">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 127,name = <<"Flow Table 0x7f">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 128,name = <<"Flow Table 0x80">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 129,name = <<"Flow Table 0x81">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 130,name = <<"Flow Table 0x82">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 131,name = <<"Flow Table 0x83">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 132,name = <<"Flow Table 0x84">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 133,name = <<"Flow Table 0x85">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 134,name = <<"Flow Table 0x86">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 135,name = <<"Flow Table 0x87">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 136,name = <<"Flow Table 0x88">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 137,name = <<"Flow Table 0x89">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 138,name = <<"Flow Table 0x8a">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 139,name = <<"Flow Table 0x8b">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 140,name = <<"Flow Table 0x8c">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 141,name = <<"Flow Table 0x8d">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 142,name = <<"Flow Table 0x8e">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 143,name = <<"Flow Table 0x8f">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 144,name = <<"Flow Table 0x90">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 145,name = <<"Flow Table 0x91">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 146,name = <<"Flow Table 0x92">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 147,name = <<"Flow Table 0x93">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 148,name = <<"Flow Table 0x94">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 149,name = <<"Flow Table 0x95">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 150,name = <<"Flow Table 0x96">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 151,name = <<"Flow Table 0x97">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 152,name = <<"Flow Table 0x98">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 153,name = <<"Flow Table 0x99">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 154,name = <<"Flow Table 0x9a">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 155,name = <<"Flow Table 0x9b">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 156,name = <<"Flow Table 0x9c">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 157,name = <<"Flow Table 0x9d">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 158,name = <<"Flow Table 0x9e">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 159,name = <<"Flow Table 0x9f">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 160,name = <<"Flow Table 0xa0">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 161,name = <<"Flow Table 0xa1">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 162,name = <<"Flow Table 0xa2">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 163,name = <<"Flow Table 0xa3">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 164,name = <<"Flow Table 0xa4">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 165,name = <<"Flow Table 0xa5">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 166,name = <<"Flow Table 0xa6">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 167,name = <<"Flow Table 0xa7">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 168,name = <<"Flow Table 0xa8">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 169,name = <<"Flow Table 0xa9">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 170,name = <<"Flow Table 0xaa">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 171,name = <<"Flow Table 0xab">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 172,name = <<"Flow Table 0xac">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 173,name = <<"Flow Table 0xad">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 174,name = <<"Flow Table 0xae">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 175,name = <<"Flow Table 0xaf">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 176,name = <<"Flow Table 0xb0">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 177,name = <<"Flow Table 0xb1">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 178,name = <<"Flow Table 0xb2">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 179,name = <<"Flow Table 0xb3">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 180,name = <<"Flow Table 0xb4">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 181,name = <<"Flow Table 0xb5">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 182,name = <<"Flow Table 0xb6">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 183,name = <<"Flow Table 0xb7">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 184,name = <<"Flow Table 0xb8">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 185,name = <<"Flow Table 0xb9">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 186,name = <<"Flow Table 0xba">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 187,name = <<"Flow Table 0xbb">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 188,name = <<"Flow Table 0xbc">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 189,name = <<"Flow Table 0xbd">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 190,name = <<"Flow Table 0xbe">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 191,name = <<"Flow Table 0xbf">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 192,name = <<"Flow Table 0xc0">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 193,name = <<"Flow Table 0xc1">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 194,name = <<"Flow Table 0xc2">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 195,name = <<"Flow Table 0xc3">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 196,name = <<"Flow Table 0xc4">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 197,name = <<"Flow Table 0xc5">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 198,name = <<"Flow Table 0xc6">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 199,name = <<"Flow Table 0xc7">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 200,name = <<"Flow Table 0xc8">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 201,name = <<"Flow Table 0xc9">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 202,name = <<"Flow Table 0xca">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 203,name = <<"Flow Table 0xcb">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 204,name = <<"Flow Table 0xcc">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 205,name = <<"Flow Table 0xcd">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 206,name = <<"Flow Table 0xce">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 207,name = <<"Flow Table 0xcf">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 208,name = <<"Flow Table 0xd0">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 209,name = <<"Flow Table 0xd1">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 210,name = <<"Flow Table 0xd2">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 211,name = <<"Flow Table 0xd3">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 212,name = <<"Flow Table 0xd4">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 213,name = <<"Flow Table 0xd5">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 214,name = <<"Flow Table 0xd6">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 215,name = <<"Flow Table 0xd7">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 216,name = <<"Flow Table 0xd8">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 217,name = <<"Flow Table 0xd9">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 218,name = <<"Flow Table 0xda">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 219,name = <<"Flow Table 0xdb">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 220,name = <<"Flow Table 0xdc">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 221,name = <<"Flow Table 0xdd">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 222,name = <<"Flow Table 0xde">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 223,name = <<"Flow Table 0xdf">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 224,name = <<"Flow Table 0xe0">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 225,name = <<"Flow Table 0xe1">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 226,name = <<"Flow Table 0xe2">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 227,name = <<"Flow Table 0xe3">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 228,name = <<"Flow Table 0xe4">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 229,name = <<"Flow Table 0xe5">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 230,name = <<"Flow Table 0xe6">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 231,name = <<"Flow Table 0xe7">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 232,name = <<"Flow Table 0xe8">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 233,name = <<"Flow Table 0xe9">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 234,name = <<"Flow Table 0xea">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 235,name = <<"Flow Table 0xeb">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 236,name = <<"Flow Table 0xec">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 237,name = <<"Flow Table 0xed">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 238,name = <<"Flow Table 0xee">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 239,name = <<"Flow Table 0xef">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 240,name = <<"Flow Table 0xf0">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 241,name = <<"Flow Table 0xf1">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 242,name = <<"Flow Table 0xf2">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 243,name = <<"Flow Table 0xf3">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 244,name = <<"Flow Table 0xf4">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 245,name = <<"Flow Table 0xf5">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 246,name = <<"Flow Table 0xf6">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 247,name = <<"Flow Table 0xf7">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 248,name = <<"Flow Table 0xf8">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 249,name = <<"Flow Table 0xf9">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 250,name = <<"Flow Table 0xfa">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 251,name = <<"Flow Table 0xfb">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 252,name = <<"Flow Table 0xfc">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 253,name = <<"Flow Table 0xfd">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0},
+ #ofp_table_stats{
+ table_id = 254,name = <<"Flow Table 0xfe">>,
+ match =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ wildcards =
+ [in_port,metadata,eth_dst,eth_src,eth_type,vlan_vid,
+ vlan_pcp,ip_dscp,ip_ecn,ip_proto,ipv4_src,ipv4_dst,tcp_src,
+ tcp_dst,udp_src,udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,arp_tha,ipv6_src,
+ ipv6_dst,ipv6_flabel,icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc],
+ write_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ apply_actions =
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,
+ push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,
+ set_nw_ttl,dec_nw_ttl,set_field],
+ write_setfields = [],apply_setfields = [],
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,
+ instructions =
+ [goto_table,write_metadata,write_actions,apply_actions,
+ clear_actions],
+ config = controller,max_entries = 16777216,active_count = 0,
+ lookup_count = 0,matched_count = 0}]},
+
+ #ofp_port_stats_request{flags = [],port_no = any},
+ #ofp_port_stats_reply{
+ flags = [],
+ stats =
+ [#ofp_port_stats{
+ port_no = 7,rx_packets = 0,tx_packets = 4,rx_bytes = 0,
+ tx_bytes = 336,rx_dropped = 0,tx_dropped = 0,
+ rx_errors = 0,
+ tx_errors = 0,rx_frame_err = 0,rx_over_err = 0,
+ rx_crc_err = 0,collisions = 0},
+ #ofp_port_stats{
+ port_no = 6,rx_packets = 4,tx_packets = 4,rx_bytes = 336,
+ tx_bytes = 336,rx_dropped = 0,tx_dropped = 0,
+ rx_errors = 0,
+ tx_errors = 0,rx_frame_err = 0,rx_over_err = 0,
+ rx_crc_err = 0,collisions = 0}]},
+ #ofp_group_features_stats_request{flags = []},
+ #ofp_group_features_stats_reply{
+ flags = [],
+ types = [all,select,indirect,ff],
+ capabilities = [select_weight,chaining],
+ max_groups = {16777216,16777216,16777216,16777216},
+ actions =
+ {[output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field],
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field],
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field],
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field]}},
+ #ofp_group_desc_stats_request{},
+ #ofp_group_desc_stats_reply{
+ flags = [],
+ stats =
+ [#ofp_group_desc_stats{
+ type = all,group_id = 1,
+ buckets =
+ [#ofp_bucket{
+ weight = 1,watch_port = 1,watch_group = 1,
+ actions =
+ [#ofp_action_output{
+ port = 2, max_len = no_buffer}]}]}]},
+ #ofp_queue_get_config_request{port = any},
+ #ofp_queue_get_config_reply{port = any,queues = [
+ #ofp_packet_queue{queue_id = 99, port_no = 77,
+ properties = [
+ #ofp_queue_prop_min_rate{rate = 10},
+ #ofp_queue_prop_max_rate{rate = 900}
+ ]
+ },
+ #ofp_packet_queue{queue_id = 88, port_no = 77,
+ properties = [
+ #ofp_queue_prop_min_rate{rate = 100},
+ #ofp_queue_prop_max_rate{rate = 200}
+ ]
+ }
+ ]},
+ #ofp_queue_stats_request{flags = [],port_no = any,
+ queue_id = all},
+ #ofp_queue_stats_reply{
+ flags = [],
+ stats =
+ [#ofp_queue_stats{
+ port_no = 7,queue_id = 1,tx_bytes = 0,tx_packets = 0,
+ tx_errors = 0},
+ #ofp_queue_stats{
+ port_no = 6,queue_id = 1,tx_bytes = 0,tx_packets = 0,
+ tx_errors = 0},
+ #ofp_queue_stats{
+ port_no = 7,queue_id = 2,tx_bytes = 0,tx_packets = 0,
+ tx_errors = 0}]},
+ #ofp_port_status{
+ reason = add,
+ desc = #ofp_port{
+ port_no = 7,hw_addr = <<"\362\v\244\320?p">>,
+ name = <<"\xe7\xa7\x81\xe3\x81\xae\xe3\x83\x9d\xe3\x83\xbc\xe3\x83\x88">>, % "my port" in japanese, utf-8
+ config = [],
+ state = [live],
+ curr = ['100mb_fd',copper,autoneg],
+ advertised = [copper,autoneg],
+ supported = ['100mb_fd',copper,autoneg],
+ peer = ['100mb_fd',copper,autoneg],
+ curr_speed = 5000,max_speed = 5000}
+ },
+ #ofp_flow_removed{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ priority = 65535,reason = idle_timeout,table_id = 0,
+ duration_sec = 3,duration_nsec = 48825000,idle_timeout = 3,
+ hard_timeout = 0,packet_count = 1,byte_count = 86,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]}},
+ #ofp_error_msg_experimenter{
+ exp_type = 60000,
+ experimenter = 999999,
+ data = <<"jikken data">>
+ },
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ skip,
+ #ofp_packet_in{
+ buffer_id = 16#f0000000,reason = no_match,table_id = 200,
+ match = #ofp_match{fields = AllFields},
+ data = <<>>},
+ #ofp_flow_mod{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ table_id = 1,command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = any,out_group = any,flags = [],
+ match = #ofp_match{fields = AllFields},
+ instructions = []},
+ #ofp_group_stats_request{flags = [],group_id = all},
+ #ofp_group_stats_reply{
+ flags = [],
+ stats =
+ [#ofp_group_stats{
+ group_id = 1,ref_count = 2,packet_count = 123,
+ byte_count = 12345,
+ bucket_stats =
+ [#ofp_bucket_counter{
+ packet_count = 234,byte_count = 2345}]}]}
+ ],
+ lists:foldl(fun x:do/2, {3, 0}, List).
diff --git a/tests/packet_data_generator/src/x4.erl b/tests/packet_data_generator/src/x4.erl
new file mode 100644
index 00000000..a749fbc8
--- /dev/null
+++ b/tests/packet_data_generator/src/x4.erl
@@ -0,0 +1,2657 @@
+%% Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+%% Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+%% implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+
+-module(x4).
+-export([x/0]).
+
+-include_lib("of_protocol/include/of_protocol.hrl").
+-include_lib("of_protocol/include/ofp_v4.hrl").
+
+x() ->
+ AllFields = [
+ #ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<5,6,7,8>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = in_phy_port,
+ has_mask = false,
+ value = <<1,2,3,4>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = metadata,
+ has_mask = false,
+ value = <<0,1,2,3,4,5,6,7>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_type,
+ has_mask = false,
+ value = <<8,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,value = <<"\377\377\377\377\377\377">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = vlan_vid,
+ has_mask = false,value = <<999:13>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ip_dscp,
+ has_mask = false,value = <<9:6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ip_ecn,
+ has_mask = false,value = <<3:2>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ip_proto,
+ has_mask = false,value = <<99>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv4_src,
+ has_mask = false,value = <<1,2,3,4>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv4_dst,
+ has_mask = false,value = <<1,2,3,4>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = tcp_src,
+ has_mask = false,value = <<8080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = tcp_dst,
+ has_mask = false,value = <<18080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = udp_src,
+ has_mask = false,value = <<28080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = udp_dst,
+ has_mask = false,value = <<318080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = sctp_src,
+ has_mask = false,value = <<48080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = sctp_dst,
+ has_mask = false,value = <<518080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv4_type,
+ has_mask = false,value = <<100>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv4_code,
+ has_mask = false,value = <<101>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_op,
+ has_mask = false,
+ value = <<0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_spa,
+ has_mask = false,
+ value = <<10,0,0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tpa,
+ has_mask = false,
+ value = <<10,0,0,3>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_sha,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tha,
+ has_mask = false,
+ value = <<0,0,0,0,0,0>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_src,
+ has_mask = false,
+ % fe80::f00b:a4ff:fe48:28a5
+ value = <<16#fe80000000000000f00ba4fffe4828a5:128>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_dst,
+ has_mask = false,
+ % fe80::f00b:a4ff:fe05:b7dc
+ value = <<16#fe80000000000000f00ba4fffe05b7dc:128>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_flabel,
+ has_mask = false,
+ value = <<16#84321:20>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv6_type,
+ has_mask = false,
+ value = <<200>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv6_code,
+ has_mask = false,
+ value = <<201>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_nd_target,
+ has_mask = false,
+ % fe80::a60:6eff:fe7f:74e7
+ value = <<16#fe800000000000000a606efffe7f74e7:128>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_nd_sll,
+ has_mask = false,
+ value = <<666:48>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_nd_tll,
+ has_mask = false,
+ value = <<555:48>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = mpls_label,
+ has_mask = false,
+ value = <<16#98765:20>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = mpls_tc,
+ has_mask = false,
+ value = <<5:3>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = mpls_bos,
+ has_mask = false,
+ value = <<1:1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = pbb_isid,
+ has_mask = false,
+ value = <<16#abcdef:24>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = tunnel_id,
+ has_mask = false,
+ value = <<9,9,9,9,9,9,9,9>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_exthdr,
+ has_mask = false,
+ value = <<500:9>>,
+ mask = undefined},
+ #ofp_field{
+ class = {experimenter, onf},name = pbb_uca,
+ has_mask = false,
+ value = <<1:1>>,
+ mask = undefined},
+ #ofp_field{
+ class = nxm_1,name = 31, % tun_ipv4_src
+ has_mask = false,
+ value = <<1,2,3,4>>,
+ mask = undefined},
+ #ofp_field{
+ class = nxm_1,name = 32, % tun_ipv4_dst
+ has_mask = false,
+ value = <<1,2,3,4>>,
+ mask = undefined}
+ ],
+ List = [
+ #ofp_desc_reply{flags = [], mfr_desc = <<"mfr">>,
+ hw_desc = <<"hw">>, sw_desc = <<"sw">>,
+ serial_num = <<"serial">>,
+ dp_desc = <<"dp">>},
+ #ofp_packet_out{
+ buffer_id = no_buffer,in_port = controller,
+ actions =
+ [#ofp_action_output{port = all,max_len = no_buffer}],
+ data =
+ <<242,11,164,208,63,112,242,11,164,125,248,234,8,0,69,0,
+ 0,84,248,26,0,0,255,1,175,139,10,0,0,1,10,0,0,2,8,0,2,
+ 8,247,96,0,0,49,214,2,0,0,0,0,0,171,141,45,49,0,0,0,0,
+ 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,
+ 34,35,36,37,38,39,40,41,42,43,44,45,46,47,0,0,0,0,0,0,
+ 0,0>>},
+ #ofp_flow_mod{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ table_id = 1,command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = any,out_group = any,flags = [],
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_write_actions{
+ actions =
+ [#ofp_action_set_field{
+ field = #ofp_field{name = vlan_vid,
+ value = <<258:13>> }},
+ #ofp_action_copy_ttl_out{},
+ #ofp_action_copy_ttl_in{},
+ #ofp_action_copy_ttl_in{},
+ #ofp_action_pop_pbb{},
+ #ofp_action_push_pbb{ethertype = 16#1234},
+ #ofp_action_pop_mpls{ethertype= 16#9876},
+ #ofp_action_push_mpls{ethertype = 16#8847},
+ #ofp_action_pop_vlan{},
+ #ofp_action_push_vlan{ethertype = 16#8100},
+ #ofp_action_dec_mpls_ttl{},
+ #ofp_action_set_mpls_ttl{mpls_ttl = 10},
+ #ofp_action_dec_nw_ttl{},
+ #ofp_action_set_nw_ttl{nw_ttl = 10},
+ #ofp_action_experimenter{
+ experimenter = 101,
+ data = <<0,1,2,3,4,5,6,7>>},
+ #ofp_action_set_queue{queue_id = 3},
+ #ofp_action_group{group_id = 99},
+ #ofp_action_output{port = 6,max_len = no_buffer}]},
+ #ofp_instruction_apply_actions{
+ actions =
+ [#ofp_action_set_field{
+ field = #ofp_field{name = eth_src,
+ value = <<1,2,3,4,5,6>> }},
+ #ofp_action_set_field{
+ field = #ofp_field{class = {experimenter, onf},
+ name = pbb_uca,
+ value = <<1:1>> }}]}]},
+ #ofp_flow_mod{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ table_id = 0,command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = any,out_group = any,flags = [],
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<0,0,0,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_goto_table{table_id = 1}]},
+ #ofp_packet_in{
+ buffer_id = 2,reason = action,table_id = 1,
+ cookie = <<0,1,2,3,0,0,0,0>>,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<0,0,0,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_type,
+ has_mask = false,
+ value = <<8,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,value = <<"\377\377\377\377\377\377">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_op,
+ has_mask = false,
+ value = <<0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_spa,
+ has_mask = false,
+ value = <<10,0,0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tpa,
+ has_mask = false,
+ value = <<10,0,0,3>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_sha,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tha,
+ has_mask = false,
+ value = <<0,0,0,0,0,0>>,
+ mask = undefined}]},
+ data =
+ <<255,255,255,255,255,255,242,11,164,125,248,234,8,6,0,
+ 1,8,0,6,4,0,1,242,11,164,125,248,234,10,0,0,1,0,0,0,0,
+ 0,0,10,0,0,3>>},
+ #ofp_features_request{},
+ #ofp_features_reply{
+ datapath_mac = <<8,96,110,127,116,231>>,
+ datapath_id = 0,n_buffers = 0,n_tables = 255,
+ auxiliary_id = 99,
+ capabilities =
+ [flow_stats,table_stats,port_stats,group_stats,queue_stats]},
+ #ofp_set_config{flags = [],miss_send_len = 128},
+ #ofp_get_config_request{},
+ #ofp_get_config_reply{flags = [],miss_send_len = 128},
+ #ofp_hello{elements = [{versionbitmap, [30, 10, 9, 3, 2, 1]}]},
+ #ofp_flow_stats_request{
+ flags = [],table_id = 0,out_port = any,out_group = any,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ match = #ofp_match{fields = []}},
+ #ofp_flow_stats_reply{
+ flags = [],
+ body =
+ [#ofp_flow_stats{
+ table_id = 0,duration_sec = 358,
+ duration_nsec = 115277000,priority = 65535,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 0,byte_count = 0,
+ match = #ofp_match{fields = []},
+ instructions = []},
+ #ofp_flow_stats{
+ table_id = 0,duration_sec = 358,
+ duration_nsec = 115055000,priority = 65534,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 0,byte_count = 0,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_type,
+ has_mask = false,
+ value = <<8,6>>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_apply_actions{
+ actions =
+ [#ofp_action_output{
+ port = normal,max_len = 0}]}]},
+ #ofp_flow_stats{
+ table_id = 0,duration_sec = 316220,
+ duration_nsec = 511582000,priority = 123,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 3,byte_count = 238,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<0,0,0,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_goto_table{table_id = 1}]},
+ #ofp_flow_stats{
+ table_id = 0,duration_sec = 313499,
+ duration_nsec = 980901000,priority = 0,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 1,byte_count = 98,
+ match = #ofp_match{fields = []},
+ instructions =
+ [#ofp_instruction_write_actions{
+ actions =
+ [#ofp_action_set_field{
+ field = #ofp_field{name = vlan_vid,
+ value = <<258:13>> }},
+ #ofp_action_copy_ttl_out{},
+ #ofp_action_copy_ttl_in{},
+ #ofp_action_copy_ttl_in{},
+ #ofp_action_pop_pbb{},
+ #ofp_action_push_pbb{ethertype = 16#1234},
+ #ofp_action_pop_mpls{ethertype= 16#9876},
+ #ofp_action_push_mpls{ethertype = 16#8847},
+ #ofp_action_pop_vlan{},
+ #ofp_action_push_vlan{ethertype = 16#8100},
+ #ofp_action_dec_mpls_ttl{},
+ #ofp_action_set_mpls_ttl{mpls_ttl = 10},
+ #ofp_action_dec_nw_ttl{},
+ #ofp_action_set_nw_ttl{nw_ttl = 10},
+ #ofp_action_set_queue{queue_id = 3},
+ #ofp_action_group{group_id = 99},
+ #ofp_action_output{port = 6,
+ max_len = no_buffer},
+ #ofp_action_experimenter{experimenter = 98765432,
+ data = <<"exp_data">>},
+ #ofp_action_experimenter{experimenter = 8992,
+ data = <<"exp_data">>}
+ ]},
+ #ofp_instruction_apply_actions{
+ actions =
+ [#ofp_action_set_field{
+ field = #ofp_field{name = eth_src,
+ value = <<1,2,3,4,
+ 5,6>> }},
+ #ofp_action_set_field{
+ field = #ofp_field{class = {experimenter,
+ onf},
+ name = pbb_uca,
+ value = <<1:1>> }}]},
+ #ofp_instruction_write_actions{
+ actions =
+ [#ofp_action_output{
+ port = controller,
+ max_len = no_buffer}]}]}]},
+ #ofp_echo_request{
+ data = <<"hoge">>
+ },
+ #ofp_echo_reply{
+ data = <<"hoge">>
+ },
+ #ofp_error_msg{
+ type = bad_action,
+ code = unsupported_order,
+ data = <<"fugafuga">>
+ },
+ #ofp_experimenter{
+ experimenter = 98765432,
+ exp_type = 123456789,
+ data = <<"nazo">>
+ },
+ #ofp_barrier_request{},
+ #ofp_barrier_reply{},
+ #ofp_role_request{
+ role = master,
+ generation_id = 16#f000f000f000f000},
+ #ofp_role_reply{
+ role = slave,
+ generation_id = 16#f000f000f000f000},
+
+ #ofp_group_mod{
+ command = add,type = all,group_id = 1,
+ buckets =
+ [#ofp_bucket{
+ weight = 1,watch_port = 1,watch_group = 1,
+ actions =
+ [#ofp_action_output{port = 2,max_len = no_buffer}]}]},
+ #ofp_port_mod{port_no = 1, hw_addr = <<0,17,0,0,17,17>>,
+ config = [],mask = [], advertise = [fiber]},
+ #ofp_table_mod{table_id = all},
+ #ofp_desc_request{},
+ #ofp_aggregate_stats_request{
+ flags = [],table_id = all,out_port = any,out_group = any,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ match = #ofp_match{fields = []}},
+ #ofp_aggregate_stats_reply{flags = [],packet_count = 7,
+ byte_count = 574,flow_count = 6},
+ #ofp_table_stats_request{},
+
+#ofp_table_stats_reply{
+ flags = [],
+ body =
+ [#ofp_table_stats{
+ table_id = 0,
+ active_count = 4, lookup_count = 4,matched_count = 4},
+ #ofp_table_stats{
+ table_id = 1,
+ active_count = 4, lookup_count = 4,matched_count = 4}]},
+
+ #ofp_port_stats_request{flags = [],port_no = any},
+ #ofp_port_stats_reply{
+ flags = [],
+ body =
+ [#ofp_port_stats{
+ port_no = 7,rx_packets = 0,tx_packets = 4,rx_bytes = 0,
+ tx_bytes = 336,rx_dropped = 0,tx_dropped = 0,
+ rx_errors = 0,
+ tx_errors = 0,rx_frame_err = 0,rx_over_err = 0,
+ rx_crc_err = 0,collisions = 0},
+ #ofp_port_stats{
+ port_no = 6,rx_packets = 4,tx_packets = 4,rx_bytes = 336,
+ tx_bytes = 336,rx_dropped = 0,tx_dropped = 0,
+ rx_errors = 0,
+ tx_errors = 0,rx_frame_err = 0,rx_over_err = 0,
+ rx_crc_err = 0,collisions = 0}]},
+ #ofp_group_features_request{flags = []},
+ #ofp_group_features_reply{
+ flags = [],
+ types = [all,select,indirect,ff],
+ capabilities = [select_weight,chaining],
+ max_groups = {16777216,16777216,16777216,16777216},
+ actions =
+ {[output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field],
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field],
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field],
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field]}},
+ #ofp_group_desc_request{},
+ #ofp_group_desc_reply{
+ flags = [],
+ body =
+ [#ofp_group_desc_stats{
+ type = all,group_id = 1,
+ buckets =
+ [#ofp_bucket{
+ weight = 1,watch_port = 1,watch_group = 1,
+ actions =
+ [#ofp_action_output{
+ port = 2, max_len = no_buffer}]}]}]},
+ #ofp_queue_get_config_request{port = any},
+ #ofp_queue_get_config_reply{port = any,queues = [
+ #ofp_packet_queue{queue_id = 99, port_no = 77,
+ properties = [
+ #ofp_queue_prop_min_rate{rate = 10},
+ #ofp_queue_prop_max_rate{rate = 900},
+ #ofp_queue_prop_experimenter{experimenter = 999,
+ data = <<>>}
+ ]
+ },
+ #ofp_packet_queue{queue_id = 88, port_no = 77,
+ properties = [
+ #ofp_queue_prop_min_rate{rate = 100},
+ #ofp_queue_prop_max_rate{rate = 200},
+ #ofp_queue_prop_experimenter{experimenter = 999,
+ data = <<1:8>>}
+ ]
+ },
+ #ofp_packet_queue{queue_id = 77, port_no = 77,
+ properties = [
+ #ofp_queue_prop_min_rate{rate = 200},
+ #ofp_queue_prop_max_rate{rate = 400},
+ #ofp_queue_prop_experimenter{experimenter = 999,
+ data = <<1:8,2:8>>}
+ ]
+ }
+ ]},
+ #ofp_queue_stats_request{flags = [],port_no = any,
+ queue_id = all},
+ #ofp_queue_stats_reply{
+ flags = [],
+ body =
+ [#ofp_queue_stats{
+ port_no = 7,queue_id = 1,tx_bytes = 0,tx_packets = 0,
+ tx_errors = 0},
+ #ofp_queue_stats{
+ port_no = 6,queue_id = 1,tx_bytes = 0,tx_packets = 0,
+ tx_errors = 0},
+ #ofp_queue_stats{
+ port_no = 7,queue_id = 2,tx_bytes = 0,tx_packets = 0,
+ tx_errors = 0}]},
+ #ofp_port_status{
+ reason = add,
+ desc = #ofp_port{
+ port_no = 7,hw_addr = <<"\362\v\244\320?p">>,
+ name = <<"\xe7\xa7\x81\xe3\x81\xae\xe3\x83\x9d\xe3\x83\xbc\xe3\x83\x88">>, % "my port" in japanese, utf-8
+ config = [],
+ state = [live],
+ curr = ['100mb_fd',copper,autoneg],
+ advertised = [copper,autoneg],
+ supported = ['100mb_fd',copper,autoneg],
+ peer = ['100mb_fd',copper,autoneg],
+ curr_speed = 5000,max_speed = 5000}
+ },
+ #ofp_flow_removed{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ priority = 65535,reason = idle_timeout,table_id = 0,
+ duration_sec = 3,duration_nsec = 48825000,idle_timeout = 3,
+ hard_timeout = 0,packet_count = 1,byte_count = 86,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]}},
+ #ofp_error_msg_experimenter{
+ exp_type = 60000,
+ experimenter = 999999,
+ data = <<"jikken data">>
+ },
+ #ofp_get_async_request{},
+ #ofp_get_async_reply{
+ packet_in_mask = {[no_match, invalid_ttl], [no_match]},
+ port_status_mask = {[add, delete, modify], [add, delete]},
+ flow_removed_mask = {
+ [idle_timeout, hard_timeout, delete, group_delete],
+ [idle_timeout, hard_timeout]
+ }
+ },
+ #ofp_set_async{
+ packet_in_mask = {[no_match, invalid_ttl], [no_match]},
+ port_status_mask = {[add, delete, modify], [add, delete]},
+ flow_removed_mask = {
+ [idle_timeout, hard_timeout, delete, group_delete],
+ [idle_timeout, hard_timeout]
+ }
+ },
+
+ #ofp_meter_mod{
+ command = add,
+ flags = [pktps, burst, stats],
+ meter_id = 100,
+ bands = [
+ #ofp_meter_band_drop{rate = 1000, burst_size = 10},
+ #ofp_meter_band_dscp_remark{rate = 1000, burst_size = 10,
+ prec_level = 1},
+ #ofp_meter_band_experimenter{rate = 1000, burst_size = 10,
+ experimenter = 999}
+ ]
+ },
+
+ #ofp_flow_mod{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ table_id = 1,command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = any,out_group = any,flags = [],
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_meter{meter_id = 1},
+ #ofp_instruction_write_actions{
+ actions =
+ [#ofp_action_output{port = 6,max_len = no_buffer}]}]},
+
+ #ofp_meter_config_request{meter_id = all},
+ #ofp_meter_config_reply{
+ body =
+ [#ofp_meter_config{
+ flags = [pktps,burst,stats],
+ meter_id = 100,
+ bands =
+ [#ofp_meter_band_drop{
+ type = drop,rate = 1000,burst_size = 10}]}]},
+
+ #ofp_meter_stats_request{meter_id = all},
+ #ofp_meter_stats_reply{
+ body =
+ [#ofp_meter_stats{
+ meter_id = 100,flow_count = 0,packet_in_count = 0,
+ byte_in_count = 0,duration_sec = 0,duration_nsec = 480000,
+ band_stats =
+ [#ofp_meter_band_stats{
+ packet_band_count = 0,byte_band_count = 0}]}]},
+
+ #ofp_meter_features_request{},
+ #ofp_meter_features_reply{max_meter = 16777216,
+ band_types = [drop,dscp_remark,experimenter],
+ capabilities = [kbps,pktps,burst,stats],
+ max_bands = 255,max_color = 0},
+ #ofp_port_desc_request{flags = []},
+ #ofp_port_desc_reply{flags = [],
+ body = [#ofp_port{port_no = 7,hw_addr = <<"\362\v\244\320?p">>,
+ name = <<"Port7">>,config = [],
+ state = [live],
+ curr = ['100mb_fd',copper,autoneg],
+ advertised = [copper,autoneg],
+ supported = ['100mb_fd',copper,autoneg],
+ peer = ['100mb_fd',copper,autoneg],
+ curr_speed = 5000,max_speed = 5000},
+ #ofp_port{port_no = 6,hw_addr = <<"\362\v\244}\370\352">>,
+ name = <<"Port6">>,config = [],
+ state = [live],
+ curr = ['100mb_fd',copper,autoneg],
+ advertised = [copper,autoneg],
+ supported = ['100mb_fd',copper,autoneg],
+ peer = ['100mb_fd',copper,autoneg],
+ curr_speed = 5000,max_speed = 5000}]},
+
+
+ #ofp_table_features_request{
+ flags = [more],
+ body =
+ [#ofp_table_features{
+ table_id = 0,name = <<"Flow Table 0x00">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
+ 18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+ 32,33,34,35,36,37,38,39,40,41,42,43,44,45,
+ 46,47,48,49,50,51,52,53,54,55,56,57,58,59,
+ 60,61,62,63,64,65,66,67,68,69,70,71,72,73,
+ 74,75,76,77,78,79,80,81,82,83,84,85,86,87,
+ 88,89,90,91,92,93,94,95,96,97,98,99,100,
+ 101,102,103,104,105,106,107,108,109,110,
+ 111,112,113,114,115,116,117,118,119,120,
+ 121,122,123,124,125,126,127,128,129,130,
+ 131,132,133,134,135,136,137,138,139,140,
+ 141,142,143,144,145,146,147,148,149,150,
+ 151,152,153,154,155,156,157,158,159,160,
+ 161,162,163,164,165,166,167,168,169,170,
+ 171,172,173,174,175,176,177,178,179,180,
+ 181,182,183,184,185,186,187,188,189,190,
+ 191,192,193,194,195,196,197,198,199,200,
+ 201,202,203,204,205,206,207,208,209,210,
+ 211,212,213,214,215,216,217,218,219,220,
+ 221,222,223,224,225,226,227,228,229,230,
+ 231,232,233,234,235,236,237,238,239,240,
+ 241,242,243,244,245,246,247,248,249,250,
+ 251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]},
+ #ofp_table_features{
+ table_id = 1,name = <<"Flow Table 0x01">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
+ 19,20,21,22,23,24,25,26,27,28,29,30,31,32,
+ 33,34,35,36,37,38,39,40,41,42,43,44,45,46,
+ 47,48,49,50,51,52,53,54,55,56,57,58,59,60,
+ 61,62,63,64,65,66,67,68,69,70,71,72,73,74,
+ 75,76,77,78,79,80,81,82,83,84,85,86,87,88,
+ 89,90,91,92,93,94,95,96,97,98,99,100,101,
+ 102,103,104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,120,121,
+ 122,123,124,125,126,127,128,129,130,131,
+ 132,133,134,135,136,137,138,139,140,141,
+ 142,143,144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,160,161,
+ 162,163,164,165,166,167,168,169,170,171,
+ 172,173,174,175,176,177,178,179,180,181,
+ 182,183,184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,200,201,
+ 202,203,204,205,206,207,208,209,210,211,
+ 212,213,214,215,216,217,218,219,220,221,
+ 222,223,224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,240,241,
+ 242,243,244,245,246,247,248,249,250,251,
+ 252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 2,name = <<"Flow Table 0x02">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
+ 19,20,21,22,23,24,25,26,27,28,29,30,31,32,
+ 33,34,35,36,37,38,39,40,41,42,43,44,45,46,
+ 47,48,49,50,51,52,53,54,55,56,57,58,59,60,
+ 61,62,63,64,65,66,67,68,69,70,71,72,73,74,
+ 75,76,77,78,79,80,81,82,83,84,85,86,87,88,
+ 89,90,91,92,93,94,95,96,97,98,99,100,101,
+ 102,103,104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,120,121,
+ 122,123,124,125,126,127,128,129,130,131,
+ 132,133,134,135,136,137,138,139,140,141,
+ 142,143,144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,160,161,
+ 162,163,164,165,166,167,168,169,170,171,
+ 172,173,174,175,176,177,178,179,180,181,
+ 182,183,184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,200,201,
+ 202,203,204,205,206,207,208,209,210,211,
+ 212,213,214,215,216,217,218,219,220,221,
+ 222,223,224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,240,241,
+ 242,243,244,245,246,247,248,249,250,251,
+ 252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 3,name = <<"Flow Table 0x03">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
+ 20,21,22,23,24,25,26,27,28,29,30,31,32,33,
+ 34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+ 48,49,50,51,52,53,54,55,56,57,58,59,60,61,
+ 62,63,64,65,66,67,68,69,70,71,72,73,74,75,
+ 76,77,78,79,80,81,82,83,84,85,86,87,88,89,
+ 90,91,92,93,94,95,96,97,98,99,100,101,102,
+ 103,104,105,106,107,108,109,110,111,112,
+ 113,114,115,116,117,118,119,120,121,122,
+ 123,124,125,126,127,128,129,130,131,132,
+ 133,134,135,136,137,138,139,140,141,142,
+ 143,144,145,146,147,148,149,150,151,152,
+ 153,154,155,156,157,158,159,160,161,162,
+ 163,164,165,166,167,168,169,170,171,172,
+ 173,174,175,176,177,178,179,180,181,182,
+ 183,184,185,186,187,188,189,190,191,192,
+ 193,194,195,196,197,198,199,200,201,202,
+ 203,204,205,206,207,208,209,210,211,212,
+ 213,214,215,216,217,218,219,220,221,222,
+ 223,224,225,226,227,228,229,230,231,232,
+ 233,234,235,236,237,238,239,240,241,242,
+ 243,244,245,246,247,248,249,250,251,252,
+ 253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 4,name = <<"Flow Table 0x04">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
+ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,
+ 35,36,37,38,39,40,41,42,43,44,45,46,47,48,
+ 49,50,51,52,53,54,55,56,57,58,59,60,61,62,
+ 63,64,65,66,67,68,69,70,71,72,73,74,75,76,
+ 77,78,79,80,81,82,83,84,85,86,87,88,89,90,
+ 91,92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 5,name = <<"Flow Table 0x05">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
+ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,
+ 35,36,37,38,39,40,41,42,43,44,45,46,47,48,
+ 49,50,51,52,53,54,55,56,57,58,59,60,61,62,
+ 63,64,65,66,67,68,69,70,71,72,73,74,75,76,
+ 77,78,79,80,81,82,83,84,85,86,87,88,89,90,
+ 91,92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 6,name = <<"Flow Table 0x06">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
+ 22,23,24,25,26,27,28,29,30,31,32,33,34,35,
+ 36,37,38,39,40,41,42,43,44,45,46,47,48,49,
+ 50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+ 64,65,66,67,68,69,70,71,72,73,74,75,76,77,
+ 78,79,80,81,82,83,84,85,86,87,88,89,90,91,
+ 92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 7,name = <<"Flow Table 0x07">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
+ 23,24,25,26,27,28,29,30,31,32,33,34,35,36,
+ 37,38,39,40,41,42,43,44,45,46,47,48,49,50,
+ 51,52,53,54,55,56,57,58,59,60,61,62,63,64,
+ 65,66,67,68,69,70,71,72,73,74,75,76,77,78,
+ 79,80,81,82,83,84,85,86,87,88,89,90,91,92,
+ 93,94,95,96,97,98,99,100,101,102,103,104,
+ 105,106,107,108,109,110,111,112,113,114,
+ 115,116,117,118,119,120,121,122,123,124,
+ 125,126,127,128,129,130,131,132,133,134,
+ 135,136,137,138,139,140,141,142,143,144,
+ 145,146,147,148,149,150,151,152,153,154,
+ 155,156,157,158,159,160,161,162,163,164,
+ 165,166,167,168,169,170,171,172,173,174,
+ 175,176,177,178,179,180,181,182,183,184,
+ 185,186,187,188,189,190,191,192,193,194,
+ 195,196,197,198,199,200,201,202,203,204,
+ 205,206,207,208,209,210,211,212,213,214,
+ 215,216,217,218,219,220,221,222,223,224,
+ 225,226,227,228,229,230,231,232,233,234,
+ 235,236,237,238,239,240,241,242,243,244,
+ 245,246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 8,name = <<"Flow Table 0x08">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [9,10,11,12,13,14,15,16,17,18,19,20,21,22,
+ 23,24,25,26,27,28,29,30,31,32,33,34,35,36,
+ 37,38,39,40,41,42,43,44,45,46,47,48,49,50,
+ 51,52,53,54,55,56,57,58,59,60,61,62,63,64,
+ 65,66,67,68,69,70,71,72,73,74,75,76,77,78,
+ 79,80,81,82,83,84,85,86,87,88,89,90,91,92,
+ 93,94,95,96,97,98,99,100,101,102,103,104,
+ 105,106,107,108,109,110,111,112,113,114,
+ 115,116,117,118,119,120,121,122,123,124,
+ 125,126,127,128,129,130,131,132,133,134,
+ 135,136,137,138,139,140,141,142,143,144,
+ 145,146,147,148,149,150,151,152,153,154,
+ 155,156,157,158,159,160,161,162,163,164,
+ 165,166,167,168,169,170,171,172,173,174,
+ 175,176,177,178,179,180,181,182,183,184,
+ 185,186,187,188,189,190,191,192,193,194,
+ 195,196,197,198,199,200,201,202,203,204,
+ 205,206,207,208,209,210,211,212,213,214,
+ 215,216,217,218,219,220,221,222,223,224,
+ 225,226,227,228,229,230,231,232,233,234,
+ 235,236,237,238,239,240,241,242,243,244,
+ 245,246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 9,name = <<"Flow Table 0x09">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [10,11,12,13,14,15,16,17,18,19,20,21,22,23,
+ 24,25,26,27,28,29,30,31,32,33,34,35,36,37,
+ 38,39,40,41,42,43,44,45,46,47,48,49,50,51,
+ 52,53,54,55,56,57,58,59,60,61,62,63,64,65,
+ 66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+ 80,81,82,83,84,85,86,87,88,89,90,91,92,93,
+ 94,95,96,97,98,99,100,101,102,103,104,105,
+ 106,107,108,109,110,111,112,113,114,115,
+ 116,117,118,119,120,121,122,123,124,125,
+ 126,127,128,129,130,131,132,133,134,135,
+ 136,137,138,139,140,141,142,143,144,145,
+ 146,147,148,149,150,151,152,153,154,155,
+ 156,157,158,159,160,161,162,163,164,165,
+ 166,167,168,169,170,171,172,173,174,175,
+ 176,177,178,179,180,181,182,183,184,185,
+ 186,187,188,189,190,191,192,193,194,195,
+ 196,197,198,199,200,201,202,203,204,205,
+ 206,207,208,209,210,211,212,213,214,215,
+ 216,217,218,219,220,221,222,223,224,225,
+ 226,227,228,229,230,231,232,233,234,235,
+ 236,237,238,239,240,241,242,243,244,245,
+ 246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]}]},
+ #ofp_table_features_reply{
+ flags = [more],
+ body =
+ [#ofp_table_features{
+ table_id = 0,name = <<"\xe7\xa7\x81\xe3\x81\xae\xe3\x83\x86\xe3\x83\xbc\xe3\x83\x96\xe3\x83\xab">>, % "my table" in japanese, utf-8
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
+ 18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+ 32,33,34,35,36,37,38,39,40,41,42,43,44,45,
+ 46,47,48,49,50,51,52,53,54,55,56,57,58,59,
+ 60,61,62,63,64,65,66,67,68,69,70,71,72,73,
+ 74,75,76,77,78,79,80,81,82,83,84,85,86,87,
+ 88,89,90,91,92,93,94,95,96,97,98,99,100,
+ 101,102,103,104,105,106,107,108,109,110,
+ 111,112,113,114,115,116,117,118,119,120,
+ 121,122,123,124,125,126,127,128,129,130,
+ 131,132,133,134,135,136,137,138,139,140,
+ 141,142,143,144,145,146,147,148,149,150,
+ 151,152,153,154,155,156,157,158,159,160,
+ 161,162,163,164,165,166,167,168,169,170,
+ 171,172,173,174,175,176,177,178,179,180,
+ 181,182,183,184,185,186,187,188,189,190,
+ 191,192,193,194,195,196,197,198,199,200,
+ 201,202,203,204,205,206,207,208,209,210,
+ 211,212,213,214,215,216,217,218,219,220,
+ 221,222,223,224,225,226,227,228,229,230,
+ 231,232,233,234,235,236,237,238,239,240,
+ 241,242,243,244,245,246,247,248,249,250,
+ 251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]},
+ #ofp_table_features{
+ table_id = 1,name = <<"Flow Table 0x01">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
+ 19,20,21,22,23,24,25,26,27,28,29,30,31,32,
+ 33,34,35,36,37,38,39,40,41,42,43,44,45,46,
+ 47,48,49,50,51,52,53,54,55,56,57,58,59,60,
+ 61,62,63,64,65,66,67,68,69,70,71,72,73,74,
+ 75,76,77,78,79,80,81,82,83,84,85,86,87,88,
+ 89,90,91,92,93,94,95,96,97,98,99,100,101,
+ 102,103,104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,120,121,
+ 122,123,124,125,126,127,128,129,130,131,
+ 132,133,134,135,136,137,138,139,140,141,
+ 142,143,144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,160,161,
+ 162,163,164,165,166,167,168,169,170,171,
+ 172,173,174,175,176,177,178,179,180,181,
+ 182,183,184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,200,201,
+ 202,203,204,205,206,207,208,209,210,211,
+ 212,213,214,215,216,217,218,219,220,221,
+ 222,223,224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,240,241,
+ 242,243,244,245,246,247,248,249,250,251,
+ 252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 2,name = <<"Flow Table 0x02">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
+ 19,20,21,22,23,24,25,26,27,28,29,30,31,32,
+ 33,34,35,36,37,38,39,40,41,42,43,44,45,46,
+ 47,48,49,50,51,52,53,54,55,56,57,58,59,60,
+ 61,62,63,64,65,66,67,68,69,70,71,72,73,74,
+ 75,76,77,78,79,80,81,82,83,84,85,86,87,88,
+ 89,90,91,92,93,94,95,96,97,98,99,100,101,
+ 102,103,104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,120,121,
+ 122,123,124,125,126,127,128,129,130,131,
+ 132,133,134,135,136,137,138,139,140,141,
+ 142,143,144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,160,161,
+ 162,163,164,165,166,167,168,169,170,171,
+ 172,173,174,175,176,177,178,179,180,181,
+ 182,183,184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,200,201,
+ 202,203,204,205,206,207,208,209,210,211,
+ 212,213,214,215,216,217,218,219,220,221,
+ 222,223,224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,240,241,
+ 242,243,244,245,246,247,248,249,250,251,
+ 252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 3,name = <<"Flow Table 0x03">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
+ 20,21,22,23,24,25,26,27,28,29,30,31,32,33,
+ 34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+ 48,49,50,51,52,53,54,55,56,57,58,59,60,61,
+ 62,63,64,65,66,67,68,69,70,71,72,73,74,75,
+ 76,77,78,79,80,81,82,83,84,85,86,87,88,89,
+ 90,91,92,93,94,95,96,97,98,99,100,101,102,
+ 103,104,105,106,107,108,109,110,111,112,
+ 113,114,115,116,117,118,119,120,121,122,
+ 123,124,125,126,127,128,129,130,131,132,
+ 133,134,135,136,137,138,139,140,141,142,
+ 143,144,145,146,147,148,149,150,151,152,
+ 153,154,155,156,157,158,159,160,161,162,
+ 163,164,165,166,167,168,169,170,171,172,
+ 173,174,175,176,177,178,179,180,181,182,
+ 183,184,185,186,187,188,189,190,191,192,
+ 193,194,195,196,197,198,199,200,201,202,
+ 203,204,205,206,207,208,209,210,211,212,
+ 213,214,215,216,217,218,219,220,221,222,
+ 223,224,225,226,227,228,229,230,231,232,
+ 233,234,235,236,237,238,239,240,241,242,
+ 243,244,245,246,247,248,249,250,251,252,
+ 253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 4,name = <<"Flow Table 0x04">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
+ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,
+ 35,36,37,38,39,40,41,42,43,44,45,46,47,48,
+ 49,50,51,52,53,54,55,56,57,58,59,60,61,62,
+ 63,64,65,66,67,68,69,70,71,72,73,74,75,76,
+ 77,78,79,80,81,82,83,84,85,86,87,88,89,90,
+ 91,92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 5,name = <<"Flow Table 0x05">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
+ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,
+ 35,36,37,38,39,40,41,42,43,44,45,46,47,48,
+ 49,50,51,52,53,54,55,56,57,58,59,60,61,62,
+ 63,64,65,66,67,68,69,70,71,72,73,74,75,76,
+ 77,78,79,80,81,82,83,84,85,86,87,88,89,90,
+ 91,92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 6,name = <<"Flow Table 0x06">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
+ 22,23,24,25,26,27,28,29,30,31,32,33,34,35,
+ 36,37,38,39,40,41,42,43,44,45,46,47,48,49,
+ 50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+ 64,65,66,67,68,69,70,71,72,73,74,75,76,77,
+ 78,79,80,81,82,83,84,85,86,87,88,89,90,91,
+ 92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 7,name = <<"Flow Table 0x07">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
+ 23,24,25,26,27,28,29,30,31,32,33,34,35,36,
+ 37,38,39,40,41,42,43,44,45,46,47,48,49,50,
+ 51,52,53,54,55,56,57,58,59,60,61,62,63,64,
+ 65,66,67,68,69,70,71,72,73,74,75,76,77,78,
+ 79,80,81,82,83,84,85,86,87,88,89,90,91,92,
+ 93,94,95,96,97,98,99,100,101,102,103,104,
+ 105,106,107,108,109,110,111,112,113,114,
+ 115,116,117,118,119,120,121,122,123,124,
+ 125,126,127,128,129,130,131,132,133,134,
+ 135,136,137,138,139,140,141,142,143,144,
+ 145,146,147,148,149,150,151,152,153,154,
+ 155,156,157,158,159,160,161,162,163,164,
+ 165,166,167,168,169,170,171,172,173,174,
+ 175,176,177,178,179,180,181,182,183,184,
+ 185,186,187,188,189,190,191,192,193,194,
+ 195,196,197,198,199,200,201,202,203,204,
+ 205,206,207,208,209,210,211,212,213,214,
+ 215,216,217,218,219,220,221,222,223,224,
+ 225,226,227,228,229,230,231,232,233,234,
+ 235,236,237,238,239,240,241,242,243,244,
+ 245,246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 8,name = <<"Flow Table 0x08">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [9,10,11,12,13,14,15,16,17,18,19,20,21,22,
+ 23,24,25,26,27,28,29,30,31,32,33,34,35,36,
+ 37,38,39,40,41,42,43,44,45,46,47,48,49,50,
+ 51,52,53,54,55,56,57,58,59,60,61,62,63,64,
+ 65,66,67,68,69,70,71,72,73,74,75,76,77,78,
+ 79,80,81,82,83,84,85,86,87,88,89,90,91,92,
+ 93,94,95,96,97,98,99,100,101,102,103,104,
+ 105,106,107,108,109,110,111,112,113,114,
+ 115,116,117,118,119,120,121,122,123,124,
+ 125,126,127,128,129,130,131,132,133,134,
+ 135,136,137,138,139,140,141,142,143,144,
+ 145,146,147,148,149,150,151,152,153,154,
+ 155,156,157,158,159,160,161,162,163,164,
+ 165,166,167,168,169,170,171,172,173,174,
+ 175,176,177,178,179,180,181,182,183,184,
+ 185,186,187,188,189,190,191,192,193,194,
+ 195,196,197,198,199,200,201,202,203,204,
+ 205,206,207,208,209,210,211,212,213,214,
+ 215,216,217,218,219,220,221,222,223,224,
+ 225,226,227,228,229,230,231,232,233,234,
+ 235,236,237,238,239,240,241,242,243,244,
+ 245,246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 9,name = <<"Flow Table 0x09">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [10,11,12,13,14,15,16,17,18,19,20,21,22,23,
+ 24,25,26,27,28,29,30,31,32,33,34,35,36,37,
+ 38,39,40,41,42,43,44,45,46,47,48,49,50,51,
+ 52,53,54,55,56,57,58,59,60,61,62,63,64,65,
+ 66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+ 80,81,82,83,84,85,86,87,88,89,90,91,92,93,
+ 94,95,96,97,98,99,100,101,102,103,104,105,
+ 106,107,108,109,110,111,112,113,114,115,
+ 116,117,118,119,120,121,122,123,124,125,
+ 126,127,128,129,130,131,132,133,134,135,
+ 136,137,138,139,140,141,142,143,144,145,
+ 146,147,148,149,150,151,152,153,154,155,
+ 156,157,158,159,160,161,162,163,164,165,
+ 166,167,168,169,170,171,172,173,174,175,
+ 176,177,178,179,180,181,182,183,184,185,
+ 186,187,188,189,190,191,192,193,194,195,
+ 196,197,198,199,200,201,202,203,204,205,
+ 206,207,208,209,210,211,212,213,214,215,
+ 216,217,218,219,220,221,222,223,224,225,
+ 226,227,228,229,230,231,232,233,234,235,
+ 236,237,238,239,240,241,242,243,244,245,
+ 246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]}]},
+ #ofp_group_stats_request{flags = [],group_id = all},
+ #ofp_group_stats_reply{
+ flags = [],
+ body =
+ [#ofp_group_stats{
+ group_id = 1,ref_count = 2,packet_count = 123,
+ byte_count = 12345,duration_sec = 9,
+ duration_nsec = 609036000,
+ bucket_stats =
+ [#ofp_bucket_counter{
+ packet_count = 234,byte_count = 2345}]}]},
+ #ofp_packet_in{
+ buffer_id = 16#f0000000,reason = no_match,table_id = 200,
+ cookie = <<0,1,2,3,0,0,0,0>>,
+ match = #ofp_match{fields = AllFields},
+ data = <<>>},
+ #ofp_flow_mod{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ table_id = 1,command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = any,out_group = any,flags = [],
+ match = #ofp_match{fields = AllFields},
+ instructions = []},
+ #ofp_experimenter_request{
+ experimenter = 16#deadbeaf,
+ exp_type = 16#cafe8888,
+ data = <<"hogehoge">>
+ },
+ #ofp_experimenter_reply{
+ experimenter = 16#deadbeaf,
+ exp_type = 16#cafe7777,
+ data = <<"testdata99999999">>
+ },
+ #onf_flow_monitor_request{
+ flags = [],
+ body = [
+ #onf_flow_monitor{
+ id = 100000000,
+ flags = [initial, add, delete, modify],
+ out_port = 22,
+ table_id = 33,
+ fields = []
+ },
+ #onf_flow_monitor{
+ id = 999,
+ flags = [initial, actions, own],
+ out_port = any,
+ table_id = all,
+ fields = AllFields
+ }
+ ]
+ }
+ ],
+ lists:foldl(fun x:do/2, {4, 0}, List).
diff --git a/tests/packet_data_generator/src/x5.erl b/tests/packet_data_generator/src/x5.erl
new file mode 100644
index 00000000..c9fa429b
--- /dev/null
+++ b/tests/packet_data_generator/src/x5.erl
@@ -0,0 +1,3024 @@
+%% Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+%% Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+%% implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+
+-module(x5).
+-export([x/0]).
+
+-include_lib("of_protocol/include/of_protocol.hrl").
+-include_lib("of_protocol/include/ofp_v5.hrl").
+
+x() ->
+ AllFields = [
+ #ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<5,6,7,8>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = in_phy_port,
+ has_mask = false,
+ value = <<1,2,3,4>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = metadata,
+ has_mask = false,
+ value = <<0,1,2,3,4,5,6,7>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_type,
+ has_mask = false,
+ value = <<8,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,value = <<"\377\377\377\377\377\377">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = vlan_vid,
+ has_mask = false,value = <<999:13>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ip_dscp,
+ has_mask = false,value = <<9:6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ip_ecn,
+ has_mask = false,value = <<3:2>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ip_proto,
+ has_mask = false,value = <<99>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv4_src,
+ has_mask = false,value = <<1,2,3,4>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv4_dst,
+ has_mask = false,value = <<1,2,3,4>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = tcp_src,
+ has_mask = false,value = <<8080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = tcp_dst,
+ has_mask = false,value = <<18080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = udp_src,
+ has_mask = false,value = <<28080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = udp_dst,
+ has_mask = false,value = <<318080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = sctp_src,
+ has_mask = false,value = <<48080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = sctp_dst,
+ has_mask = false,value = <<518080:16>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv4_type,
+ has_mask = false,value = <<100>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv4_code,
+ has_mask = false,value = <<101>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_op,
+ has_mask = false,
+ value = <<0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_spa,
+ has_mask = false,
+ value = <<10,0,0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tpa,
+ has_mask = false,
+ value = <<10,0,0,3>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_sha,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tha,
+ has_mask = false,
+ value = <<0,0,0,0,0,0>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_src,
+ has_mask = false,
+ % fe80::f00b:a4ff:fe48:28a5
+ value = <<16#fe80000000000000f00ba4fffe4828a5:128>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_dst,
+ has_mask = false,
+ % fe80::f00b:a4ff:fe05:b7dc
+ value = <<16#fe80000000000000f00ba4fffe05b7dc:128>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_flabel,
+ has_mask = false,
+ value = <<16#84321:20>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv6_type,
+ has_mask = false,
+ value = <<200>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = icmpv6_code,
+ has_mask = false,
+ value = <<201>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_nd_target,
+ has_mask = false,
+ % fe80::a60:6eff:fe7f:74e7
+ value = <<16#fe800000000000000a606efffe7f74e7:128>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_nd_sll,
+ has_mask = false,
+ value = <<666:48>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_nd_tll,
+ has_mask = false,
+ value = <<555:48>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = mpls_label,
+ has_mask = false,
+ value = <<16#98765:20>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = mpls_tc,
+ has_mask = false,
+ value = <<5:3>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = mpls_bos,
+ has_mask = false,
+ value = <<1:1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = pbb_isid,
+ has_mask = false,
+ value = <<16#abcdef:24>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = tunnel_id,
+ has_mask = false,
+ value = <<9,9,9,9,9,9,9,9>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = ipv6_exthdr,
+ has_mask = false,
+ value = <<500:9>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = pbb_uca,
+ has_mask = false,
+ value = <<1:1>>,
+ mask = undefined}
+ ],
+ List = [
+ #ofp_desc_reply{flags = [], mfr_desc = <<"mfr">>,
+ hw_desc = <<"hw">>, sw_desc = <<"sw">>,
+ serial_num = <<"serial">>,
+ dp_desc = <<"dp">>},
+ #ofp_packet_out{
+ buffer_id = no_buffer,in_port = controller,
+ actions =
+ [#ofp_action_output{port = all,max_len = no_buffer}],
+ data =
+ <<242,11,164,208,63,112,242,11,164,125,248,234,8,0,69,0,
+ 0,84,248,26,0,0,255,1,175,139,10,0,0,1,10,0,0,2,8,0,2,
+ 8,247,96,0,0,49,214,2,0,0,0,0,0,171,141,45,49,0,0,0,0,
+ 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,
+ 34,35,36,37,38,39,40,41,42,43,44,45,46,47,0,0,0,0,0,0,
+ 0,0>>},
+ #ofp_flow_mod{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ table_id = 1,command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = any,out_group = any,flags = [],
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_write_actions{
+ actions =
+ [#ofp_action_set_field{
+ field = #ofp_field{name = vlan_vid,
+ value = <<258:13>> }},
+ #ofp_action_copy_ttl_out{},
+ #ofp_action_copy_ttl_in{},
+ #ofp_action_copy_ttl_in{},
+ #ofp_action_pop_pbb{},
+ #ofp_action_push_pbb{ethertype = 16#1234},
+ #ofp_action_pop_mpls{ethertype= 16#9876},
+ #ofp_action_push_mpls{ethertype = 16#8847},
+ #ofp_action_pop_vlan{},
+ #ofp_action_push_vlan{ethertype = 16#8100},
+ #ofp_action_dec_mpls_ttl{},
+ #ofp_action_set_mpls_ttl{mpls_ttl = 10},
+ #ofp_action_dec_nw_ttl{},
+ #ofp_action_set_nw_ttl{nw_ttl = 10},
+ #ofp_action_experimenter{
+ experimenter = 101,
+ data = <<0,1,2,3,4,5,6,7>>},
+ #ofp_action_set_queue{queue_id = 3},
+ #ofp_action_group{group_id = 99},
+ #ofp_action_output{port = 6,max_len = no_buffer}]},
+ #ofp_instruction_apply_actions{
+ actions =
+ [#ofp_action_set_field{
+ field = #ofp_field{name = eth_src,
+ value = <<1,2,3,4,5,6>> }},
+ #ofp_action_set_field{
+ field = #ofp_field{name = pbb_uca,
+ value = <<1:1>> }}]}]},
+ #ofp_flow_mod{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ table_id = 0,command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = any,out_group = any,flags = [],
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<0,0,0,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_goto_table{table_id = 1}]},
+ #ofp_packet_in{
+ buffer_id = 2,reason = action_set,table_id = 1,
+ cookie = <<0,1,2,3,0,0,0,0>>,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<0,0,0,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_type,
+ has_mask = false,
+ value = <<8,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,value = <<"\377\377\377\377\377\377">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_op,
+ has_mask = false,
+ value = <<0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_spa,
+ has_mask = false,
+ value = <<10,0,0,1>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tpa,
+ has_mask = false,
+ value = <<10,0,0,3>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_sha,
+ has_mask = false,value = <<"\362\v\244}\370\352">>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = arp_tha,
+ has_mask = false,
+ value = <<0,0,0,0,0,0>>,
+ mask = undefined}]},
+ data =
+ <<255,255,255,255,255,255,242,11,164,125,248,234,8,6,0,
+ 1,8,0,6,4,0,1,242,11,164,125,248,234,10,0,0,1,0,0,0,0,
+ 0,0,10,0,0,3>>},
+ #ofp_features_request{},
+ #ofp_features_reply{
+ datapath_mac = <<8,96,110,127,116,231>>,
+ datapath_id = 0,n_buffers = 0,n_tables = 255,
+ auxiliary_id = 99,
+ capabilities =
+ [flow_stats,table_stats,port_stats,group_stats,queue_stats]},
+ #ofp_set_config{flags = [],miss_send_len = 128},
+ #ofp_get_config_request{},
+ #ofp_get_config_reply{flags = [],miss_send_len = 128},
+ #ofp_hello{elements = [{versionbitmap, [30, 10, 9, 3, 2, 1]}]},
+ #ofp_flow_stats_request{
+ flags = [],table_id = 0,out_port = any,out_group = any,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ match = #ofp_match{fields = []}},
+ #ofp_flow_stats_reply{
+ flags = [],
+ body =
+ [#ofp_flow_stats{
+ table_id = 0,duration_sec = 358,
+ duration_nsec = 115277000,priority = 65535,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 0,byte_count = 0,
+ match = #ofp_match{fields = []},
+ instructions = []},
+ #ofp_flow_stats{
+ table_id = 0,duration_sec = 358,
+ duration_nsec = 115055000,priority = 65534,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 0,byte_count = 0,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_type,
+ has_mask = false,
+ value = <<8,6>>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_apply_actions{
+ actions =
+ [#ofp_action_output{
+ port = normal,max_len = 0}]}]},
+ #ofp_flow_stats{
+ table_id = 0,duration_sec = 316220,
+ duration_nsec = 511582000,priority = 123,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 3,byte_count = 238,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = in_port,
+ has_mask = false,
+ value = <<0,0,0,6>>,
+ mask = undefined},
+ #ofp_field{
+ class = openflow_basic,name = eth_src,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_goto_table{table_id = 1}]},
+ #ofp_flow_stats{
+ table_id = 0,duration_sec = 313499,
+ duration_nsec = 980901000,priority = 0,
+ idle_timeout = 0,hard_timeout = 0,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ packet_count = 1,byte_count = 98,
+ match = #ofp_match{fields = []},
+ instructions =
+ [#ofp_instruction_write_actions{
+ actions =
+ [#ofp_action_set_field{
+ field = #ofp_field{name = vlan_vid,
+ value = <<258:13>> }},
+ #ofp_action_copy_ttl_out{},
+ #ofp_action_copy_ttl_in{},
+ #ofp_action_copy_ttl_in{},
+ #ofp_action_pop_pbb{},
+ #ofp_action_push_pbb{ethertype = 16#1234},
+ #ofp_action_pop_mpls{ethertype= 16#9876},
+ #ofp_action_push_mpls{ethertype = 16#8847},
+ #ofp_action_pop_vlan{},
+ #ofp_action_push_vlan{ethertype = 16#8100},
+ #ofp_action_dec_mpls_ttl{},
+ #ofp_action_set_mpls_ttl{mpls_ttl = 10},
+ #ofp_action_dec_nw_ttl{},
+ #ofp_action_set_nw_ttl{nw_ttl = 10},
+ #ofp_action_set_queue{queue_id = 3},
+ #ofp_action_group{group_id = 99},
+ #ofp_action_output{port = 6,
+ max_len = no_buffer},
+ #ofp_action_experimenter{experimenter = 98765432,
+ data = <<"exp_data">>},
+ #ofp_action_experimenter{experimenter = 8992,
+ data = <<"exp_data">>}
+ ]},
+ #ofp_instruction_apply_actions{
+ actions =
+ [#ofp_action_set_field{
+ field = #ofp_field{name = eth_src,
+ value = <<1,2,3,4,
+ 5,6>> }},
+ #ofp_action_set_field{
+ field = #ofp_field{name = pbb_uca,
+ value = <<1:1>> }}]},
+ #ofp_instruction_write_actions{
+ actions =
+ [#ofp_action_output{
+ port = controller,
+ max_len = no_buffer}]}]}]},
+ #ofp_echo_request{
+ data = <<"hoge">>
+ },
+ #ofp_echo_reply{
+ data = <<"hoge">>
+ },
+ #ofp_error_msg{
+ type = bad_action,
+ code = unsupported_order,
+ data = <<"fugafuga">>
+ },
+ #ofp_experimenter{
+ experimenter = 98765432,
+ exp_type = 123456789,
+ data = <<"nazo">>
+ },
+ #ofp_barrier_request{},
+ #ofp_barrier_reply{},
+ #ofp_role_request{
+ role = master,
+ generation_id = 16#f000f000f000f000},
+ #ofp_role_reply{
+ role = slave,
+ generation_id = 16#f000f000f000f000},
+
+ #ofp_group_mod{
+ command = add,type = all,group_id = 1,
+ buckets =
+ [#ofp_bucket{
+ weight = 1,watch_port = 1,watch_group = 1,
+ actions =
+ [#ofp_action_output{port = 2,max_len = no_buffer}]}]},
+ #ofp_port_mod{port_no = 1, hw_addr = <<0,17,0,0,17,17>>,
+ config = [],mask = [],
+ properties =
+ [#ofp_port_mod_prop_ethernet{advertise = [fiber]},
+ #ofp_port_mod_prop_optical{
+ configure = [rx_tune, tx_tune],
+ freq_lmda = 1500,
+ fl_offset = 2000,
+ grid_span = 3000,
+ tx_pwr = 300},
+ #ofp_port_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_port_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_port_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]},
+ #ofp_table_mod{
+ properties =
+ [#ofp_table_mod_prop_eviction{flags = []},
+ #ofp_table_mod_prop_vacancy{
+ vacancy = 0,
+ vacancy_down = 0,
+ vacancy_up = 0},
+ #ofp_table_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_table_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_table_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}],
+ table_id = all},
+ #ofp_desc_request{},
+ #ofp_aggregate_stats_request{
+ flags = [],table_id = all,out_port = any,out_group = any,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ match = #ofp_match{fields = []}},
+ #ofp_aggregate_stats_reply{flags = [],packet_count = 7,
+ byte_count = 574,flow_count = 6},
+ #ofp_table_stats_request{},
+
+#ofp_table_stats_reply{
+ flags = [],
+ body =
+ [#ofp_table_stats{
+ table_id = 0,
+ active_count = 4, lookup_count = 4,matched_count = 4},
+ #ofp_table_stats{
+ table_id = 1,
+ active_count = 4, lookup_count = 4,matched_count = 4}]},
+
+ #ofp_port_stats_request{flags = [],port_no = any},
+ #ofp_port_stats_reply{
+ flags = [],
+ body =
+ [#ofp_port_stats{
+ port_no = 7,rx_packets = 0,tx_packets = 4,rx_bytes = 0,
+ tx_bytes = 336,rx_dropped = 0,tx_dropped = 0,
+ rx_errors = 0, tx_errors = 0,
+ properties =
+ [#ofp_port_stats_prop_ethernet{
+ rx_frame_err = 0,rx_over_err = 0,
+ rx_crc_err = 0,collisions = 0},
+ #ofp_port_stats_prop_optical{
+ flags = [rx_tune,tx_tune],
+ tx_freq_lmda = 1500,
+ tx_offset = 700,
+ tx_grid_span = 500,
+ rx_freq_lmda = 1500,
+ rx_offset = 700,
+ rx_grid_span = 500,
+ tx_pwr = 2000,
+ rx_pwr = 2000,
+ bias_current = 300,
+ temperature = 273},
+ #ofp_port_stats_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_port_stats_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_port_stats_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]},
+ #ofp_port_stats{
+ port_no = 6,rx_packets = 4,tx_packets = 4,rx_bytes = 336,
+ tx_bytes = 336,rx_dropped = 0,tx_dropped = 0,
+ rx_errors = 0, tx_errors = 0,
+ properties =
+ [#ofp_port_stats_prop_ethernet{
+ rx_frame_err = 0,rx_over_err = 0,
+ rx_crc_err = 0,collisions = 0}]}]},
+ #ofp_group_features_request{flags = []},
+ #ofp_group_features_reply{
+ flags = [],
+ types = [all,select,indirect,ff],
+ capabilities = [select_weight,chaining],
+ max_groups = {16777216,16777216,16777216,16777216},
+ actions =
+ {[output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field],
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field],
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field],
+ [output,copy_ttl_out,copy_ttl_in,set_mpls_ttl,dec_mpls_ttl,push_vlan,pop_vlan,push_mpls,pop_mpls,set_queue,group,set_nw_ttl,dec_nw_ttl,set_field]}},
+ #ofp_group_desc_request{},
+ #ofp_group_desc_reply{
+ flags = [],
+ body =
+ [#ofp_group_desc_stats{
+ type = all,group_id = 1,
+ buckets =
+ [#ofp_bucket{
+ weight = 1,watch_port = 1,watch_group = 1,
+ actions =
+ [#ofp_action_output{
+ port = 2, max_len = no_buffer}]}]}]},
+ #ofp_queue_stats_request{flags = [],port_no = any,
+ queue_id = all},
+ #ofp_queue_stats_reply{
+ flags = [],
+ body =
+ [#ofp_queue_stats{
+ port_no = 7,queue_id = 1,tx_bytes = 0,tx_packets = 0,
+ tx_errors = 0,
+ properties =
+ [#ofp_queue_stats_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_queue_stats_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_queue_stats_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]},
+ #ofp_queue_stats{
+ port_no = 6,queue_id = 1,tx_bytes = 0,tx_packets = 0,
+ tx_errors = 0},
+ #ofp_queue_stats{
+ port_no = 7,queue_id = 2,tx_bytes = 0,tx_packets = 0,
+ tx_errors = 0}]},
+ #ofp_port_status{
+ reason = add,
+ desc = #ofp_port{
+ port_no = 7,hw_addr = <<"\362\v\244\320?p">>,
+ name = <<"\xe7\xa7\x81\xe3\x81\xae\xe3\x83\x9d\xe3\x83\xbc\xe3\x83\x88">>, % "my port" in japanese, utf-8
+ config = [],
+ state = [live],
+ properties =
+ [#ofp_port_desc_prop_ethernet{
+ curr = ['100mb_fd',copper,autoneg],
+ advertised = [copper,autoneg],
+ supported = ['100mb_fd',copper,autoneg],
+ peer = ['100mb_fd',copper,autoneg],
+ curr_speed = 5000,max_speed = 5000},
+ #ofp_port_desc_prop_optical{
+ supported = [rx_tune],
+ tx_min_freq_lmda = 1000,
+ tx_max_freq_lmda = 2000,
+ tx_grid_freq_lmda = 1500,
+ rx_min_freq_lmda = 1000,
+ rx_max_freq_lmda = 2000,
+ rx_grid_freq_lmda = 1500,
+ tx_pwr_min = 1000,
+ tx_pwr_max = 2000},
+ #ofp_port_desc_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_port_desc_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_port_desc_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]}
+ },
+ #ofp_flow_removed{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ priority = 65535,reason = idle_timeout,table_id = 0,
+ duration_sec = 3,duration_nsec = 48825000,idle_timeout = 3,
+ hard_timeout = 0,packet_count = 1,byte_count = 86,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]}},
+ #ofp_error_msg_experimenter{
+ exp_type = 60000,
+ experimenter = 999999,
+ data = <<"jikken data">>
+ },
+ #ofp_get_async_request{},
+ #ofp_get_async_reply{
+ properties =
+ [#ofp_async_config_prop_reasons{
+ type = packet_in_slave,
+ mask = [table_miss, apply_action]},
+ #ofp_async_config_prop_reasons{
+ type = packet_in_master,
+ mask = [table_miss, apply_action]},
+ #ofp_async_config_prop_reasons{
+ type = port_status_slave,
+ mask = [add, delete]},
+ #ofp_async_config_prop_reasons{
+ type = port_status_master,
+ mask = [add, delete]},
+ #ofp_async_config_prop_reasons{
+ type = flow_removed_slave,
+ mask = [idle_timeout, hard_timeout]},
+ #ofp_async_config_prop_reasons{
+ type = flow_removed_master,
+ mask = [idle_timeout, hard_timeout]},
+ #ofp_async_config_prop_reasons{
+ type = role_status_slave,
+ mask = [master_request, config]},
+ #ofp_async_config_prop_reasons{
+ type = role_status_master,
+ mask = [master_request, config]},
+ #ofp_async_config_prop_reasons{
+ type = table_status_slave,
+ mask = [vacancy_down, vacancy_up]},
+ #ofp_async_config_prop_reasons{
+ type = table_status_master,
+ mask = [vacancy_down, vacancy_up]},
+ #ofp_async_config_prop_reasons{
+ type = requestforward_slave,
+ mask = [group_mod, meter_mod]},
+ #ofp_async_config_prop_reasons{
+ type = requestforward_master,
+ mask = [group_mod, meter_mod]},
+ #ofp_async_config_prop_experimenter{
+ type = experimenter_slave,
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_async_config_prop_experimenter{
+ type = experimenter_master,
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_async_config_prop_experimenter{
+ type = experimenter_master,
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32, 2:32>>}]},
+ #ofp_set_async{
+ properties =
+ [#ofp_async_config_prop_reasons{
+ type = packet_in_slave,
+ mask = [table_miss, apply_action]},
+ #ofp_async_config_prop_reasons{
+ type = packet_in_master,
+ mask = [table_miss, apply_action]},
+ #ofp_async_config_prop_reasons{
+ type = port_status_slave,
+ mask = [add, delete]},
+ #ofp_async_config_prop_reasons{
+ type = port_status_master,
+ mask = [add, delete]},
+ #ofp_async_config_prop_reasons{
+ type = flow_removed_slave,
+ mask = [idle_timeout, hard_timeout]},
+ #ofp_async_config_prop_reasons{
+ type = flow_removed_master,
+ mask = [idle_timeout, hard_timeout]},
+ #ofp_async_config_prop_reasons{
+ type = role_status_slave,
+ mask = [master_request, config]},
+ #ofp_async_config_prop_reasons{
+ type = role_status_master,
+ mask = [master_request, config]},
+ #ofp_async_config_prop_reasons{
+ type = table_status_slave,
+ mask = [vacancy_down, vacancy_up]},
+ #ofp_async_config_prop_reasons{
+ type = table_status_master,
+ mask = [vacancy_down, vacancy_up]},
+ #ofp_async_config_prop_reasons{
+ type = requestforward_slave,
+ mask = [group_mod, meter_mod]},
+ #ofp_async_config_prop_reasons{
+ type = requestforward_master,
+ mask = [group_mod, meter_mod]},
+ #ofp_async_config_prop_experimenter{
+ type = experimenter_slave,
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_async_config_prop_experimenter{
+ type = experimenter_master,
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_async_config_prop_experimenter{
+ type = experimenter_master,
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32, 2:32>>}]},
+ #ofp_meter_mod{
+ command = add,
+ flags = [pktps, burst, stats],
+ meter_id = 100,
+ bands = [
+ #ofp_meter_band_drop{rate = 1000, burst_size = 10},
+ #ofp_meter_band_dscp_remark{rate = 1000, burst_size = 10,
+ prec_level = 1},
+ #ofp_meter_band_experimenter{rate = 1000, burst_size = 10,
+ experimenter = 999}
+ ]
+ },
+
+ #ofp_flow_mod{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ table_id = 1,command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = any,out_group = any,flags = [],
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_meter{meter_id = 1},
+ #ofp_instruction_write_actions{
+ actions =
+ [#ofp_action_output{port = 6,max_len = no_buffer}]}]},
+
+ #ofp_meter_config_request{meter_id = all},
+ #ofp_meter_config_reply{
+ body =
+ [#ofp_meter_config{
+ flags = [pktps,burst,stats],
+ meter_id = 100,
+ bands =
+ [#ofp_meter_band_drop{
+ type = drop,rate = 1000,burst_size = 10}]}]},
+
+ #ofp_meter_stats_request{meter_id = all},
+ #ofp_meter_stats_reply{
+ body =
+ [#ofp_meter_stats{
+ meter_id = 100,flow_count = 0,packet_in_count = 0,
+ byte_in_count = 0,duration_sec = 0,duration_nsec = 480000,
+ band_stats =
+ [#ofp_meter_band_stats{
+ packet_band_count = 0,byte_band_count = 0}]}]},
+
+ #ofp_meter_features_request{},
+ #ofp_meter_features_reply{max_meter = 16777216,
+ band_types = [drop,dscp_remark,experimenter],
+ capabilities = [kbps,pktps,burst,stats],
+ max_bands = 255,max_color = 0},
+ #ofp_port_desc_request{flags = []},
+ #ofp_port_desc_reply{flags = [],
+ body = [#ofp_port{port_no = 7,hw_addr = <<"\362\v\244\320?p">>,
+ name = <<"Port7">>,config = [],
+ state = [live],
+ properties =
+ [#ofp_port_desc_prop_ethernet{
+ curr = ['100mb_fd',copper,autoneg],
+ advertised = [copper,autoneg],
+ supported = ['100mb_fd',copper,autoneg],
+ peer = ['100mb_fd',copper,autoneg],
+ curr_speed = 5000,max_speed = 5000},
+ #ofp_port_desc_prop_optical{
+ supported = [rx_tune],
+ tx_min_freq_lmda = 1000,
+ tx_max_freq_lmda = 2000,
+ tx_grid_freq_lmda = 1500,
+ rx_min_freq_lmda = 1000,
+ rx_max_freq_lmda = 2000,
+ rx_grid_freq_lmda = 1500,
+ tx_pwr_min = 1000,
+ tx_pwr_max = 2000},
+ #ofp_port_desc_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_port_desc_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_port_desc_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]},
+ #ofp_port{port_no = 6,hw_addr = <<"\362\v\244}\370\352">>,
+ name = <<"Port6">>,config = [],
+ state = [live],
+ properties =
+ [#ofp_port_desc_prop_ethernet{
+ curr = ['100mb_fd',copper,autoneg],
+ advertised = [copper,autoneg],
+ supported = ['100mb_fd',copper,autoneg],
+ peer = ['100mb_fd',copper,autoneg],
+ curr_speed = 5000,max_speed = 5000}]}]},
+
+
+ #ofp_table_features_request{
+ flags = [more],
+ body =
+ [#ofp_table_features{
+ table_id = 0,name = <<"Flow Table 0x00">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
+ 18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+ 32,33,34,35,36,37,38,39,40,41,42,43,44,45,
+ 46,47,48,49,50,51,52,53,54,55,56,57,58,59,
+ 60,61,62,63,64,65,66,67,68,69,70,71,72,73,
+ 74,75,76,77,78,79,80,81,82,83,84,85,86,87,
+ 88,89,90,91,92,93,94,95,96,97,98,99,100,
+ 101,102,103,104,105,106,107,108,109,110,
+ 111,112,113,114,115,116,117,118,119,120,
+ 121,122,123,124,125,126,127,128,129,130,
+ 131,132,133,134,135,136,137,138,139,140,
+ 141,142,143,144,145,146,147,148,149,150,
+ 151,152,153,154,155,156,157,158,159,160,
+ 161,162,163,164,165,166,167,168,169,170,
+ 171,172,173,174,175,176,177,178,179,180,
+ 181,182,183,184,185,186,187,188,189,190,
+ 191,192,193,194,195,196,197,198,199,200,
+ 201,202,203,204,205,206,207,208,209,210,
+ 211,212,213,214,215,216,217,218,219,220,
+ 221,222,223,224,225,226,227,228,229,230,
+ 231,232,233,234,235,236,237,238,239,240,
+ 241,242,243,244,245,246,247,248,249,250,
+ 251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]},
+ #ofp_table_features{
+ table_id = 1,name = <<"Flow Table 0x01">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
+ 19,20,21,22,23,24,25,26,27,28,29,30,31,32,
+ 33,34,35,36,37,38,39,40,41,42,43,44,45,46,
+ 47,48,49,50,51,52,53,54,55,56,57,58,59,60,
+ 61,62,63,64,65,66,67,68,69,70,71,72,73,74,
+ 75,76,77,78,79,80,81,82,83,84,85,86,87,88,
+ 89,90,91,92,93,94,95,96,97,98,99,100,101,
+ 102,103,104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,120,121,
+ 122,123,124,125,126,127,128,129,130,131,
+ 132,133,134,135,136,137,138,139,140,141,
+ 142,143,144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,160,161,
+ 162,163,164,165,166,167,168,169,170,171,
+ 172,173,174,175,176,177,178,179,180,181,
+ 182,183,184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,200,201,
+ 202,203,204,205,206,207,208,209,210,211,
+ 212,213,214,215,216,217,218,219,220,221,
+ 222,223,224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,240,241,
+ 242,243,244,245,246,247,248,249,250,251,
+ 252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 2,name = <<"Flow Table 0x02">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
+ 19,20,21,22,23,24,25,26,27,28,29,30,31,32,
+ 33,34,35,36,37,38,39,40,41,42,43,44,45,46,
+ 47,48,49,50,51,52,53,54,55,56,57,58,59,60,
+ 61,62,63,64,65,66,67,68,69,70,71,72,73,74,
+ 75,76,77,78,79,80,81,82,83,84,85,86,87,88,
+ 89,90,91,92,93,94,95,96,97,98,99,100,101,
+ 102,103,104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,120,121,
+ 122,123,124,125,126,127,128,129,130,131,
+ 132,133,134,135,136,137,138,139,140,141,
+ 142,143,144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,160,161,
+ 162,163,164,165,166,167,168,169,170,171,
+ 172,173,174,175,176,177,178,179,180,181,
+ 182,183,184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,200,201,
+ 202,203,204,205,206,207,208,209,210,211,
+ 212,213,214,215,216,217,218,219,220,221,
+ 222,223,224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,240,241,
+ 242,243,244,245,246,247,248,249,250,251,
+ 252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 3,name = <<"Flow Table 0x03">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
+ 20,21,22,23,24,25,26,27,28,29,30,31,32,33,
+ 34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+ 48,49,50,51,52,53,54,55,56,57,58,59,60,61,
+ 62,63,64,65,66,67,68,69,70,71,72,73,74,75,
+ 76,77,78,79,80,81,82,83,84,85,86,87,88,89,
+ 90,91,92,93,94,95,96,97,98,99,100,101,102,
+ 103,104,105,106,107,108,109,110,111,112,
+ 113,114,115,116,117,118,119,120,121,122,
+ 123,124,125,126,127,128,129,130,131,132,
+ 133,134,135,136,137,138,139,140,141,142,
+ 143,144,145,146,147,148,149,150,151,152,
+ 153,154,155,156,157,158,159,160,161,162,
+ 163,164,165,166,167,168,169,170,171,172,
+ 173,174,175,176,177,178,179,180,181,182,
+ 183,184,185,186,187,188,189,190,191,192,
+ 193,194,195,196,197,198,199,200,201,202,
+ 203,204,205,206,207,208,209,210,211,212,
+ 213,214,215,216,217,218,219,220,221,222,
+ 223,224,225,226,227,228,229,230,231,232,
+ 233,234,235,236,237,238,239,240,241,242,
+ 243,244,245,246,247,248,249,250,251,252,
+ 253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 4,name = <<"Flow Table 0x04">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
+ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,
+ 35,36,37,38,39,40,41,42,43,44,45,46,47,48,
+ 49,50,51,52,53,54,55,56,57,58,59,60,61,62,
+ 63,64,65,66,67,68,69,70,71,72,73,74,75,76,
+ 77,78,79,80,81,82,83,84,85,86,87,88,89,90,
+ 91,92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 5,name = <<"Flow Table 0x05">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
+ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,
+ 35,36,37,38,39,40,41,42,43,44,45,46,47,48,
+ 49,50,51,52,53,54,55,56,57,58,59,60,61,62,
+ 63,64,65,66,67,68,69,70,71,72,73,74,75,76,
+ 77,78,79,80,81,82,83,84,85,86,87,88,89,90,
+ 91,92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 6,name = <<"Flow Table 0x06">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
+ 22,23,24,25,26,27,28,29,30,31,32,33,34,35,
+ 36,37,38,39,40,41,42,43,44,45,46,47,48,49,
+ 50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+ 64,65,66,67,68,69,70,71,72,73,74,75,76,77,
+ 78,79,80,81,82,83,84,85,86,87,88,89,90,91,
+ 92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 7,name = <<"Flow Table 0x07">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
+ 23,24,25,26,27,28,29,30,31,32,33,34,35,36,
+ 37,38,39,40,41,42,43,44,45,46,47,48,49,50,
+ 51,52,53,54,55,56,57,58,59,60,61,62,63,64,
+ 65,66,67,68,69,70,71,72,73,74,75,76,77,78,
+ 79,80,81,82,83,84,85,86,87,88,89,90,91,92,
+ 93,94,95,96,97,98,99,100,101,102,103,104,
+ 105,106,107,108,109,110,111,112,113,114,
+ 115,116,117,118,119,120,121,122,123,124,
+ 125,126,127,128,129,130,131,132,133,134,
+ 135,136,137,138,139,140,141,142,143,144,
+ 145,146,147,148,149,150,151,152,153,154,
+ 155,156,157,158,159,160,161,162,163,164,
+ 165,166,167,168,169,170,171,172,173,174,
+ 175,176,177,178,179,180,181,182,183,184,
+ 185,186,187,188,189,190,191,192,193,194,
+ 195,196,197,198,199,200,201,202,203,204,
+ 205,206,207,208,209,210,211,212,213,214,
+ 215,216,217,218,219,220,221,222,223,224,
+ 225,226,227,228,229,230,231,232,233,234,
+ 235,236,237,238,239,240,241,242,243,244,
+ 245,246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 8,name = <<"Flow Table 0x08">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [9,10,11,12,13,14,15,16,17,18,19,20,21,22,
+ 23,24,25,26,27,28,29,30,31,32,33,34,35,36,
+ 37,38,39,40,41,42,43,44,45,46,47,48,49,50,
+ 51,52,53,54,55,56,57,58,59,60,61,62,63,64,
+ 65,66,67,68,69,70,71,72,73,74,75,76,77,78,
+ 79,80,81,82,83,84,85,86,87,88,89,90,91,92,
+ 93,94,95,96,97,98,99,100,101,102,103,104,
+ 105,106,107,108,109,110,111,112,113,114,
+ 115,116,117,118,119,120,121,122,123,124,
+ 125,126,127,128,129,130,131,132,133,134,
+ 135,136,137,138,139,140,141,142,143,144,
+ 145,146,147,148,149,150,151,152,153,154,
+ 155,156,157,158,159,160,161,162,163,164,
+ 165,166,167,168,169,170,171,172,173,174,
+ 175,176,177,178,179,180,181,182,183,184,
+ 185,186,187,188,189,190,191,192,193,194,
+ 195,196,197,198,199,200,201,202,203,204,
+ 205,206,207,208,209,210,211,212,213,214,
+ 215,216,217,218,219,220,221,222,223,224,
+ 225,226,227,228,229,230,231,232,233,234,
+ 235,236,237,238,239,240,241,242,243,244,
+ 245,246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 9,name = <<"Flow Table 0x09">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [10,11,12,13,14,15,16,17,18,19,20,21,22,23,
+ 24,25,26,27,28,29,30,31,32,33,34,35,36,37,
+ 38,39,40,41,42,43,44,45,46,47,48,49,50,51,
+ 52,53,54,55,56,57,58,59,60,61,62,63,64,65,
+ 66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+ 80,81,82,83,84,85,86,87,88,89,90,91,92,93,
+ 94,95,96,97,98,99,100,101,102,103,104,105,
+ 106,107,108,109,110,111,112,113,114,115,
+ 116,117,118,119,120,121,122,123,124,125,
+ 126,127,128,129,130,131,132,133,134,135,
+ 136,137,138,139,140,141,142,143,144,145,
+ 146,147,148,149,150,151,152,153,154,155,
+ 156,157,158,159,160,161,162,163,164,165,
+ 166,167,168,169,170,171,172,173,174,175,
+ 176,177,178,179,180,181,182,183,184,185,
+ 186,187,188,189,190,191,192,193,194,195,
+ 196,197,198,199,200,201,202,203,204,205,
+ 206,207,208,209,210,211,212,213,214,215,
+ 216,217,218,219,220,221,222,223,224,225,
+ 226,227,228,229,230,231,232,233,234,235,
+ 236,237,238,239,240,241,242,243,244,245,
+ 246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]}]},
+ #ofp_table_features_reply{
+ flags = [more],
+ body =
+ [#ofp_table_features{
+ table_id = 0,name = <<"\xe7\xa7\x81\xe3\x81\xae\xe3\x83\x86\xe3\x83\xbc\xe3\x83\x96\xe3\x83\xab">>, % "my table" in japanese, utf-8
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
+ 18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+ 32,33,34,35,36,37,38,39,40,41,42,43,44,45,
+ 46,47,48,49,50,51,52,53,54,55,56,57,58,59,
+ 60,61,62,63,64,65,66,67,68,69,70,71,72,73,
+ 74,75,76,77,78,79,80,81,82,83,84,85,86,87,
+ 88,89,90,91,92,93,94,95,96,97,98,99,100,
+ 101,102,103,104,105,106,107,108,109,110,
+ 111,112,113,114,115,116,117,118,119,120,
+ 121,122,123,124,125,126,127,128,129,130,
+ 131,132,133,134,135,136,137,138,139,140,
+ 141,142,143,144,145,146,147,148,149,150,
+ 151,152,153,154,155,156,157,158,159,160,
+ 161,162,163,164,165,166,167,168,169,170,
+ 171,172,173,174,175,176,177,178,179,180,
+ 181,182,183,184,185,186,187,188,189,190,
+ 191,192,193,194,195,196,197,198,199,200,
+ 201,202,203,204,205,206,207,208,209,210,
+ 211,212,213,214,215,216,217,218,219,220,
+ 221,222,223,224,225,226,227,228,229,230,
+ 231,232,233,234,235,236,237,238,239,240,
+ 241,242,243,244,245,246,247,248,249,250,
+ 251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_table_feature_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]},
+ #ofp_table_features{
+ table_id = 1,name = <<"Flow Table 0x01">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
+ 19,20,21,22,23,24,25,26,27,28,29,30,31,32,
+ 33,34,35,36,37,38,39,40,41,42,43,44,45,46,
+ 47,48,49,50,51,52,53,54,55,56,57,58,59,60,
+ 61,62,63,64,65,66,67,68,69,70,71,72,73,74,
+ 75,76,77,78,79,80,81,82,83,84,85,86,87,88,
+ 89,90,91,92,93,94,95,96,97,98,99,100,101,
+ 102,103,104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,120,121,
+ 122,123,124,125,126,127,128,129,130,131,
+ 132,133,134,135,136,137,138,139,140,141,
+ 142,143,144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,160,161,
+ 162,163,164,165,166,167,168,169,170,171,
+ 172,173,174,175,176,177,178,179,180,181,
+ 182,183,184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,200,201,
+ 202,203,204,205,206,207,208,209,210,211,
+ 212,213,214,215,216,217,218,219,220,221,
+ 222,223,224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,240,241,
+ 242,243,244,245,246,247,248,249,250,251,
+ 252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 2,name = <<"Flow Table 0x02">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
+ 19,20,21,22,23,24,25,26,27,28,29,30,31,32,
+ 33,34,35,36,37,38,39,40,41,42,43,44,45,46,
+ 47,48,49,50,51,52,53,54,55,56,57,58,59,60,
+ 61,62,63,64,65,66,67,68,69,70,71,72,73,74,
+ 75,76,77,78,79,80,81,82,83,84,85,86,87,88,
+ 89,90,91,92,93,94,95,96,97,98,99,100,101,
+ 102,103,104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,120,121,
+ 122,123,124,125,126,127,128,129,130,131,
+ 132,133,134,135,136,137,138,139,140,141,
+ 142,143,144,145,146,147,148,149,150,151,
+ 152,153,154,155,156,157,158,159,160,161,
+ 162,163,164,165,166,167,168,169,170,171,
+ 172,173,174,175,176,177,178,179,180,181,
+ 182,183,184,185,186,187,188,189,190,191,
+ 192,193,194,195,196,197,198,199,200,201,
+ 202,203,204,205,206,207,208,209,210,211,
+ 212,213,214,215,216,217,218,219,220,221,
+ 222,223,224,225,226,227,228,229,230,231,
+ 232,233,234,235,236,237,238,239,240,241,
+ 242,243,244,245,246,247,248,249,250,251,
+ 252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 3,name = <<"Flow Table 0x03">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
+ 20,21,22,23,24,25,26,27,28,29,30,31,32,33,
+ 34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+ 48,49,50,51,52,53,54,55,56,57,58,59,60,61,
+ 62,63,64,65,66,67,68,69,70,71,72,73,74,75,
+ 76,77,78,79,80,81,82,83,84,85,86,87,88,89,
+ 90,91,92,93,94,95,96,97,98,99,100,101,102,
+ 103,104,105,106,107,108,109,110,111,112,
+ 113,114,115,116,117,118,119,120,121,122,
+ 123,124,125,126,127,128,129,130,131,132,
+ 133,134,135,136,137,138,139,140,141,142,
+ 143,144,145,146,147,148,149,150,151,152,
+ 153,154,155,156,157,158,159,160,161,162,
+ 163,164,165,166,167,168,169,170,171,172,
+ 173,174,175,176,177,178,179,180,181,182,
+ 183,184,185,186,187,188,189,190,191,192,
+ 193,194,195,196,197,198,199,200,201,202,
+ 203,204,205,206,207,208,209,210,211,212,
+ 213,214,215,216,217,218,219,220,221,222,
+ 223,224,225,226,227,228,229,230,231,232,
+ 233,234,235,236,237,238,239,240,241,242,
+ 243,244,245,246,247,248,249,250,251,252,
+ 253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 4,name = <<"Flow Table 0x04">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
+ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,
+ 35,36,37,38,39,40,41,42,43,44,45,46,47,48,
+ 49,50,51,52,53,54,55,56,57,58,59,60,61,62,
+ 63,64,65,66,67,68,69,70,71,72,73,74,75,76,
+ 77,78,79,80,81,82,83,84,85,86,87,88,89,90,
+ 91,92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 5,name = <<"Flow Table 0x05">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
+ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,
+ 35,36,37,38,39,40,41,42,43,44,45,46,47,48,
+ 49,50,51,52,53,54,55,56,57,58,59,60,61,62,
+ 63,64,65,66,67,68,69,70,71,72,73,74,75,76,
+ 77,78,79,80,81,82,83,84,85,86,87,88,89,90,
+ 91,92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 6,name = <<"Flow Table 0x06">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
+ 22,23,24,25,26,27,28,29,30,31,32,33,34,35,
+ 36,37,38,39,40,41,42,43,44,45,46,47,48,49,
+ 50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+ 64,65,66,67,68,69,70,71,72,73,74,75,76,77,
+ 78,79,80,81,82,83,84,85,86,87,88,89,90,91,
+ 92,93,94,95,96,97,98,99,100,101,102,103,
+ 104,105,106,107,108,109,110,111,112,113,
+ 114,115,116,117,118,119,120,121,122,123,
+ 124,125,126,127,128,129,130,131,132,133,
+ 134,135,136,137,138,139,140,141,142,143,
+ 144,145,146,147,148,149,150,151,152,153,
+ 154,155,156,157,158,159,160,161,162,163,
+ 164,165,166,167,168,169,170,171,172,173,
+ 174,175,176,177,178,179,180,181,182,183,
+ 184,185,186,187,188,189,190,191,192,193,
+ 194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207,208,209,210,211,212,213,
+ 214,215,216,217,218,219,220,221,222,223,
+ 224,225,226,227,228,229,230,231,232,233,
+ 234,235,236,237,238,239,240,241,242,243,
+ 244,245,246,247,248,249,250,251,252,253,
+ 254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 7,name = <<"Flow Table 0x07">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
+ 23,24,25,26,27,28,29,30,31,32,33,34,35,36,
+ 37,38,39,40,41,42,43,44,45,46,47,48,49,50,
+ 51,52,53,54,55,56,57,58,59,60,61,62,63,64,
+ 65,66,67,68,69,70,71,72,73,74,75,76,77,78,
+ 79,80,81,82,83,84,85,86,87,88,89,90,91,92,
+ 93,94,95,96,97,98,99,100,101,102,103,104,
+ 105,106,107,108,109,110,111,112,113,114,
+ 115,116,117,118,119,120,121,122,123,124,
+ 125,126,127,128,129,130,131,132,133,134,
+ 135,136,137,138,139,140,141,142,143,144,
+ 145,146,147,148,149,150,151,152,153,154,
+ 155,156,157,158,159,160,161,162,163,164,
+ 165,166,167,168,169,170,171,172,173,174,
+ 175,176,177,178,179,180,181,182,183,184,
+ 185,186,187,188,189,190,191,192,193,194,
+ 195,196,197,198,199,200,201,202,203,204,
+ 205,206,207,208,209,210,211,212,213,214,
+ 215,216,217,218,219,220,221,222,223,224,
+ 225,226,227,228,229,230,231,232,233,234,
+ 235,236,237,238,239,240,241,242,243,244,
+ 245,246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 8,name = <<"Flow Table 0x08">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [9,10,11,12,13,14,15,16,17,18,19,20,21,22,
+ 23,24,25,26,27,28,29,30,31,32,33,34,35,36,
+ 37,38,39,40,41,42,43,44,45,46,47,48,49,50,
+ 51,52,53,54,55,56,57,58,59,60,61,62,63,64,
+ 65,66,67,68,69,70,71,72,73,74,75,76,77,78,
+ 79,80,81,82,83,84,85,86,87,88,89,90,91,92,
+ 93,94,95,96,97,98,99,100,101,102,103,104,
+ 105,106,107,108,109,110,111,112,113,114,
+ 115,116,117,118,119,120,121,122,123,124,
+ 125,126,127,128,129,130,131,132,133,134,
+ 135,136,137,138,139,140,141,142,143,144,
+ 145,146,147,148,149,150,151,152,153,154,
+ 155,156,157,158,159,160,161,162,163,164,
+ 165,166,167,168,169,170,171,172,173,174,
+ 175,176,177,178,179,180,181,182,183,184,
+ 185,186,187,188,189,190,191,192,193,194,
+ 195,196,197,198,199,200,201,202,203,204,
+ 205,206,207,208,209,210,211,212,213,214,
+ 215,216,217,218,219,220,221,222,223,224,
+ 225,226,227,228,229,230,231,232,233,234,
+ 235,236,237,238,239,240,241,242,243,244,
+ 245,246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]},
+ #ofp_table_features{
+ table_id = 9,name = <<"Flow Table 0x09">>,
+ metadata_match = <<"\377\377\377\377\377\377\377\377">>,
+ metadata_write = <<"\377\377\377\377\377\377\377\377">>,max_entries = 16777216,
+ properties =
+ [#ofp_table_feature_prop_instructions{
+ instruction_ids =
+ [goto_table,write_metadata,write_actions,
+ apply_actions,clear_actions,meter]},
+ #ofp_table_feature_prop_next_tables{
+ next_table_ids =
+ [10,11,12,13,14,15,16,17,18,19,20,21,22,23,
+ 24,25,26,27,28,29,30,31,32,33,34,35,36,37,
+ 38,39,40,41,42,43,44,45,46,47,48,49,50,51,
+ 52,53,54,55,56,57,58,59,60,61,62,63,64,65,
+ 66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+ 80,81,82,83,84,85,86,87,88,89,90,91,92,93,
+ 94,95,96,97,98,99,100,101,102,103,104,105,
+ 106,107,108,109,110,111,112,113,114,115,
+ 116,117,118,119,120,121,122,123,124,125,
+ 126,127,128,129,130,131,132,133,134,135,
+ 136,137,138,139,140,141,142,143,144,145,
+ 146,147,148,149,150,151,152,153,154,155,
+ 156,157,158,159,160,161,162,163,164,165,
+ 166,167,168,169,170,171,172,173,174,175,
+ 176,177,178,179,180,181,182,183,184,185,
+ 186,187,188,189,190,191,192,193,194,195,
+ 196,197,198,199,200,201,202,203,204,205,
+ 206,207,208,209,210,211,212,213,214,215,
+ 216,217,218,219,220,221,222,223,224,225,
+ 226,227,228,229,230,231,232,233,234,235,
+ 236,237,238,239,240,241,242,243,244,245,
+ 246,247,248,249,250,251,252,253,254]},
+ #ofp_table_feature_prop_write_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_apply_actions{
+ action_ids =
+ [output,group,set_queue,set_mpls_ttl,
+ dec_mpls_ttl,set_nw_ttl,dec_nw_ttl,
+ copy_ttl_out,copy_ttl_in,push_vlan,
+ pop_vlan,push_mpls,pop_mpls,push_pbb,
+ pop_pbb,set_field]},
+ #ofp_table_feature_prop_match{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_wildcards{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_write_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]},
+ #ofp_table_feature_prop_apply_setfield{
+ oxm_ids =
+ [in_port,metadata,eth_dst,eth_src,eth_type,
+ vlan_vid,vlan_pcp,ip_dscp,ip_ecn,ip_proto,
+ ipv4_src,ipv4_dst,tcp_src,tcp_dst,udp_src,
+ udp_dst,sctp_src,sctp_dst,icmpv4_type,
+ icmpv4_code,arp_op,arp_spa,arp_tpa,arp_sha,
+ arp_tha,ipv6_src,ipv6_dst,ipv6_flabel,
+ icmpv6_type,icmpv6_code,ipv6_nd_target,
+ ipv6_nd_sll,ipv6_nd_tll,mpls_label,mpls_tc,
+ mpls_bos,pbb_isid]}]}]},
+ #ofp_group_stats_request{flags = [],group_id = all},
+ #ofp_group_stats_reply{
+ flags = [],
+ body =
+ [#ofp_group_stats{
+ group_id = 1,ref_count = 2,packet_count = 123,
+ byte_count = 12345,duration_sec = 9,
+ duration_nsec = 609036000,
+ bucket_stats =
+ [#ofp_bucket_counter{
+ packet_count = 234,byte_count = 2345}]}]},
+ #ofp_packet_in{
+ buffer_id = 16#f0000000,reason = table_miss,table_id = 200,
+ cookie = <<0,1,2,3,0,0,0,0>>,
+ match = #ofp_match{fields = AllFields},
+ data = <<>>},
+ #ofp_flow_mod{
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ cookie_mask = <<0,0,0,0,0,0,0,0>>,
+ table_id = 1,command = add,idle_timeout = 0,
+ hard_timeout = 0,priority = 123,buffer_id = 65535,
+ out_port = any,out_group = any,flags = [],
+ match = #ofp_match{fields = AllFields},
+ instructions = []},
+ #ofp_experimenter_request{
+ experimenter = 16#deadbeaf,
+ exp_type = 16#cafe8888,
+ data = <<"hogehoge">>
+ },
+ #ofp_experimenter_reply{
+ experimenter = 16#deadbeaf,
+ exp_type = 16#cafe7777,
+ data = <<"testdata99999999">>
+ },
+ #ofp_table_desc_request{flags = []},
+ #ofp_table_desc_reply{flags = [],
+ tables =
+ [#ofp_table_desc{
+ table_id = 7,
+ config = [],
+ properties =
+ [ #ofp_table_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>}]},
+ #ofp_table_desc{
+ table_id = 8,
+ config = [],
+ properties =
+ [#ofp_table_mod_prop_eviction{flags = []},
+ #ofp_table_mod_prop_vacancy{
+ vacancy = 0,
+ vacancy_down = 0,
+ vacancy_up = 0},
+ #ofp_table_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_table_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_table_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]}]},
+ #ofp_queue_desc_request{
+ port_no = 7,
+ queue_id = all},
+ #ofp_queue_desc_reply{
+ queues =
+ [#ofp_queue_desc{
+ port_no = 7,
+ properties =
+ [#ofp_queue_desc_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>}],
+ queue_id = 0},
+ #ofp_queue_desc{
+ port_no = 8,
+ properties =
+ [#ofp_queue_desc_prop_min_rate{rate = 300},
+ #ofp_queue_desc_prop_max_rate{rate = 900},
+ #ofp_queue_desc_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_queue_desc_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_queue_desc_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}],
+ queue_id = 1}]},
+ #ofp_role_status{
+ role = master,
+ reason = master_request,
+ generation_id=7,
+ properties =
+ [#ofp_role_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_role_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_role_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]},
+ #ofp_flow_monitor_request{
+ flags = [],
+ monitor_id = 100000000,
+ out_port = 22,
+ out_group = any,
+ monitor_flags = [initial, add, removed, modify],
+ table_id = 33,
+ command = add,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,name = eth_dst,
+ has_mask = false,
+ value = <<"\362\v\244}\370\352">>,
+ mask = undefined}]}},
+ #ofp_flow_monitor_reply{
+ flags = [],
+ updates =
+ [#ofp_flow_update_full{
+ event = initial,
+ table_id = 0,
+ reason = idle_timeout,
+ idle_timeout = 600,
+ hard_timeout = 700,
+ priority = 3,
+ cookie = <<0,0,0,0,0,0,0,0>>,
+ match =
+ #ofp_match{
+ fields =
+ [#ofp_field{
+ class = openflow_basic,
+ name = eth_type,
+ has_mask = false,
+ value = <<8,6>>,
+ mask = undefined}]},
+ instructions =
+ [#ofp_instruction_apply_actions{
+ actions =
+ [#ofp_action_output{
+ port = normal,
+ max_len = 0}]}]},
+ #ofp_flow_update_abbrev{event = abbrev,xid=1234},
+ #ofp_flow_update_paused{event = paused}]},
+ #ofp_table_status{
+ reason = vacancy_down,
+ table =
+ #ofp_table_desc{
+ table_id = 8,
+ config = [],
+ properties =
+ [#ofp_table_mod_prop_eviction{flags = []},
+ #ofp_table_mod_prop_vacancy{
+ vacancy = 0,
+ vacancy_down = 0,
+ vacancy_up = 0},
+ #ofp_table_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_table_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_table_mod_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]}},
+ #ofp_bundle_ctrl_msg{
+ bundle_id = 1234,
+ type = open_request,
+ flags = [atomic],
+ properties =
+ [#ofp_bundle_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_bundle_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_bundle_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]},
+ #ofp_bundle_add_msg{
+ bundle_id = 1234,
+ flags = [atomic],
+ message =
+ #ofp_message{
+ version = 5,
+ type = echo_request,
+ xid = 0,
+ body = #ofp_echo_request{}},
+ properties =
+ [#ofp_bundle_prop_experimenter{
+ experimenter = 101,
+ exp_type = 0,
+ data = <<>>},
+ #ofp_bundle_prop_experimenter{
+ experimenter = 101,
+ exp_type = 1,
+ data = <<1:32>>},
+ #ofp_bundle_prop_experimenter{
+ experimenter = 101,
+ exp_type = 2,
+ data = <<1:32,2:32>>}]},
+ #ofp_requestforward{
+ request =
+ #ofp_message{
+ version = 5,
+ type = group_mod,
+ xid = 0,
+ body =
+ #ofp_group_mod{
+ command = add,
+ type = all,
+ group_id = 1,
+ buckets =
+ [#ofp_bucket{
+ weight = 1,
+ watch_port = 1,
+ watch_group = 1,
+ actions =
+ [#ofp_action_output{
+ port = 2,
+ max_len = no_buffer}]}]}}}
+ ],
+ lists:foldl(fun x:do/2, {5, 0}, List).
diff --git a/tests/packet_data_generator/src/x_flower_packet.erl b/tests/packet_data_generator/src/x_flower_packet.erl
new file mode 100644
index 00000000..5c2e3742
--- /dev/null
+++ b/tests/packet_data_generator/src/x_flower_packet.erl
@@ -0,0 +1,61 @@
+%% Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+%% Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+%% implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+
+-module(x_flower_packet).
+-export([message/3, message_extract/1, encode/1, decode/1]).
+
+-include_lib("flower/include/flower_packet.hrl").
+
+message(OFPVersion, Xid, Body) ->
+ #ovs_msg{version=OFPVersion, xid=Xid, msg=Body}.
+
+message_extract(Msg) ->
+ #ovs_msg{version=OFPVersion, xid=Xid, msg=Body} = Msg,
+ {OFPVersion, Xid, Body}.
+
+guess_type(Msg) ->
+ % eg. {ofp_packet_out, ...} -> packet_out
+ RecType = element(1, Msg),
+ case RecType of
+ ofp_switch_features ->
+ features_reply;
+ _ ->
+ RecTypeStr = atom_to_list(RecType),
+ TypeStr = lists:nthtail(4, RecTypeStr),
+ list_to_atom(TypeStr)
+ end.
+
+encode(Msg) ->
+ Msg2 = case Msg of
+ #ovs_msg{msg = features_request} ->
+ Msg#ovs_msg{type = features_request, msg = <<>>};
+ _ ->
+ Msg#ovs_msg{type = guess_type(Msg#ovs_msg.msg)}
+ end,
+ %io:format("encoding ~p~n", [Msg2]),
+ BinMsg = flower_packet:encode(Msg2),
+ {ok, BinMsg}.
+
+decode(BinMsg) ->
+ {[Msg], <<>>} = flower_packet:decode(BinMsg),
+ %io:format("decoded ~p~n", [Msg]),
+ Msg2 = case Msg of
+ #ovs_msg{type = features_request} ->
+ Msg#ovs_msg{msg = features_request};
+ _ ->
+ Msg
+ end,
+ {ok, Msg2, <<>>}.
diff --git a/tests/packet_data_generator/src/x_of_protocol.erl b/tests/packet_data_generator/src/x_of_protocol.erl
new file mode 100644
index 00000000..38405dbb
--- /dev/null
+++ b/tests/packet_data_generator/src/x_of_protocol.erl
@@ -0,0 +1,33 @@
+%% Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+%% Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+%% implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+
+-module(x_of_protocol).
+-export([message/3, message_extract/1, encode/1, decode/1]).
+
+-include_lib("of_protocol/include/of_protocol.hrl").
+
+message(OFPVersion, Xid, Body) ->
+ #ofp_message{version=OFPVersion, xid=Xid, body=Body}.
+
+message_extract(Msg) ->
+ #ofp_message{version=OFPVersion, xid=Xid, body=Body} = Msg,
+ {OFPVersion, Xid, Body}.
+
+encode(Msg) ->
+ of_protocol:encode(Msg).
+
+decode(BinMsg) ->
+ of_protocol:decode(BinMsg).
diff --git a/tests/packet_data_generator2/Makefile.BSD b/tests/packet_data_generator2/Makefile.BSD
new file mode 100644
index 00000000..a6319c42
--- /dev/null
+++ b/tests/packet_data_generator2/Makefile.BSD
@@ -0,0 +1,35 @@
+# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2015 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# OVS: openvswitch installed directory (used to look for libraries)
+# OVS_SRC: openvswitch source directory
+
+OVS?=${HOME}/ovs
+OVS_SRC?=/disks/774373a2-e180-11e3-9fa1-08606e7f74e7/git/openvswitch
+
+CPPFLAGS+=-I${OVS}/include -I${OVS_SRC}
+LDFLAGS+=-L${OVS}/lib -Wl,-R${OVS}/lib -lofproto -lopenvswitch
+
+PROG=gen
+NOMAN=
+
+all: generate
+
+generate: ${PROG}
+ ${_MKMSG} "generate packet_data"
+ cd ${.CURDIR} && ${.OBJDIR}/${PROG}
+
+.include <bsd.prog.mk>
diff --git a/tests/packet_data_generator2/Makefile.GNU b/tests/packet_data_generator2/Makefile.GNU
new file mode 100644
index 00000000..3e037f8e
--- /dev/null
+++ b/tests/packet_data_generator2/Makefile.GNU
@@ -0,0 +1,39 @@
+# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# OVS_SRC: openvswitch source directory
+# OVS_INC: openvswitch include directory
+# OVS_LIB: openvswitch library directory
+
+OVS_SRC=${HOME}/ovs
+OVS_INC=/usr/local/include/openvswitch
+OVS_LIB=/usr/local/lib
+
+CPPFLAGS=-std=gnu99 -I${OVS_SRC} -I${OVS_INC}
+LDFLAGS=-L${OVS_LIB} -Wl,-R${OVS_LIB} -lofproto -lopenvswitch -lpthread -lssl -lrt -lm -lcrypto
+
+PROG=gen
+NOMAN=
+
+all: generate
+
+gen: gen.c
+ ${CC} $^ ${CPPFLAGS} ${LDFLAGS} -o $@
+
+generate: ${PROG}
+ ./${PROG}
+
+clean:
+ rm ${PROG}
diff --git a/tests/packet_data_generator2/README b/tests/packet_data_generator2/README
new file mode 100644
index 00000000..8f341709
--- /dev/null
+++ b/tests/packet_data_generator2/README
@@ -0,0 +1,15 @@
+This directory contains a small C program to generate
+OpenFlow packet binary files [1]. They are used by some of
+unit tests [2]. As we have the generated files in the repository,
+you don't need to build this program unless you want to (re-)generate
+the files for some reasons, typically adding new test cases.
+
+[1] tests/packet_data/of*/libofproto-*.packet
+[2] tests.unit.ofproto.test_parser
+
+The program requires libofproto library provided by Open vSwitch.
+It's a little tricky to build because Open vSwitch distribution
+normally does not install the corresponding C header files. You need
+both of the source distribution of Open vSwitch and matching installed
+libraries, and override OVS_SRC and SRC make variables to point those
+directries respectively.
diff --git a/tests/packet_data_generator2/gen.c b/tests/packet_data_generator2/gen.c
new file mode 100644
index 00000000..dbdcf4c2
--- /dev/null
+++ b/tests/packet_data_generator2/gen.c
@@ -0,0 +1,963 @@
+/*
+ * Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+ * Copyright (C) 2015 YAMAMOTO Takashi <yamamoto at valinux co jp>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <lib/learn.h>
+#include <lib/list.h>
+#include <lib/ofpbuf.h>
+#include <lib/ofp-actions.h>
+#include <lib/ofp-errors.h>
+#include <lib/ofp-msgs.h>
+#include <lib/ofp-util.h>
+#include <lib/packets.h>
+
+#include <assert.h>
+#include <err.h>
+#include <stdio.h>
+
+/*
+ * OpenFlow Common
+ */
+
+void
+clear_xid(struct ofpbuf *buf)
+{
+ /*
+ * some of libofproto message encoding routines automatically
+ * allocate XID for the message. e.g. ofputil_encode_flow_mod
+ * zero-out the XID so that test_parser can perform a simple
+ * bit-wise comparison.
+ */
+
+ struct ofp_header *oh = ofpbuf_at_assert(buf, 0, sizeof(*oh));
+
+ oh->xid = htonl(0);
+}
+
+void
+fill_match(struct match *match)
+{
+ const struct eth_addr dl_dst =
+ { { { 0xaa, 0xbb, 0xcc, 0x99, 0x88, 0x77 } } };
+ match_init_catchall(match);
+ match_set_in_port(match, 0xabcd);
+ match_set_dl_vlan(match, htons(999));
+ match_set_dl_dst(match, dl_dst);
+ match_set_dl_type(match, htons(ETH_TYPE_IP));
+ match_set_nw_dst(match, inet_addr("192.168.2.1"));
+ match_set_tun_src(match, inet_addr("192.168.2.3"));
+ match_set_tun_dst(match, inet_addr("192.168.2.4"));
+ match_set_tun_id(match, htonll(50000));
+}
+
+/*
+ * Controller-to-Switch Messages
+ */
+
+/*
+ * Handshake
+ */
+
+struct ofpbuf *
+features_reply(enum ofputil_protocol proto)
+{
+ struct ofputil_switch_features sf;
+
+ memset(&sf, 0, sizeof(sf));
+ sf.datapath_id = 1;
+ sf.n_buffers = 255;
+ sf.n_tables = 255;
+ sf.auxiliary_id = 0;
+ sf.capabilities = OFPUTIL_C_FLOW_STATS | OFPUTIL_C_TABLE_STATS |
+ OFPUTIL_C_PORT_STATS | OFPUTIL_C_GROUP_STATS |
+ OFPUTIL_C_QUEUE_STATS;
+ // sf.ofpacts is for only OFP10
+
+ ovs_be32 xid = 0;
+
+ return ofputil_encode_switch_features(&sf, proto, xid);
+}
+
+/*
+ * Switch Configuration
+ */
+
+struct ofpbuf *
+set_config(enum ofputil_protocol proto)
+{
+ struct ofputil_switch_config sc;
+
+ memset(&sc, 0, sizeof(sc));
+ sc.frag = OFPUTIL_FRAG_NORMAL;
+ // sc.invalid_ttl_to_controller is for only OFP11 and OFP12
+ sc.miss_send_len = 128; // The default of OpenFlow Spec
+
+ return ofputil_encode_set_config(
+ &sc, ofputil_protocol_to_ofp_version(proto));
+}
+
+struct ofpbuf *
+get_config_reply(enum ofputil_protocol proto)
+{
+ struct ofputil_switch_config sc;
+ struct ofp_header oh;
+
+ memset(&oh, 0, sizeof(oh));
+ oh.xid = 0;
+ oh.version = ofputil_protocol_to_ofp_version(proto);
+ memset(&sc, 0, sizeof(sc));
+ sc.frag = OFPUTIL_FRAG_NORMAL;
+ // sc.invalid_ttl_to_controller is for only OFP11 and OFP12
+ sc.miss_send_len = 128; // The default of OpenFlow Spec
+
+ return ofputil_encode_get_config_reply(&oh, &sc);
+}
+
+/*
+ * Modify State Messages
+ */
+
+struct ofpbuf *
+table_mod(enum ofputil_protocol proto)
+{
+ struct ofputil_table_mod tm;
+
+ memset(&tm, 0, sizeof(tm));
+ tm.table_id = 0xff; // OFPTT_ALL
+ // OpenFlow 1.1 and 1.2 only.
+ // For other versions, ignored on encoding.
+ tm.miss = OFPUTIL_TABLE_MISS_DEFAULT; // Protocol default behavior.
+ // OpenFlow 1.4+ only.
+ // For other versions, ignored on encoding.
+ tm.eviction = OFPUTIL_TABLE_EVICTION_ON; // Enable eviction.
+ tm.eviction_flags = OFPTMPEF14_IMPORTANCE; // Using flow entry importance.
+
+ return ofputil_encode_table_mod(&tm, proto);
+}
+
+struct ofpbuf *
+flow_mod(enum ofputil_protocol proto)
+{
+ struct ofputil_flow_mod fm;
+ struct ofpbuf acts;
+ struct ofpact_ipv4 *a_set_field;
+ struct ofpact_goto_table *a_goto;
+ char *error;
+
+ /*
+ * Taken from neutron OVS-agent,
+ * modified for OF>=1.3. (NXM -> OXM)
+ * NOTE(yamamoto): This needs to be writable. learn_parse() modifies it.
+ */
+ char learn_args[] =
+ "table=99,"
+ "priority=1,"
+ "hard_timeout=300,"
+ "OXM_OF_VLAN_VID[0..11],"
+ "OXM_OF_ETH_DST[]=OXM_OF_ETH_SRC[],"
+ "load:0->OXM_OF_VLAN_VID[],"
+ "load:OXM_OF_TUNNEL_ID[]->OXM_OF_TUNNEL_ID[],"
+ "output:OXM_OF_IN_PORT[]";
+
+ memset(&fm, 0, sizeof(fm));
+ fm.command = OFPFC_ADD;
+ fm.table_id = 2;
+ fm.new_cookie = htonll(0x123456789abcdef0);
+ fm.cookie_mask = OVS_BE64_MAX;
+ fm.importance = 0x9878;
+
+ fill_match(&fm.match);
+
+ ofpbuf_init(&acts, 64);
+ ofpact_put_STRIP_VLAN(&acts);
+ a_set_field = ofpact_put_SET_IPV4_DST(&acts);
+ a_set_field->ipv4 = inet_addr("192.168.2.9");
+ error = learn_parse(learn_args, &acts);
+ assert(error == NULL);
+ a_goto = ofpact_put_GOTO_TABLE(&acts);
+ a_goto->table_id = 100;
+
+ fm.ofpacts = acts.data;
+ fm.ofpacts_len = acts.size;
+ return ofputil_encode_flow_mod(&fm, proto);
+}
+
+struct ofpbuf *
+flow_mod_match_conj(enum ofputil_protocol proto)
+{
+ struct ofputil_flow_mod fm;
+ struct ofpbuf acts;
+ struct ofpact_ipv4 *a_set_field;
+ struct ofpact_goto_table *a_goto;
+
+ memset(&fm, 0, sizeof(fm));
+ fm.command = OFPFC_ADD;
+ fm.table_id = 3;
+ fm.new_cookie = htonll(0x123456789abcdef0);
+ fm.cookie_mask = OVS_BE64_MAX;
+ fm.importance = 0x9878;
+
+ match_init_catchall(&fm.match);
+ match_set_conj_id(&fm.match, 0xabcdef);
+
+ ofpbuf_init(&acts, 64);
+ ofpact_put_STRIP_VLAN(&acts);
+ a_set_field = ofpact_put_SET_IPV4_DST(&acts);
+ a_set_field->ipv4 = inet_addr("192.168.2.9");
+ a_goto = ofpact_put_GOTO_TABLE(&acts);
+ a_goto->table_id = 100;
+
+ fm.ofpacts = acts.data;
+ fm.ofpacts_len = acts.size;
+ return ofputil_encode_flow_mod(&fm, proto);
+}
+
+struct ofpbuf *
+flow_mod_conjunction(enum ofputil_protocol proto)
+{
+ struct ofputil_flow_mod fm;
+ struct ofpbuf acts;
+ struct ofpact_conjunction *a_conj;
+
+ memset(&fm, 0, sizeof(fm));
+ fm.command = OFPFC_ADD;
+ fm.table_id = 4;
+ fm.new_cookie = htonll(0x123456789abcdef0);
+ fm.cookie_mask = OVS_BE64_MAX;
+ fm.importance = 0x9878;
+
+ fill_match(&fm.match);
+
+ ofpbuf_init(&acts, 64);
+ a_conj = ofpact_put_CONJUNCTION(&acts);
+ a_conj->id = 0xabcdef;
+ a_conj->clause = 1;
+ a_conj->n_clauses = 2;
+
+ fm.ofpacts = acts.data;
+ fm.ofpacts_len = acts.size;
+ return ofputil_encode_flow_mod(&fm, proto);
+}
+
+struct ofpbuf *
+group_mod(enum ofputil_protocol proto)
+{
+ struct ofputil_group_mod gm;
+ struct ofpbuf acts;
+ struct ofpact_ipv4 *a_set_field;
+ struct ofpact_goto_table *a_goto;
+ struct ofputil_bucket bckt;
+
+ memset(&gm, 0, sizeof(gm));
+ gm.command = OFPGC15_INSERT_BUCKET;
+ gm.type = OFPGT11_SELECT;
+ gm.group_id = 0xaaaaaaaa;
+ gm.command_bucket_id = 0xbbbbbbbb;
+
+ ofpbuf_init(&acts, 0x18);
+ ofpact_put_STRIP_VLAN(&acts);
+ a_set_field = ofpact_put_SET_IPV4_DST(&acts);
+ a_set_field->ipv4 = inet_addr("192.168.2.9");
+
+ bckt.weight = 0xcccc;
+ bckt.watch_port = 0xdddd;
+ bckt.watch_group = 0xeeeeeeee;
+ bckt.bucket_id = 0x12345678;
+ bckt.ofpacts = acts.data;
+ bckt.ofpacts_len = acts.size;
+
+ list_init(&(gm.buckets));
+ list_push_back(&(gm.buckets), &(bckt.list_node));
+
+ return ofputil_encode_group_mod(
+ ofputil_protocol_to_ofp_version(proto), &gm);
+}
+
+struct ofpbuf *
+port_mod(enum ofputil_protocol proto)
+{
+ struct ofputil_port_mod pm;
+ const struct eth_addr hw_addr =
+ { { { 0xaa, 0xbb, 0xcc, 0x99, 0x88, 0x77 } } };
+
+ memset(&pm, 0, sizeof(pm));
+ pm.port_no = 1;
+ pm.hw_addr = hw_addr;
+ pm.config = OFPPC_PORT_DOWN;
+ pm.mask = OFPPC_PORT_DOWN;
+ pm.advertise = 10248; // OFPPF_100MB_FD, OFPPF_COPPER, OFPPF_AUTONEG
+
+ return ofputil_encode_port_mod(&pm, proto);
+}
+
+struct ofpbuf *
+meter_mod(enum ofputil_protocol proto)
+{
+ const int N_BANDS = 2;
+ struct ofputil_meter_mod mm;
+ struct ofputil_meter_band bands[N_BANDS];
+
+ memset(bands, 0, sizeof(*bands)*2);
+ bands[0].type = 1; // OFPMBT_DROP
+ bands[0].rate = 1000;
+ bands[0].burst_size = 10;
+ bands[1].type = 2; // OFPMBT_DSCP_REMARK
+ bands[1].prec_level = 1;
+ bands[1].rate = 1000;
+ bands[1].burst_size = 10;
+
+ memset(&mm, 0, sizeof(mm));
+ mm.command = 0; // OFPMC_ADD
+ mm.meter.meter_id = 100;
+ mm.meter.flags = 14; // OFPMF_PKTPS, OFPMF_BURST, OFPMF_STATS
+ mm.meter.n_bands = N_BANDS;
+ mm.meter.bands = bands;
+
+ return ofputil_encode_meter_mod(
+ ofputil_protocol_to_ofp_version(proto), &mm);
+}
+
+/*
+ * Multipart Messages
+ */
+
+struct ofpbuf *
+aggregate_stats_request(enum ofputil_protocol proto)
+{
+ struct ofputil_flow_stats_request fsr;
+
+ memset(&fsr, 0, sizeof(fsr));
+ fsr.aggregate = true;
+ match_init_catchall(&fsr.match);
+ fsr.out_port = OFPP_ANY;
+ fsr.out_group = OFPG_ANY;
+ fsr.table_id = OFPTT_ALL;
+ fsr.cookie = fsr.cookie_mask = htonll(0);
+
+ return ofputil_encode_flow_stats_request(&fsr, proto);
+}
+
+struct ofpbuf *
+port_stats_request(enum ofputil_protocol proto)
+{
+ uint32_t port_no = 0xffffffff;
+ return ofputil_encode_dump_ports_request(
+ ofputil_protocol_to_ofp_version(proto), port_no);
+}
+
+struct ofpbuf *
+port_desc_request(enum ofputil_protocol proto)
+{
+ uint32_t port_no = 0xbcda;
+
+ return ofputil_encode_port_desc_stats_request(
+ ofputil_protocol_to_ofp_version(proto), port_no);
+}
+
+struct ofpbuf *
+queue_stats_request(enum ofputil_protocol proto)
+{
+ struct ofputil_queue_stats_request oqsr;
+ memset(&oqsr, 0, sizeof(oqsr));
+ oqsr.port_no = 0xabcd;
+ oqsr.queue_id = 0xffffffff;
+ return ofputil_encode_queue_stats_request(
+ ofputil_protocol_to_ofp_version(proto), &oqsr);
+}
+
+struct ofpbuf *
+group_stats_request(enum ofputil_protocol proto)
+{
+ uint32_t group_id = 0xfffffffc;
+ return ofputil_encode_group_stats_request(
+ ofputil_protocol_to_ofp_version(proto), group_id);
+}
+
+struct ofpbuf *
+group_desc_request(enum ofputil_protocol proto)
+{
+ uint32_t group_id = 0xcdab;
+
+ return ofputil_encode_group_desc_request(
+ ofputil_protocol_to_ofp_version(proto), group_id);
+}
+
+struct ofpbuf *
+group_features_request(enum ofputil_protocol proto)
+{
+ return ofputil_encode_group_features_request(
+ ofputil_protocol_to_ofp_version(proto));
+}
+
+struct ofpbuf *
+meter_stats_request(enum ofputil_protocol proto)
+{
+ uint32_t meter_id = 0xffffffff;
+ return ofputil_encode_meter_request(
+ ofputil_protocol_to_ofp_version(proto),
+ OFPUTIL_METER_STATS, meter_id);
+}
+
+struct ofpbuf *
+table_desc_request(enum ofputil_protocol proto)
+{
+ return ofputil_encode_table_desc_request(
+ ofputil_protocol_to_ofp_version(proto));
+}
+
+/*
+ * Barrier Message
+ */
+
+struct ofpbuf *
+barrier_request(enum ofputil_protocol proto)
+{
+ return ofputil_encode_barrier_request(
+ ofputil_protocol_to_ofp_version(proto));
+}
+
+/*
+ * Bundle messages
+ */
+
+struct ofpbuf *
+bundle_ctrl(enum ofputil_protocol proto)
+{
+ struct ofputil_bundle_ctrl_msg msg;
+ struct ofp_header oh;
+
+ memset(&oh, 0, sizeof(oh));
+ oh.xid = 0;
+ oh.version = ofputil_protocol_to_ofp_version(proto);
+ memset(&msg, 0, sizeof(msg));
+ msg.bundle_id = 99999999;
+ msg.type = OFPBCT_OPEN_REPLY;
+ msg.flags = OFPBF_ATOMIC;
+ return ofputil_encode_bundle_ctrl_reply(&oh, &msg);
+}
+
+struct ofpbuf *
+bundle_add(enum ofputil_protocol proto)
+{
+ struct ofputil_bundle_add_msg msg;
+ struct ofpbuf *fm;
+ struct ofpbuf *add;
+
+ memset(&msg, 0, sizeof(msg));
+ msg.bundle_id = 99999999;
+ msg.flags = OFPBF_ATOMIC;
+ fm = flow_mod(proto);
+ clear_xid(fm);
+ msg.msg = fm->data;
+ add = ofputil_encode_bundle_add(
+ ofputil_protocol_to_ofp_version(proto), &msg);
+ ofpbuf_delete(fm);
+ return add;
+}
+
+/*
+ * Asynchronous Messages
+ */
+
+struct ofpbuf *
+packet_in(enum ofputil_protocol proto)
+{
+ struct ofputil_packet_in pin;
+ struct match match;
+ struct ofpbuf *buf;
+
+ memset(&pin, 0, sizeof(pin));
+ pin.packet = "hoge";
+ pin.packet_len = 4;
+ pin.total_len = 1000;
+ pin.table_id = 100;
+ pin.buffer_id = 200;
+
+ fill_match(&match);
+ flow_get_metadata(&match.flow, &pin.flow_metadata);
+
+ return ofputil_encode_packet_in(&pin, proto, NXPIF_OPENFLOW10);
+}
+
+struct ofpbuf *
+flow_removed(enum ofputil_protocol proto)
+{
+ struct ofputil_flow_removed fr;
+
+ memset(&fr, 0, sizeof(fr));
+ fill_match(&fr.match);
+ fr.cookie = htonll(0x123456789abcdef0);
+ fr.priority = 100;
+ fr.reason = 0; // OFPRR_IDLE_TIMEOUT
+ fr.table_id = 1;
+ fr.duration_sec = 600;
+ fr.duration_nsec = 500;
+ fr.idle_timeout = 400;
+ fr.hard_timeout = 300;
+ fr.packet_count = 200;
+ fr.byte_count = 100;
+
+ return ofputil_encode_flow_removed(&fr, proto);
+}
+
+struct ofpbuf *
+port_status(enum ofputil_protocol proto)
+{
+ struct ofputil_port_status ps;
+
+ memset(&ps, 0, sizeof(ps));
+ ps.reason = 2; // OFPPR_MODIFY
+ ps.desc.port_no = 1;
+ memset(&ps.desc.hw_addr, 0xff, sizeof(ps.desc.hw_addr));
+ sprintf(ps.desc.name, "eth0");
+ ps.desc.config = 0;
+ ps.desc.state = 4;
+ ps.desc.curr = 10248; // OFPPF_100MB_FD, OFPPF_COPPER, OFPPF_AUTONEG
+ ps.desc.advertised = 10248;
+ ps.desc.supported = 10248;
+ ps.desc.peer = 10248;
+ ps.desc.curr_speed = 50000; // kbps
+ ps.desc.max_speed = 100000; // kbps
+
+ return ofputil_encode_port_status(&ps, proto);
+}
+
+
+struct ofpbuf *
+role_status(enum ofputil_protocol proto)
+{
+ struct ofputil_role_status rs;
+
+ memset(&rs, 0, sizeof(rs));
+ rs.role = OFPCR12_ROLE_SLAVE; // OFPCR_ROLE_SLAVE
+ rs.reason = OFPCRR_MASTER_REQUEST; // OFPCRR_MASTER_REQUEST
+ rs.generation_id = htonll(0x123456789abcdef0);
+
+ return ofputil_encode_role_status(&rs, proto);
+}
+
+
+struct ofpbuf *
+requestforward(enum ofputil_protocol proto)
+{
+ struct ofputil_requestforward rf;
+
+ memset(&rf, 0, sizeof(rf));
+ rf.reason = OFPRFR_GROUP_MOD;
+
+ struct ofputil_group_mod gm;
+ struct ofpbuf acts;
+ struct ofpact_ipv4 *a_set_field;
+ struct ofpact_goto_table *a_goto;
+ struct ofputil_bucket bckt;
+
+ memset(&gm, 0, sizeof(gm));
+ gm.command = OFPGC15_INSERT_BUCKET;
+ gm.type = OFPGT11_SELECT;
+ gm.group_id = 0xaaaaaaaa;
+ gm.command_bucket_id = 0xbbbbbbbb;
+
+ ofpbuf_init(&acts, 0x18);
+ ofpact_put_STRIP_VLAN(&acts);
+ a_set_field = ofpact_put_SET_IPV4_DST(&acts);
+ a_set_field->ipv4 = inet_addr("192.168.2.9");
+
+ bckt.weight = 0xcccc;
+ bckt.watch_port = 0xdddd;
+ bckt.watch_group = 0xeeeeeeee;
+ bckt.bucket_id = 0x12345678;
+ bckt.ofpacts = acts.data;
+ bckt.ofpacts_len = acts.size;
+
+ list_init(&(gm.buckets));
+ list_push_back(&(gm.buckets), &(bckt.list_node));
+
+ rf.group_mod = &gm;
+
+ return ofputil_encode_requestforward(&rf, proto);
+}
+
+/*
+ * Symmetric Messages
+ */
+
+struct ofpbuf *
+hello(enum ofputil_protocol proto)
+{
+ return ofputil_encode_hello(ofputil_protocols_to_version_bitmap(proto));
+}
+
+struct ofpbuf *
+echo_request(enum ofputil_protocol proto)
+{
+ return make_echo_request(ofputil_protocol_to_ofp_version(proto));
+}
+
+struct ofpbuf *
+echo_reply(enum ofputil_protocol proto)
+{
+ struct ofp_header oh;
+
+ memset(&oh, 0, sizeof(oh));
+ oh.version = ofputil_protocol_to_ofp_version(proto);
+ oh.type = 3; // OFPT_ECHO_REPLY
+ oh.length = htons(8); // lenght of ofp_header
+ oh.xid = 0;
+
+ return make_echo_reply(&oh);
+}
+
+struct ofpbuf *
+error_msg(enum ofputil_protocol proto)
+{
+ struct ofp_header oh;
+
+ memset(&oh, 0, sizeof(oh));
+ oh.version = ofputil_protocol_to_ofp_version(proto);
+ oh.type = 14; // OFPT_FLOW_MOD
+ oh.length = htons(8); // lenght of ofp_header
+ oh.xid = 0;
+
+ // OFPERR_OFPBMC_BAD_FIELD means
+ // "Unsupported field in the match."
+ // - type: OFPET_BAD_MATCH = 4
+ // - code: OFPBMC_BAD_FIELD = 6
+ return ofperr_encode_reply(OFPERR_OFPBMC_BAD_FIELD, &oh);
+}
+
+/*
+ * Utilities
+ */
+
+void
+dump_ofpbuf(const char *name, const struct ofpbuf *buf)
+{
+ FILE *fp;
+ size_t written;
+
+ fp = fopen(name, "wb");
+ if (fp == NULL) {
+ err(1, "fopen");
+ }
+ written = fwrite(buf->data, buf->size, 1, fp);
+ if (written != 1) {
+ err(1, "fwrite");
+ }
+ if (fclose(fp) != 0) {
+ err(1, "fclose");
+ }
+}
+
+void
+dump_message(const char *name, struct ofpbuf *buf)
+{
+
+ ofpmsg_update_length(buf);
+ dump_ofpbuf(name, buf);
+}
+
+struct protocol_version {
+ const char *name;
+ const char *dir_name;
+ enum ofp_version version;
+};
+
+#define P(v) {.name = "OFP" #v, .dir_name = "of" #v, \
+ .version = OFP ## v ## _VERSION,}
+
+const struct protocol_version p13 = P(13);
+const struct protocol_version p15 = P(15);
+
+struct message {
+ const char *name;
+ struct ofpbuf *(*gen)(enum ofputil_protocol);
+ const struct protocol_version **protocols;
+};
+
+#define M(m, p) {.name = #m, .gen = m, .protocols = p,}
+
+const struct message messages[] = {
+ /* Controller-to-Switch Messages */
+ /* Handshake */
+ // TODO:
+ // The following messages are not supported in Open vSwitch 2.5.90,
+ // re-generate the packet data, later.
+ // - OFP10+ Features Request Message
+ // M(features_request,
+ // ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ M(features_reply,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ /* Switch Configuration */
+ // TODO:
+ // The following messages are not supported in Open vSwitch 2.5.90,
+ // re-generate the packet data, later.
+ // - OFP10+ Get Switch Configuration Request Message
+ M(set_config,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ // M(get_config_request,
+ // ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ M(get_config_reply,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ /* Modify State Messages */
+ // TODO:
+ // The following messages are not supported in Open vSwitch 2.4.90,
+ // re-generate the packet data, later.
+ // - OFP14+ Port Modification Message [EXT-154]
+ M(table_mod,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ M(flow_mod,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ M(flow_mod_match_conj,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ M(flow_mod_conjunction,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ M(group_mod,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ M(port_mod,
+ ((const struct protocol_version *[]){&p13, NULL})),
+ M(meter_mod,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ /* Multipart Messages */
+ // TODO:
+ // The following messages are not supported in Open vSwitch 2.4.90,
+ // re-generate the packet data, later.
+ // - OFP10+ Desc Stats Request Message
+ // - OFP10+ Desc Stats Reply Message
+ // - OFP15+ Flow Desc Request Message [EXT-334]
+ // - OFP15+ Flow Desc Reply Message [EXT-334]
+ // - OFP15+ Flow Stats Request Message [EXT-302]
+ // - OFP15+ Flow Stats Reply Message [EXT-334]
+ // - OFP15+ Aggregate Stats Reply Message [EXT-334]
+ // - OFP14+ Port Stats Reply Message [EXT-262]
+ // - OFP14+ Port Desc Reply Message [EXT-262]
+ // - OFP14+ Queue Stats Reply Message [EXT-262]
+ // - OFP14+ Queue Desc Request Message [EXT-262]
+ // - OFP14+ Queue Desc Reply Message [EXT-262]
+ // - OFP13+ Group Stats Reply Message [EXT-102]
+ // - OFP15+ Group Desc Reply Message [EXT-350]
+ // - OFP12+ Group Features Reply Message [EXT-61]
+ // - OFP15+ Meter Stats Reply Message [EXT-374]
+ // - OFP15+ Meter Desc Request Message [EXT-302]
+ // - OFP15+ Meter Desc Reply Message [EXT-302]
+ // - OFP13+ Meter Features Stats Request Message [EXT-14]
+ // - OFP13+ Meter Features Stats Reply Message [EXT-14]
+ // - OFP15+ Controller Status Stats Request Message [EXT-454]
+ // - OFP15+ Controller Status Stats Reply Message [EXT-454]
+ // - OFP14+ Table Desc Reply Message [EXT-262]
+ // - OFP15+ Table Features Stats Request Message [EXT-306]
+ // - OFP15+ Table Features Stats Reply Message [EXT-306]
+ // - OFP14+ Flow Monitor Request Message [EXT-187]
+ // - OFP14+ Flow Monitor Reply Message [EXT-187]
+ // - OFP15+ Bundle Features Stats Request Message [EXT-340]
+ // - OFP15+ Bundle Features Stats Reply Message [EXT-340]
+ // - OFP11+ Experimenter Stats Request
+ // - OFP11+ Experimenter Stats Reply
+ // M(desc_stats_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(desc_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(flow_desc_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(flow_desc_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(flow_stats_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(flow_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ M(aggregate_stats_request,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ // M(aggregate_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ M(port_stats_request,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ // M(port_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ M(port_desc_request,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ // M(port_desc_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ M(queue_stats_request,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ // M(queue_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(queue_desc_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(queue_desc_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ M(group_stats_request,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ // M(group_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ M(group_desc_request,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ // M(group_desc_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ M(group_features_request,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ // M(group_features_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ M(meter_stats_request,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ // M(meter_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(meter_desc_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(meter_desc_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(meter_features_stats_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(meter_features_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(controller_status_stats_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(controller_status_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ M(table_desc_request,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ // M(table_desc_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(table_features_stats_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(table_features_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(flow_monitor_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(flow_monitor_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(bundle_features_stats_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(bundle_features_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(experimenter_stats_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(experimenter_stats_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ /* Packet-Out Message */
+ // TODO:
+ // The following message are not supported in Open vSwitch 2.4.90,
+ // re-generate the packet data, later.
+ // - OFP15+ Packet Out Message [EXT-427]
+ // M(packet_out,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ /* Barrier Message */
+ // TODO:
+ // The following message are not supported in Open vSwitch 2.4.90,
+ // re-generate the packet data, later.
+ // - OFP10+ Barrier Reply Message
+ M(barrier_request,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ // M(barrier_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ /* Role Request Message */
+ // TODO:
+ // The following messages are not supported in Open vSwitch 2.4.90,
+ // re-generate the packet data, later.
+ // - OFP15+ Role Request Message [EXT-275]
+ // - OFP15+ Role Reply Message [EXT-275]
+ // M(role_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(role_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ /* Bundle messages */
+ M(bundle_ctrl,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ M(bundle_add,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ /* Set Asynchronous Configuration Message */
+ // TODO:
+ // The following messages are not supported in Open vSwitch 2.4.90,
+ // re-generate the packet data, later.
+ // - OFP14+ Set Async Message [EXT-262]
+ // - OFP14+ Get Async Request Message [EXT-262]
+ // - OFP14+ Get Async Reply Message [EXT-262]
+ // M(set_async,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(get_async_request,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ // M(get_async_reply,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ /* Asynchronous Messages */
+ // TODO:
+ // The following messages are not supported in Open vSwitch 2.4.90,
+ // re-generate the packet data, later.
+ // - OFP15 Flow Removed Message [EXT-334]
+ // - OFP14+ Port Status Message [EXT-154]
+ // - OFP14+ Table Status Message [EXT-232]
+ // - OFP15+ Controller Status Message [EXT-454]
+ M(packet_in,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ M(flow_removed,
+ ((const struct protocol_version *[]){&p13, NULL})),
+ M(port_status,
+ ((const struct protocol_version *[]){&p13, NULL})),
+ // M(table_status,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ M(role_status,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ M(requestforward,
+ ((const struct protocol_version *[]){&p15, NULL})),
+ // M(controller_status,
+ // ((const struct protocol_version *[]){&p15, NULL})),
+ /* Symmetric Messages */
+ M(hello,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ M(echo_request,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ M(echo_reply,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+ M(error_msg,
+ ((const struct protocol_version *[]){&p13, &p15, NULL})),
+};
+
+#if !defined(__arraycount)
+#define __arraycount(a) (sizeof(a) / sizeof(a[0]))
+#endif
+
+/*
+ * Main
+ */
+
+int
+main(int argc, char *argv[])
+{
+ struct ofpbuf *buf;
+ unsigned int i, j;
+
+ for (i = 0; i < __arraycount(messages); i++) {
+ const struct message * const m = &messages[i];
+ char name[255];
+
+ for (j = 0;; j++) {
+ const struct protocol_version * const p = m->protocols[j];
+
+ if (p == NULL) {
+ break;
+ }
+ const enum ofputil_protocol proto =
+ ofputil_protocol_from_ofp_version(p->version);
+
+ buf = (*m->gen)(proto);
+ snprintf(name, sizeof(name),
+ "../packet_data/%s/libofproto-%s-%s.packet",
+ p->dir_name, p->name, m->name);
+ printf("generating %s ...\n", name);
+ clear_xid(buf);
+ dump_message(name, buf);
+ ofpbuf_delete(buf);
+ }
+ }
+}
diff --git a/tests/packet_data_generator3/gen.py b/tests/packet_data_generator3/gen.py
new file mode 100644
index 00000000..92676e46
--- /dev/null
+++ b/tests/packet_data_generator3/gen.py
@@ -0,0 +1,329 @@
+#! /usr/bin/env python
+
+from __future__ import print_function
+
+import getopt
+import os
+import six
+from six.moves import socketserver
+import subprocess
+import sys
+import tempfile
+import threading
+
+from ryu.ofproto import ofproto_parser
+from ryu.ofproto import ofproto_v1_0
+from ryu.ofproto import ofproto_v1_0_parser
+from ryu.ofproto import ofproto_v1_5
+from ryu.ofproto import ofproto_v1_5_parser
+from ryu.ofproto import ofproto_protocol
+
+if six.PY3:
+ TimeoutExpired = subprocess.TimeoutExpired
+else:
+ # As python2 doesn't have timeout for subprocess.call,
+ # this script may hang.
+ TimeoutExpired = None
+
+STD_MATCH = [
+ 'in_port=43981',
+ 'dl_vlan=999',
+ 'dl_dst=aa:bb:cc:99:88:77',
+ 'dl_type=0x0800', # ETH_TYPE_IP
+ 'nw_dst=192.168.2.1',
+ 'tun_src=192.168.2.3',
+ 'tun_dst=192.168.2.4',
+ 'tun_id=50000']
+
+MESSAGES = [
+ {'name': 'action_learn',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': ['table=2',
+ 'importance=39032'] + STD_MATCH + [
+ 'actions=strip_vlan,mod_nw_dst:192.168.2.9,' +
+ 'learn(table=99,priority=1,hard_timeout=300,' +
+ 'OXM_OF_VLAN_VID[0..11],' +
+ 'OXM_OF_ETH_DST[]=OXM_OF_ETH_SRC[],' +
+ 'load:0->OXM_OF_VLAN_VID[],' +
+ 'load:OXM_OF_TUNNEL_ID[]->OXM_OF_TUNNEL_ID[],' +
+ 'output:OXM_OF_IN_PORT[]),goto_table:100']},
+ {'name': 'match_conj',
+ 'versions': [4],
+ 'cmd': 'mod-flows',
+ 'args': ['table=3',
+ 'cookie=0x123456789abcdef0/0xffffffffffffffff',
+ 'dl_vlan=1234',
+ 'conj_id=0xabcdef',
+ 'actions=strip_vlan,goto_table:100']},
+ {'name': 'match_pkt_mark',
+ 'versions': [4],
+ 'cmd': 'mod-flows',
+ 'args': ['table=3',
+ 'cookie=0x123456789abcdef0/0xffffffffffffffff',
+ 'dl_vlan=1234',
+ 'pkt_mark=54321',
+ 'actions=strip_vlan,goto_table:100']},
+ {'name': 'match_pkt_mark_masked',
+ 'versions': [4],
+ 'cmd': 'mod-flows',
+ 'args': ['table=3',
+ 'cookie=0x123456789abcdef0/0xffffffffffffffff',
+ 'dl_vlan=1234',
+ 'pkt_mark=0xd431/0xffff',
+ 'actions=strip_vlan,goto_table:100']},
+ {'name': 'action_conjunction',
+ 'versions': [4],
+ 'cmd': 'mod-flows',
+ 'args': (['table=2',
+ 'cookie=0x123456789abcdef0/0xffffffffffffffff'] +
+ STD_MATCH +
+ ['actions=conjunction(0xabcdef,1/2)'])},
+ {'name': 'match_load_nx_register',
+ 'versions': [4],
+ 'cmd': 'mod-flows',
+ 'args': ['table=3',
+ 'cookie=0x123456789abcdef0/0xffffffffffffffff',
+ 'reg0=0x1234',
+ 'reg5=0xabcd/0xffff',
+ 'actions=load:0xdeadbee->NXM_NX_REG0[4..31]']},
+ {'name': 'match_move_nx_register',
+ 'versions': [4],
+ 'cmd': 'mod-flows',
+ 'args': ['table=3',
+ 'cookie=0x123456789abcdef0/0xffffffffffffffff',
+ 'reg0=0x1234',
+ 'reg5=0xabcd/0xffff',
+ 'actions=move:NXM_NX_REG0[10..15]->NXM_NX_REG1[0..5]']},
+ {'name': 'action_resubmit',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['table=3',
+ 'importance=39032'] +
+ STD_MATCH +
+ ['actions=resubmit(1234,99)'])},
+ {'name': 'action_ct',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['table=3,',
+ 'importance=39032'] +
+ ['dl_type=0x0800,ct_state=-trk'] +
+ ['actions=ct(table=4,zone=NXM_NX_REG0[4..31])'])},
+ {'name': 'action_ct_exec',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['table=3,',
+ 'importance=39032'] +
+ ['dl_type=0x0800,ct_state=+trk+est'] +
+ ['actions=ct(commit,exec(set_field:0x654321->ct_mark))'])},
+ {'name': 'action_ct_nat',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['table=3,',
+ 'importance=39032'] +
+ ['dl_type=0x0800'] +
+ ['actions=ct(commit,nat(src=10.1.12.0-10.1.13.255:1-1023)'])},
+ {'name': 'action_ct_nat_v6',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['table=3,',
+ 'importance=39032'] +
+ ['dl_type=0x86dd'] +
+ ['actions=ct(commit,nat(dst=2001:1::1-2001:1::ffff)'])},
+ {'name': 'action_note',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100'] +
+ ['actions=note:04.05.06.07.00.00'])},
+ {'name': 'action_controller',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100'] +
+ ['actions=controller(reason=packet_out,max_len=1024,id=1)'])},
+ {'name': 'action_fintimeout',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100,tcp'] +
+ ['actions=fin_timeout(idle_timeout=30,hard_timeout=60)'])},
+ {'name': 'action_dec_nw_ttl',
+ 'versions': [1],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100,mpls'] +
+ ['actions=dec_ttl'])},
+ {'name': 'action_push_mpls',
+ 'versions': [1],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100,ip'] +
+ ['actions=push_mpls:0x8847'])},
+ {'name': 'action_pop_mpls',
+ 'versions': [1],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100,mpls'] +
+ ['actions=pop_mpls:0x0800'])},
+ {'name': 'action_set_mpls_ttl',
+ 'versions': [1],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100,mpls'] +
+ ['actions=set_mpls_ttl(127)'])},
+ {'name': 'action_dec_mpls_ttl',
+ 'versions': [1],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100,mpls'] +
+ ['actions=dec_mpls_ttl'])},
+ {'name': 'action_set_mpls_label',
+ 'versions': [1],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100,mpls'] +
+ ['actions=set_mpls_label(10)'])},
+ {'name': 'action_set_mpls_tc',
+ 'versions': [1],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100,mpls'] +
+ ['actions=set_mpls_tc(10)'])},
+ {'name': 'action_dec_ttl_cnt_ids',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100,tcp'] +
+ ['actions=dec_ttl(1,2,3,4,5)'])},
+ {'name': 'action_stack_push',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100'] +
+ ['actions=push:NXM_NX_REG2[1..5]'])},
+ {'name': 'action_stack_pop',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100'] +
+ ['actions=pop:NXM_NX_REG2[1..5]'])},
+ {'name': 'action_sample',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100'] +
+ ['actions=sample(probability=3,collector_set_id=1,' +
+ 'obs_domain_id=2,obs_point_id=3)'])},
+ {'name': 'action_sample2',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100'] +
+ ['actions=sample(probability=3,collector_set_id=1,' +
+ 'obs_domain_id=2,obs_point_id=3,sampling_port=8080)'])},
+ {'name': 'action_controller2',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100'] +
+ ['actions=controller(reason=packet_out,max_len=1024,' +
+ 'id=10,userdata=01.02.03.04.05,pause)'])},
+ {'name': 'action_output_trunc',
+ 'versions': [4],
+ 'cmd': 'add-flow',
+ 'args': (['priority=100'] +
+ ['actions=output(port=8080,max_len=1024)'])},
+
+
+ # ToDo: The following actions are not eligible
+ # {'name': 'action_regload2'},
+ # {'name': 'action_outputreg2'},
+]
+
+buf = []
+
+
+class MyHandler(socketserver.BaseRequestHandler):
+ verbose = False
+
+ def handle(self):
+ desc = ofproto_protocol.ProtocolDesc()
+ residue = b''
+ while True:
+ if residue:
+ data = residue
+ residue = b''
+ else:
+ data = self.request.recv(1024)
+ if data == b'':
+ break
+ if self.verbose:
+ print(data)
+ h = ofproto_parser.header(data)
+ if self.verbose:
+ print(h)
+ version, msg_type, msg_len, xid = h
+ residue = data[msg_len:]
+ desc.set_version(version=version)
+ if msg_type == desc.ofproto.OFPT_HELLO:
+ hello = desc.ofproto_parser.OFPHello(desc)
+ hello.serialize()
+ self.request.send(hello.buf)
+ elif msg_type == desc.ofproto.OFPT_FLOW_MOD:
+ # HACK: Clear xid into zero
+ buf.append(data[:4] + b'\x00\x00\x00\x00' + data[8:msg_len])
+ elif msg_type == desc.ofproto.OFPT_BARRIER_REQUEST:
+ brep = desc.ofproto_parser.OFPBarrierReply(desc)
+ brep.xid = xid
+ brep.serialize()
+ self.request.send(brep.buf)
+ break
+
+
+class MyVerboseHandler(MyHandler):
+ verbose = True
+
+if __name__ == '__main__':
+ optlist, args = getopt.getopt(sys.argv[1:], 'dvo:')
+ debug = False
+ ofctl_cmd = '/usr/bin/ovs-ofctl'
+ verbose = False
+ for o, a in optlist:
+ if o == '-d':
+ debug = True
+ elif o == '-v':
+ verbose = True
+ elif o == '-o':
+ ofctl_cmd = a
+
+ if not os.access(ofctl_cmd, os.X_OK):
+ raise Exception("%s is not executable" % ofctl_cmd)
+ outpath = '../packet_data'
+ socketdir = tempfile.mkdtemp()
+ socketname = os.path.join(socketdir, 'ovs')
+ server = socketserver.UnixStreamServer(socketname,
+ MyVerboseHandler if verbose else
+ MyHandler)
+ if debug or verbose:
+ print("Serving at %s" % socketname)
+
+ for msg in MESSAGES:
+ for v in msg['versions']:
+ cmdargs = [ofctl_cmd, '-O', 'OpenFlow%2d' % (v + 9)]
+ if verbose:
+ cmdargs.append('-v')
+ cmdargs.append(msg['cmd'])
+ cmdargs.append('unix:%s' % socketname)
+ cmdargs.append('\n'.join(msg['args']))
+ if verbose:
+ print("Running cmd: " + ' '.join(cmdargs) + "\n")
+ t = threading.Thread(target=subprocess.call, args=[cmdargs],
+ kwargs={'timeout': 5})
+ t.start()
+ server.handle_request()
+ if debug:
+ print(buf.pop())
+ else:
+ outf = os.path.join(
+ outpath, "of%d" % (v + 9),
+ "ovs-ofctl-of%d-%s.packet" % (v + 9, msg['name']))
+ print("Writing %s..." % outf)
+ with open(outf, 'wb') as f:
+ f.write(buf.pop())
+ try:
+ t.join()
+ except TimeoutExpired as e:
+ print(e)
+
+ if debug:
+ while True:
+ server.handle_request()
+ print(buf.pop())
+
+ os.unlink(socketname)
+ os.rmdir(socketdir)
diff --git a/tests/run_tests.py b/tests/run_tests.py
new file mode 100755
index 00000000..133c7e7e
--- /dev/null
+++ b/tests/run_tests.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+
+
+import os
+import sys
+
+from nose import config
+from nose import core
+
+sys.path.append(os.getcwd())
+sys.path.append(os.path.dirname(__file__))
+
+
+import tests.unit
+from tests.test_lib import run_tests
+
+
+if __name__ == '__main__':
+ exit_status = False
+
+ # if a single test case was specified,
+ # we should only invoked the tests once
+ invoke_once = len(sys.argv) > 1
+
+ cwd = os.getcwd()
+ c = config.Config(stream=sys.stdout,
+ env=os.environ,
+ verbosity=int(os.environ.get('NOSE_VERBOSE', 3)),
+ includeExe=True,
+ traverseNamespace=True,
+ plugins=core.DefaultPluginManager())
+ c.configureWhere(tests.unit.__path__)
+
+ exit_status = run_tests(c)
+ sys.exit(exit_status)
diff --git a/tests/test_lib.py b/tests/test_lib.py
new file mode 100644
index 00000000..c1c0f82e
--- /dev/null
+++ b/tests/test_lib.py
@@ -0,0 +1,270 @@
+# Copyright (C) 2013,2014,2015 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013,2014,2015 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import gettext
+import os
+import unittest
+import six
+import sys
+import types
+import logging
+
+from nose import result
+from nose import core
+from nose import config
+
+
+class _AnsiColorizer(object):
+ """
+ A colorizer is an object that loosely wraps around a stream, allowing
+ callers to write text to the stream in a particular color.
+
+ Colorizer classes must implement C{supported()} and C{write(text, color)}.
+ """
+ _colors = dict(black=30, red=31, green=32, yellow=33,
+ blue=34, magenta=35, cyan=36, white=37)
+
+ def __init__(self, stream):
+ self.stream = stream
+
+ def supported(cls, stream=sys.stdout):
+ """
+ A class method that returns True if the current platform supports
+ coloring terminal output using this method. Returns False otherwise.
+ """
+ if not stream.isatty():
+ return False # auto color only on TTYs
+ try:
+ import curses
+ except ImportError:
+ return False
+ else:
+ try:
+ try:
+ return curses.tigetnum("colors") > 2
+ except curses.error:
+ curses.setupterm()
+ return curses.tigetnum("colors") > 2
+ except:
+ # guess false in case of error
+ return False
+ supported = classmethod(supported)
+
+ def write(self, text, color):
+ """
+ Write the given text to the stream in the given color.
+
+ @param text: Text to be written to the stream.
+
+ @param color: A string label for a color. e.g. 'red', 'white'.
+ """
+ color = self._colors[color]
+ self.stream.write('\x1b[%s;1m%s\x1b[0m' % (color, text))
+
+
+class _Win32Colorizer(object):
+ """
+ See _AnsiColorizer docstring.
+ """
+ def __init__(self, stream):
+ from win32console import GetStdHandle, STD_OUT_HANDLE
+ from win32console import FOREGROUND_RED, FOREGROUND_BLUE
+ from win32console import FOREGROUND_GREEN, FOREGROUND_INTENSITY
+ red, green, blue, bold = (FOREGROUND_RED, FOREGROUND_GREEN,
+ FOREGROUND_BLUE, FOREGROUND_INTENSITY)
+ self.stream = stream
+ self.screenBuffer = GetStdHandle(STD_OUT_HANDLE)
+ self._colors = {
+ 'normal': red | green | blue,
+ 'red': red | bold,
+ 'green': green | bold,
+ 'blue': blue | bold,
+ 'yellow': red | green | bold,
+ 'magenta': red | blue | bold,
+ 'cyan': green | blue | bold,
+ 'white': red | green | blue | bold}
+
+ def supported(cls, stream=sys.stdout):
+ try:
+ import win32console
+ screenBuffer = win32console.GetStdHandle(
+ win32console.STD_OUT_HANDLE)
+ except ImportError:
+ return False
+ import pywintypes
+ try:
+ screenBuffer.SetConsoleTextAttribute(
+ win32console.FOREGROUND_RED |
+ win32console.FOREGROUND_GREEN |
+ win32console.FOREGROUND_BLUE)
+ except pywintypes.error:
+ return False
+ else:
+ return True
+ supported = classmethod(supported)
+
+ def write(self, text, color):
+ color = self._colors[color]
+ self.screenBuffer.SetConsoleTextAttribute(color)
+ self.stream.write(text)
+ self.screenBuffer.SetConsoleTextAttribute(self._colors['normal'])
+
+
+class _NullColorizer(object):
+ """
+ See _AnsiColorizer docstring.
+ """
+ def __init__(self, stream):
+ self.stream = stream
+
+ def supported(cls, stream=sys.stdout):
+ return True
+ supported = classmethod(supported)
+
+ def write(self, text, color):
+ self.stream.write(text)
+
+
+class RyuTestResult(result.TextTestResult):
+ def __init__(self, *args, **kw):
+ result.TextTestResult.__init__(self, *args, **kw)
+ self._last_case = None
+ self.colorizer = None
+ # NOTE(vish, tfukushima): reset stdout for the terminal check
+ stdout = sys.__stdout__
+ sys.stdout = sys.__stdout__
+ for colorizer in [_Win32Colorizer, _AnsiColorizer, _NullColorizer]:
+ if colorizer.supported():
+ self.colorizer = colorizer(self.stream)
+ break
+ sys.stdout = stdout
+
+ def getDescription(self, test):
+ return str(test)
+
+ # NOTE(vish, tfukushima): copied from unittest with edit to add color
+ def addSuccess(self, test):
+ unittest.TestResult.addSuccess(self, test)
+ if self.showAll:
+ self.colorizer.write("OK", 'green')
+ self.stream.writeln()
+ elif self.dots:
+ self.stream.write('.')
+ self.stream.flush()
+
+ # NOTE(vish, tfukushima): copied from unittest with edit to add color
+ def addFailure(self, test, err):
+ unittest.TestResult.addFailure(self, test, err)
+ if self.showAll:
+ self.colorizer.write("FAIL", 'red')
+ self.stream.writeln()
+ elif self.dots:
+ self.stream.write('F')
+ self.stream.flush()
+
+ # NOTE(vish, tfukushima): copied from unittest with edit to add color
+ def addError(self, test, err):
+ """Overrides normal addError to add support for errorClasses.
+ If the exception is a registered class, the error will be added
+ to the list for that class, not errors.
+ """
+ stream = getattr(self, 'stream', None)
+ ec, ev, tb = err
+ try:
+ exc_info = self._exc_info_to_string(err, test)
+ except TypeError:
+ # This is for compatibility with Python 2.3.
+ exc_info = self._exc_info_to_string(err)
+ for cls, (storage, label, isfail) in self.errorClasses.items():
+ if result.isclass(ec) and issubclass(ec, cls):
+ if isfail:
+ test.passwd = False
+ storage.append((test, exc_info))
+ # Might get patched into a streamless result
+ if stream is not None:
+ if self.showAll:
+ message = [label]
+ detail = result._exception_detail(err[1])
+ if detail:
+ message.append(detail)
+ stream.writeln(": ".join(message))
+ elif self.dots:
+ stream.write(label[:1])
+ return
+ self.errors.append((test, exc_info))
+ test.passed = False
+ if stream is not None:
+ if self.showAll:
+ self.colorizer.write("ERROR", 'red')
+ self.stream.writeln()
+ elif self.dots:
+ stream.write('E')
+
+ def startTest(self, test):
+ unittest.TestResult.startTest(self, test)
+ current_case = test.test.__class__.__name__
+
+ if self.showAll:
+ if current_case != self._last_case:
+ self.stream.writeln(current_case)
+ self._last_case = current_case
+ # NOTE(salvatore-orlando):
+ # slightly changed in order to print test case class
+ # together with unit test name
+ self.stream.write(
+ ' %s' % str(test.test).ljust(60))
+ self.stream.flush()
+
+
+class RyuTestRunner(core.TextTestRunner):
+ def _makeResult(self):
+ return RyuTestResult(self.stream,
+ self.descriptions,
+ self.verbosity,
+ self.config)
+
+
+def run_tests(c=None):
+ logger = logging.getLogger()
+ hdlr = logging.StreamHandler()
+ formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
+ hdlr.setFormatter(formatter)
+ logger.addHandler(hdlr)
+ logger.setLevel(logging.DEBUG)
+
+ # NOTE(bgh): I'm not entirely sure why but nose gets confused here when
+ # calling run_tests from a plugin directory run_tests.py (instead of the
+ # main run_tests.py). It will call run_tests with no arguments and the
+ # testing of run_tests will fail (though the plugin tests will pass). For
+ # now we just return True to let the run_tests test pass.
+ if not c:
+ return True
+
+ runner = RyuTestRunner(stream=c.stream,
+ verbosity=c.verbosity,
+ config=c)
+ return not core.run(config=c, testRunner=runner)
+
+
+def add_method(cls, method_name, method):
+ """Add the method to the class dynamically, keeping unittest/nose happy."""
+ method.func_name = method_name
+ method.__name__ = method_name
+ if six.PY3:
+ methodtype = types.MethodType(method, cls)
+ else:
+ methodtype = types.MethodType(method, None, cls)
+ setattr(cls, method_name, methodtype)
diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py
new file mode 100644
index 00000000..de6e5a33
--- /dev/null
+++ b/tests/unit/__init__.py
@@ -0,0 +1,6 @@
+from __future__ import absolute_import
+
+# Note: The following import statement is defined in order to resolve
+# the conflict of the module names between 'ryu.lib.ovs' and 'ovs'.
+# The latter is the official Python package of Open vSwitch.
+import ovs
diff --git a/tests/unit/app/__init__.py b/tests/unit/app/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/app/__init__.py
diff --git a/tests/unit/app/ofctl_rest_json/of10.json b/tests/unit/app/ofctl_rest_json/of10.json
new file mode 100644
index 00000000..266eb80c
--- /dev/null
+++ b/tests/unit/app/ofctl_rest_json/of10.json
@@ -0,0 +1,101 @@
+[
+ {
+ "method": "GET",
+ "path": "/stats/switches"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/desc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/flow/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flow/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/aggregateflow/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/aggregateflow/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/port/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/port/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/portdesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/table/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/modify_strict",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/delete_strict",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "DELETE",
+ "path": "/stats/flowentry/clear/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/portdesc/modify",
+ "body": {
+ "dpid": 1,
+ "port_no": 1
+ }
+ }
+]
diff --git a/tests/unit/app/ofctl_rest_json/of12.json b/tests/unit/app/ofctl_rest_json/of12.json
new file mode 100644
index 00000000..89a81919
--- /dev/null
+++ b/tests/unit/app/ofctl_rest_json/of12.json
@@ -0,0 +1,150 @@
+[
+ {
+ "method": "GET",
+ "path": "/stats/switches"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/desc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/flow/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flow/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/aggregateflow/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/aggregateflow/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/port/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/port/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/portdesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queueconfig/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queueconfig/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/group/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/group/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/groupdesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/groupfeatures/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/table/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/modify_strict",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/delete_strict",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "DELETE",
+ "path": "/stats/flowentry/clear/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/portdesc/modify",
+ "body": {
+ "dpid": 1,
+ "port_no": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/experimenter/1"
+ }
+]
diff --git a/tests/unit/app/ofctl_rest_json/of13.json b/tests/unit/app/ofctl_rest_json/of13.json
new file mode 100644
index 00000000..d515f628
--- /dev/null
+++ b/tests/unit/app/ofctl_rest_json/of13.json
@@ -0,0 +1,191 @@
+[
+ {
+ "method": "GET",
+ "path": "/stats/switches"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/desc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/flow/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flow/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/aggregateflow/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/aggregateflow/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/port/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/port/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/portdesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queueconfig/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queueconfig/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/group/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/group/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/groupdesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/groupfeatures/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meter/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meter/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meterconfig/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meterconfig/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meterfeatures/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/table/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/modify_strict",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/delete_strict",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "DELETE",
+ "path": "/stats/flowentry/clear/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/portdesc/modify",
+ "body": {
+ "dpid": 1,
+ "port_no": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/meterentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/meterentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/meterentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/experimenter/1"
+ }
+]
diff --git a/tests/unit/app/ofctl_rest_json/of14.json b/tests/unit/app/ofctl_rest_json/of14.json
new file mode 100644
index 00000000..0cc4eb6c
--- /dev/null
+++ b/tests/unit/app/ofctl_rest_json/of14.json
@@ -0,0 +1,195 @@
+[
+ {
+ "method": "GET",
+ "path": "/stats/switches"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/desc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/flow/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flow/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/aggregateflow/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/aggregateflow/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/port/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/port/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/portdesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queuedesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queuedesc/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queuedesc/1/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/group/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/group/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/groupdesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/groupfeatures/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meter/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meter/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meterconfig/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meterconfig/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meterfeatures/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/table/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/modify_strict",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/delete_strict",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "DELETE",
+ "path": "/stats/flowentry/clear/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/portdesc/modify",
+ "body": {
+ "dpid": 1,
+ "port_no": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/meterentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/meterentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/meterentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/experimenter/1"
+ }
+]
diff --git a/tests/unit/app/ofctl_rest_json/of15.json b/tests/unit/app/ofctl_rest_json/of15.json
new file mode 100644
index 00000000..a7569223
--- /dev/null
+++ b/tests/unit/app/ofctl_rest_json/of15.json
@@ -0,0 +1,203 @@
+[
+ {
+ "method": "GET",
+ "path": "/stats/switches"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/desc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/flow/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flow/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/aggregateflow/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/aggregateflow/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/port/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/port/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/portdesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/portdesc/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queue/1/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queuedesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queuedesc/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/queuedesc/1/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/group/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/group/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/groupdesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/groupdesc/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/groupfeatures/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meter/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meter/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meterdesc/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meterdesc/1/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/meterfeatures/1"
+ },
+ {
+ "method": "GET",
+ "path": "/stats/table/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/modify_strict",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/flowentry/delete_strict",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "DELETE",
+ "path": "/stats/flowentry/clear/1"
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/groupentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/portdesc/modify",
+ "body": {
+ "dpid": 1,
+ "port_no": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/meterentry/add",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/meterentry/modify",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/meterentry/delete",
+ "body": {
+ "dpid": 1
+ }
+ },
+ {
+ "method": "POST",
+ "path": "/stats/experimenter/1"
+ }
+]
diff --git a/tests/unit/app/test_ofctl_rest.py b/tests/unit/app/test_ofctl_rest.py
new file mode 100644
index 00000000..5ed70ec4
--- /dev/null
+++ b/tests/unit/app/test_ofctl_rest.py
@@ -0,0 +1,138 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import functools
+import json
+import logging
+import os
+import sys
+import unittest
+try:
+ import mock # Python 2
+except ImportError:
+ from unittest import mock # Python 3
+from nose.tools import eq_
+
+from ryu.app import ofctl_rest
+from ryu.app.wsgi import Request
+from ryu.app.wsgi import WSGIApplication
+from ryu.controller.dpset import DPSet
+from ryu.ofproto import ofproto_protocol
+from ryu.ofproto import ofproto_v1_0
+from ryu.ofproto import ofproto_v1_2
+from ryu.ofproto import ofproto_v1_3
+from ryu.ofproto import ofproto_v1_4
+from ryu.ofproto import ofproto_v1_5
+
+from tests import test_lib
+
+
+LOG = logging.getLogger(__name__)
+
+
+class DummyDatapath(ofproto_protocol.ProtocolDesc):
+
+ def __init__(self, version):
+ super(DummyDatapath, self).__init__(version)
+ self.id = 1
+ _kw = {'port_no': 1, 'hw_addr': 'aa:bb:cc:dd:ee:ff',
+ 'name': 's1-eth1', 'config': 1, 'state': 1}
+ # for OpenFlow 1.0
+ if version in [ofproto_v1_0.OFP_VERSION]:
+ _kw.update(
+ {'curr': 2112, 'advertised': 0, 'supported': 0, 'peer': 0})
+ port_info = self.ofproto_parser.OFPPhyPort(**_kw)
+ # for OpenFlow 1.2 or 1.3
+ elif version in [ofproto_v1_2.OFP_VERSION, ofproto_v1_3.OFP_VERSION]:
+ _kw.update(
+ {'curr': 2112, 'advertised': 0, 'supported': 0, 'peer': 0,
+ 'curr_speed': 10000000, 'max_speed': 0})
+ port_info = self.ofproto_parser.OFPPort(**_kw)
+ # for OpenFlow 1.4+
+ else:
+ _kw.update({'properties': []})
+ port_info = self.ofproto_parser.OFPPort(**_kw)
+ self.ports = {1: port_info}
+
+
+class Test_ofctl_rest(unittest.TestCase):
+
+ def _test(self, name, dp, method, path, body):
+ # print('processing %s ...' % name)
+
+ dpset = DPSet()
+ dpset._register(dp)
+ wsgi = WSGIApplication()
+ contexts = {
+ 'dpset': dpset,
+ 'wsgi': wsgi,
+ }
+ ofctl_rest.RestStatsApi(**contexts)
+
+ req = Request.blank(path)
+ req.body = json.dumps(body).encode('utf-8')
+ req.method = method
+
+ with mock.patch('ryu.lib.ofctl_utils.send_stats_request'),\
+ mock.patch('ryu.lib.ofctl_utils.send_msg'):
+ res = req.get_response(wsgi)
+ eq_(res.status, '200 OK')
+
+
+def _add_tests():
+ _ofp_vers = {
+ 'of10': ofproto_v1_0.OFP_VERSION,
+ 'of12': ofproto_v1_2.OFP_VERSION,
+ 'of13': ofproto_v1_3.OFP_VERSION,
+ 'of14': ofproto_v1_4.OFP_VERSION,
+ 'of15': ofproto_v1_5.OFP_VERSION,
+ }
+
+ this_dir = os.path.dirname(sys.modules[__name__].__file__)
+ ofctl_rest_json_dir = os.path.join(this_dir, 'ofctl_rest_json/')
+
+ for ofp_ver in _ofp_vers:
+ # read a json file
+ json_path = os.path.join(ofctl_rest_json_dir, ofp_ver + '.json')
+ if os.path.exists(json_path):
+ _test_cases = json.load(open(json_path))
+ else:
+ # print("Skip to load test cases for %s" % ofp_ver)
+ continue
+
+ # add test
+ for test in _test_cases:
+ method = test['method']
+ path = test['path']
+ body = test.get('body', {})
+
+ name = 'test_ofctl_rest_' + method + '_' + ofp_ver + '_' + path
+ # print('adding %s ...' % name)
+ f = functools.partial(
+ Test_ofctl_rest._test,
+ name=name,
+ dp=DummyDatapath(_ofp_vers[ofp_ver]),
+ method=test['method'],
+ path=test['path'],
+ body=body
+ )
+ test_lib.add_method(Test_ofctl_rest, name, f)
+
+_add_tests()
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/unit/app/test_tester.py b/tests/unit/app/test_tester.py
new file mode 100644
index 00000000..64657f9e
--- /dev/null
+++ b/tests/unit/app/test_tester.py
@@ -0,0 +1,464 @@
+# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+from nose.tools import *
+
+import binascii
+import inspect
+import json
+import logging
+import math
+import netaddr
+import os
+import signal
+import sys
+import time
+import traceback
+from random import randint
+
+from ryu import cfg
+
+# import all packet libraries.
+PKT_LIB_PATH = 'ryu.lib.packet'
+for modname, moddef in sys.modules.items():
+ if not modname.startswith(PKT_LIB_PATH) or not moddef:
+ continue
+ for (clsname, clsdef, ) in inspect.getmembers(moddef):
+ if not inspect.isclass(clsdef):
+ continue
+ exec('from %s import %s' % (modname, clsname))
+
+from ryu.base import app_manager
+from ryu.controller import handler
+from ryu.controller import ofp_event
+from ryu.controller.handler import set_ev_cls
+from ryu.exception import RyuException
+from ryu.lib import dpid as dpid_lib
+from ryu.lib import hub
+from ryu.lib import stringify
+from ryu.lib.packet import packet
+from ryu.ofproto import ofproto_protocol
+from ryu.ofproto import ofproto_v1_3
+from ryu.ofproto import ofproto_v1_3_parser
+from ryu.ofproto import ofproto_v1_4
+
+from ryu.tests.switch.tester import TestPatterns
+from ryu.tests.switch.tester import TestFile
+from ryu.tests.switch.tester import OfTester
+
+CONF = cfg.CONF
+
+LOG = logging.getLogger('test_tester')
+
+SAMPLE_DESC = "action: 00_OUTPUT"
+
+
+class Test_tester(unittest.TestCase):
+
+ """ Test case for tester
+ """
+
+ # action/00_OUTPUT.json
+
+ test_json_1 = {
+ "description": "ethernet/ipv4/tcp-->'actions=output:2'",
+ "prerequisite": [
+ {
+ "OFPFlowMod": {
+ "table_id": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "port": "target_send_port_1"
+ }
+ }
+ ],
+ "type": 4
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "tests": [
+ {
+ "ingress": [
+ "ethernet(dst='22:22:22:22:22:22', \
+ src='12:11:11:11:11:11', ethertype=2048)",
+ "ipv4(tos=32, proto=6, src='192.168.10.10', \
+ dst='192.168.20.20', ttl=64)",
+ "tcp(dst_port=2222, option=str('\\x00' * 4), \
+ src_port=11111)",
+ "'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x0\
+ 8\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x1\
+ 2\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1\
+ b\\x1c\\x1d\\x1e\\x1f'"
+ ],
+ "egress":[
+ "ethernet(dst='22:22:22:22:22:22', \
+ src='12:11:11:11:11:11', ethertype=2048)",
+ "ipv4(tos=32, proto=6, src='192.168.10.10', \
+ dst='192.168.20.20', ttl=64)",
+ "tcp(dst_port=2222, option=str('\\x00' * 4), \
+ src_port=11111)",
+ "'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x0\
+ 8\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x1\
+ 2\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1\
+ b\\x1c\\x1d\\x1e\\x1f'"
+ ]
+
+ }
+ ]
+ }
+
+ # group/00_ALL.json
+
+ test_json_2 = {
+ "description": "2Mbps(ethernet/ipv4/tcp)-->'in_port=1,\
+ actions=group:all(actions=output:2/actions=output:3)'",
+ "prerequisite": [
+ {
+ "OFPGroupMod": {
+ "group_id": 0,
+ "buckets": [
+ {
+ "OFPBucket": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "port": "target_send_port_1"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "OFPBucket": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "port": "target_send_port_2"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ {
+ "OFPFlowMod": {
+ "match": {
+ "OFPMatch": {
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "value": "target_recv_port"
+ }
+ }
+ ]
+ }
+ },
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionGroup": {
+ "group_id": 0
+ }
+ }
+ ],
+ "type": 4
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "tests": [
+ {
+ "ingress": {
+ "packets": {
+ "data": [
+ "ethernet(dst='22:22:22:22:22:22', \
+ src='12:11:11:11:11:11', ethertype=2048)",
+ "ipv4(proto=6)",
+ "tcp()",
+ "str('\\x11' * (1500 - 54))"
+ ],
+ "pktps":175,
+ "duration_time":30
+ }
+ },
+ "egress":{
+ "throughput": [
+ {
+ "OFPMatch": {
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "value": "tester_recv_port_1"
+ }
+ }
+ ]
+ },
+ "kbps": 2000
+ },
+ {
+ "OFPMatch": {
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "value": "tester_recv_port_2"
+ }
+ }
+ ]
+ },
+ "kbps": 2000
+ }
+ ]
+ }
+ }
+ ]
+ }
+
+ # match/00_IN_PORT.json
+
+ test_json_3 = {
+ "description": "ethernet/ipv4/tcp-->'in_port=1,actions=output:2'",
+ "prerequisite": [
+ {
+ "OFPFlowMod": {
+ "table_id": 0,
+ "match": {
+ "OFPMatch": {
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "value": "target_recv_port"
+ }
+ }
+ ]
+ }
+ },
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "port": "target_send_port_1"
+ }
+ }
+ ],
+ "type": 4
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "tests": [
+ {
+ "ingress": [
+ "ethernet(dst='22:22:22:22:22:22', \
+ src='12:11:11:11:11:11', ethertype=2048)",
+ "ipv4(tos=32, proto=6, src='192.168.10.10', \
+ dst='192.168.20.20', ttl=64)",
+ "tcp(dst_port=2222, option=str('\\x00' * 4), \
+ src_port=11111)",
+ "'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x0\
+ 8\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x1\
+ 2\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1\
+ b\\x1c\\x1d\\x1e\\x1f'"
+ ],
+ "egress":[
+ "ethernet(dst='22:22:22:22:22:22', \
+ src='12:11:11:11:11:11', ethertype=2048)",
+ "ipv4(tos=32, proto=6, src='192.168.10.10',\
+ dst='192.168.20.20', ttl=64)",
+ "tcp(dst_port=2222, option=str('\\x00' * 4), \
+ src_port=11111)",
+ "'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x0\
+ 8\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x1\
+ 2\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1\
+ b\\x1c\\x1d\\x1e\\x1f'"
+ ]
+ }
+ ]
+ }
+
+ # meter/01_DROP_00_KBPS_00_1M.json
+
+ test_json_4 = {
+ "description": "2Mbps(ethernet/ipv4/tcp)-->'in_port=1,\
+ actions=meter:1Mbps(drop),output:2'",
+ "prerequisite": [
+ {
+ "OFPMeterMod": {
+ "meter_id": 1,
+ "bands": [
+ {
+ "OFPMeterBandDrop": {
+ "rate": 1000
+ }
+ }
+ ]
+ }
+ },
+ {
+ "OFPFlowMod": {
+ "match": {
+ "OFPMatch": {
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "value": "target_recv_port"
+ }
+ }
+ ]
+ }
+ },
+ "instructions": [
+ {
+ "OFPInstructionMeter": {
+ "meter_id": 1
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "port": "target_send_port_1"
+ }
+ }
+ ],
+ "type": 4
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "tests": [
+ {
+ "ingress": {
+ "packets": {
+ "data": [
+ "ethernet(dst='22:22:22:22:22:22', \
+ src='12:11:11:11:11:11', ethertype=2048)",
+ "ipv4(proto=6)",
+ "tcp()",
+ "str('\\x11' * (1500 - 54))"
+ ],
+ "pktps":175,
+ "duration_time":30
+ }
+ },
+ "egress":{
+ "throughput": [
+ {
+ "OFPMatch": {
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "value": "tester_recv_port_1"
+ }
+
+ }
+ ]
+ },
+ "kbps": 1000
+ }
+ ]
+ }
+ }
+ ]
+ }
+
+ def setUp(self):
+ OfTester.tester_ver = ofproto_v1_3.OFP_VERSION
+ OfTester.target_ver = ofproto_v1_3.OFP_VERSION
+
+ def tearDown(self):
+ pass
+
+ def test__normalize_test_json(self):
+ self.tests = TestPatterns(
+ "../../ryu/tests/switch/of13/action/00_OUTPUT.json",
+ logging.getLogger("test_tester"))
+
+ self.tests[SAMPLE_DESC]._normalize_test_json(Test_tester.test_json_1)
+ self.tests[SAMPLE_DESC]._normalize_test_json(Test_tester.test_json_2)
+ self.tests[SAMPLE_DESC]._normalize_test_json(Test_tester.test_json_3)
+ self.tests[SAMPLE_DESC]._normalize_test_json(Test_tester.test_json_4)
+
+ # action/00_OUTPUT.json
+ eq_(Test_tester.test_json_1["prerequisite"][0]["OFPFlowMod"][
+ "instructions"][0]["OFPInstructionActions"][
+ "actions"][0]["OFPActionOutput"]["port"],
+ CONF['test-switch']['target_send_port_1'])
+
+ # group/00_ALL.json
+ eq_(Test_tester.test_json_2["prerequisite"][1]["OFPFlowMod"][
+ "match"]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
+ CONF['test-switch']['target_recv_port'])
+ eq_(Test_tester.test_json_2["prerequisite"][0]["OFPGroupMod"][
+ "buckets"][0]["OFPBucket"]["actions"][0]["OFPActionOutput"][
+ "port"], CONF['test-switch']['target_send_port_1'])
+ eq_(Test_tester.test_json_2["prerequisite"][0]["OFPGroupMod"][
+ "buckets"][1]["OFPBucket"]["actions"][0]["OFPActionOutput"][
+ "port"], CONF['test-switch']['target_send_port_2'])
+ eq_(Test_tester.test_json_2["tests"][0]["egress"]["throughput"][
+ 0]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
+ CONF['test-switch']['tester_recv_port_1'])
+ eq_(Test_tester.test_json_2["tests"][0]["egress"]["throughput"][
+ 1]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
+ CONF['test-switch']['tester_recv_port_2'])
+
+ # match/00_IN_PORT.json
+ eq_(Test_tester.test_json_3["prerequisite"][0]["OFPFlowMod"][
+ "match"]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
+ CONF['test-switch']['target_recv_port'])
+ eq_(Test_tester.test_json_3["prerequisite"][0]["OFPFlowMod"][
+ "instructions"][0]["OFPInstructionActions"]["actions"][0][
+ "OFPActionOutput"]["port"], CONF['test-switch'][
+ 'target_send_port_1'])
+
+ # meter/01_DROP_00_KBPS_00_1M.json
+ eq_(Test_tester.test_json_4["prerequisite"][1]["OFPFlowMod"][
+ "match"]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
+ CONF['test-switch']['target_recv_port'])
+ eq_(Test_tester.test_json_4["prerequisite"][1]["OFPFlowMod"][
+ "instructions"][1]["OFPInstructionActions"]["actions"][0][
+ "OFPActionOutput"]["port"],
+ CONF['test-switch']['target_send_port_1'])
+ eq_(Test_tester.test_json_4["tests"][0]["egress"]["throughput"][
+ 0]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
+ CONF['test-switch']['tester_recv_port_1'])
diff --git a/tests/unit/app/test_ws_topology.py b/tests/unit/app/test_ws_topology.py
new file mode 100644
index 00000000..6eaaa0e5
--- /dev/null
+++ b/tests/unit/app/test_ws_topology.py
@@ -0,0 +1,54 @@
+# Copyright (C) 2013 Stratosphere Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+from socket import error as SocketError
+
+import mock
+
+from ryu.app.ws_topology import WebSocketTopology
+
+
+class Test_ws_topology(unittest.TestCase):
+
+ def test_when_sock_error(self):
+ args = {
+ 'wsgi': mock.Mock(),
+ }
+ app = WebSocketTopology(**args)
+
+ rpc_client_mock1 = mock.Mock()
+ config = {
+ 'get_proxy.return_value.event_link_add.side_effect': SocketError,
+ }
+ rpc_client_mock1.configure_mock(**config)
+
+ rpc_client_mock2 = mock.Mock()
+
+ app.rpc_clients = [
+ rpc_client_mock1,
+ rpc_client_mock2,
+ ]
+
+ ev_mock = mock.Mock()
+ app._event_link_add_handler(ev_mock)
+
+ rpc_client_mock1.get_proxy.assert_called_once_with()
+ rpc_client_mock2.get_proxy.assert_called_once_with()
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/unit/app/test_wsgi.py b/tests/unit/app/test_wsgi.py
new file mode 100644
index 00000000..bec21ddc
--- /dev/null
+++ b/tests/unit/app/test_wsgi.py
@@ -0,0 +1,104 @@
+# Copyright (C) 2013 Stratosphere Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+
+import nose
+from nose.tools import eq_
+
+from ryu.app.wsgi import ControllerBase
+from ryu.app.wsgi import WSGIApplication
+from ryu.app.wsgi import Response
+from ryu.app.wsgi import route
+from ryu.lib import dpid as dpidlib
+
+LOG = logging.getLogger('test_wsgi')
+
+
+class _TestController(ControllerBase):
+
+ def __init__(self, req, link, data, **config):
+ super(_TestController, self).__init__(req, link, data, **config)
+ eq_(data['test_param'], 'foo')
+
+ @route('test', '/test/{dpid}',
+ methods=['GET'], requirements={'dpid': dpidlib.DPID_PATTERN})
+ def test_get_dpid(self, req, dpid, **_kwargs):
+ return Response(status=200, body=dpid)
+
+ @route('test', '/test')
+ def test_root(self, req, **_kwargs):
+ return Response(status=200, body='root')
+
+
+class Test_wsgi(unittest.TestCase):
+
+ """ Test case for wsgi
+ """
+
+ def setUp(self):
+ controller_data = {
+ 'test_param': 'foo'
+ }
+ self.wsgi_app = WSGIApplication()
+ self.wsgi_app.register(_TestController, controller_data)
+
+ def tearDown(self):
+ pass
+
+ def test_wsgi_decorator_ok(self):
+ r = self.wsgi_app({'REQUEST_METHOD': 'GET',
+ 'PATH_INFO': '/test/0123456789abcdef'},
+ lambda s, _: eq_(s, '200 OK'))
+ eq_(r[0], (b'0123456789abcdef'))
+
+ def test_wsgi_decorator_ng_path(self):
+ self.wsgi_app({'REQUEST_METHOD': 'GET',
+ 'PATH_INFO': '/'},
+ lambda s, _: eq_(s, '404 Not Found'))
+
+ def test_wsgi_decorator_ng_method(self):
+ # XXX: If response code is "405 Method Not Allowed", it is better.
+ self.wsgi_app({'REQUEST_METHOD': 'PUT',
+ 'PATH_INFO': '/test/0123456789abcdef'},
+ lambda s, _: eq_(s, '404 Not Found'))
+
+ def test_wsgi_decorator_ng_requirements(self):
+ # XXX: If response code is "400 Bad Request", it is better.
+ self.wsgi_app({'REQUEST_METHOD': 'GET',
+ 'PATH_INFO': '/test/hogehoge'},
+ lambda s, _: eq_(s, '404 Not Found'))
+
+ def test_wsgi_decorator_ok_any_method(self):
+ self.wsgi_app({'REQUEST_METHOD': 'GET',
+ 'PATH_INFO': '/test'},
+ lambda s, _: eq_(s, '200 OK'))
+ self.wsgi_app({'REQUEST_METHOD': 'POST',
+ 'PATH_INFO': '/test'},
+ lambda s, _: eq_(s, '200 OK'))
+ self.wsgi_app({'REQUEST_METHOD': 'PUT',
+ 'PATH_INFO': '/test'},
+ lambda s, _: eq_(s, '200 OK'))
+ r = self.wsgi_app({'REQUEST_METHOD': 'DELETE',
+ 'PATH_INFO': '/test'},
+ lambda s, _: eq_(s, '200 OK'))
+ eq_(r[0], b'root')
+
+
+if __name__ == '__main__':
+ nose.main(argv=['nosetests', '-s', '-v'], defaultTest=__file__)
diff --git a/tests/unit/cmd/__init__.py b/tests/unit/cmd/__init__.py
new file mode 100644
index 00000000..ca8ef539
--- /dev/null
+++ b/tests/unit/cmd/__init__.py
@@ -0,0 +1,15 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/tests/unit/cmd/dummy_app.py b/tests/unit/cmd/dummy_app.py
new file mode 100644
index 00000000..6c594298
--- /dev/null
+++ b/tests/unit/cmd/dummy_app.py
@@ -0,0 +1,21 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from ryu.base import app_manager
+
+
+class DummyApp(app_manager.RyuApp):
+ pass
diff --git a/tests/unit/cmd/dummy_openflow_app.py b/tests/unit/cmd/dummy_openflow_app.py
new file mode 100644
index 00000000..614febcd
--- /dev/null
+++ b/tests/unit/cmd/dummy_openflow_app.py
@@ -0,0 +1,22 @@
+# Copyright (C) 2013,2014 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013,2014 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from ryu.base import app_manager
+from ryu.ofproto import ofproto_v1_3
+
+
+class DummyOpenFlowApp(app_manager.RyuApp):
+ OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
diff --git a/tests/unit/cmd/test_manager.py b/tests/unit/cmd/test_manager.py
new file mode 100644
index 00000000..5127fa52
--- /dev/null
+++ b/tests/unit/cmd/test_manager.py
@@ -0,0 +1,77 @@
+# Copyright (C) 2013,2014 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013,2014 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import sys
+import unittest
+import mock
+from nose.tools import eq_, raises
+
+try:
+ # Python 3
+ from imp import reload
+except ImportError:
+ # Python 2
+ pass
+
+from ryu.cmd.manager import main
+
+
+class Test_Manager(unittest.TestCase):
+ """Test ryu-manager command
+ """
+
+ def __init__(self, methodName):
+ super(Test_Manager, self).__init__(methodName)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ @raises(SystemExit)
+ @mock.patch('sys.argv', new=['ryu-manager', '--version'])
+ def test_version(self):
+ main()
+
+ @raises(SystemExit)
+ @mock.patch('sys.argv', new=['ryu-manager', '--help'])
+ def test_help(self):
+ main()
+
+ @staticmethod
+ def _reset_globals():
+ # hack to reset globals like SERVICE_BRICKS.
+ # assumption: this is the only test which actually starts RyuApp.
+ import ryu.base.app_manager
+ import ryu.ofproto.ofproto_protocol
+
+ reload(ryu.base.app_manager)
+ reload(ryu.ofproto.ofproto_protocol)
+
+ @mock.patch('sys.argv', new=['ryu-manager', '--verbose',
+ 'tests.unit.cmd.dummy_app'])
+ def test_no_services(self):
+ self._reset_globals()
+ main()
+ self._reset_globals()
+
+ @mock.patch('sys.argv', new=['ryu-manager', '--verbose',
+ 'tests.unit.cmd.dummy_openflow_app'])
+ def test_openflow_app(self):
+ self._reset_globals()
+ main()
+ self._reset_globals()
diff --git a/tests/unit/controller/__init__.py b/tests/unit/controller/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/controller/__init__.py
diff --git a/tests/unit/controller/test_controller.py b/tests/unit/controller/test_controller.py
new file mode 100644
index 00000000..27a2bce6
--- /dev/null
+++ b/tests/unit/controller/test_controller.py
@@ -0,0 +1,145 @@
+# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2015 Stratosphere Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+try:
+ import mock # Python 2
+except ImportError:
+ from unittest import mock # Python 3
+
+import json
+import os
+import sys
+import warnings
+import unittest
+import logging
+import random
+
+from ryu.base import app_manager # To suppress cyclic import
+from ryu.controller import controller
+from ryu.controller import handler
+from ryu.ofproto import ofproto_v1_3_parser
+from ryu.ofproto import ofproto_v1_2_parser
+from ryu.ofproto import ofproto_v1_0_parser
+
+
+LOG = logging.getLogger('test_controller')
+
+
+class Test_Datapath(unittest.TestCase):
+ """
+ Test cases for controller.Datapath
+ """
+
+ def _test_ports_accessibility(self, ofproto_parser, msgs_len):
+ with mock.patch('ryu.controller.controller.Datapath.set_state'):
+
+ # Ignore warnings
+ with warnings.catch_warnings(record=True) as msgs:
+ warnings.simplefilter('always')
+
+ # Test target
+ sock_mock = mock.Mock()
+ addr_mock = mock.Mock()
+ dp = controller.Datapath(sock_mock, addr_mock)
+ dp.ofproto_parser = ofproto_parser
+
+ # Create
+ dp.ports = {}
+
+ # Update
+ port_mock = mock.Mock()
+ dp.ports[0] = port_mock
+
+ # Read & Delete
+ del dp.ports[0]
+
+ self.assertEqual(len(msgs), msgs_len)
+ for msg in msgs:
+ self.assertTrue(issubclass(msg.category, UserWarning))
+
+ def test_ports_accessibility_v13(self):
+ self._test_ports_accessibility(ofproto_v1_3_parser, 0)
+
+ def test_ports_accessibility_v12(self):
+ self._test_ports_accessibility(ofproto_v1_2_parser, 0)
+
+ def test_ports_accessibility_v10(self):
+ self._test_ports_accessibility(ofproto_v1_0_parser, 0)
+
+ @mock.patch("ryu.base.app_manager", spec=app_manager)
+ def test_recv_loop(self, app_manager_mock):
+ # Prepare test data
+ test_messages = [
+ "4-6-ofp_features_reply.packet",
+ "4-14-ofp_echo_reply.packet",
+ "4-14-ofp_echo_reply.packet",
+ "4-4-ofp_packet_in.packet",
+ "4-14-ofp_echo_reply.packet",
+ "4-14-ofp_echo_reply.packet",
+ ]
+ this_dir = os.path.dirname(sys.modules[__name__].__file__)
+ packet_data_dir = os.path.join(this_dir, '../../packet_data/of13')
+ json_dir = os.path.join(this_dir, '../ofproto/json/of13')
+
+ packet_buf = bytearray()
+ expected_json = list()
+ for msg in test_messages:
+ # Construct the received packet buffer as one packet data in order
+ # to test the case of the OpenFlow messages composed in one packet.
+ packet_data_file = os.path.join(packet_data_dir, msg)
+ packet_buf += open(packet_data_file, 'rb').read()
+ json_data_file = os.path.join(json_dir, msg + '.json')
+ expected_json.append(json.load(open(json_data_file)))
+
+ # Prepare mock for socket
+ class SocketMock(mock.MagicMock):
+ buf = bytearray()
+ random = None
+
+ def recv(self, bufsize):
+ size = self.random.randint(1, bufsize)
+ out = self.buf[:size]
+ self.buf = self.buf[size:]
+ return out
+
+ # Prepare mock
+ ofp_brick_mock = mock.MagicMock(spec=app_manager.RyuApp)
+ app_manager_mock.lookup_service_brick.return_value = ofp_brick_mock
+ sock_mock = SocketMock()
+ sock_mock.buf = packet_buf
+ sock_mock.random = random.Random('Ryu SDN Framework')
+ addr_mock = mock.MagicMock()
+
+ # Prepare test target
+ dp = controller.Datapath(sock_mock, addr_mock)
+ dp.set_state(handler.MAIN_DISPATCHER)
+ ofp_brick_mock.reset_mock()
+
+ # Test
+ dp._recv_loop()
+
+ # Assert calls
+ output_json = list()
+ for call in ofp_brick_mock.send_event_to_observers.call_args_list:
+ args, kwargs = call
+ ev, state = args
+ if not hasattr(ev, 'msg'):
+ continue
+ output_json.append(ev.msg.to_jsondict())
+ self.assertEqual(state, handler.MAIN_DISPATCHER)
+ self.assertEqual(kwargs, {})
+ self.assertEqual(expected_json, output_json)
diff --git a/tests/unit/lib/__init__.py b/tests/unit/lib/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/lib/__init__.py
diff --git a/tests/unit/lib/ofctl_json/of10/1-2-ofp_flow_mod.packet.json b/tests/unit/lib/ofctl_json/of10/1-2-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..cc0b13d9
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of10/1-2-ofp_flow_mod.packet.json
@@ -0,0 +1,23 @@
+{
+ "cmd": 0,
+ "flow": {
+ "actions": [
+ {
+ "type": "OUTPUT",
+ "max_len": 65535,
+ "port": 6
+ }
+ ],
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "match": {
+ "dl_dst": "f2:0b:a4:7d:f8:ea"
+ },
+ "out_port": 65532,
+ "priority": 123
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-0-ofp_desc_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of12/3-0-ofp_desc_stats_reply.packet.json
new file mode 100644
index 00000000..8fc54b74
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-0-ofp_desc_stats_reply.packet.json
@@ -0,0 +1,9 @@
+{
+ "1": {
+ "dp_desc": "dp",
+ "hw_desc": "hw",
+ "mfr_desc": "mfr",
+ "serial_num": "serial",
+ "sw_desc": "sw"
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-11-ofp_flow_stats_request.packet.json b/tests/unit/lib/ofctl_json/of12/3-11-ofp_flow_stats_request.packet.json
new file mode 100644
index 00000000..a42dfef0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-11-ofp_flow_stats_request.packet.json
@@ -0,0 +1,11 @@
+{
+ "flow": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {},
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-12-ofp_flow_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of12/3-12-ofp_flow_stats_reply.packet.json
new file mode 100644
index 00000000..4d73e0b5
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-12-ofp_flow_stats_reply.packet.json
@@ -0,0 +1,75 @@
+{
+ "1": [
+ {
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115277000,
+ "duration_sec": 358,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "actions": [],
+ "length": 56,
+ "match": {},
+ "packet_count": 0,
+ "priority": 65535,
+ "table_id": 0
+ },
+ {
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115055000,
+ "duration_sec": 358,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "actions": [
+ "OUTPUT:NORMAL"
+ ],
+ "length": 88,
+ "match": {
+ "dl_type": 2054
+ },
+ "packet_count": 0,
+ "priority": 65534,
+ "table_id": 0
+ },
+ {
+ "byte_count": 238,
+ "cookie": 0,
+ "duration_nsec": 511582000,
+ "duration_sec": 316220,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "actions": [
+ "GOTO_TABLE:1"
+ ],
+ "length": 80,
+ "match": {
+ "in_port": 6,
+ "dl_src": "f2:0b:a4:7d:f8:ea"
+ },
+ "packet_count": 3,
+ "priority": 123,
+ "table_id": 0
+ },
+ {
+ "byte_count": 98,
+ "cookie": 0,
+ "duration_nsec": 980901000,
+ "duration_sec": 313499,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "actions": [
+ {
+ "WRITE_ACTIONS": [
+ "OUTPUT:CONTROLLER"
+ ]
+ }
+ ],
+ "length": 80,
+ "match": {},
+ "packet_count": 1,
+ "priority": 0,
+ "table_id": 0
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-16-ofp_experimenter.packet.json b/tests/unit/lib/ofctl_json/of12/3-16-ofp_experimenter.packet.json
new file mode 100644
index 00000000..c655f8f0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-16-ofp_experimenter.packet.json
@@ -0,0 +1,8 @@
+{
+ "exp": {
+ "data": "bmF6bw==",
+ "data_type": "base64",
+ "exp_type": 123456789,
+ "experimenter": 98765432
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-2-ofp_flow_mod.packet.json b/tests/unit/lib/ofctl_json/of12/3-2-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..f6a0f26a
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-2-ofp_flow_mod.packet.json
@@ -0,0 +1,41 @@
+{
+ "cmd": 0,
+ "flow": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "actions": [
+ {
+ "type": "WRITE_ACTIONS",
+ "actions": [
+ {
+ "type": "SET_FIELD",
+ "field": "vlan_vid",
+ "value": 258
+ },
+ {
+ "type": "OUTPUT",
+ "port": 6,
+ "max_len": 65535
+ }
+ ]
+ },
+ {
+ "type": "SET_FIELD",
+ "field": "eth_src",
+ "value": "01:02:03:04:05:06"
+ }
+ ],
+ "match": {
+ "eth_dst": "f2:0b:a4:7d:f8:ea"
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-21-ofp_group_mod.packet.json b/tests/unit/lib/ofctl_json/of12/3-21-ofp_group_mod.packet.json
new file mode 100644
index 00000000..9509e191
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-21-ofp_group_mod.packet.json
@@ -0,0 +1,22 @@
+{
+ "cmd": 0,
+ "group": {
+ "buckets": [
+ {
+ "actions": [
+ {
+ "max_len": 65535,
+ "port": 2,
+ "type": "OUTPUT"
+ }
+ ],
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ ],
+ "command": 0,
+ "group_id": 1,
+ "type": "ALL"
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-22-ofp_port_mod.packet.json b/tests/unit/lib/ofctl_json/of12/3-22-ofp_port_mod.packet.json
new file mode 100644
index 00000000..3c3ccf89
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-22-ofp_port_mod.packet.json
@@ -0,0 +1,9 @@
+{
+ "port_config": {
+ "advertise": 4096,
+ "config": 0,
+ "hw_addr": "00-11-00-00-11-11",
+ "mask": 0,
+ "port_no": 1
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-25-ofp_aggregate_stats_request.packet.json b/tests/unit/lib/ofctl_json/of12/3-25-ofp_aggregate_stats_request.packet.json
new file mode 100644
index 00000000..845af65b
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-25-ofp_aggregate_stats_request.packet.json
@@ -0,0 +1,11 @@
+{
+ "flow": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {},
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 255
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-26-ofp_aggregate_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of12/3-26-ofp_aggregate_stats_reply.packet.json
new file mode 100644
index 00000000..a4b23d12
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-26-ofp_aggregate_stats_reply.packet.json
@@ -0,0 +1,9 @@
+{
+ "1": [
+ {
+ "byte_count": 574,
+ "flow_count": 6,
+ "packet_count": 7
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-28-ofp_table_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of12/3-28-ofp_table_stats_reply.packet.json
new file mode 100644
index 00000000..7444a29a
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-28-ofp_table_stats_reply.packet.json
@@ -0,0 +1,32134 @@
+{
+ "1": [
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "\u79c1\u306e\u30c6\u30fc\u30d6\u30eb",
+ "matched_count": 4,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 4,
+ "max_entries": 16777216,
+ "lookup_count": 4,
+ "metadata_match": 18446744073709551615,
+ "table_id": 0,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x01",
+ "matched_count": 3,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 2,
+ "max_entries": 16777216,
+ "lookup_count": 3,
+ "metadata_match": 18446744073709551615,
+ "table_id": 1,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x02",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 2,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x03",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 3,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x04",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 4,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x05",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 5,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x06",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 6,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x07",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 7,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x08",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 8,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x09",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 9,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x0a",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 10,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x0b",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 11,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x0c",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 12,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x0d",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 13,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x0e",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 14,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x0f",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 15,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x10",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 16,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x11",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 17,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x12",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 18,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x13",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 19,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x14",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 20,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x15",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 21,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x16",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 22,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x17",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 23,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x18",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 24,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x19",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 25,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x1a",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 26,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x1b",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 27,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x1c",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 28,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x1d",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 29,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x1e",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 30,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x1f",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 31,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x20",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 32,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x21",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 33,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x22",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 34,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x23",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 35,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x24",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 36,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x25",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 37,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x26",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 38,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x27",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 39,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x28",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 40,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x29",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 41,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x2a",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 42,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x2b",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 43,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x2c",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 44,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x2d",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 45,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x2e",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 46,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x2f",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 47,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x30",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 48,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x31",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 49,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x32",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 50,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x33",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 51,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x34",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 52,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x35",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 53,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x36",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 54,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x37",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 55,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x38",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 56,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x39",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 57,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x3a",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 58,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x3b",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 59,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x3c",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 60,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x3d",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 61,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x3e",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 62,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x3f",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 63,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x40",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 64,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x41",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 65,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x42",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 66,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x43",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 67,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x44",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 68,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x45",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 69,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x46",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 70,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x47",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 71,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x48",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 72,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x49",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 73,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x4a",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 74,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x4b",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 75,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x4c",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 76,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x4d",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 77,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x4e",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 78,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x4f",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 79,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x50",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 80,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x51",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 81,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x52",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 82,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x53",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 83,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x54",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 84,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x55",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 85,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x56",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 86,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x57",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 87,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x58",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 88,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x59",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 89,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x5a",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 90,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x5b",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 91,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x5c",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 92,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x5d",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 93,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x5e",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 94,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x5f",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 95,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x60",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 96,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x61",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 97,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x62",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 98,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x63",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 99,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x64",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 100,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x65",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 101,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x66",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 102,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x67",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 103,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x68",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 104,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x69",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 105,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x6a",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 106,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x6b",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 107,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x6c",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 108,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x6d",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 109,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x6e",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 110,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x6f",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 111,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x70",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 112,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x71",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 113,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x72",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 114,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x73",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 115,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x74",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 116,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x75",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 117,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x76",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 118,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x77",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 119,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x78",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 120,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x79",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 121,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x7a",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 122,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x7b",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 123,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x7c",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 124,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x7d",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 125,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x7e",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 126,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x7f",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 127,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x80",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 128,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x81",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 129,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x82",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 130,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x83",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 131,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x84",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 132,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x85",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 133,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x86",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 134,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x87",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 135,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x88",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 136,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x89",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 137,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x8a",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 138,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x8b",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 139,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x8c",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 140,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x8d",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 141,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x8e",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 142,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x8f",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 143,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x90",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 144,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x91",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 145,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x92",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 146,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x93",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 147,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x94",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 148,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x95",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 149,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x96",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 150,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x97",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 151,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x98",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 152,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x99",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 153,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x9a",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 154,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x9b",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 155,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x9c",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 156,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x9d",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 157,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x9e",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 158,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0x9f",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 159,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xa0",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 160,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xa1",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 161,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xa2",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 162,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xa3",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 163,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xa4",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 164,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xa5",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 165,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xa6",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 166,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xa7",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 167,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xa8",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 168,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xa9",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 169,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xaa",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 170,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xab",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 171,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xac",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 172,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xad",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 173,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xae",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 174,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xaf",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 175,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xb0",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 176,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xb1",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 177,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xb2",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 178,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xb3",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 179,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xb4",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 180,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xb5",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 181,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xb6",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 182,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xb7",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 183,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xb8",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 184,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xb9",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 185,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xba",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 186,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xbb",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 187,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xbc",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 188,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xbd",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 189,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xbe",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 190,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xbf",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 191,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xc0",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 192,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xc1",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 193,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xc2",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 194,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xc3",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 195,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xc4",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 196,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xc5",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 197,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xc6",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 198,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xc7",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 199,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xc8",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 200,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xc9",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 201,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xca",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 202,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xcb",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 203,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xcc",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 204,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xcd",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 205,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xce",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 206,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xcf",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 207,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xd0",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 208,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xd1",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 209,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xd2",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 210,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xd3",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 211,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xd4",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 212,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xd5",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 213,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xd6",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 214,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xd7",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 215,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xd8",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 216,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xd9",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 217,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xda",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 218,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xdb",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 219,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xdc",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 220,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xdd",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 221,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xde",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 222,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xdf",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 223,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xe0",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 224,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xe1",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 225,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xe2",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 226,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xe3",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 227,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xe4",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 228,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xe5",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 229,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xe6",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 230,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xe7",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 231,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xe8",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 232,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xe9",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 233,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xea",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 234,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xeb",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 235,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xec",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 236,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xed",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 237,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xee",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 238,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xef",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 239,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xf0",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 240,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xf1",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 241,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xf2",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 242,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xf3",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 243,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xf4",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 244,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xf5",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 245,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xf6",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 246,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xf7",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 247,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xf8",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 248,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xf9",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 249,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xfa",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 250,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xfb",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 251,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xfc",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 252,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xfd",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": 253,
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ },
+ {
+ "wildcards": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "write_setfields": [],
+ "write_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "name": "Flow Table 0xfe",
+ "matched_count": 0,
+ "apply_actions": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ],
+ "active_count": 0,
+ "max_entries": 16777216,
+ "lookup_count": 0,
+ "metadata_match": 18446744073709551615,
+ "table_id": "MAX",
+ "instructions": [
+ "GOTO_TABLE",
+ "WRITE_METADATA",
+ "WRITE_ACTIONS",
+ "APPLY_ACTIONS",
+ "CLEAR_ACTIONS"
+ ],
+ "config": [],
+ "metadata_write": 18446744073709551615,
+ "match": [
+ "IN_PORT",
+ "METADATA",
+ "ETH_DST",
+ "ETH_SRC",
+ "ETH_TYPE",
+ "VLAN_VID",
+ "VLAN_PCP",
+ "IP_DSCP",
+ "IP_ECN",
+ "IP_PROTO",
+ "IPV4_SRC",
+ "IPV4_DST",
+ "TCP_SRC",
+ "TCP_DST",
+ "UDP_SRC",
+ "UDP_DST",
+ "SCTP_SRC",
+ "SCTP_DST",
+ "ICMPV4_TYPE",
+ "ICMPV4_CODE",
+ "ARP_OP",
+ "ARP_SPA",
+ "ARP_TPA",
+ "ARP_SHA",
+ "ARP_THA",
+ "IPV6_SRC",
+ "IPV6_DST",
+ "IPV6_FLABEL",
+ "ICMPV6_TYPE",
+ "ICMPV6_CODE",
+ "IPV6_ND_TARGET",
+ "IPV6_ND_SLL",
+ "IPV6_ND_TLL",
+ "MPLS_LABEL",
+ "MPLS_TC"
+ ],
+ "apply_setfields": []
+ }
+ ]
+} \ No newline at end of file
diff --git a/tests/unit/lib/ofctl_json/of12/3-30-ofp_port_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of12/3-30-ofp_port_stats_reply.packet.json
new file mode 100644
index 00000000..43414b65
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-30-ofp_port_stats_reply.packet.json
@@ -0,0 +1,34 @@
+{
+ "1": [
+ {
+ "collisions": 0,
+ "port_no": 7,
+ "rx_bytes": 0,
+ "rx_crc_err": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "rx_packets": 0,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ },
+ {
+ "collisions": 0,
+ "port_no": 6,
+ "rx_bytes": 336,
+ "rx_crc_err": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "rx_packets": 4,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-32-ofp_group_features_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of12/3-32-ofp_group_features_stats_reply.packet.json
new file mode 100644
index 00000000..b277969e
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-32-ofp_group_features_stats_reply.packet.json
@@ -0,0 +1,104 @@
+{
+ "1": [
+ {
+ "actions": [
+ {
+ "ALL": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "SELECT": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "INDIRECT": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "FF": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ }
+ ],
+ "max_groups": [
+ {
+ "ALL": 16777216
+ },
+ {
+ "SELECT": 16777216
+ },
+ {
+ "INDIRECT": 16777216
+ },
+ {
+ "FF": 16777216
+ }
+ ],
+ "capabilities": [
+ "SELECT_WEIGHT",
+ "CHAINING"
+ ],
+ "types": [
+ "ALL",
+ "SELECT",
+ "INDIRECT",
+ "FF"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tests/unit/lib/ofctl_json/of12/3-34-ofp_group_desc_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of12/3-34-ofp_group_desc_stats_reply.packet.json
new file mode 100644
index 00000000..c23a9bbe
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-34-ofp_group_desc_stats_reply.packet.json
@@ -0,0 +1,20 @@
+{
+ "1": [
+ {
+ "buckets": [
+ {
+ "actions": [
+ "OUTPUT:2"
+ ],
+ "len": 32,
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ ],
+ "group_id": 1,
+ "length": 40,
+ "type": "ALL"
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-35-ofp_queue_get_config_request.packet.json b/tests/unit/lib/ofctl_json/of12/3-35-ofp_queue_get_config_request.packet.json
new file mode 100644
index 00000000..fc49ec2c
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-35-ofp_queue_get_config_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "port": 4294967295
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-36-ofp_queue_get_config_reply.packet.json b/tests/unit/lib/ofctl_json/of12/3-36-ofp_queue_get_config_reply.packet.json
new file mode 100644
index 00000000..8e922a9a
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-36-ofp_queue_get_config_reply.packet.json
@@ -0,0 +1,43 @@
+{
+ "1": [
+ {
+ "port": "ANY",
+ "queues": [
+ {
+ "len": 48,
+ "port": 77,
+ "properties": [
+ {
+ "len": 16,
+ "property": "MIN_RATE",
+ "rate": 10
+ },
+ {
+ "len": 16,
+ "property": "MAX_RATE",
+ "rate": 900
+ }
+ ],
+ "queue_id": 99
+ },
+ {
+ "len": 48,
+ "port": 77,
+ "properties": [
+ {
+ "len": 16,
+ "property": "MIN_RATE",
+ "rate": 100
+ },
+ {
+ "len": 16,
+ "property": "MAX_RATE",
+ "rate": 200
+ }
+ ],
+ "queue_id": 88
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-38-ofp_queue_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of12/3-38-ofp_queue_stats_reply.packet.json
new file mode 100644
index 00000000..db50c1e5
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-38-ofp_queue_stats_reply.packet.json
@@ -0,0 +1,25 @@
+{
+ "1": [
+ {
+ "port_no": 7,
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ },
+ {
+ "port_no": 6,
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ },
+ {
+ "port_no": 7,
+ "queue_id": 2,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-6-ofp_features_reply.packet.json b/tests/unit/lib/ofctl_json/of12/3-6-ofp_features_reply.packet.json
new file mode 100644
index 00000000..be040f79
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-6-ofp_features_reply.packet.json
@@ -0,0 +1,30 @@
+{
+ "1": [
+ {
+ "advertised": 10240,
+ "config": 0,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "hw_addr": "f2:0b:a4:7d:f8:ea",
+ "max_speed": 5000,
+ "name": "Port6",
+ "peer": 10248,
+ "port_no": 6,
+ "state": 4,
+ "supported": 10248
+ },
+ {
+ "advertised": 10240,
+ "config": 0,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "max_speed": 5000,
+ "name": "Port7",
+ "peer": 10248,
+ "port_no": 7,
+ "state": 4,
+ "supported": 10248
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of12/3-62-ofp_group_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of12/3-62-ofp_group_stats_reply.packet.json
new file mode 100644
index 00000000..f2f1a6ce
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/3-62-ofp_group_stats_reply.packet.json
@@ -0,0 +1,17 @@
+{
+ "1": [
+ {
+ "bucket_stats": [
+ {
+ "byte_count": 2345,
+ "packet_count": 234
+ }
+ ],
+ "byte_count": 12345,
+ "group_id": 1,
+ "length": 48,
+ "packet_count": 123,
+ "ref_count": 2
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_group_stats_request.packet.json b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_group_stats_request.packet.json
new file mode 100644
index 00000000..7646a77a
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_group_stats_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "group_id": 1
+}
diff --git a/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_port_stats_request.packet.json b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_port_stats_request.packet.json
new file mode 100644
index 00000000..7d56f29d
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_port_stats_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "port": 7
+}
diff --git a/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_get_config_request.packet.json b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_get_config_request.packet.json
new file mode 100644
index 00000000..e116fdc1
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_get_config_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "port": null
+}
diff --git a/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet1.json b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet1.json
new file mode 100644
index 00000000..7d56f29d
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet1.json
@@ -0,0 +1,3 @@
+{
+ "port": 7
+}
diff --git a/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet2.json b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet2.json
new file mode 100644
index 00000000..78077510
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet2.json
@@ -0,0 +1,4 @@
+{
+ "port": 7,
+ "queue_id":1
+}
diff --git a/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet3.json b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet3.json
new file mode 100644
index 00000000..ee465693
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of12/lib-ofctl-ofp_queue_stats_request.packet3.json
@@ -0,0 +1,3 @@
+{
+ "queue_id":1
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-0-ofp_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-0-ofp_desc_reply.packet.json
new file mode 100644
index 00000000..8fc54b74
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-0-ofp_desc_reply.packet.json
@@ -0,0 +1,9 @@
+{
+ "1": {
+ "dp_desc": "dp",
+ "hw_desc": "hw",
+ "mfr_desc": "mfr",
+ "serial_num": "serial",
+ "sw_desc": "sw"
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-11-ofp_flow_stats_request.packet.json b/tests/unit/lib/ofctl_json/of13/4-11-ofp_flow_stats_request.packet.json
new file mode 100644
index 00000000..a42dfef0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-11-ofp_flow_stats_request.packet.json
@@ -0,0 +1,11 @@
+{
+ "flow": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {},
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-12-ofp_flow_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-12-ofp_flow_stats_reply.packet.json
new file mode 100644
index 00000000..f9b8e68f
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-12-ofp_flow_stats_reply.packet.json
@@ -0,0 +1,104 @@
+{
+ "1": [
+ {
+ "actions": [],
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115277000,
+ "duration_sec": 358,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "length": 0,
+ "match": {},
+ "packet_count": 0,
+ "priority": 65535,
+ "table_id": 0
+ },
+ {
+ "actions": [
+ "OUTPUT:NORMAL"
+ ],
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115055000,
+ "duration_sec": 358,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "length": 0,
+ "match": {
+ "dl_type": 2054
+ },
+ "packet_count": 0,
+ "priority": 65534,
+ "table_id": 0
+ },
+ {
+ "actions": [
+ "GOTO_TABLE:1"
+ ],
+ "byte_count": 238,
+ "cookie": 0,
+ "duration_nsec": 511582000,
+ "duration_sec": 316220,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "length": 0,
+ "match": {
+ "dl_src": "f2:0b:a4:7d:f8:ea",
+ "in_port": 6
+ },
+ "packet_count": 3,
+ "priority": 123,
+ "table_id": 0
+ },
+ {
+ "actions": [
+ {
+ "WRITE_ACTIONS": [
+ "SET_FIELD: {vlan_vid:258}",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "COPY_TTL_IN",
+ "POP_PBB",
+ "PUSH_PBB:4660",
+ "POP_MPLS:39030",
+ "PUSH_MPLS:34887",
+ "POP_VLAN",
+ "PUSH_VLAN:33024",
+ "DEC_MPLS_TTL",
+ "SET_MPLS_TTL:10",
+ "DEC_NW_TTL",
+ "SET_NW_TTL:10",
+ "SET_QUEUE:3",
+ "GROUP:99",
+ "OUTPUT:6",
+ "EXPERIMENTER: {experimenter:98765432, data:ZXhwX2RhdGE=}",
+ "NX_UNKNOWN: {subtype: 25976, data: cF9kYXRh}"
+ ]
+ },
+ "SET_FIELD: {eth_src:01:02:03:04:05:06}",
+ "SET_FIELD: {pbb_uca:1}",
+ {
+ "WRITE_ACTIONS": [
+ "OUTPUT:CONTROLLER"
+ ]
+ }
+ ],
+ "byte_count": 98,
+ "cookie": 0,
+ "duration_nsec": 980901000,
+ "duration_sec": 313499,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "length": 0,
+ "match": {},
+ "packet_count": 1,
+ "priority": 0,
+ "table_id": 0
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-16-ofp_experimenter.packet.json b/tests/unit/lib/ofctl_json/of13/4-16-ofp_experimenter.packet.json
new file mode 100644
index 00000000..c655f8f0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-16-ofp_experimenter.packet.json
@@ -0,0 +1,8 @@
+{
+ "exp": {
+ "data": "bmF6bw==",
+ "data_type": "base64",
+ "exp_type": 123456789,
+ "experimenter": 98765432
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-2-ofp_flow_mod.packet.json b/tests/unit/lib/ofctl_json/of13/4-2-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..fbd5c214
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-2-ofp_flow_mod.packet.json
@@ -0,0 +1,97 @@
+{
+ "cmd": 0,
+ "flow": {
+ "buffer_id": 65535,
+ "table_id": 1,
+ "priority": 123,
+ "match": {
+ "eth_dst": "f2:0b:a4:7d:f8:ea"
+ },
+ "actions": [
+ {
+ "type": "WRITE_ACTIONS",
+ "actions": [
+ {
+ "type": "SET_FIELD",
+ "field": "vlan_vid",
+ "value": 258
+ },
+ {
+ "type": "COPY_TTL_OUT"
+ },
+ {
+ "type": "COPY_TTL_IN"
+ },
+ {
+ "type": "COPY_TTL_IN"
+ },
+ {
+ "type": "POP_PBB"
+ },
+ {
+ "type": "PUSH_PBB",
+ "ethertype": 4660
+ },
+ {
+ "type": "POP_MPLS",
+ "ethertype": 39030
+ },
+ {
+ "type": "PUSH_MPLS",
+ "ethertype": 34887
+ },
+ {
+ "type": "POP_VLAN"
+ },
+ {
+ "type": "PUSH_VLAN",
+ "ethertype": 33024
+ },
+ {
+ "type": "DEC_MPLS_TTL"
+ },
+ {
+ "type": "SET_MPLS_TTL",
+ "mpls_ttl": 10
+ },
+ {
+ "type": "DEC_NW_TTL"
+ },
+ {
+ "type": "SET_NW_TTL",
+ "nw_ttl": 10
+ },
+ {
+ "type": "EXPERIMENTER",
+ "experimenter": 101,
+ "data": "AAECAwQFBgc=",
+ "data_type": "base64"
+ },
+ {
+ "type": "SET_QUEUE",
+ "queue_id": 3
+ },
+ {
+ "type": "GROUP",
+ "group_id": 99
+ },
+ {
+ "type": "OUTPUT",
+ "max_len": 65535,
+ "port": 6
+ }
+ ]
+ },
+ {
+ "type": "SET_FIELD",
+ "field": "eth_src",
+ "value": "01:02:03:04:05:06"
+ },
+ {
+ "type": "SET_FIELD",
+ "field": "pbb_uca",
+ "value": 1
+ }
+ ]
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-21-ofp_group_mod.packet.json b/tests/unit/lib/ofctl_json/of13/4-21-ofp_group_mod.packet.json
new file mode 100644
index 00000000..fa48425a
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-21-ofp_group_mod.packet.json
@@ -0,0 +1,21 @@
+{
+ "cmd": 0,
+ "group": {
+ "buckets": [
+ {
+ "actions": [
+ {
+ "max_len": 65535,
+ "port": 2,
+ "type": "OUTPUT"
+ }
+ ],
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ ],
+ "group_id": 1,
+ "type": "ALL"
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-22-ofp_port_mod.packet.json b/tests/unit/lib/ofctl_json/of13/4-22-ofp_port_mod.packet.json
new file mode 100644
index 00000000..73339730
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-22-ofp_port_mod.packet.json
@@ -0,0 +1,9 @@
+{
+ "port_config": {
+ "advertise": 4096,
+ "config": 0,
+ "hw_addr": "00:11:00:00:11:11",
+ "mask": 0,
+ "port_no": 1
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-25-ofp_aggregate_stats_request.packet.json b/tests/unit/lib/ofctl_json/of13/4-25-ofp_aggregate_stats_request.packet.json
new file mode 100644
index 00000000..845af65b
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-25-ofp_aggregate_stats_request.packet.json
@@ -0,0 +1,11 @@
+{
+ "flow": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {},
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 255
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-26-ofp_aggregate_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-26-ofp_aggregate_stats_reply.packet.json
new file mode 100644
index 00000000..a4b23d12
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-26-ofp_aggregate_stats_reply.packet.json
@@ -0,0 +1,9 @@
+{
+ "1": [
+ {
+ "byte_count": 574,
+ "flow_count": 6,
+ "packet_count": 7
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-28-ofp_table_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-28-ofp_table_stats_reply.packet.json
new file mode 100644
index 00000000..95b2c495
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-28-ofp_table_stats_reply.packet.json
@@ -0,0 +1,16 @@
+{
+ "1": [
+ {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 0
+ },
+ {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 1
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-30-ofp_port_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-30-ofp_port_stats_reply.packet.json
new file mode 100644
index 00000000..a81e6825
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-30-ofp_port_stats_reply.packet.json
@@ -0,0 +1,38 @@
+{
+ "1": [
+ {
+ "collisions": 0,
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 7,
+ "rx_bytes": 0,
+ "rx_crc_err": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "rx_packets": 0,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ },
+ {
+ "collisions": 0,
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 6,
+ "rx_bytes": 336,
+ "rx_crc_err": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "rx_packets": 4,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-32-ofp_group_features_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-32-ofp_group_features_reply.packet.json
new file mode 100644
index 00000000..2a29ac2d
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-32-ofp_group_features_reply.packet.json
@@ -0,0 +1,104 @@
+{
+ "1": [
+ {
+ "actions": [
+ {
+ "ALL": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "SELECT": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "INDIRECT": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "FF": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ }
+ ],
+ "capabilities": [
+ "SELECT_WEIGHT",
+ "CHAINING"
+ ],
+ "max_groups": [
+ {
+ "ALL": 16777216
+ },
+ {
+ "SELECT": 16777216
+ },
+ {
+ "INDIRECT": 16777216
+ },
+ {
+ "FF": 16777216
+ }
+ ],
+ "types": [
+ "ALL",
+ "SELECT",
+ "INDIRECT",
+ "FF"
+ ]
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-34-ofp_group_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-34-ofp_group_desc_reply.packet.json
new file mode 100644
index 00000000..c23a9bbe
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-34-ofp_group_desc_reply.packet.json
@@ -0,0 +1,20 @@
+{
+ "1": [
+ {
+ "buckets": [
+ {
+ "actions": [
+ "OUTPUT:2"
+ ],
+ "len": 32,
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ ],
+ "group_id": 1,
+ "length": 40,
+ "type": "ALL"
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-35-ofp_queue_get_config_request.packet.json b/tests/unit/lib/ofctl_json/of13/4-35-ofp_queue_get_config_request.packet.json
new file mode 100644
index 00000000..fc49ec2c
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-35-ofp_queue_get_config_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "port": 4294967295
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-36-ofp_queue_get_config_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-36-ofp_queue_get_config_reply.packet.json
new file mode 100644
index 00000000..9d529400
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-36-ofp_queue_get_config_reply.packet.json
@@ -0,0 +1,83 @@
+{
+ "1": [
+ {
+ "port": "ANY",
+ "queues": [
+ {
+ "len": 64,
+ "port": 77,
+ "properties": [
+ {
+ "len": 16,
+ "property": "MIN_RATE",
+ "rate": 10
+ },
+ {
+ "len": 16,
+ "property": "MAX_RATE",
+ "rate": 900
+ },
+ {
+ "data": [],
+ "experimenter": 999,
+ "len": 16,
+ "property": "EXPERIMENTER"
+ }
+ ],
+ "queue_id": 99
+ },
+ {
+ "len": 65,
+ "port": 77,
+ "properties": [
+ {
+ "len": 16,
+ "property": "MIN_RATE",
+ "rate": 100
+ },
+ {
+ "len": 16,
+ "property": "MAX_RATE",
+ "rate": 200
+ },
+ {
+ "experimenter": 999,
+ "data": [
+ 1
+ ],
+ "len": 17,
+ "property": "EXPERIMENTER"
+ }
+ ],
+ "queue_id": 88
+ },
+ {
+ "len": 66,
+ "port": 77,
+ "properties": [
+ {
+ "len": 16,
+ "property": "MIN_RATE",
+ "rate": 200
+ },
+ {
+ "len": 16,
+ "property": "MAX_RATE",
+ "rate": 400
+ },
+ {
+ "experimenter": 999,
+ "data": [
+ 1,
+ 2
+ ],
+ "len": 18,
+ "property": "EXPERIMENTER"
+ }
+ ],
+ "queue_id": 77
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-38-ofp_queue_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-38-ofp_queue_stats_reply.packet.json
new file mode 100644
index 00000000..b19fe300
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-38-ofp_queue_stats_reply.packet.json
@@ -0,0 +1,31 @@
+{
+ "1": [
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 7,
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ },
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 6,
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ },
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 7,
+ "queue_id": 2,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-45-ofp_meter_mod.packet.json b/tests/unit/lib/ofctl_json/of13/4-45-ofp_meter_mod.packet.json
new file mode 100644
index 00000000..b78ea6be
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-45-ofp_meter_mod.packet.json
@@ -0,0 +1,31 @@
+{
+ "cmd": 0,
+ "meter": {
+ "flags": [
+ "PKTPS",
+ "BURST",
+ "STATS"
+ ],
+ "meter_id": 100,
+ "bands": [
+ {
+ "burst_size": 10,
+ "rate": 1000,
+ "type": "DROP"
+ },
+ {
+ "burst_size": 10,
+ "prec_level": 1,
+ "rate": 1000,
+ "type": "DSCP_REMARK"
+ },
+ {
+ "burst_size": 10,
+ "experimenter": 999,
+ "len": 16,
+ "rate": 1000,
+ "type": "EXPERIMENTER"
+ }
+ ]
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-48-ofp_meter_config_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-48-ofp_meter_config_reply.packet.json
new file mode 100644
index 00000000..d5efcd97
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-48-ofp_meter_config_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "bands": [
+ {
+ "burst_size": 10,
+ "rate": 1000,
+ "type": "DROP"
+ }
+ ],
+ "flags": [
+ "PKTPS",
+ "BURST",
+ "STATS"
+ ],
+ "meter_id": 100
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-50-ofp_meter_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-50-ofp_meter_stats_reply.packet.json
new file mode 100644
index 00000000..f21ec519
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-50-ofp_meter_stats_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "band_stats": [
+ {
+ "byte_band_count": 0,
+ "packet_band_count": 0
+ }
+ ],
+ "byte_in_count": 0,
+ "duration_nsec": 480000,
+ "duration_sec": 0,
+ "flow_count": 0,
+ "len": 56,
+ "meter_id": 100,
+ "packet_in_count": 0
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-52-ofp_meter_features_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-52-ofp_meter_features_reply.packet.json
new file mode 100644
index 00000000..24dac7d4
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-52-ofp_meter_features_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "band_types": [
+ "DROP",
+ "DSCP_REMARK"
+ ],
+ "capabilities": [
+ "KBPS",
+ "PKTPS",
+ "BURST",
+ "STATS"
+ ],
+ "max_bands": 255,
+ "max_color": 0,
+ "max_meter": 16777216
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-54-ofp_port_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-54-ofp_port_desc_reply.packet.json
new file mode 100644
index 00000000..72ff2ec3
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-54-ofp_port_desc_reply.packet.json
@@ -0,0 +1,30 @@
+{
+ "1": [
+ {
+ "advertised": 10240,
+ "config": 0,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "max_speed": 5000,
+ "name": "Port7",
+ "peer": 10248,
+ "port_no": 7,
+ "state": 4,
+ "supported": 10248
+ },
+ {
+ "advertised": 10240,
+ "config": 0,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "hw_addr": "f2:0b:a4:7d:f8:ea",
+ "max_speed": 5000,
+ "name": "Port6",
+ "peer": 10248,
+ "port_no": 6,
+ "state": 4,
+ "supported": 10248
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-56-ofp_table_features_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-56-ofp_table_features_reply.packet.json
new file mode 100644
index 00000000..ded5a996
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-56-ofp_table_features_reply.packet.json
@@ -0,0 +1,11928 @@
+{
+ "1": [
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "\u79c1\u306e\u30c6\u30fc\u30d6\u30eb",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ },
+ {
+ "type": "EXPERIMENTER"
+ },
+ {
+ "type": "EXPERIMENTER"
+ },
+ {
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "table_id": 0
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x01",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 1
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x02",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 2
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x03",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 3
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x04",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 4
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x05",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 5
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x06",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 6
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x07",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 7
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x08",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 8
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x09",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 9
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/4-58-ofp_group_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of13/4-58-ofp_group_stats_reply.packet.json
new file mode 100644
index 00000000..1c6f9039
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/4-58-ofp_group_stats_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "bucket_stats": [
+ {
+ "byte_count": 2345,
+ "packet_count": 234
+ }
+ ],
+ "byte_count": 12345,
+ "duration_nsec": 609036000,
+ "duration_sec": 9,
+ "group_id": 1,
+ "length": 56,
+ "packet_count": 123,
+ "ref_count": 2
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_group_stats_request.packet.json b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_group_stats_request.packet.json
new file mode 100644
index 00000000..7646a77a
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_group_stats_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "group_id": 1
+}
diff --git a/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_meter_config_request.packet.json b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_meter_config_request.packet.json
new file mode 100644
index 00000000..3ad622e0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_meter_config_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "meter_id": 1
+}
diff --git a/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_meter_stats_request.packet.json b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_meter_stats_request.packet.json
new file mode 100644
index 00000000..3ad622e0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_meter_stats_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "meter_id": 1
+}
diff --git a/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_port_stats_request.packet.json b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_port_stats_request.packet.json
new file mode 100644
index 00000000..7d56f29d
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_port_stats_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "port": 7
+}
diff --git a/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_get_config_request.packet.json b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_get_config_request.packet.json
new file mode 100644
index 00000000..e116fdc1
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_get_config_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "port": null
+}
diff --git a/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet1.json b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet1.json
new file mode 100644
index 00000000..7d56f29d
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet1.json
@@ -0,0 +1,3 @@
+{
+ "port": 7
+}
diff --git a/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet2.json b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet2.json
new file mode 100644
index 00000000..78077510
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet2.json
@@ -0,0 +1,4 @@
+{
+ "port": 7,
+ "queue_id":1
+}
diff --git a/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet3.json b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet3.json
new file mode 100644
index 00000000..ee465693
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of13/lib-ofctl-ofp_queue_stats_request.packet3.json
@@ -0,0 +1,3 @@
+{
+ "queue_id":1
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-0-ofp_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-0-ofp_desc_reply.packet.json
new file mode 100644
index 00000000..8fc54b74
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-0-ofp_desc_reply.packet.json
@@ -0,0 +1,9 @@
+{
+ "1": {
+ "dp_desc": "dp",
+ "hw_desc": "hw",
+ "mfr_desc": "mfr",
+ "serial_num": "serial",
+ "sw_desc": "sw"
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-11-ofp_flow_stats_request.packet.json b/tests/unit/lib/ofctl_json/of14/5-11-ofp_flow_stats_request.packet.json
new file mode 100644
index 00000000..a42dfef0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-11-ofp_flow_stats_request.packet.json
@@ -0,0 +1,11 @@
+{
+ "flow": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {},
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-12-ofp_flow_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-12-ofp_flow_stats_reply.packet.json
new file mode 100644
index 00000000..134c3f12
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-12-ofp_flow_stats_reply.packet.json
@@ -0,0 +1,197 @@
+{
+ "1": [
+ {
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115277000,
+ "duration_sec": 358,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [],
+ "length": 0,
+ "match": {},
+ "packet_count": 0,
+ "priority": 65535,
+ "table_id": 0
+ },
+ {
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115055000,
+ "duration_sec": 358,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [
+ {
+ "actions": [
+ {
+ "max_len": 0,
+ "port": 4294967290,
+ "type": "OUTPUT"
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ }
+ ],
+ "length": 0,
+ "match": {
+ "eth_type": 2054
+ },
+ "packet_count": 0,
+ "priority": 65534,
+ "table_id": 0
+ },
+ {
+ "byte_count": 238,
+ "cookie": 0,
+ "duration_nsec": 511582000,
+ "duration_sec": 316220,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [
+ {
+ "table_id": 1,
+ "type": "GOTO_TABLE"
+ }
+ ],
+ "length": 0,
+ "match": {
+ "eth_src": "f2:0b:a4:7d:f8:ea",
+ "in_port": 6
+ },
+ "packet_count": 3,
+ "priority": 123,
+ "table_id": 0
+ },
+ {
+ "byte_count": 98,
+ "cookie": 0,
+ "duration_nsec": 980901000,
+ "duration_sec": 313499,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [
+ {
+ "actions": [
+ {
+ "field": "vlan_vid",
+ "mask": null,
+ "type": "SET_FIELD",
+ "value": 258
+ },
+ {
+ "type": "COPY_TTL_OUT"
+ },
+ {
+ "type": "COPY_TTL_IN"
+ },
+ {
+ "type": "COPY_TTL_IN"
+ },
+ {
+ "type": "POP_PBB"
+ },
+ {
+ "ethertype": 4660,
+ "type": "PUSH_PBB"
+ },
+ {
+ "ethertype": 39030,
+ "type": "POP_MPLS"
+ },
+ {
+ "ethertype": 34887,
+ "type": "PUSH_MPLS"
+ },
+ {
+ "type": "POP_VLAN"
+ },
+ {
+ "ethertype": 33024,
+ "type": "PUSH_VLAN"
+ },
+ {
+ "type": "DEC_MPLS_TTL"
+ },
+ {
+ "mpls_ttl": 10,
+ "type": "SET_MPLS_TTL"
+ },
+ {
+ "type": "DEC_NW_TTL"
+ },
+ {
+ "nw_ttl": 10,
+ "type": "SET_NW_TTL"
+ },
+ {
+ "queue_id": 3,
+ "type": "SET_QUEUE"
+ },
+ {
+ "group_id": 99,
+ "type": "GROUP"
+ },
+ {
+ "max_len": 65535,
+ "port": 6,
+ "type": "OUTPUT"
+ },
+ {
+ "data": "ZXhwX2RhdGE=",
+ "experimenter": 98765432,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": "cF9kYXRh",
+ "experimenter": 8992,
+ "subtype": 25976,
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "actions": [
+ {
+ "field": "eth_src",
+ "mask": null,
+ "type": "SET_FIELD",
+ "value": "01:02:03:04:05:06"
+ },
+ {
+ "field": "pbb_uca",
+ "mask": null,
+ "type": "SET_FIELD",
+ "value": 1
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "actions": [
+ {
+ "max_len": 65535,
+ "port": 4294967293,
+ "type": "OUTPUT"
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ }
+ ],
+ "length": 0,
+ "match": {},
+ "packet_count": 1,
+ "priority": 0,
+ "table_id": 0
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-16-ofp_experimenter.packet.json b/tests/unit/lib/ofctl_json/of14/5-16-ofp_experimenter.packet.json
new file mode 100644
index 00000000..c655f8f0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-16-ofp_experimenter.packet.json
@@ -0,0 +1,8 @@
+{
+ "exp": {
+ "data": "bmF6bw==",
+ "data_type": "base64",
+ "exp_type": 123456789,
+ "experimenter": 98765432
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-2-ofp_flow_mod.packet.json b/tests/unit/lib/ofctl_json/of14/5-2-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..72054e33
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-2-ofp_flow_mod.packet.json
@@ -0,0 +1,103 @@
+{
+ "cmd": 0,
+ "flow": {
+ "instructions": [
+ {
+ "actions": [
+ {
+ "field": "vlan_vid",
+ "type": "SET_FIELD",
+ "value": 258
+ },
+ {
+ "type": "COPY_TTL_OUT"
+ },
+ {
+ "type": "COPY_TTL_IN"
+ },
+ {
+ "type": "COPY_TTL_IN"
+ },
+ {
+ "type": "POP_PBB"
+ },
+ {
+ "ethertype": 4660,
+ "type": "PUSH_PBB"
+ },
+ {
+ "ethertype": 39030,
+ "type": "POP_MPLS"
+ },
+ {
+ "ethertype": 34887,
+ "type": "PUSH_MPLS"
+ },
+ {
+ "type": "POP_VLAN"
+ },
+ {
+ "ethertype": 33024,
+ "type": "PUSH_VLAN"
+ },
+ {
+ "type": "DEC_MPLS_TTL"
+ },
+ {
+ "mpls_ttl": 10,
+ "type": "SET_MPLS_TTL"
+ },
+ {
+ "type": "DEC_NW_TTL"
+ },
+ {
+ "nw_ttl": 10,
+ "type": "SET_NW_TTL"
+ },
+ {
+ "data": "AAECAwQFBgc=",
+ "data_type": "base64",
+ "experimenter": 101,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "queue_id": 3,
+ "type": "SET_QUEUE"
+ },
+ {
+ "group_id": 99,
+ "type": "GROUP"
+ },
+ {
+ "max_len": 65535,
+ "port": 6,
+ "type": "OUTPUT"
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "actions": [
+ {
+ "field": "eth_src",
+ "type": "SET_FIELD",
+ "value": "01:02:03:04:05:06"
+ },
+ {
+ "field": "pbb_uca",
+ "type": "SET_FIELD",
+ "value": 1
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ }
+ ],
+ "buffer_id": 65535,
+ "importance": 0,
+ "match": {
+ "eth_dst": "f2:0b:a4:7d:f8:ea"
+ },
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-21-ofp_group_mod.packet.json b/tests/unit/lib/ofctl_json/of14/5-21-ofp_group_mod.packet.json
new file mode 100644
index 00000000..fa48425a
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-21-ofp_group_mod.packet.json
@@ -0,0 +1,21 @@
+{
+ "cmd": 0,
+ "group": {
+ "buckets": [
+ {
+ "actions": [
+ {
+ "max_len": 65535,
+ "port": 2,
+ "type": "OUTPUT"
+ }
+ ],
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ ],
+ "group_id": 1,
+ "type": "ALL"
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-22-ofp_port_mod.packet.json b/tests/unit/lib/ofctl_json/of14/5-22-ofp_port_mod.packet.json
new file mode 100644
index 00000000..980456eb
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-22-ofp_port_mod.packet.json
@@ -0,0 +1,50 @@
+{
+ "port_config": {
+ "config": 0,
+ "hw_addr": "00:11:00:00:11:11",
+ "mask": 0,
+ "port_no": 1,
+ "properties": [
+ {
+ "advertise": 4096,
+ "length": 8,
+ "type": 0
+ },
+ {
+ "configure": 3,
+ "fl_offset": 2000,
+ "freq_lmda": 1500,
+ "grid_span": 3000,
+ "length": 24,
+ "tx_pwr": 300,
+ "type": 1
+ },
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ },
+ {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ },
+ {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ ]
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-25-ofp_aggregate_stats_request.packet.json b/tests/unit/lib/ofctl_json/of14/5-25-ofp_aggregate_stats_request.packet.json
new file mode 100644
index 00000000..845af65b
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-25-ofp_aggregate_stats_request.packet.json
@@ -0,0 +1,11 @@
+{
+ "flow": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {},
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 255
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-26-ofp_aggregate_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-26-ofp_aggregate_stats_reply.packet.json
new file mode 100644
index 00000000..a4b23d12
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-26-ofp_aggregate_stats_reply.packet.json
@@ -0,0 +1,9 @@
+{
+ "1": [
+ {
+ "byte_count": 574,
+ "flow_count": 6,
+ "packet_count": 7
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-28-ofp_table_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-28-ofp_table_stats_reply.packet.json
new file mode 100644
index 00000000..95b2c495
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-28-ofp_table_stats_reply.packet.json
@@ -0,0 +1,16 @@
+{
+ "1": [
+ {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 0
+ },
+ {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 1
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-30-ofp_port_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-30-ofp_port_stats_reply.packet.json
new file mode 100644
index 00000000..f9f1d86f
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-30-ofp_port_stats_reply.packet.json
@@ -0,0 +1,85 @@
+{
+ "1": [
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 7,
+ "properties": [
+ {
+ "collisions": 0,
+ "rx_crc_err": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "type": "ETHERNET"
+ },
+ {
+ "bias_current": 300,
+ "flags": 3,
+ "rx_freq_lmda": 1500,
+ "rx_grid_span": 500,
+ "rx_offset": 700,
+ "rx_pwr": 2000,
+ "temperature": 273,
+ "tx_freq_lmda": 1500,
+ "tx_grid_span": 500,
+ "tx_offset": 700,
+ "tx_pwr": 2000,
+ "type": "OPTICAL"
+ },
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "rx_bytes": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_packets": 0,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ },
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 6,
+ "properties": [
+ {
+ "collisions": 0,
+ "rx_crc_err": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "type": "ETHERNET"
+ }
+ ],
+ "rx_bytes": 336,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_packets": 4,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-32-ofp_group_features_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-32-ofp_group_features_reply.packet.json
new file mode 100644
index 00000000..2a29ac2d
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-32-ofp_group_features_reply.packet.json
@@ -0,0 +1,104 @@
+{
+ "1": [
+ {
+ "actions": [
+ {
+ "ALL": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "SELECT": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "INDIRECT": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "FF": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ }
+ ],
+ "capabilities": [
+ "SELECT_WEIGHT",
+ "CHAINING"
+ ],
+ "max_groups": [
+ {
+ "ALL": 16777216
+ },
+ {
+ "SELECT": 16777216
+ },
+ {
+ "INDIRECT": 16777216
+ },
+ {
+ "FF": 16777216
+ }
+ ],
+ "types": [
+ "ALL",
+ "SELECT",
+ "INDIRECT",
+ "FF"
+ ]
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-34-ofp_group_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-34-ofp_group_desc_reply.packet.json
new file mode 100644
index 00000000..df0ef359
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-34-ofp_group_desc_reply.packet.json
@@ -0,0 +1,24 @@
+{
+ "1": [
+ {
+ "buckets": [
+ {
+ "actions": [
+ {
+ "max_len": 65535,
+ "port": 2,
+ "type": "OUTPUT"
+ }
+ ],
+ "len": 32,
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ ],
+ "group_id": 1,
+ "length": 40,
+ "type": "ALL"
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-36-ofp_queue_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-36-ofp_queue_stats_reply.packet.json
new file mode 100644
index 00000000..a6d246d0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-36-ofp_queue_stats_reply.packet.json
@@ -0,0 +1,64 @@
+{
+ "1": [
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 104,
+ "port_no": 7,
+ "properties": [
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ },
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 48,
+ "port_no": 6,
+ "properties": [],
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ },
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 48,
+ "port_no": 7,
+ "properties": [],
+ "queue_id": 2,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-43-ofp_meter_mod.packet.json b/tests/unit/lib/ofctl_json/of14/5-43-ofp_meter_mod.packet.json
new file mode 100644
index 00000000..b78ea6be
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-43-ofp_meter_mod.packet.json
@@ -0,0 +1,31 @@
+{
+ "cmd": 0,
+ "meter": {
+ "flags": [
+ "PKTPS",
+ "BURST",
+ "STATS"
+ ],
+ "meter_id": 100,
+ "bands": [
+ {
+ "burst_size": 10,
+ "rate": 1000,
+ "type": "DROP"
+ },
+ {
+ "burst_size": 10,
+ "prec_level": 1,
+ "rate": 1000,
+ "type": "DSCP_REMARK"
+ },
+ {
+ "burst_size": 10,
+ "experimenter": 999,
+ "len": 16,
+ "rate": 1000,
+ "type": "EXPERIMENTER"
+ }
+ ]
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-46-ofp_meter_config_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-46-ofp_meter_config_reply.packet.json
new file mode 100644
index 00000000..d5efcd97
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-46-ofp_meter_config_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "bands": [
+ {
+ "burst_size": 10,
+ "rate": 1000,
+ "type": "DROP"
+ }
+ ],
+ "flags": [
+ "PKTPS",
+ "BURST",
+ "STATS"
+ ],
+ "meter_id": 100
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-48-ofp_meter_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-48-ofp_meter_stats_reply.packet.json
new file mode 100644
index 00000000..f21ec519
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-48-ofp_meter_stats_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "band_stats": [
+ {
+ "byte_band_count": 0,
+ "packet_band_count": 0
+ }
+ ],
+ "byte_in_count": 0,
+ "duration_nsec": 480000,
+ "duration_sec": 0,
+ "flow_count": 0,
+ "len": 56,
+ "meter_id": 100,
+ "packet_in_count": 0
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-50-ofp_meter_features_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-50-ofp_meter_features_reply.packet.json
new file mode 100644
index 00000000..24dac7d4
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-50-ofp_meter_features_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "band_types": [
+ "DROP",
+ "DSCP_REMARK"
+ ],
+ "capabilities": [
+ "KBPS",
+ "PKTPS",
+ "BURST",
+ "STATS"
+ ],
+ "max_bands": 255,
+ "max_color": 0,
+ "max_meter": 16777216
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-52-ofp_port_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-52-ofp_port_desc_reply.packet.json
new file mode 100644
index 00000000..c2f748a8
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-52-ofp_port_desc_reply.packet.json
@@ -0,0 +1,83 @@
+{
+ "1": [
+ {
+ "config": 0,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "length": 168,
+ "name": "Port7",
+ "port_no": 7,
+ "properties": [
+ {
+ "advertised": 10240,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "length": 32,
+ "max_speed": 5000,
+ "peer": 10248,
+ "supported": 10248,
+ "type": "ETHERNET"
+ },
+ {
+ "length": 40,
+ "rx_grid_freq_lmda": 1500,
+ "rx_max_freq_lmda": 2000,
+ "rx_min_freq_lmda": 1000,
+ "supported": 1,
+ "tx_grid_freq_lmda": 1500,
+ "tx_max_freq_lmda": 2000,
+ "tx_min_freq_lmda": 1000,
+ "tx_pwr_max": 2000,
+ "tx_pwr_min": 1000,
+ "type": "OPTICAL"
+ },
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "state": 4
+ },
+ {
+ "config": 0,
+ "hw_addr": "f2:0b:a4:7d:f8:ea",
+ "length": 72,
+ "name": "Port6",
+ "port_no": 6,
+ "properties": [
+ {
+ "advertised": 10240,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "length": 32,
+ "max_speed": 5000,
+ "peer": 10248,
+ "supported": 10248,
+ "type": "ETHERNET"
+ }
+ ],
+ "state": 4
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-54-ofp_table_features_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-54-ofp_table_features_reply.packet.json
new file mode 100644
index 00000000..ded5a996
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-54-ofp_table_features_reply.packet.json
@@ -0,0 +1,11928 @@
+{
+ "1": [
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "\u79c1\u306e\u30c6\u30fc\u30d6\u30eb",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ },
+ {
+ "type": "EXPERIMENTER"
+ },
+ {
+ "type": "EXPERIMENTER"
+ },
+ {
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "table_id": 0
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x01",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 1
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x02",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 2
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x03",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 3
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x04",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 4
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x05",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 5
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x06",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 6
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x07",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 7
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x08",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 8
+ },
+ {
+ "config": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x09",
+ "properties": [
+ {
+ "instruction_ids": [
+ {
+ "len": 4,
+ "type": 1
+ },
+ {
+ "len": 4,
+ "type": 2
+ },
+ {
+ "len": 4,
+ "type": 3
+ },
+ {
+ "len": 4,
+ "type": 4
+ },
+ {
+ "len": 4,
+ "type": 5
+ },
+ {
+ "len": 4,
+ "type": 6
+ }
+ ],
+ "type": "INSTRUCTIONS"
+ },
+ {
+ "table_ids": [
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": "NEXT_TABLES"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "action_ids": [
+ {
+ "len": 4,
+ "type": 0
+ },
+ {
+ "len": 4,
+ "type": 22
+ },
+ {
+ "len": 4,
+ "type": 21
+ },
+ {
+ "len": 4,
+ "type": 15
+ },
+ {
+ "len": 4,
+ "type": 16
+ },
+ {
+ "len": 4,
+ "type": 23
+ },
+ {
+ "len": 4,
+ "type": 24
+ },
+ {
+ "len": 4,
+ "type": 11
+ },
+ {
+ "len": 4,
+ "type": 12
+ },
+ {
+ "len": 4,
+ "type": 17
+ },
+ {
+ "len": 4,
+ "type": 18
+ },
+ {
+ "len": 4,
+ "type": 19
+ },
+ {
+ "len": 4,
+ "type": 20
+ },
+ {
+ "len": 4,
+ "type": 26
+ },
+ {
+ "len": 4,
+ "type": 27
+ },
+ {
+ "len": 4,
+ "type": 25
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "MATCH"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WILDCARDS"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "WRITE_SETFIELD"
+ },
+ {
+ "oxm_ids": [
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ },
+ {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ ],
+ "type": "APPLY_SETFIELD"
+ }
+ ],
+ "table_id": 9
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-56-ofp_group_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-56-ofp_group_stats_reply.packet.json
new file mode 100644
index 00000000..1c6f9039
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-56-ofp_group_stats_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "bucket_stats": [
+ {
+ "byte_count": 2345,
+ "packet_count": 234
+ }
+ ],
+ "byte_count": 12345,
+ "duration_nsec": 609036000,
+ "duration_sec": 9,
+ "group_id": 1,
+ "length": 56,
+ "packet_count": 123,
+ "ref_count": 2
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-63-ofp_queue_desc_request.packet.json b/tests/unit/lib/ofctl_json/of14/5-63-ofp_queue_desc_request.packet.json
new file mode 100644
index 00000000..fc863813
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-63-ofp_queue_desc_request.packet.json
@@ -0,0 +1,4 @@
+{
+ "port_no": 7,
+ "queue_id": 4294967295
+}
diff --git a/tests/unit/lib/ofctl_json/of14/5-64-ofp_queue_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of14/5-64-ofp_queue_desc_reply.packet.json
new file mode 100644
index 00000000..ca6e87f2
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of14/5-64-ofp_queue_desc_reply.packet.json
@@ -0,0 +1,61 @@
+{
+ "1": [
+ {
+ "len": 32,
+ "port_no": 7,
+ "properties": [
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "queue_id": 0
+ },
+ {
+ "len": 88,
+ "port_no": 8,
+ "properties": [
+ {
+ "length": 8,
+ "rate": 300,
+ "type": "MIN_RATE"
+ },
+ {
+ "length": 8,
+ "rate": 900,
+ "type": "MAX_RATE"
+ },
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "queue_id": 1
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_desc_reply.packet.json
new file mode 100644
index 00000000..0b5e04be
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_desc_reply.packet.json
@@ -0,0 +1,48 @@
+{
+ "1": [
+ {
+ "cookie": 1234605616436508552,
+ "flags": 1,
+ "hard_timeout": 255,
+ "idle_timeout": 255,
+ "importance": 43690,
+ "instructions": [
+ {
+ "table_id": 2,
+ "type": "GOTO_TABLE"
+ },
+ {
+ "actions": [
+ {
+ "meter_id": 2,
+ "type": "METER"
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "actions": [
+ {
+ "type": "COPY_FIELD",
+ "n_bits": 32,
+ "src_offset": 1,
+ "dst_offset": 2,
+ "src_oxm_id": "eth_src",
+ "dst_oxm_id": "eth_dst"
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ }
+ ],
+ "length": 64,
+ "match": {
+ "in_port": 1
+ },
+ "priority": 5,
+ "stats": {
+ "flow_count": 1
+ },
+ "table_id": 1
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_desc_request.packet.json b/tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_desc_request.packet.json
new file mode 100644
index 00000000..f59aa0b2
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_desc_request.packet.json
@@ -0,0 +1,13 @@
+{
+ "flow": {
+ "cookie": 1234605616436508552,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "match": {
+ "in_port": 1
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_mod.packet.json b/tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_mod.packet.json
new file mode 100644
index 00000000..cc3ba488
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/lib-ofctl-OFP15-flow_mod.packet.json
@@ -0,0 +1,115 @@
+{
+ "cmd": 0,
+ "flow": {
+ "instructions": [
+ {
+ "actions": [
+ {
+ "field": "vlan_vid",
+ "type": "SET_FIELD",
+ "value": 258
+ },
+ {
+ "type": "COPY_TTL_OUT"
+ },
+ {
+ "type": "COPY_TTL_IN"
+ },
+ {
+ "type": "COPY_TTL_IN"
+ },
+ {
+ "type": "POP_PBB"
+ },
+ {
+ "ethertype": 4660,
+ "type": "PUSH_PBB"
+ },
+ {
+ "ethertype": 39030,
+ "type": "POP_MPLS"
+ },
+ {
+ "ethertype": 34887,
+ "type": "PUSH_MPLS"
+ },
+ {
+ "type": "POP_VLAN"
+ },
+ {
+ "ethertype": 33024,
+ "type": "PUSH_VLAN"
+ },
+ {
+ "type": "DEC_MPLS_TTL"
+ },
+ {
+ "mpls_ttl": 10,
+ "type": "SET_MPLS_TTL"
+ },
+ {
+ "type": "DEC_NW_TTL"
+ },
+ {
+ "nw_ttl": 10,
+ "type": "SET_NW_TTL"
+ },
+ {
+ "data": "AAECAwQFBgc=",
+ "data_type": "base64",
+ "experimenter": 101,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "queue_id": 3,
+ "type": "SET_QUEUE"
+ },
+ {
+ "meter_id": 2,
+ "type": "METER"
+ },
+ {
+ "group_id": 99,
+ "type": "GROUP"
+ },
+ {
+ "max_len": 65535,
+ "port": 6,
+ "type": "OUTPUT"
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "actions": [
+ {
+ "field": "eth_src",
+ "type": "SET_FIELD",
+ "value": "01:02:03:04:05:06"
+ },
+ {
+ "field": "pbb_uca",
+ "type": "SET_FIELD",
+ "value": 1
+ },
+ {
+ "type": "COPY_FIELD",
+ "n_bits": 32,
+ "src_offset": 1,
+ "dst_offset": 2,
+ "src_oxm_id": "eth_src",
+ "dst_oxm_id": "eth_dst"
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ }
+ ],
+ "buffer_id": 65535,
+ "importance": 0,
+ "match": {
+ "eth_dst": "f2:0b:a4:7d:f8:ea"
+ },
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-aggregate_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-aggregate_stats_reply.packet.json
new file mode 100644
index 00000000..ac4f93c4
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-aggregate_stats_reply.packet.json
@@ -0,0 +1,10 @@
+{
+ "1": [
+ {
+ "length": 16,
+ "stats": {
+ "flow_count": 1
+ }
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-aggregate_stats_request.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-aggregate_stats_request.packet.json
new file mode 100644
index 00000000..845af65b
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-aggregate_stats_request.packet.json
@@ -0,0 +1,11 @@
+{
+ "flow": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {},
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 255
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-desc_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-desc_reply.packet.json
new file mode 100644
index 00000000..8fc54b74
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-desc_reply.packet.json
@@ -0,0 +1,9 @@
+{
+ "1": {
+ "dp_desc": "dp",
+ "hw_desc": "hw",
+ "mfr_desc": "mfr",
+ "serial_num": "serial",
+ "sw_desc": "sw"
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-experimenter.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-experimenter.packet.json
new file mode 100644
index 00000000..c655f8f0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-experimenter.packet.json
@@ -0,0 +1,8 @@
+{
+ "exp": {
+ "data": "bmF6bw==",
+ "data_type": "base64",
+ "exp_type": 123456789,
+ "experimenter": 98765432
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_desc_reply.packet.json
new file mode 100644
index 00000000..4e12f857
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_desc_reply.packet.json
@@ -0,0 +1,26 @@
+{
+ "1": [
+ {
+ "cookie": 1234605616436508552,
+ "flags": 1,
+ "hard_timeout": 255,
+ "idle_timeout": 255,
+ "importance": 43690,
+ "instructions": [
+ {
+ "table_id": 2,
+ "type": "GOTO_TABLE"
+ }
+ ],
+ "length": 64,
+ "match": {
+ "in_port": 1
+ },
+ "priority": 5,
+ "stats": {
+ "flow_count": 1
+ },
+ "table_id": 1
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_desc_request.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_desc_request.packet.json
new file mode 100644
index 00000000..f59aa0b2
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_desc_request.packet.json
@@ -0,0 +1,13 @@
+{
+ "flow": {
+ "cookie": 1234605616436508552,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "match": {
+ "in_port": 1
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_mod_no_nx.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_mod_no_nx.packet.json
new file mode 100644
index 00000000..72054e33
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_mod_no_nx.packet.json
@@ -0,0 +1,103 @@
+{
+ "cmd": 0,
+ "flow": {
+ "instructions": [
+ {
+ "actions": [
+ {
+ "field": "vlan_vid",
+ "type": "SET_FIELD",
+ "value": 258
+ },
+ {
+ "type": "COPY_TTL_OUT"
+ },
+ {
+ "type": "COPY_TTL_IN"
+ },
+ {
+ "type": "COPY_TTL_IN"
+ },
+ {
+ "type": "POP_PBB"
+ },
+ {
+ "ethertype": 4660,
+ "type": "PUSH_PBB"
+ },
+ {
+ "ethertype": 39030,
+ "type": "POP_MPLS"
+ },
+ {
+ "ethertype": 34887,
+ "type": "PUSH_MPLS"
+ },
+ {
+ "type": "POP_VLAN"
+ },
+ {
+ "ethertype": 33024,
+ "type": "PUSH_VLAN"
+ },
+ {
+ "type": "DEC_MPLS_TTL"
+ },
+ {
+ "mpls_ttl": 10,
+ "type": "SET_MPLS_TTL"
+ },
+ {
+ "type": "DEC_NW_TTL"
+ },
+ {
+ "nw_ttl": 10,
+ "type": "SET_NW_TTL"
+ },
+ {
+ "data": "AAECAwQFBgc=",
+ "data_type": "base64",
+ "experimenter": 101,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "queue_id": 3,
+ "type": "SET_QUEUE"
+ },
+ {
+ "group_id": 99,
+ "type": "GROUP"
+ },
+ {
+ "max_len": 65535,
+ "port": 6,
+ "type": "OUTPUT"
+ }
+ ],
+ "type": "WRITE_ACTIONS"
+ },
+ {
+ "actions": [
+ {
+ "field": "eth_src",
+ "type": "SET_FIELD",
+ "value": "01:02:03:04:05:06"
+ },
+ {
+ "field": "pbb_uca",
+ "type": "SET_FIELD",
+ "value": 1
+ }
+ ],
+ "type": "APPLY_ACTIONS"
+ }
+ ],
+ "buffer_id": 65535,
+ "importance": 0,
+ "match": {
+ "eth_dst": "f2:0b:a4:7d:f8:ea"
+ },
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_stats_reply.packet.json
new file mode 100644
index 00000000..385f256b
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_stats_reply.packet.json
@@ -0,0 +1,16 @@
+{
+ "1": [
+ {
+ "length": 40,
+ "match": {
+ "in_port": 1
+ },
+ "priority": 1,
+ "reason": 0,
+ "stats": {
+ "flow_count": 1
+ },
+ "table_id": 1
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_stats_request.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_stats_request.packet.json
new file mode 100644
index 00000000..a42dfef0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-flow_stats_request.packet.json
@@ -0,0 +1,11 @@
+{
+ "flow": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {},
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_desc_reply.packet.json
new file mode 100644
index 00000000..b6b75020
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_desc_reply.packet.json
@@ -0,0 +1,27 @@
+{
+ "1": [
+ {
+ "buckets": [
+ {
+ "actions": [
+ {
+ "max_len": 65509,
+ "port": 1,
+ "type": "OUTPUT"
+ }
+ ],
+ "bucket_id": 65535,
+ "properties": [
+ {
+ "type": "WEIGHT",
+ "weight": 65535
+ }
+ ]
+ }
+ ],
+ "group_id": 1,
+ "properties": [],
+ "type": "SELECT"
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_desc_request.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_desc_request.packet.json
new file mode 100644
index 00000000..f25aaff4
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_desc_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "group_id": 52651
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_features_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_features_reply.packet.json
new file mode 100644
index 00000000..2a29ac2d
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_features_reply.packet.json
@@ -0,0 +1,104 @@
+{
+ "1": [
+ {
+ "actions": [
+ {
+ "ALL": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "SELECT": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "INDIRECT": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ },
+ {
+ "FF": [
+ "OUTPUT",
+ "COPY_TTL_OUT",
+ "COPY_TTL_IN",
+ "SET_MPLS_TTL",
+ "DEC_MPLS_TTL",
+ "PUSH_VLAN",
+ "POP_VLAN",
+ "PUSH_MPLS",
+ "POP_MPLS",
+ "SET_QUEUE",
+ "GROUP",
+ "SET_NW_TTL",
+ "DEC_NW_TTL",
+ "SET_FIELD"
+ ]
+ }
+ ],
+ "capabilities": [
+ "SELECT_WEIGHT",
+ "CHAINING"
+ ],
+ "max_groups": [
+ {
+ "ALL": 16777216
+ },
+ {
+ "SELECT": 16777216
+ },
+ {
+ "INDIRECT": 16777216
+ },
+ {
+ "FF": 16777216
+ }
+ ],
+ "types": [
+ "ALL",
+ "SELECT",
+ "INDIRECT",
+ "FF"
+ ]
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_mod.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_mod.packet.json
new file mode 100644
index 00000000..eca861ea
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_mod.packet.json
@@ -0,0 +1,42 @@
+{
+ "cmd": 3,
+ "group": {
+ "buckets": [
+ {
+ "actions": [
+ {
+ "len": 8,
+ "type": "POP_VLAN"
+ },
+ {
+ "field": "ipv4_dst",
+ "type": "SET_FIELD",
+ "value": "192.168.2.9"
+ }
+ ],
+ "bucket_id": 305419896,
+ "properties": [
+ {
+ "length": 8,
+ "type": "WEIGHT",
+ "weight": 52428
+ },
+ {
+ "length": 8,
+ "type": "WATCH_PORT",
+ "watch": 56797
+ },
+ {
+ "length": 8,
+ "type": "WATCH_GROUP",
+ "watch": 4008636142
+ }
+ ]
+ }
+ ],
+ "command_bucket_id": 3149642683,
+ "group_id": 2863311530,
+ "properties": [],
+ "type": "SELECT"
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_stats_reply.packet.json
new file mode 100644
index 00000000..1c6f9039
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-group_stats_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "bucket_stats": [
+ {
+ "byte_count": 2345,
+ "packet_count": 234
+ }
+ ],
+ "byte_count": 12345,
+ "duration_nsec": 609036000,
+ "duration_sec": 9,
+ "group_id": 1,
+ "length": 56,
+ "packet_count": 123,
+ "ref_count": 2
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_desc_reply.packet.json
new file mode 100644
index 00000000..d5efcd97
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_desc_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "bands": [
+ {
+ "burst_size": 10,
+ "rate": 1000,
+ "type": "DROP"
+ }
+ ],
+ "flags": [
+ "PKTPS",
+ "BURST",
+ "STATS"
+ ],
+ "meter_id": 100
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_features_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_features_reply.packet.json
new file mode 100644
index 00000000..24dac7d4
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_features_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "band_types": [
+ "DROP",
+ "DSCP_REMARK"
+ ],
+ "capabilities": [
+ "KBPS",
+ "PKTPS",
+ "BURST",
+ "STATS"
+ ],
+ "max_bands": 255,
+ "max_color": 0,
+ "max_meter": 16777216
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_mod.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_mod.packet.json
new file mode 100644
index 00000000..1d881209
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_mod.packet.json
@@ -0,0 +1,24 @@
+{
+ "cmd": 0,
+ "meter": {
+ "bands": [
+ {
+ "burst_size": 10,
+ "rate": 1000,
+ "type": "DROP"
+ },
+ {
+ "burst_size": 10,
+ "prec_level": 1,
+ "rate": 1000,
+ "type": "DSCP_REMARK"
+ }
+ ],
+ "flags": [
+ "PKTPS",
+ "BURST",
+ "STATS"
+ ],
+ "meter_id": 100
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_stats_reply.packet.json
new file mode 100644
index 00000000..e7f9722b
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-meter_stats_reply.packet.json
@@ -0,0 +1,19 @@
+{
+ "1": [
+ {
+ "band_stats": [
+ {
+ "byte_band_count": 0,
+ "packet_band_count": 0
+ }
+ ],
+ "byte_in_count": 0,
+ "duration_nsec": 480000,
+ "duration_sec": 0,
+ "len": 56,
+ "meter_id": 100,
+ "packet_in_count": 0,
+ "ref_count": 0
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_desc_reply.packet.json
new file mode 100644
index 00000000..c2f748a8
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_desc_reply.packet.json
@@ -0,0 +1,83 @@
+{
+ "1": [
+ {
+ "config": 0,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "length": 168,
+ "name": "Port7",
+ "port_no": 7,
+ "properties": [
+ {
+ "advertised": 10240,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "length": 32,
+ "max_speed": 5000,
+ "peer": 10248,
+ "supported": 10248,
+ "type": "ETHERNET"
+ },
+ {
+ "length": 40,
+ "rx_grid_freq_lmda": 1500,
+ "rx_max_freq_lmda": 2000,
+ "rx_min_freq_lmda": 1000,
+ "supported": 1,
+ "tx_grid_freq_lmda": 1500,
+ "tx_max_freq_lmda": 2000,
+ "tx_min_freq_lmda": 1000,
+ "tx_pwr_max": 2000,
+ "tx_pwr_min": 1000,
+ "type": "OPTICAL"
+ },
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "state": 4
+ },
+ {
+ "config": 0,
+ "hw_addr": "f2:0b:a4:7d:f8:ea",
+ "length": 72,
+ "name": "Port6",
+ "port_no": 6,
+ "properties": [
+ {
+ "advertised": 10240,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "length": 32,
+ "max_speed": 5000,
+ "peer": 10248,
+ "supported": 10248,
+ "type": "ETHERNET"
+ }
+ ],
+ "state": 4
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_desc_request.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_desc_request.packet.json
new file mode 100644
index 00000000..d0519e83
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_desc_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "port_no": 48346
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_mod.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_mod.packet.json
new file mode 100644
index 00000000..be9de69d
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_mod.packet.json
@@ -0,0 +1,50 @@
+{
+ "port_config": {
+ "config": 0,
+ "hw_addr": "00:11:00:00:11:11",
+ "mask": 0,
+ "port_no": 1,
+ "properties": [
+ {
+ "advertise": 4096,
+ "length": 8,
+ "type": "ETHERNET"
+ },
+ {
+ "configure": 3,
+ "fl_offset": 2000,
+ "freq_lmda": 1500,
+ "grid_span": 3000,
+ "length": 24,
+ "tx_pwr": 300,
+ "type": "OPTICAL"
+ },
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": "EXPERIMENTER"
+ }
+ ]
+ }
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_stats_reply.packet.json
new file mode 100644
index 00000000..821c9b72
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-port_stats_reply.packet.json
@@ -0,0 +1,93 @@
+{
+ "1": [
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 224,
+ "port_no": 7,
+ "properties": [
+ {
+ "collisions": 0,
+ "length": 40,
+ "rx_crc_err": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "type": "ETHERNET"
+ },
+ {
+ "bias_current": 300,
+ "flags": 3,
+ "length": 44,
+ "rx_freq_lmda": 1500,
+ "rx_grid_span": 500,
+ "rx_offset": 700,
+ "rx_pwr": 2000,
+ "temperature": 273,
+ "tx_freq_lmda": 1500,
+ "tx_grid_span": 500,
+ "tx_offset": 700,
+ "tx_pwr": 2000,
+ "type": "OPTICAL"
+ },
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "rx_bytes": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_packets": 0,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ },
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 120,
+ "port_no": 6,
+ "properties": [
+ {
+ "collisions": 0,
+ "length": 40,
+ "rx_crc_err": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "type": "ETHERNET"
+ }
+ ],
+ "rx_bytes": 336,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_packets": 4,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_desc_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_desc_reply.packet.json
new file mode 100644
index 00000000..71ca0b71
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_desc_reply.packet.json
@@ -0,0 +1,61 @@
+{
+ "1": [
+ {
+ "len": 32,
+ "port_no": 7,
+ "properties": [
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "queue_id": 0
+ },
+ {
+ "len": 88,
+ "port_no": 8,
+ "properties": [
+ {
+ "length": 8,
+ "rate": 300,
+ "type": "MIN_RATE"
+ },
+ {
+ "length": 8,
+ "rate": 900,
+ "type": "MAX_RATE"
+ },
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "queue_id": 1
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_desc_request.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_desc_request.packet.json
new file mode 100644
index 00000000..9765cf31
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_desc_request.packet.json
@@ -0,0 +1,4 @@
+{
+ "port_no": 52651,
+ "queue_id": 57020
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_stats_reply.packet.json
new file mode 100644
index 00000000..a6d246d0
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-queue_stats_reply.packet.json
@@ -0,0 +1,64 @@
+{
+ "1": [
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 104,
+ "port_no": 7,
+ "properties": [
+ {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": "EXPERIMENTER"
+ },
+ {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": "EXPERIMENTER"
+ }
+ ],
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ },
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 48,
+ "port_no": 6,
+ "properties": [],
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ },
+ {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 48,
+ "port_no": 7,
+ "properties": [],
+ "queue_id": 2,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-table_features_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-table_features_reply.packet.json
new file mode 100644
index 00000000..e16efb76
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-table_features_reply.packet.json
@@ -0,0 +1,25 @@
+{
+ "1": [
+ {
+ "capabilities": 4,
+ "command": 1,
+ "features": 1,
+ "length": 80,
+ "max_entries": 255,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "table1",
+ "properties": [
+ {
+ "oxm_values": [
+ {
+ "eth_src": "aa:bb:cc:dd:ee:ff"
+ }
+ ],
+ "type": "PACKET_TYPES"
+ }
+ ],
+ "table_id": 1
+ }
+ ]
+}
diff --git a/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-table_stats_reply.packet.json b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-table_stats_reply.packet.json
new file mode 100644
index 00000000..95b2c495
--- /dev/null
+++ b/tests/unit/lib/ofctl_json/of15/libofproto-OFP15-table_stats_reply.packet.json
@@ -0,0 +1,16 @@
+{
+ "1": [
+ {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 0
+ },
+ {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 1
+ }
+ ]
+}
diff --git a/tests/unit/lib/ovs/__init__.py b/tests/unit/lib/ovs/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/lib/ovs/__init__.py
diff --git a/tests/unit/lib/ovs/test_vsctl.py b/tests/unit/lib/ovs/test_vsctl.py
new file mode 100644
index 00000000..28edf6e9
--- /dev/null
+++ b/tests/unit/lib/ovs/test_vsctl.py
@@ -0,0 +1,789 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from distutils.spawn import find_executable
+import logging
+import subprocess
+import unittest
+
+from nose.tools import eq_
+from nose.tools import ok_
+
+from ryu.lib.hub import sleep
+from ryu.lib.ovs import vsctl
+
+
+LOG = logging.getLogger(__name__)
+
+DOCKER_IMAGE_MININET = 'osrg/ryu-book'
+
+OVSDB_MANAGER_ADDR = 'ptcp:6640'
+OVSDB_SWITCH_ADDR = 'tcp:%s:6640'
+
+
+def setUpModule():
+ if not find_executable('docker'):
+ raise unittest.SkipTest(
+ 'Docker is not available. Test in %s will be skipped.' % __name__)
+
+
+def _run(command):
+ popen = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
+ popen.wait()
+ result = popen.stdout.read().decode('utf-8')
+
+ if result:
+ return [str(r.strip('\r')) for r in result.split('\n')]
+ else:
+ return []
+
+
+class TestVSCtl(unittest.TestCase):
+ """
+ Test cases for ryu.lib.ovs.vsctl.VSCtl
+ """
+ container_mn = None # Container ID of Mininet
+ container_mn_ip = None # IP of Mininet container
+
+ vsctl = None # instance of vsctl.VSCtl
+
+ @classmethod
+ def _docker_exec(cls, container, command):
+ return _run('docker exec -t %s %s' % (container, command))
+
+ @classmethod
+ def _docker_exec_mn(cls, command):
+ return cls._docker_exec(cls.container_mn, command)
+
+ @classmethod
+ def _docker_run(cls, image):
+ return _run('docker run --privileged -t -d %s' % image)[0]
+
+ @classmethod
+ def _docker_stop(cls, container):
+ return _run('docker stop %s' % container)[0]
+
+ @classmethod
+ def _docker_rm(cls, container):
+ return _run('docker rm %s' % container)[0]
+
+ @classmethod
+ def _docker_inspect_ip_addr(cls, container):
+ return _run(
+ 'docker inspect --format="{{.NetworkSettings.IPAddress}}" %s' %
+ container)[0].strip('"')
+
+ @classmethod
+ def _set_up_mn_container(cls):
+ cls.container_mn = cls._docker_run(DOCKER_IMAGE_MININET)
+ cls.container_mn_ip = cls._docker_inspect_ip_addr(cls.container_mn)
+
+ # Note: Wait for loading the OVS kernel module.
+ # If the OVS kernel module is loaded at first time, it might take
+ # a few seconds.
+ sleep(5)
+
+ cls._docker_exec_mn(
+ 'ovs-vsctl set-manager %s' % OVSDB_MANAGER_ADDR)
+
+ @classmethod
+ def _set_up_vsctl(cls):
+ cls.vsctl = vsctl.VSCtl(OVSDB_SWITCH_ADDR % cls.container_mn_ip)
+
+ @classmethod
+ def setUpClass(cls):
+ cls._set_up_mn_container()
+ cls._set_up_vsctl()
+
+ @classmethod
+ def _tear_down_mn_container(cls):
+ cls._docker_exec_mn('mn --clean')
+ cls._docker_stop(cls.container_mn)
+ cls._docker_rm(cls.container_mn)
+
+ @classmethod
+ def tearDownClass(cls):
+ cls._tear_down_mn_container()
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def _run_commands(self, commands):
+ self.vsctl.run_command(commands, timeout_sec=1)
+
+ # 00: Open vSwitch commands
+
+ def test_00_01_init(self):
+ command = vsctl.VSCtlCommand('init')
+ self._run_commands([command])
+
+ ok_(command.result is None)
+
+ def test_00_02_show(self):
+ command = vsctl.VSCtlCommand('show')
+ self._run_commands([command])
+
+ ok_(command.result is not None)
+
+ # 01: Bridge commands
+
+ def test_01_01_add_br_bridge(self):
+ bridge = 's1'
+ command = vsctl.VSCtlCommand('add-br', (bridge,))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn('ovs-vsctl list-br')
+ ok_(bridge in result)
+
+ def test_01_02_add_br_parent_vlan(self):
+ bridge = 'sub-s1-100'
+ parent = 's1'
+ vlan = '100'
+ command = vsctl.VSCtlCommand('add-br', (bridge, parent, vlan))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn('ovs-vsctl list-br')
+ ok_(bridge in result)
+ result = self._docker_exec_mn(
+ 'ovs-vsctl br-to-parent %s' % bridge)
+ eq_(parent, result[0])
+ result = self._docker_exec_mn(
+ 'ovs-vsctl br-to-vlan %s' % bridge)
+ eq_(vlan, result[0])
+
+ def test_01_03_del_br(self):
+ bridge = 's1'
+ child = 'sub-s1-100'
+
+ command = vsctl.VSCtlCommand('del-br', (bridge,))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn('ovs-vsctl list-br')
+ ok_(bridge not in result)
+ ok_(child not in result)
+
+ def test_01_04_list_br(self):
+ bridge = 's1'
+ child = 'sub-s1-100'
+ vlan = '100'
+ self._docker_exec_mn('ovs-vsctl add-br %s' % bridge)
+ self._docker_exec_mn(
+ 'ovs-vsctl add-br %s %s %s' % (child, bridge, vlan))
+
+ command = vsctl.VSCtlCommand('list-br')
+ self._run_commands([command])
+
+ ok_(bridge in command.result)
+ ok_(child in command.result)
+
+ def test_01_05_br_exists(self):
+ bridge = 's1'
+
+ command = vsctl.VSCtlCommand('br-exists', (bridge, ))
+ self._run_commands([command])
+
+ eq_(True, command.result)
+
+ def test_01_06_br_to_vlan(self):
+ bridge = 's1'
+
+ command = vsctl.VSCtlCommand('br-to-vlan', (bridge, ))
+ self._run_commands([command])
+
+ eq_(0, command.result)
+
+ def test_01_06_br_to_vlan_fake_bridge(self):
+ bridge = 'sub-s1-100'
+
+ command = vsctl.VSCtlCommand('br-to-vlan', (bridge, ))
+ self._run_commands([command])
+
+ eq_(100, command.result)
+
+ def test_01_07_br_to_parent(self):
+ bridge = 's1'
+ parent = bridge
+
+ command = vsctl.VSCtlCommand('br-to-parent', (bridge, ))
+ self._run_commands([command])
+
+ # result = <ryu.lib.ovs.vsctl.VSCtlBridge object>
+ eq_(parent, command.result.name)
+
+ def test_01_07_br_to_parent_fake_bridge(self):
+ bridge = 'sub-s1-100'
+ parent = 's1'
+
+ command = vsctl.VSCtlCommand('br-to-parent', (bridge, ))
+ self._run_commands([command])
+
+ # result = <ryu.lib.ovs.vsctl.VSCtlBridge object>
+ eq_(parent, command.result.name)
+
+ def test_01_08_br_set_external_id_add(self):
+ bridge = 's1'
+ key = 'ext_id_key'
+ value = 'ext_id_value'
+
+ command = vsctl.VSCtlCommand(
+ 'br-set-external-id', (bridge, key, value))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl br-get-external-id %s %s' % (bridge, key))
+ eq_(value, result[0])
+
+ def test_01_09_br_get_external_id_value(self):
+ bridge = 's1'
+ key = 'ext_id_key'
+ value = 'ext_id_value'
+
+ command = vsctl.VSCtlCommand(
+ 'br-get-external-id', (bridge, key))
+ self._run_commands([command])
+
+ eq_(value, command.result)
+
+ def test_01_10_br_get_external_id_dict(self):
+ bridge = 's1'
+ key = 'ext_id_key'
+ value = 'ext_id_value'
+
+ command = vsctl.VSCtlCommand(
+ 'br-get-external-id', (bridge,))
+ self._run_commands([command])
+
+ eq_({key: value}, command.result)
+
+ def test_01_11_br_set_external_id_clear(self):
+ bridge = 's1'
+ key = 'ext_id_key'
+
+ command = vsctl.VSCtlCommand(
+ 'br-set-external-id', (bridge, key))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl br-get-external-id %s %s' % (bridge, key))
+ eq_([], result)
+
+ # Clean up
+ self._docker_exec_mn('mn --clean')
+
+ # 02: Port commands
+
+ def test_02_01_list_ports(self):
+ bridge = 's1'
+ interface_1 = 's1-eth1'
+ interface_2 = 's1-eth2'
+
+ self._docker_exec_mn(
+ 'ip link add %s type dummy' % interface_1)
+ self._docker_exec_mn(
+ 'ip link add %s type dummy' % interface_2)
+ self._docker_exec_mn(
+ 'ovs-vsctl add-br %(bridge)s'
+ ' -- add-port %(bridge)s %(interface_1)s'
+ ' -- add-port %(bridge)s %(interface_2)s' % locals())
+
+ command = vsctl.VSCtlCommand('list-ports', (bridge,))
+ self._run_commands([command])
+
+ ok_(interface_1 in command.result)
+ ok_(interface_2 in command.result)
+
+ def test_02_02_add_port(self):
+ bridge = 's1'
+ interface_1 = 's1-eth1'
+ self._docker_exec_mn(
+ 'ovs-vsctl del-port %s %s' % (bridge, interface_1))
+
+ command = vsctl.VSCtlCommand('add-port', (bridge, interface_1))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl port-to-br %s' % interface_1)
+ eq_(bridge, result[0])
+
+ def test_02_03_add_bond(self):
+ bridge = 's1'
+ interface_1 = 's1-eth1'
+ interface_2 = 's1-eth2'
+ port = 's1-bond1'
+ interface_list = [interface_1, interface_2]
+ self._docker_exec_mn('ovs-vsctl del-br %s' % bridge)
+ self._docker_exec_mn('ovs-vsctl add-br %s' % bridge)
+
+ command = vsctl.VSCtlCommand(
+ 'add-bond', (bridge, port, interface_list))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl port-to-br %s' % port)
+ eq_(bridge, result[0])
+
+ def test_02_04_del_port(self):
+ bridge = 's1'
+ port = 's1-bond1'
+
+ command = vsctl.VSCtlCommand('del-port', (bridge, port))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl list-ports %s' % bridge)
+ eq_([], result)
+
+ def test_02_05_port_to_br(self):
+ bridge = 's1'
+ port_1 = 's1-eth1'
+ port_2 = 's1-eth2'
+ self._docker_exec_mn('ovs-vsctl del-br %s' % bridge)
+ self._docker_exec_mn(
+ 'ovs-vsctl add-br %(bridge)s'
+ ' -- add-port %(bridge)s %(port_1)s'
+ ' -- add-port %(bridge)s %(port_2)s' % locals())
+
+ command = vsctl.VSCtlCommand('port-to-br', (port_1,))
+ self._run_commands([command])
+
+ eq_(bridge, command.result)
+
+ # Clean up
+ self._docker_exec_mn('mn --clean')
+
+ # 03: Interface commands
+
+ def test_03_01_list_ifaces(self):
+ bridge = 's1'
+ interface_1 = 's1-eth1'
+ interface_2 = 's1-eth2'
+
+ self._docker_exec_mn(
+ 'ip link add %s type dummy' % interface_1)
+ self._docker_exec_mn(
+ 'ip link add %s type dummy' % interface_2)
+ self._docker_exec_mn(
+ 'ovs-vsctl add-br %(bridge)s'
+ ' -- add-port %(bridge)s %(interface_1)s'
+ ' -- add-port %(bridge)s %(interface_2)s' % locals())
+
+ command = vsctl.VSCtlCommand('list-ifaces', (bridge,))
+ self._run_commands([command])
+
+ ok_(interface_1 in command.result)
+ ok_(interface_2 in command.result)
+
+ def test_03_02_ifaces_to_br(self):
+ bridge = 's1'
+ interface_1 = 's1-eth1'
+
+ command = vsctl.VSCtlCommand('iface-to-br', (interface_1,))
+ self._run_commands([command])
+
+ eq_(bridge, command.result)
+
+ # Clean up
+ self._docker_exec_mn('mn --clean')
+
+ # 04: Controller commands
+
+ def test_04_01_get_controller(self):
+ bridge = 's1'
+ controller = 'tcp:127.0.0.1:6653'
+ self._docker_exec_mn(
+ 'ovs-vsctl add-br %(bridge)s'
+ ' -- set-controller %(bridge)s %(controller)s' % locals())
+
+ command = vsctl.VSCtlCommand('get-controller', (bridge,))
+ self._run_commands([command])
+
+ eq_(1, len(command.result))
+ eq_(controller, command.result[0])
+
+ def test_04_02_del_controller(self):
+ bridge = 's1'
+
+ command = vsctl.VSCtlCommand('del-controller', (bridge,))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get-controller %s' % bridge)
+ eq_([], result)
+
+ def test_04_03_set_controller(self):
+ bridge = 's1'
+ controller = 'tcp:127.0.0.1:6653'
+
+ command = vsctl.VSCtlCommand('set-controller', (bridge, controller))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get-controller %s' % bridge)
+ eq_(controller, result[0])
+
+ def test_04_04_get_fail_mode(self):
+ bridge = 's1'
+ fai_mode = 'secure'
+ self._docker_exec_mn(
+ 'ovs-vsctl set-fail-mode %s %s' % (bridge, fai_mode))
+
+ command = vsctl.VSCtlCommand('get-fail-mode', (bridge,))
+ self._run_commands([command])
+
+ eq_(fai_mode, command.result)
+
+ def test_04_05_del_fail_mode(self):
+ bridge = 's1'
+
+ command = vsctl.VSCtlCommand('del-fail-mode', (bridge,))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get-fail-mode %s' % bridge)
+ eq_([], result)
+
+ def test_04_06_set_fail_mode(self):
+ bridge = 's1'
+ fail_mode = 'secure'
+
+ command = vsctl.VSCtlCommand('set-fail-mode', (bridge, fail_mode))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get-fail-mode %s' % bridge)
+ eq_(fail_mode, result[0])
+
+ # Clean up
+ self._docker_exec_mn('mn --clean')
+
+ # 05: Manager commands (not implemented yet)
+ # 06: SSL commands (not implemented yet)
+ # 07: Switch commands (not implemented yet)
+
+ # 08: Database commands
+
+ def test_08_01_list(self):
+ table = 'Bridge'
+ bridge = 's1'
+ interface_1 = 's1-eth1'
+ interface_2 = 's1-eth2'
+ fail_mode = 'secure'
+ protocols = 'OpenFlow10,OpenFlow13'
+ datapath_id = '1111111111111111'
+
+ self._docker_exec_mn(
+ 'ip link add %s type dummy' % interface_1)
+ self._docker_exec_mn(
+ 'ip link add %s type dummy' % interface_2)
+ self._docker_exec_mn(
+ 'ovs-vsctl add-br %(bridge)s'
+ ' -- add-port %(bridge)s %(interface_1)s'
+ ' -- add-port %(bridge)s %(interface_2)s' % locals())
+ self._docker_exec_mn(
+ 'ovs-vsctl set %(table)s %(bridge)s '
+ 'fail_mode=%(fail_mode)s '
+ 'protocols=%(protocols)s '
+ 'other_config:datapath-id=%(datapath_id)s' % locals())
+
+ command = vsctl.VSCtlCommand('list', (table,))
+ self._run_commands([command])
+
+ eq_(1, len(command.result))
+ # command.result[0] = <ryu.lib.ovs.vsctl.VSCtlBridge object>
+ eq_(bridge, command.result[0].name)
+
+ def test_08_02_find(self):
+ table = 'Bridge'
+ bridge = 's1'
+
+ command = vsctl.VSCtlCommand('find', (table, 'name=%s' % bridge))
+ self._run_commands([command])
+
+ eq_(1, len(command.result))
+ # command.result[0] = <ovs.db.idl.Row object object> for Bridge
+ eq_(bridge, command.result[0].name)
+
+ def test_08_02_find_complex(self):
+ table = 'Bridge'
+ bridge = 's1'
+ fail_mode = 'secure'
+ protocols = 'OpenFlow10,OpenFlow13'
+ datapath_id = '1111111111111111'
+
+ command = vsctl.VSCtlCommand(
+ 'find', (table, 'fail_mode=%s' % fail_mode,
+ 'protocols=%s' % protocols,
+ 'other_config:datapath-id=%s' % datapath_id))
+ self._run_commands([command])
+
+ eq_(1, len(command.result))
+ # command.result[0] = <ovs.db.idl.Row object object> for Bridge
+ eq_(bridge, command.result[0].name)
+
+ def test_08_03_get_01_value(self):
+ table = 'Bridge'
+ bridge = 's1'
+ column = 'fail_mode'
+ value = 'secure'
+
+ command = vsctl.VSCtlCommand('get', (table, bridge, column))
+ self._run_commands([command])
+
+ # command.result[0] is a list of return values
+ eq_(value, command.result[0][0])
+
+ def test_08_03_get_02_set(self):
+ table = 'Bridge'
+ bridge = 's1'
+ column = 'protocols'
+ value = 'OpenFlow10,OpenFlow13'.split(',')
+
+ command = vsctl.VSCtlCommand('get', (table, bridge, column))
+ self._run_commands([command])
+
+ # command.result[0] is a list
+ eq_(value, command.result[0])
+
+ def test_08_03_get_03_map(self):
+ table = 'Bridge'
+ bridge = 's1'
+ column = 'other_config'
+ key = 'datapath-id'
+ datapath_id = '1111111111111111'
+ value = {key: datapath_id}
+
+ command = vsctl.VSCtlCommand('get', (table, bridge, column))
+ self._run_commands([command])
+
+ # command.result[0] is a dict
+ eq_(value, command.result[0])
+
+ def test_08_03_get_04_map_value(self):
+ table = 'Bridge'
+ bridge = 's1'
+ column = 'other_config'
+ key = 'datapath-id'
+ datapath_id = '1111111111111111'
+ value = datapath_id
+
+ command = vsctl.VSCtlCommand(
+ 'get', (table, bridge, '%s:%s' % (column, key)))
+ self._run_commands([command])
+
+ # command.result[0] is a dict
+ eq_(value, command.result[0])
+
+ def test_08_04_set_01_value(self):
+ table = 'Bridge'
+ bridge = 's1'
+ column = 'fail_mode'
+ value = 'standalone'
+
+ command = vsctl.VSCtlCommand(
+ 'set', (table, bridge, '%s=%s' % (column, value)))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s' % (table, bridge, column))
+ eq_(value, result[0])
+
+ def test_08_04_set_02_set(self):
+ table = 'Bridge'
+ bridge = 's1'
+ column = 'protocols'
+ value = 'OpenFlow10,OpenFlow12,OpenFlow13'
+
+ command = vsctl.VSCtlCommand(
+ 'set', (table, bridge, '%s=%s' % (column, value)))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s' % (table, bridge, column))
+ expected_value = '["OpenFlow10", "OpenFlow12", "OpenFlow13"]'
+ eq_(expected_value, result[0])
+
+ def test_08_04_set_03_map(self):
+ table = 'Bridge'
+ bridge = 's1'
+ column = 'other_config'
+ key = 'datapath-id'
+ value = '0000000000000001'
+
+ command = vsctl.VSCtlCommand(
+ 'set', (table, bridge, '%s:%s=%s' % (column, key, value)))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s:%s' % (table, bridge, column, key))
+ expected_value = '"0000000000000001"'
+ eq_(expected_value, result[0])
+
+ def test_08_05_add_01_value(self):
+ table = 'Port'
+ bridge = 's1'
+ column = 'tag'
+ value = '100'
+
+ command = vsctl.VSCtlCommand(
+ 'add', (table, bridge, column, value))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s' % (table, bridge, column))
+ eq_(value, result[0])
+
+ def test_08_05_add_02_set(self):
+ table = 'Port'
+ bridge = 's1'
+ column = 'trunks'
+ value = '100,200'
+
+ command = vsctl.VSCtlCommand(
+ 'add', (table, bridge, column, value))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s' % (table, bridge, column))
+ expected_value = '[100, 200]'
+ eq_(expected_value, result[0])
+
+ def test_08_05_add_03_map(self):
+ table = 'Bridge'
+ bridge = 's1'
+ column = 'other_config'
+ key = 'datapath-id'
+ value = '0000000000000011'
+
+ command = vsctl.VSCtlCommand(
+ 'add', (table, bridge, column, '%s=%s' % (key, value)))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s:%s' % (table, bridge, column, key))
+ expected_value = '"0000000000000011"'
+ eq_(expected_value, result[0])
+
+ def test_08_06_remove_01_value(self):
+ table = 'Port'
+ bridge = 's1'
+ column = 'tag'
+ value = '100'
+ self._docker_exec_mn(
+ 'ovs-vsctl set %s %s %s=%s' % (table, bridge, column, value))
+
+ command = vsctl.VSCtlCommand(
+ 'remove', (table, bridge, column, value))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s' % (table, bridge, column))
+ expected_value = '[]'
+ eq_(expected_value, result[0])
+
+ def test_08_06_remove_02_set(self):
+ table = 'Port'
+ bridge = 's1'
+ column = 'trunks'
+ init_value = '100,200,300'
+ value = '100,200'
+ self._docker_exec_mn(
+ 'ovs-vsctl set %s %s %s=%s' % (table, bridge, column, init_value))
+
+ command = vsctl.VSCtlCommand(
+ 'remove', (table, bridge, column, value))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s' % (table, bridge, column))
+ expected_value = '[300]'
+ eq_(expected_value, result[0])
+
+ def test_08_06_remove_03_map(self):
+ table = 'Port'
+ bridge = 's1'
+ column = 'other_config'
+ key = 'priority-tag'
+ value = 'true'
+ self._docker_exec_mn(
+ 'ovs-vsctl set %s %s %s:%s=%s' %
+ (table, bridge, column, key, value))
+
+ command = vsctl.VSCtlCommand(
+ 'remove', (table, bridge, column, '%s=%s' % (key, value)))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s' % (table, bridge, column))
+ expected_value = '{}'
+ eq_(expected_value, result[0])
+
+ def test_08_07_clear_01_value(self):
+ table = 'Port'
+ bridge = 's1'
+ column = 'tag'
+ value = '100'
+ self._docker_exec_mn(
+ 'ovs-vsctl set %s %s %s=%s' % (table, bridge, column, value))
+
+ command = vsctl.VSCtlCommand(
+ 'clear', (table, bridge, column))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s' % (table, bridge, column))
+ expected_value = '[]'
+ eq_(expected_value, result[0])
+
+ def test_08_07_clear_02_set(self):
+ table = 'Port'
+ bridge = 's1'
+ column = 'trunks'
+ value = '100,200'
+ self._docker_exec_mn(
+ 'ovs-vsctl set %s %s %s=%s' % (table, bridge, column, value))
+
+ command = vsctl.VSCtlCommand(
+ 'clear', (table, bridge, column))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s' % (table, bridge, column))
+ expected_value = '[]'
+ eq_(expected_value, result[0])
+
+ def test_08_07_clear_03_map(self):
+ table = 'Port'
+ bridge = 's1'
+ column = 'other_config'
+ key = 'priority-tag'
+ value = 'true'
+ self._docker_exec_mn(
+ 'ovs-vsctl set %s %s %s:%s=%s' %
+ (table, bridge, column, key, value))
+
+ command = vsctl.VSCtlCommand(
+ 'clear', (table, bridge, column, '%s=%s' % (key, value)))
+ self._run_commands([command])
+
+ result = self._docker_exec_mn(
+ 'ovs-vsctl get %s %s %s' % (table, bridge, column))
+ expected_value = '{}'
+ eq_(expected_value, result[0])
+
+ # Clean up
+ self._docker_exec_mn('mn --clean')
diff --git a/tests/unit/lib/test_addrconv.py b/tests/unit/lib/test_addrconv.py
new file mode 100644
index 00000000..77877038
--- /dev/null
+++ b/tests/unit/lib/test_addrconv.py
@@ -0,0 +1,56 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+from nose.tools import eq_
+
+from ryu.lib import addrconv
+
+
+class Test_addrconv(unittest.TestCase):
+ """ Test case for ryu.lib.addrconv
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ @staticmethod
+ def _test_conv(conv, text_value, bin_value):
+ eq_(conv.text_to_bin(text_value), bin_value)
+ eq_(conv.bin_to_text(bin_value), text_value)
+
+ def test_ipv4(self):
+ self._test_conv(addrconv.ipv4, '0.0.0.0', b'\x00\x00\x00\x00')
+ self._test_conv(addrconv.ipv4, '127.0.0.1', b'\x7f\x00\x00\x01')
+ self._test_conv(addrconv.ipv4, '255.255.0.0', b'\xff\xff\x00\x00')
+
+ def test_ipv6(self):
+ self._test_conv(addrconv.ipv6, 'ff02::1',
+ (b'\xff\x02\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x01'))
+ self._test_conv(addrconv.ipv6, 'fe80::f00b:a4ff:fe7d:f8ea',
+ (b'\xfe\x80\x00\x00\x00\x00\x00\x00'
+ b'\xf0\x0b\xa4\xff\xfe\x7d\xf8\xea'))
+ self._test_conv(addrconv.ipv6, '::',
+ (b'\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00'))
+
+ def test_mac(self):
+ self._test_conv(addrconv.mac, 'f2:0b:a4:01:0a:23',
+ b'\xf2\x0b\xa4\x01\x0a\x23')
diff --git a/tests/unit/lib/test_hub.py b/tests/unit/lib/test_hub.py
new file mode 100644
index 00000000..d8b75996
--- /dev/null
+++ b/tests/unit/lib/test_hub.py
@@ -0,0 +1,239 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import time
+import unittest
+from nose.tools import raises
+
+from ryu.lib import hub
+hub.patch()
+
+
+class MyException(BaseException):
+ pass
+
+
+class Test_hub(unittest.TestCase):
+ """ Test case for ryu.lib.hub
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ # we want to test timeout first because the rest of tests rely on it.
+ # thus test_0_ prefix.
+
+ @raises(hub.Timeout)
+ def test_0_timeout1(self):
+ with hub.Timeout(0.1):
+ hub.sleep(1)
+
+ @raises(MyException)
+ def test_0_timeout2(self):
+ with hub.Timeout(0.1, MyException):
+ hub.sleep(1)
+
+ def test_0_timeout3(self):
+ with hub.Timeout(1):
+ hub.sleep(0.1)
+ # sleep some more to ensure timer cancelation
+ hub.sleep(2)
+
+ def test_spawn_event1(self):
+ def _child(ev, result):
+ hub.sleep(1)
+ result.append(1)
+ ev.set()
+
+ ev = hub.Event()
+ result = []
+ with hub.Timeout(2):
+ hub.spawn(_child, ev, result)
+ ev.wait()
+ assert len(result) == 1
+
+ def test_spawn_event2(self):
+ def _child(ev, result):
+ hub.sleep(1)
+ result.append(1)
+ ev.set()
+
+ ev = hub.Event()
+ result = []
+ with hub.Timeout(2):
+ t = hub.spawn(_child, ev, result)
+ ev.wait(timeout=0.5)
+ assert len(result) == 0
+ ev.wait()
+ assert len(result) == 1
+
+ def test_spawn_event3(self):
+ def _child(ev, ev2, result):
+ ev2.wait()
+ hub.sleep(0.5)
+ result.append(1)
+ ev.set()
+
+ ev = hub.Event()
+ ev2 = hub.Event()
+ result = []
+ with hub.Timeout(2):
+ hub.spawn(_child, ev, ev2, result)
+ hub.spawn(_child, ev, ev2, result)
+ hub.sleep(0.5)
+ ev2.set() # this should wake up the above created two threads
+ ev.wait(timeout=1)
+ assert len(result) == 2
+
+ def test_spawn_select1(self):
+ import select
+ import socket
+
+ def _child(s1):
+ hub.sleep(0.5)
+ s1.send(b"hoge")
+
+ s1, s2 = socket.socketpair()
+ with hub.Timeout(1):
+ hub.spawn(_child, s1)
+ select.select([s2.fileno()], [], [])
+ select.select([s2.fileno()], [], []) # return immediately
+
+ @raises(MyException)
+ def test_select1(self):
+ import select
+ import socket
+
+ s1, s2 = socket.socketpair()
+ with hub.Timeout(1, MyException):
+ select.select([s2.fileno()], [], [])
+
+ def test_select2(self):
+ import select
+
+ with hub.Timeout(1, MyException):
+ select.select([], [], [], 0) # timeout immediately
+
+ def test_select3(self):
+ import select
+ import socket
+
+ s1, s2 = socket.socketpair()
+ with hub.Timeout(1, MyException):
+ list = [s1.fileno(), s2.fileno()]
+ rlist, wlist, xlist = select.select(list, list, list)
+ assert not s1.fileno() in rlist
+ assert not s2.fileno() in rlist
+ # the following two assertions are commented out because one of
+ # them fails with eventlet-patched select.
+ # assert s1.fileno() in wlist
+ # assert s2.fileno() in wlist
+ # note: eventlet-patched select returns at most one file.
+ assert (s1.fileno() in wlist) or (s2.fileno() in wlist)
+ assert not s1.fileno() in xlist
+ assert not s2.fileno() in xlist
+
+ def test_spawn_joinall(self):
+ def _child(ev2, result):
+ ev2.wait()
+ hub.sleep(0.5)
+ result.append(1)
+ raise BaseException("this exception should not be propagated")
+
+ ev2 = hub.Event()
+ threads = []
+ result = []
+ with hub.Timeout(2):
+ threads.append(hub.spawn(_child, ev2, result))
+ threads.append(hub.spawn(_child, ev2, result))
+ hub.sleep(0.5)
+ ev2.set() # this should wake up the above created two threads
+ hub.joinall(threads)
+ assert len(result) == 2
+
+ def test_spawn_kill_joinall(self):
+ def _child(ev2, result):
+ ev2.wait()
+ result.append(1)
+
+ ev2 = hub.Event()
+ threads = []
+ result = []
+ with hub.Timeout(2):
+ threads.append(hub.spawn(_child, ev2, result))
+ threads.append(hub.spawn(_child, ev2, result))
+ hub.sleep(0.5)
+ for t in threads:
+ hub.kill(t)
+ hub.joinall(threads)
+ assert len(result) == 0
+
+ def test_spawn_kill_nowait_joinall(self):
+ # XXX this test relies on the scheduling behaviour.
+ # the intention here is, killing threads before they get active.
+
+ def _child(result):
+ result.append(1)
+
+ threads = []
+ result = []
+ with hub.Timeout(2):
+ threads.append(hub.spawn(_child, result))
+ for t in threads:
+ hub.kill(t)
+ hub.joinall(threads)
+ assert len(result) == 0
+
+ def test_spawn_kill_die_joinall(self):
+ def _child(result):
+ result.append(1)
+
+ threads = []
+ result = []
+ with hub.Timeout(2):
+ threads.append(hub.spawn(_child, result))
+ threads.append(hub.spawn(_child, result))
+ hub.sleep(0.5)
+ for t in threads:
+ hub.kill(t)
+ hub.joinall(threads)
+ assert len(result) == 2
+
+ def test_spawn_exception_joinall(self):
+ def _child():
+ raise Exception("hoge")
+
+ threads = []
+ with hub.Timeout(2):
+ threads.append(hub.spawn(_child))
+ threads.append(hub.spawn(_child))
+ hub.sleep(0.5)
+ hub.joinall(threads)
+
+ def test_event1(self):
+ ev = hub.Event()
+ ev.set()
+ with hub.Timeout(1):
+ ev.wait() # should return immediately
+
+ def test_event2(self):
+ ev = hub.Event()
+ # allow multiple sets unlike eventlet Event
+ ev.set()
+ ev.set()
diff --git a/tests/unit/lib/test_import_module.py b/tests/unit/lib/test_import_module.py
new file mode 100644
index 00000000..852ee21b
--- /dev/null
+++ b/tests/unit/lib/test_import_module.py
@@ -0,0 +1,66 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+from nose.tools import eq_
+
+from ryu.utils import import_module
+
+
+class Test_import_module(unittest.TestCase):
+ """
+ Test case for ryu.utils.import_module
+ """
+
+ @staticmethod
+ def _my_import(name):
+ mod = __import__(name)
+ components = name.split('.')
+ for c in components[1:]:
+ mod = getattr(mod, c)
+ return mod
+
+ def test_import_module_with_same_basename(self):
+ aaa = import_module('tests.unit.lib.test_mod.aaa.mod')
+ eq_("this is aaa", aaa.name)
+ bbb = import_module('tests.unit.lib.test_mod.bbb.mod')
+ eq_("this is bbb", bbb.name)
+
+ def test_import_module_by_filename(self):
+ ccc = import_module('./lib/test_mod/ccc/mod.py')
+ eq_("this is ccc", ccc.name)
+ ddd = import_module('./lib/test_mod/ddd/mod.py')
+ # Note: When importing a module by filename, if module file name
+ # is duplicated, import_module reload (override) a module instance.
+ eq_("this is ddd", ddd.name)
+
+ def test_import_same_module1(self):
+ from tests.unit.lib.test_mod import eee as eee1
+ eq_("this is eee", eee1.name)
+ eee2 = import_module('./lib/test_mod/eee.py')
+ eq_("this is eee", eee2.name)
+
+ def test_import_same_module2(self):
+ fff1 = import_module('./lib/test_mod/fff.py')
+ eq_("this is fff", fff1.name)
+ fff2 = import_module('tests.unit.lib.test_mod.fff')
+ eq_("this is fff", fff2.name)
+
+ def test_import_same_module3(self):
+ ggg1 = import_module('./lib/test_mod/ggg.py')
+ eq_("this is ggg", ggg1.name)
+ ggg2 = self._my_import('tests.unit.lib.test_mod.ggg')
+ eq_("this is ggg", ggg2.name)
diff --git a/tests/unit/lib/test_ip.py b/tests/unit/lib/test_ip.py
new file mode 100644
index 00000000..66d8f0c2
--- /dev/null
+++ b/tests/unit/lib/test_ip.py
@@ -0,0 +1,156 @@
+# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import logging
+import struct
+import unittest
+
+from nose.tools import eq_
+from nose.tools import raises
+
+from ryu.lib import ip
+
+LOG = logging.getLogger('test_ip')
+
+
+class Test_ip(unittest.TestCase):
+ """
+ test case for ip address module
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_ipv4_to_bin(self):
+ ipv4_str = '10.28.197.1'
+ val = 0x0a1cc501
+
+ (res,) = struct.unpack('!I', ip.ipv4_to_bin(ipv4_str))
+ eq_(val, res)
+
+ def test_ipv4_to_int(self):
+ ipv4_str = '10.28.197.1'
+ val = 169657601
+
+ res = ip.ipv4_to_int(ipv4_str)
+ eq_(val, res)
+
+ def test_ipv4_to_str_from_bin(self):
+ ipv4_bin = struct.pack('!I', 0x0a1cc501)
+ val = '10.28.197.1'
+
+ res = ip.ipv4_to_str(ipv4_bin)
+ eq_(val, res)
+
+ def test_ipv4_to_str_from_int(self):
+ ipv4_int = 169657601
+ val = '10.28.197.1'
+
+ res = ip.ipv4_to_str(ipv4_int)
+ eq_(val, res)
+
+ def test_ipv6_to_bin(self):
+ ipv6_str = '2013:da8:215:8f2:aa20:66ff:fe4c:9c3c'
+ val = struct.pack('!8H', 0x2013, 0xda8, 0x215, 0x8f2, 0xaa20, 0x66ff,
+ 0xfe4c, 0x9c3c)
+ res = ip.ipv6_to_bin(ipv6_str)
+ eq_(val, res)
+
+ def test_ipv6_to_bin_with_shortcut(self):
+ ipv6_str = '3f:10::1:2'
+ val = struct.pack('!8H', 0x3f, 0x10, 0, 0, 0, 0, 0x1, 0x2)
+
+ res = ip.ipv6_to_bin(ipv6_str)
+ eq_(val, res)
+
+ def test_ipv6_to_int(self):
+ ipv6_str = '2013:da8:215:8f2:aa20:66ff:fe4c:9c3c'
+ val = 0x20130da8021508f2aa2066fffe4c9c3c
+
+ res = ip.ipv6_to_int(ipv6_str)
+ eq_(val, res)
+
+ def test_ipv6_to_int_with_shortcut(self):
+ ipv6_str = '3f:10::1:2'
+ val = 0x003f0010000000000000000000010002
+
+ res = ip.ipv6_to_int(ipv6_str)
+ eq_(val, res)
+
+ def test_ipv6_to_str_from_bin(self):
+ ipv6_bin = struct.pack('!8H', 0x2013, 0xda8, 0x215, 0x8f2, 0xaa20,
+ 0x66ff, 0xfe4c, 0x9c3c)
+ val = '2013:da8:215:8f2:aa20:66ff:fe4c:9c3c'
+
+ res = ip.ipv6_to_str(ipv6_bin)
+ eq_(val, res)
+
+ def test_ipv6_to_str_from_int(self):
+ ipv6_int = 0x20130da8021508f2aa2066fffe4c9c3c
+ val = '2013:da8:215:8f2:aa20:66ff:fe4c:9c3c'
+
+ res = ip.ipv6_to_str(ipv6_int)
+ eq_(val, res)
+
+ def test_text_to_bin_from_ipv4_text(self):
+ ipv4_str = '10.28.197.1'
+ val = struct.pack('!4B', 10, 28, 197, 1)
+ res = ip.text_to_bin(ipv4_str)
+ eq_(val, res)
+
+ def test_text_to_bin_from_ipv6_text(self):
+ ipv6_str = '2013:da8:215:8f2:aa20:66ff:fe4c:9c3c'
+ val = struct.pack('!8H', 0x2013, 0xda8, 0x215, 0x8f2, 0xaa20,
+ 0x66ff, 0xfe4c, 0x9c3c)
+ res = ip.text_to_bin(ipv6_str)
+ eq_(val, res)
+
+ def test_text_to_int_from_ipv4_text(self):
+ ipv4_str = '10.28.197.1' # 0a.1c.c5.01
+ val = 0x0a1cc501
+
+ res = ip.text_to_int(ipv4_str)
+ eq_(val, res)
+
+ def test_text_to_int_from_ipv6_text(self):
+ ipv6_str = '2013:da8:215:8f2:aa20:66ff:fe4c:9c3c'
+ val = 0x20130da8021508f2aa2066fffe4c9c3c
+
+ res = ip.text_to_int(ipv6_str)
+ eq_(val, res)
+
+ def test_bin_to_text_from_ipv4_bin(self):
+ ipv4_bin = struct.pack('!4B', 10, 28, 197, 1)
+ val = '10.28.197.1'
+ res = ip.bin_to_text(ipv4_bin)
+ eq_(val, res)
+
+ def test_bin_to_text_from_ipv6_bin(self):
+ ipv6_bin = struct.pack('!8H', 0x2013, 0xda8, 0x215, 0x8f2, 0xaa20,
+ 0x66ff, 0xfe4c, 0x9c3c)
+ val = '2013:da8:215:8f2:aa20:66ff:fe4c:9c3c'
+ res = ip.bin_to_text(ipv6_bin)
+ eq_(val, res)
+
+ @raises(struct.error)
+ def test_bin_to_text_with_invalid_bin(self):
+ invalid_bin = b'invalid'
+
+ ip.bin_to_text(invalid_bin)
diff --git a/tests/unit/lib/test_mac.py b/tests/unit/lib/test_mac.py
new file mode 100644
index 00000000..91839ead
--- /dev/null
+++ b/tests/unit/lib/test_mac.py
@@ -0,0 +1,95 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import struct
+import netaddr
+from struct import *
+from nose.tools import *
+
+from ryu.lib import mac
+
+LOG = logging.getLogger('test_mac')
+
+
+class Test_mac(unittest.TestCase):
+ """ Test case for mac
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_mac_is_multicast(self):
+ addr = b'\x01\x23\x45\x67\x89\x0a'
+ val = True
+
+ res = mac.is_multicast(addr)
+
+ eq_(val, res)
+
+ def test_mac_haddr_to_str(self):
+ addr = 'aa:aa:aa:aa:aa:aa'
+ val = b'\xaa\xaa\xaa\xaa\xaa\xaa'
+
+ res = mac.haddr_to_str(val)
+
+ eq_(addr, res)
+
+ def test_mac_haddr_to_str_none(self):
+ """ addr is None
+ """
+ addr = None
+ val = 'None'
+ res = mac.haddr_to_str(addr)
+
+ eq_(val, res)
+
+ @raises(AssertionError)
+ def test_mac_haddr_to_str_assert(self):
+ val = b'\xaa\xaa\xaa\xaa\xaa'
+
+ res = mac.haddr_to_str(val)
+
+ def test_mac_haddr_to_bin_false(self):
+ """ len(hexes) = 6 (False)
+ """
+ addr = 'aa:aa:aa:aa:aa:aa'
+ val = b'\xaa\xaa\xaa\xaa\xaa\xaa'
+
+ res = mac.haddr_to_bin(addr)
+
+ eq_(val, res)
+
+ @raises(ValueError)
+ def test_mac_haddr_to_bin_true(self):
+ """ len(hexes) != 6 (True)
+ """
+ addr = 'aa:aa:aa:aa:aa'
+ res = mac.haddr_to_bin(addr)
+
+ def test_mac_haddr_bitand(self):
+ addr = b'\xaa\xaa\xaa\xaa\xaa\xaa'
+ mask = b'\xff\xff\xff\x00\x00\x00'
+ val = b'\xaa\xaa\xaa\x00\x00\x00'
+
+ res = mac.haddr_bitand(addr, mask)
+
+ eq_(val, res)
diff --git a/tests/unit/lib/test_mod/__init__.py b/tests/unit/lib/test_mod/__init__.py
new file mode 100644
index 00000000..ca8ef539
--- /dev/null
+++ b/tests/unit/lib/test_mod/__init__.py
@@ -0,0 +1,15 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/tests/unit/lib/test_mod/aaa/__init__.py b/tests/unit/lib/test_mod/aaa/__init__.py
new file mode 100644
index 00000000..ca8ef539
--- /dev/null
+++ b/tests/unit/lib/test_mod/aaa/__init__.py
@@ -0,0 +1,15 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/tests/unit/lib/test_mod/aaa/mod.py b/tests/unit/lib/test_mod/aaa/mod.py
new file mode 100644
index 00000000..a5eff136
--- /dev/null
+++ b/tests/unit/lib/test_mod/aaa/mod.py
@@ -0,0 +1,17 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name = "this is aaa"
diff --git a/tests/unit/lib/test_mod/bbb/__init__.py b/tests/unit/lib/test_mod/bbb/__init__.py
new file mode 100644
index 00000000..ca8ef539
--- /dev/null
+++ b/tests/unit/lib/test_mod/bbb/__init__.py
@@ -0,0 +1,15 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/tests/unit/lib/test_mod/bbb/mod.py b/tests/unit/lib/test_mod/bbb/mod.py
new file mode 100644
index 00000000..397c8554
--- /dev/null
+++ b/tests/unit/lib/test_mod/bbb/mod.py
@@ -0,0 +1,17 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name = "this is bbb"
diff --git a/tests/unit/lib/test_mod/ccc/__init__.py b/tests/unit/lib/test_mod/ccc/__init__.py
new file mode 100644
index 00000000..ce07156d
--- /dev/null
+++ b/tests/unit/lib/test_mod/ccc/__init__.py
@@ -0,0 +1,14 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/tests/unit/lib/test_mod/ccc/mod.py b/tests/unit/lib/test_mod/ccc/mod.py
new file mode 100644
index 00000000..5be826cf
--- /dev/null
+++ b/tests/unit/lib/test_mod/ccc/mod.py
@@ -0,0 +1,16 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name = "this is ccc"
diff --git a/tests/unit/lib/test_mod/ddd/__init__.py b/tests/unit/lib/test_mod/ddd/__init__.py
new file mode 100644
index 00000000..ce07156d
--- /dev/null
+++ b/tests/unit/lib/test_mod/ddd/__init__.py
@@ -0,0 +1,14 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/tests/unit/lib/test_mod/ddd/mod.py b/tests/unit/lib/test_mod/ddd/mod.py
new file mode 100644
index 00000000..31d31d53
--- /dev/null
+++ b/tests/unit/lib/test_mod/ddd/mod.py
@@ -0,0 +1,16 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name = "this is ddd"
diff --git a/tests/unit/lib/test_mod/eee.py b/tests/unit/lib/test_mod/eee.py
new file mode 100644
index 00000000..ed21a8aa
--- /dev/null
+++ b/tests/unit/lib/test_mod/eee.py
@@ -0,0 +1,16 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name = "this is eee"
diff --git a/tests/unit/lib/test_mod/fff.py b/tests/unit/lib/test_mod/fff.py
new file mode 100644
index 00000000..5a565e38
--- /dev/null
+++ b/tests/unit/lib/test_mod/fff.py
@@ -0,0 +1,16 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name = "this is fff"
diff --git a/tests/unit/lib/test_mod/ggg.py b/tests/unit/lib/test_mod/ggg.py
new file mode 100644
index 00000000..29555e56
--- /dev/null
+++ b/tests/unit/lib/test_mod/ggg.py
@@ -0,0 +1,16 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name = "this is ggg"
diff --git a/tests/unit/lib/test_mrtlib.py b/tests/unit/lib/test_mrtlib.py
new file mode 100644
index 00000000..e870f401
--- /dev/null
+++ b/tests/unit/lib/test_mrtlib.py
@@ -0,0 +1,765 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import bz2
+import io
+import logging
+import os
+import sys
+import unittest
+
+try:
+ import mock # Python 2
+except ImportError:
+ from unittest import mock # Python 3
+
+from nose.tools import eq_
+from nose.tools import ok_
+
+from ryu.lib import addrconv
+from ryu.lib import mrtlib
+from ryu.lib.packet import bgp
+from ryu.lib.packet import ospf
+from ryu.utils import binary_str
+
+
+LOG = logging.getLogger(__name__)
+
+MRT_DATA_DIR = os.path.join(
+ os.path.dirname(sys.modules[__name__].__file__), '../../packet_data/mrt/')
+
+
+class TestMrtlib(unittest.TestCase):
+ """
+ Test case for ryu.lib.mrtlib.
+ """
+
+ def test_reader(self):
+ files = [
+ 'rib.20161101.0000_pick.bz2',
+ 'updates.20161101.0000.bz2',
+ ]
+
+ for f in files:
+ # print('\n*** testing mrtlib.Reader with %s ...' % f)
+ counter = 0
+ input_file = os.path.join(MRT_DATA_DIR, f)
+ for record in mrtlib.Reader(bz2.BZ2File(input_file, 'rb')):
+ # print('* No.%d\n%s' % (counter, record))
+ ok_(not isinstance(record, mrtlib.UnknownMrtRecord))
+ counter += 1
+
+ def test_writer(self):
+ files = [
+ 'rib.20161101.0000_pick.bz2',
+ 'updates.20161101.0000.bz2',
+ ]
+
+ for f in files:
+ # print('\n*** testing mrtlib.Writer with %s ...' % f)
+ input_file = os.path.join(MRT_DATA_DIR, f)
+ input_buf = bz2.BZ2File(input_file, 'rb').read()
+ input_records = list(mrtlib.Reader(bz2.BZ2File(input_file, 'rb')))
+
+ counter = 0
+ f = io.BytesIO()
+ mrt_writer = mrtlib.Writer(f)
+ for record in input_records:
+ # print('* No.%d\n%s' % (counter, record))
+ mrt_writer.write(record)
+ counter += 1
+
+ output_buf = f.getvalue()
+
+ eq_(binary_str(input_buf), binary_str(output_buf))
+
+ mrt_writer.close()
+
+ eq_(True, mrt_writer._f.closed)
+
+
+class TestMrtlibMrtRecord(unittest.TestCase):
+ """
+ Test case for ryu.lib.mrtlib.MrtRecord.
+ """
+
+ def test_init_without_type_subtype(self):
+ type_ = mrtlib.MrtRecord.TYPE_TABLE_DUMP
+ subtype = mrtlib.TableDumpMrtRecord.SUBTYPE_AFI_IPv4
+
+ message = mrtlib.TableDumpAfiIPv4MrtMessage(
+ view_num=1,
+ seq_num=2,
+ prefix='192.168.1.0',
+ prefix_len=24,
+ status=1,
+ originated_time=0,
+ peer_ip='10.0.0.1',
+ peer_as=65000,
+ bgp_attributes=[],
+ )
+ record = mrtlib.TableDumpMrtRecord(message)
+
+ eq_(type_, record.type)
+ eq_(subtype, record.subtype)
+
+ def test_parse_pre_with_type_et(self):
+ buf = (
+ b'\x00\x00\x00\x00' # timestamp
+ b'\x00\x11\x00\x00' # type=TYPE_BGP4MP_ET(17), subtype
+ b'\x00\x00\x00\xaa' # length
+ )
+
+ required_len = mrtlib.MrtRecord.parse_pre(buf)
+
+ eq_(0xaa + mrtlib.ExtendedTimestampMrtRecord.HEADER_SIZE,
+ required_len)
+
+
+# Note: MrtCommonRecord is tested in TestMrtlibMrtRecord.
+# class TestMrtlibMrtCommonRecord(unittest.TestCase):
+
+
+class TestMrtlibExtendedTimestampMrtRecord(unittest.TestCase):
+ """
+ Test case for ryu.lib.mrtlib.ExtendedTimestampMrtRecord.
+ """
+
+ def test_parse_extended_header(self):
+ body = b'test'
+ buf = (
+ b'\x11\x11\x11\x11' # ms_timestamp
+ + body
+ )
+
+ (headers,
+ rest) = mrtlib.ExtendedTimestampMrtRecord.parse_extended_header(buf)
+
+ ok_(isinstance(headers, list))
+ eq_(1, len(headers))
+ eq_(0x11111111, headers[0])
+ eq_(body, rest)
+
+ def test_serialize(self):
+ body = b'test' # 4 bytes
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x22\x22\x33\x33' # type, subtype
+ b'\x00\x00\x00\x04' # length=len(body)
+ b'\x44\x44\x44\x44' # ms_timestamp
+ + body
+ )
+
+ message_mock = mock.MagicMock(spec=mrtlib.MrtMessage)
+ message_mock.serialize.return_value = body
+
+ record = mrtlib.ExtendedTimestampMrtRecord(
+ message=message_mock,
+ timestamp=0x11111111,
+ type_=0x2222, subtype=0x3333,
+ ms_timestamp=0x44444444,
+ length=0x00000004,
+ )
+
+ output = record.serialize()
+
+ eq_(buf, output)
+
+
+class TestMrtlibUnknownMrtRecord(unittest.TestCase):
+ """
+ Test case for ryu.lib.mrtlib.UnknownMrtRecord.
+ """
+
+ def test_parse(self):
+ body = b'test' # 4 bytes
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x22\x22\x33\x33' # type, subtype
+ b'\x00\x00\x00\x04' # length=len(body)
+ + body
+ )
+
+ (record, rest) = mrtlib.MrtRecord.parse(buf)
+
+ eq_(0x11111111, record.timestamp)
+ eq_(0x2222, record.type)
+ eq_(0x3333, record.subtype)
+ eq_(0x00000004, record.length)
+ eq_(body, record.message.buf)
+ eq_(b'', rest)
+
+ def test_serialize(self):
+ body = b'test' # 4 bytes
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x22\x22\x33\x33' # type, subtype
+ b'\x00\x00\x00\x04' # length=len(body)
+ + body
+ )
+
+ message = mrtlib.UnknownMrtMessage(buf=body)
+ record = mrtlib.UnknownMrtRecord(
+ message=message,
+ timestamp=0x11111111,
+ type_=0x2222, subtype=0x3333,
+ length=0x00000004,
+ )
+
+ output = record.serialize()
+
+ eq_(buf, output)
+
+
+class TestMrtlibOspf2MrtRecord(unittest.TestCase):
+ """
+ Test case for ryu.lib.mrtlib.Ospf2MrtRecord.
+ """
+
+ @mock.patch('ryu.lib.packet.ospf.ospf.parser')
+ def test_parse(self, mock_ospf_parser):
+ remote_ip = '10.0.0.1'
+ local_ip = '10.0.0.2'
+ body = b'test' # 4 bytes
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x0b\x00\x00' # type=TYPE_OSPFv2(11), subtype
+ b'\x00\x00\x00\x0c' # length=len(remote_ip + local_ip + body)
+ + addrconv.ipv4.text_to_bin(remote_ip) # remote_ip
+ + addrconv.ipv4.text_to_bin(local_ip) # local_ip
+ + body # ospf_message
+ )
+
+ mock_ospf_message = mock.MagicMock(spec=ospf.OSPFMessage)
+ mock_ospf_parser.return_value = (mock_ospf_message, None, '')
+
+ (record, rest) = mrtlib.MrtRecord.parse(buf)
+
+ eq_(0x11111111, record.timestamp)
+ eq_(mrtlib.MrtRecord.TYPE_OSPFv2, record.type)
+ eq_(0x0000, record.subtype)
+ eq_(0x0000000c, record.length)
+ eq_(remote_ip, record.message.remote_ip)
+ eq_(local_ip, record.message.local_ip)
+ eq_(mock_ospf_message, record.message.ospf_message)
+ eq_(b'', rest)
+
+ def test_serialize(self):
+ remote_ip = '10.0.0.1'
+ local_ip = '10.0.0.2'
+ body = b'test' # 4 bytes
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x0b\x00\x00' # type=TYPE_OSPFv2(11), subtype
+ b'\x00\x00\x00\x0c' # length=len(remote_ip + local_ip + body)
+ + addrconv.ipv4.text_to_bin(remote_ip) # remote_ip
+ + addrconv.ipv4.text_to_bin(local_ip) # local_ip
+ + body # ospf_message
+ )
+
+ mock_ospf_message = mock.MagicMock(spec=ospf.OSPFMessage)
+ mock_ospf_message.serialize.return_value = body
+
+ message = mrtlib.Ospf2MrtMessage(
+ remote_ip=remote_ip,
+ local_ip=local_ip,
+ ospf_message=mock_ospf_message,
+ )
+ record = mrtlib.Ospf2MrtRecord(
+ message=message,
+ timestamp=0x11111111,
+ # type_=None,
+ # subtype=None,
+ # length=None,
+ )
+
+ output = record.serialize()
+
+ eq_(buf, output)
+
+
+class TestMrtlibTableDumpMrtRecord(unittest.TestCase):
+ """
+ Test case for ryu.lib.mrtlib.TableDumpMrtRecord.
+ """
+
+ @mock.patch('ryu.lib.packet.bgp._PathAttribute.parser')
+ def test_parse_afi_ipv4(self, mock_bgp_attr_parser):
+ prefix = '10.0.0.0'
+ peer_ip = '172.16.0.1'
+ body = b'test' # 4 bytes
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x0c\x00\x01' # type=TYPE_TABLE_DUMP(12),
+ # subtype=SUBTYPE_AFI_IPv4(1)
+ b'\x00\x00\x00\x1a' # length=26
+ b'\x22\x22\x33\x33' # view_num, seq_num
+ + addrconv.ipv4.text_to_bin(prefix) + # prefix
+ b'\x18\x01' # prefix_len=24, status=1
+ b'\x44\x44\x44\x44' # originated_time
+ + addrconv.ipv4.text_to_bin(peer_ip) + # peer_ip
+ b'\xfd\xe8\x00\x04' # peer_as=65000, attr_len=len(body)
+ + body # bgp_attributes
+ )
+
+ mock_bgp_attr = mock.MagicMock(spec=bgp._PathAttribute)
+ mock_bgp_attr_parser.return_value = (mock_bgp_attr, b'')
+
+ (record, rest) = mrtlib.MrtRecord.parse(buf)
+
+ eq_(0x11111111, record.timestamp)
+ eq_(mrtlib.MrtRecord.TYPE_TABLE_DUMP, record.type)
+ eq_(mrtlib.TableDumpMrtRecord.SUBTYPE_AFI_IPv4, record.subtype)
+ eq_(0x0000001a, record.length)
+ eq_(0x2222, record.message.view_num)
+ eq_(0x3333, record.message.seq_num)
+ eq_(prefix, record.message.prefix)
+ eq_(24, record.message.prefix_len)
+ eq_(1, record.message.status)
+ eq_(0x44444444, record.message.originated_time)
+ eq_(peer_ip, record.message.peer_ip)
+ eq_(65000, record.message.peer_as)
+ eq_(0x0004, record.message.attr_len)
+ eq_([mock_bgp_attr], record.message.bgp_attributes)
+ eq_(b'', rest)
+
+ def test_serialize_afi_ipv4(self):
+ prefix = '10.0.0.0'
+ peer_ip = '172.16.0.1'
+ body = b'test' # 4 bytes
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x0c\x00\x01' # type=TYPE_TABLE_DUMP(12),
+ # subtype=SUBTYPE_AFI_IPv4(1)
+ b'\x00\x00\x00\x1a' # length=26
+ b'\x22\x22\x33\x33' # view_num, seq_num
+ + addrconv.ipv4.text_to_bin(prefix) + # prefix
+ b'\x18\x01' # prefix_len=24, status=1
+ b'\x44\x44\x44\x44' # originated_time
+ + addrconv.ipv4.text_to_bin(peer_ip) + # peer_ip
+ b'\xfd\xe8\x00\x04' # peer_as=65000, attr_len=len(body)
+ + body # bgp_attributes
+ )
+
+ mock_bgp_attr = mock.MagicMock(spec=bgp._PathAttribute)
+ mock_bgp_attr.serialize.return_value = body
+
+ message = mrtlib.TableDumpAfiIPv4MrtMessage(
+ view_num=0x2222,
+ seq_num=0x3333,
+ prefix=prefix,
+ prefix_len=24,
+ status=1,
+ originated_time=0x44444444,
+ peer_ip=peer_ip,
+ peer_as=65000,
+ bgp_attributes=[mock_bgp_attr],
+ # attr_len=4
+ )
+ record = mrtlib.TableDumpMrtRecord(
+ message=message,
+ timestamp=0x11111111,
+ # type_=None,
+ # subtype=None,
+ # length=None,
+ )
+
+ output = record.serialize()
+
+ eq_(buf, output)
+
+ @mock.patch('ryu.lib.packet.bgp._PathAttribute.parser')
+ def test_parse_afi_ipv6(self, mock_bgp_attr_parser):
+ prefix = '2001:db8::1'
+ peer_ip = 'fe80::1'
+ body = b'test' # 4 bytes
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x0c\x00\x02' # type=TYPE_TABLE_DUMP(12),
+ # subtype=SUBTYPE_AFI_IPv6(2)
+ b'\x00\x00\x00\x32' # length=50
+ b'\x22\x22\x33\x33' # view_num, seq_num
+ + addrconv.ipv6.text_to_bin(prefix) + # prefix
+ b'\x40\x01' # prefix_len=64, status=1
+ b'\x44\x44\x44\x44' # originated_time
+ + addrconv.ipv6.text_to_bin(peer_ip) + # peer_ip
+ b'\xfd\xe8\x00\x04' # peer_as=65000, attr_len=len(body)
+ + body # bgp_attributes
+ )
+
+ mock_bgp_attr = mock.MagicMock(spec=bgp._PathAttribute)
+ mock_bgp_attr_parser.return_value = (mock_bgp_attr, b'')
+
+ (record, rest) = mrtlib.MrtRecord.parse(buf)
+
+ eq_(0x11111111, record.timestamp)
+ eq_(mrtlib.MrtRecord.TYPE_TABLE_DUMP, record.type)
+ eq_(mrtlib.TableDumpMrtRecord.SUBTYPE_AFI_IPv6, record.subtype)
+ eq_(0x00000032, record.length)
+ eq_(0x2222, record.message.view_num)
+ eq_(0x3333, record.message.seq_num)
+ eq_(prefix, record.message.prefix)
+ eq_(64, record.message.prefix_len)
+ eq_(1, record.message.status)
+ eq_(0x44444444, record.message.originated_time)
+ eq_(peer_ip, record.message.peer_ip)
+ eq_(65000, record.message.peer_as)
+ eq_(0x0004, record.message.attr_len)
+ eq_([mock_bgp_attr], record.message.bgp_attributes)
+ eq_(b'', rest)
+
+ def test_serialize_afi_ipv6(self):
+ prefix = '2001:db8::1'
+ peer_ip = 'fe80::1'
+ body = b'test' # 4 bytes
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x0c\x00\x02' # type=TYPE_TABLE_DUMP(12),
+ # subtype=SUBTYPE_AFI_IPv6(2)
+ b'\x00\x00\x00\x32' # length=50
+ b'\x22\x22\x33\x33' # view_num, seq_num
+ + addrconv.ipv6.text_to_bin(prefix) + # prefix
+ b'\x40\x01' # prefix_len=64, status=1
+ b'\x44\x44\x44\x44' # originated_time
+ + addrconv.ipv6.text_to_bin(peer_ip) + # peer_ip
+ b'\xfd\xe8\x00\x04' # peer_as=65000, attr_len=len(body)
+ + body # bgp_attributes
+ )
+
+ mock_bgp_attr = mock.MagicMock(spec=bgp._PathAttribute)
+ mock_bgp_attr.serialize.return_value = body
+
+ message = mrtlib.TableDumpAfiIPv6MrtMessage(
+ view_num=0x2222,
+ seq_num=0x3333,
+ prefix=prefix,
+ prefix_len=64,
+ status=1,
+ originated_time=0x44444444,
+ peer_ip=peer_ip,
+ peer_as=65000,
+ bgp_attributes=[mock_bgp_attr],
+ # attr_len=4
+ )
+ record = mrtlib.TableDumpMrtRecord(
+ message=message,
+ timestamp=0x11111111,
+ # type_=None,
+ # subtype=None,
+ # length=None,
+ )
+
+ output = record.serialize()
+
+ eq_(buf, output)
+
+
+class TestMrtlibTableDump2MrtRecord(unittest.TestCase):
+ """
+ Test case for ryu.lib.mrtlib.TableDump2MrtRecord.
+ """
+
+ # Note: The classes corresponding to the following subtypes are
+ # tested in TestMrtlibMrtRecord.
+ # - SUBTYPE_PEER_INDEX_TABLE = 1
+ # - SUBTYPE_RIB_IPV4_UNICAST = 2
+ # - SUBTYPE_RIB_IPV4_MULTICAST = 3
+ # - SUBTYPE_RIB_IPV6_UNICAST = 4
+ # - SUBTYPE_RIB_IPV6_MULTICAST = 5
+
+ @mock.patch('ryu.lib.mrtlib.MrtRibEntry.parse')
+ @mock.patch('ryu.lib.packet.bgp.BGPNLRI.parser')
+ def test_parse_rib_generic(self, mock_nlri_parser, mock_rib_entry_parser):
+ nlri_bin = b'nlri' # 4 bytes
+ rib_entries_bin = b'ribs' # 4 bytes
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x0d\x00\x06' # type=TYPE_TABLE_DUMP_V2(13),
+ # subtype=SUBTYPE_RIB_GENERIC(6)
+ b'\x00\x00\x00\x11' # length=17
+ b'\x22\x22\x22\x22' # seq_num
+ b'\x33\x33\x44' # afi, safi
+ + nlri_bin + # nlri
+ b'\x00\x01' # entry_count
+ + rib_entries_bin # rib_entries
+ )
+ buf_entries = (
+ b'\x00\x01' # entry_count
+ + rib_entries_bin # rib_entries
+ )
+
+ mock_bgp_nlri = mock.MagicMock(spec=bgp._AddrPrefix)
+ mock_nlri_parser.return_value = (mock_bgp_nlri, buf_entries)
+
+ mock_rib_entry = mock.MagicMock(spec=mrtlib.MrtRibEntry)
+ mock_rib_entry_parser.return_value = (mock_rib_entry, b'')
+
+ (record, rest) = mrtlib.MrtRecord.parse(buf)
+
+ eq_(0x11111111, record.timestamp)
+ eq_(mrtlib.MrtRecord.TYPE_TABLE_DUMP_V2, record.type)
+ eq_(mrtlib.TableDump2MrtRecord.SUBTYPE_RIB_GENERIC, record.subtype)
+ eq_(0x00000011, record.length)
+ eq_(0x22222222, record.message.seq_num)
+ eq_(0x3333, record.message.afi)
+ eq_(0x44, record.message.safi)
+ eq_(mock_bgp_nlri, record.message.nlri)
+ eq_(0x0001, record.message.entry_count)
+ eq_([mock_rib_entry], record.message.rib_entries)
+ eq_(b'', rest)
+
+ def test_serialize_rib_generic(self):
+ nlri_bin = b'nlri' # 4 bytes
+ rib_entries_bin = b'ribs' # 4 bytes
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x0d\x00\x06' # type=TYPE_TABLE_DUMP_V2(13),
+ # subtype=SUBTYPE_RIB_GENERIC(6)
+ b'\x00\x00\x00\x11' # length=17
+ b'\x22\x22\x22\x22' # seq_num
+ b'\x33\x33\x44' # afi, safi
+ + nlri_bin + # nlri
+ b'\x00\x01' # entry_count
+ + rib_entries_bin # rib_entries
+ )
+
+ mock_bgp_nlri = mock.MagicMock(spec=bgp._AddrPrefix)
+ mock_bgp_nlri.serialize.return_value = nlri_bin
+
+ mock_rib_entry = mock.MagicMock(spec=mrtlib.MrtRibEntry)
+ mock_rib_entry.serialize.return_value = rib_entries_bin
+
+ message = mrtlib.TableDump2RibGenericMrtMessage(
+ seq_num=0x22222222,
+ afi=0x3333,
+ safi=0x44,
+ nlri=mock_bgp_nlri,
+ rib_entries=[mock_rib_entry],
+ # entry_count=1,
+ )
+ record = mrtlib.TableDump2MrtRecord(
+ message=message,
+ timestamp=0x11111111,
+ # type_=None,
+ # subtype=None,
+ # length=None,
+ )
+
+ output = record.serialize()
+
+ eq_(buf, output)
+
+
+class TestMrtlibMrtPeer(unittest.TestCase):
+ """
+ Test case for ryu.lib.mrtlib.MrtPeer.
+ """
+
+ def test_parse_two_octet_as(self):
+ bgp_id = '1.1.1.1'
+ ip_addr = '10.0.0.1'
+ buf = (
+ b'\x00' # type
+ + addrconv.ipv4.text_to_bin(bgp_id) # bgp_id
+ + addrconv.ipv4.text_to_bin(ip_addr) + # ip_addr
+ b'\xfd\xe8' # as_num
+ )
+
+ peer, rest = mrtlib.MrtPeer.parse(buf)
+
+ eq_(0, peer.type)
+ eq_(bgp_id, peer.bgp_id)
+ eq_(ip_addr, peer.ip_addr)
+ eq_(65000, peer.as_num)
+ eq_(b'', rest)
+
+ def test_serialize_two_octet_as(self):
+ bgp_id = '1.1.1.1'
+ ip_addr = '10.0.0.1'
+ buf = (
+ b'\x00' # type
+ + addrconv.ipv4.text_to_bin(bgp_id) # bgp_id
+ + addrconv.ipv4.text_to_bin(ip_addr) + # ip_addr
+ b'\xfd\xe8' # as_num
+ )
+
+ peer = mrtlib.MrtPeer(
+ bgp_id=bgp_id,
+ ip_addr=ip_addr,
+ as_num=65000,
+ # type_=0,
+ )
+
+ output = peer.serialize()
+
+ eq_(buf, output)
+
+
+class TestMrtlibBgp4MpMrtRecord(unittest.TestCase):
+ """
+ Test case for ryu.lib.mrtlib.Bgp4MpMrtRecord.
+ """
+
+ # Note: The classes corresponding to the following subtypes are
+ # tested in TestMrtlibMrtRecord.
+ # - SUBTYPE_BGP4MP_MESSAGE = 1
+ # - SUBTYPE_BGP4MP_MESSAGE_AS4 = 4
+ # - SUBTYPE_BGP4MP_STATE_CHANGE_AS4 = 5
+ # - SUBTYPE_BGP4MP_MESSAGE_LOCAL = 6
+ # - SUBTYPE_BGP4MP_MESSAGE_AS4_LOCAL = 7
+
+ def test_parse_state_change_afi_ipv4(self):
+ peer_ip = '10.0.0.1'
+ local_ip = '10.0.0.2'
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x10\x00\x00' # type=TYPE_BGP4MP(16),
+ # subtype=SUBTYPE_BGP4MP_STATE_CHANGE(0)
+ b'\x00\x00\x00\x14' # length=20
+ b'\xfd\xe9\xfd\xea' # peer_as=65001, local_as=65002
+ b'\x22\x22\x00\x01' # if_index, addr_family=AFI_IPv4(1)
+ + addrconv.ipv4.text_to_bin(peer_ip) # peer_ip
+ + addrconv.ipv4.text_to_bin(local_ip) + # local_ip
+ b'\x00\x01\x00\x02' # old_state=STATE_IDLE(1),
+ # new_state=STATE_CONNECT(2)
+ )
+
+ (record, rest) = mrtlib.MrtRecord.parse(buf)
+
+ eq_(0x11111111, record.timestamp)
+ eq_(mrtlib.MrtRecord.TYPE_BGP4MP, record.type)
+ eq_(mrtlib.Bgp4MpMrtRecord.SUBTYPE_BGP4MP_STATE_CHANGE, record.subtype)
+ eq_(0x00000014, record.length)
+ eq_(65001, record.message.peer_as)
+ eq_(65002, record.message.local_as)
+ eq_(0x2222, record.message.if_index)
+ eq_(mrtlib.Bgp4MpStateChangeMrtMessage.AFI_IPv4,
+ record.message.afi)
+ eq_(mrtlib.Bgp4MpStateChangeMrtMessage.STATE_IDLE,
+ record.message.old_state)
+ eq_(mrtlib.Bgp4MpStateChangeMrtMessage.STATE_CONNECT,
+ record.message.new_state)
+ eq_(b'', rest)
+
+ def test_serialize_state_change_afi_ipv4(self):
+ peer_ip = '10.0.0.1'
+ local_ip = '10.0.0.2'
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x10\x00\x00' # type=TYPE_BGP4MP(16),
+ # subtype=SUBTYPE_BGP4MP_STATE_CHANGE(0)
+ b'\x00\x00\x00\x14' # length=20
+ b'\xfd\xe9\xfd\xea' # peer_as=65001, local_as=65002
+ b'\x22\x22\x00\x01' # if_index, addr_family=AFI_IPv4(1)
+ + addrconv.ipv4.text_to_bin(peer_ip) # peer_ip
+ + addrconv.ipv4.text_to_bin(local_ip) + # local_ip
+ b'\x00\x01\x00\x02' # old_state=STATE_IDLE(1),
+ # new_state=STATE_CONNECT(2)
+ )
+
+ message = mrtlib.Bgp4MpStateChangeMrtMessage(
+ peer_as=65001,
+ local_as=65002,
+ if_index=0x2222,
+ peer_ip=peer_ip,
+ local_ip=local_ip,
+ old_state=mrtlib.Bgp4MpStateChangeMrtMessage.STATE_IDLE,
+ new_state=mrtlib.Bgp4MpStateChangeMrtMessage.STATE_CONNECT,
+ # afi=mrtlib.Bgp4MpStateChangeMrtMessage.AFI_IPv4,
+ )
+ record = mrtlib.Bgp4MpMrtRecord(
+ message=message,
+ timestamp=0x11111111,
+ # type_=None,
+ # subtype=None,
+ # length=None,
+ )
+
+ output = record.serialize()
+
+ eq_(buf, output)
+
+ def test_parse_state_change_afi_ipv6(self):
+ peer_ip = 'fe80::1'
+ local_ip = 'fe80::2'
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x10\x00\x00' # type=TYPE_BGP4MP(16),
+ # subtype=SUBTYPE_BGP4MP_STATE_CHANGE(0)
+ b'\x00\x00\x00\x2c' # length=44
+ b'\xfd\xe9\xfd\xea' # peer_as=65001, local_as=65002
+ b'\x22\x22\x00\x02' # if_index, addr_family=AFI_IPv6(2)
+ + addrconv.ipv6.text_to_bin(peer_ip) # peer_ip
+ + addrconv.ipv6.text_to_bin(local_ip) + # local_ip
+ b'\x00\x01\x00\x02' # old_state=STATE_IDLE(1),
+ # new_state=STATE_CONNECT(2)
+ )
+
+ (record, rest) = mrtlib.MrtRecord.parse(buf)
+
+ eq_(0x11111111, record.timestamp)
+ eq_(mrtlib.MrtRecord.TYPE_BGP4MP, record.type)
+ eq_(mrtlib.Bgp4MpMrtRecord.SUBTYPE_BGP4MP_STATE_CHANGE, record.subtype)
+ eq_(0x0000002c, record.length)
+ eq_(65001, record.message.peer_as)
+ eq_(65002, record.message.local_as)
+ eq_(0x2222, record.message.if_index)
+ eq_(mrtlib.Bgp4MpStateChangeMrtMessage.AFI_IPv6,
+ record.message.afi)
+ eq_(mrtlib.Bgp4MpStateChangeMrtMessage.STATE_IDLE,
+ record.message.old_state)
+ eq_(mrtlib.Bgp4MpStateChangeMrtMessage.STATE_CONNECT,
+ record.message.new_state)
+ eq_(b'', rest)
+
+ def test_serialize_state_change_afi_ipv6(self):
+ peer_ip = 'fe80::1'
+ local_ip = 'fe80::2'
+ buf = (
+ b'\x11\x11\x11\x11' # timestamp
+ b'\x00\x10\x00\x00' # type=TYPE_BGP4MP(16),
+ # subtype=SUBTYPE_BGP4MP_STATE_CHANGE(0)
+ b'\x00\x00\x00\x2c' # length=44
+ b'\xfd\xe9\xfd\xea' # peer_as=65001, local_as=65002
+ b'\x22\x22\x00\x02' # if_index, addr_family=AFI_IPv6(2)
+ + addrconv.ipv6.text_to_bin(peer_ip) # peer_ip
+ + addrconv.ipv6.text_to_bin(local_ip) + # local_ip
+ b'\x00\x01\x00\x02' # old_state=STATE_IDLE(1),
+ # new_state=STATE_CONNECT(2)
+ )
+
+ message = mrtlib.Bgp4MpStateChangeMrtMessage(
+ peer_as=65001,
+ local_as=65002,
+ if_index=0x2222,
+ peer_ip=peer_ip,
+ local_ip=local_ip,
+ old_state=mrtlib.Bgp4MpStateChangeMrtMessage.STATE_IDLE,
+ new_state=mrtlib.Bgp4MpStateChangeMrtMessage.STATE_CONNECT,
+ # afi=mrtlib.Bgp4MpStateChangeMrtMessage.AFI_IPv4,
+ )
+ record = mrtlib.Bgp4MpMrtRecord(
+ message=message,
+ timestamp=0x11111111,
+ # type_=None,
+ # subtype=None,
+ # length=None,
+ )
+
+ output = record.serialize()
+
+ eq_(buf, output)
diff --git a/tests/unit/lib/test_of_config_classes.py b/tests/unit/lib/test_of_config_classes.py
new file mode 100644
index 00000000..5b0dd6d3
--- /dev/null
+++ b/tests/unit/lib/test_of_config_classes.py
@@ -0,0 +1,442 @@
+# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2014 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+from nose.tools import eq_
+from nose.tools import ok_
+
+import sys
+import lxml.etree as ET
+from formencode.doctest_xml_compare import xml_compare
+
+from ryu.lib.of_config import classes as ofc
+
+
+GET = """<ns0:capable-switch xmlns:ns0="urn:onf:of111:config:yang">
+ <ns0:id>CapableSwitch0</ns0:id>
+ <ns0:resources>
+ <ns0:port>
+ <ns0:resource-id>LogicalSwitch9-Port4</ns0:resource-id>
+ <ns0:number>4</ns0:number>
+ <ns0:name>Port4</ns0:name>
+ <ns0:current-rate>5000</ns0:current-rate>
+ <ns0:max-rate>5000</ns0:max-rate>
+ <ns0:configuration>
+ <ns0:admin-state>up</ns0:admin-state>
+ <ns0:no-receive>false</ns0:no-receive>
+ <ns0:no-forward>false</ns0:no-forward>
+ <ns0:no-packet-in>false</ns0:no-packet-in>
+ </ns0:configuration>
+ <ns0:state>
+ <ns0:oper-state>up</ns0:oper-state>
+ <ns0:blocked>false</ns0:blocked>
+ <ns0:live>true</ns0:live>
+ </ns0:state>
+ <ns0:features>
+ <ns0:current>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:current>
+ <ns0:advertised>
+ <ns0:rate>other</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:advertised>
+ <ns0:supported>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:supported>
+ <ns0:advertised-peer>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:advertised-peer>
+ </ns0:features>
+ </ns0:port>
+ <ns0:port>
+ <ns0:resource-id>LogicalSwitch9-Port3</ns0:resource-id>
+ <ns0:number>3</ns0:number>
+ <ns0:name>Port3</ns0:name>
+ <ns0:current-rate>5000</ns0:current-rate>
+ <ns0:max-rate>5000</ns0:max-rate>
+ <ns0:configuration>
+ <ns0:admin-state>up</ns0:admin-state>
+ <ns0:no-receive>false</ns0:no-receive>
+ <ns0:no-forward>false</ns0:no-forward>
+ <ns0:no-packet-in>false</ns0:no-packet-in>
+ </ns0:configuration>
+ <ns0:state>
+ <ns0:oper-state>up</ns0:oper-state>
+ <ns0:blocked>false</ns0:blocked>
+ <ns0:live>true</ns0:live>
+ </ns0:state>
+ <ns0:features>
+ <ns0:current>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:current>
+ <ns0:advertised>
+ <ns0:rate>other</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:advertised>
+ <ns0:supported>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:supported>
+ <ns0:advertised-peer>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:advertised-peer>
+ </ns0:features>
+ </ns0:port>
+ <ns0:port>
+ <ns0:resource-id>LogicalSwitch7-Port2</ns0:resource-id>
+ <ns0:number>2</ns0:number>
+ <ns0:name>Port2</ns0:name>
+ <ns0:current-rate>5000</ns0:current-rate>
+ <ns0:max-rate>5000</ns0:max-rate>
+ <ns0:configuration>
+ <ns0:admin-state>up</ns0:admin-state>
+ <ns0:no-receive>false</ns0:no-receive>
+ <ns0:no-forward>false</ns0:no-forward>
+ <ns0:no-packet-in>false</ns0:no-packet-in>
+ </ns0:configuration>
+ <ns0:state>
+ <ns0:oper-state>up</ns0:oper-state>
+ <ns0:blocked>false</ns0:blocked>
+ <ns0:live>true</ns0:live>
+ </ns0:state>
+ <ns0:features>
+ <ns0:current>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:current>
+ <ns0:advertised>
+ <ns0:rate>other</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:advertised>
+ <ns0:supported>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:supported>
+ <ns0:advertised-peer>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:advertised-peer>
+ </ns0:features>
+ </ns0:port>
+ <ns0:port>
+ <ns0:resource-id>LogicalSwitch7-Port1</ns0:resource-id>
+ <ns0:number>1</ns0:number>
+ <ns0:name>Port1</ns0:name>
+ <ns0:current-rate>5000</ns0:current-rate>
+ <ns0:max-rate>5000</ns0:max-rate>
+ <ns0:configuration>
+ <ns0:admin-state>up</ns0:admin-state>
+ <ns0:no-receive>false</ns0:no-receive>
+ <ns0:no-forward>false</ns0:no-forward>
+ <ns0:no-packet-in>false</ns0:no-packet-in>
+ </ns0:configuration>
+ <ns0:state>
+ <ns0:oper-state>up</ns0:oper-state>
+ <ns0:blocked>false</ns0:blocked>
+ <ns0:live>true</ns0:live>
+ </ns0:state>
+ <ns0:features>
+ <ns0:current>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:current>
+ <ns0:advertised>
+ <ns0:rate>other</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:advertised>
+ <ns0:supported>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:supported>
+ <ns0:advertised-peer>
+ <ns0:rate>100Mb-FD</ns0:rate>
+ <ns0:auto-negotiate>true</ns0:auto-negotiate>
+ <ns0:medium>copper</ns0:medium>
+ <ns0:pause>unsupported</ns0:pause>
+ </ns0:advertised-peer>
+ </ns0:features>
+ </ns0:port>
+ <ns0:queue>
+ <ns0:resource-id>LogicalSwitch9-Port4-Queue992</ns0:resource-id>
+ <ns0:id>992</ns0:id>
+ <ns0:port>4</ns0:port>
+ <ns0:properties>
+ <ns0:min-rate>10</ns0:min-rate>
+ <ns0:max-rate>130</ns0:max-rate>
+ </ns0:properties>
+ </ns0:queue>
+ <ns0:queue>
+ <ns0:resource-id>LogicalSwitch9-Port4-Queue991</ns0:resource-id>
+ <ns0:id>991</ns0:id>
+ <ns0:port>4</ns0:port>
+ <ns0:properties>
+ <ns0:min-rate>10</ns0:min-rate>
+ <ns0:max-rate>120</ns0:max-rate>
+ </ns0:properties>
+ </ns0:queue>
+ <ns0:queue>
+ <ns0:resource-id>LogicalSwitch7-Port2-Queue994</ns0:resource-id>
+ <ns0:id>994</ns0:id>
+ <ns0:port>2</ns0:port>
+ <ns0:properties>
+ <ns0:min-rate>400</ns0:min-rate>
+ <ns0:max-rate>900</ns0:max-rate>
+ </ns0:properties>
+ </ns0:queue>
+ <ns0:queue>
+ <ns0:resource-id>LogicalSwitch7-Port2-Queue993</ns0:resource-id>
+ <ns0:id>993</ns0:id>
+ <ns0:port>2</ns0:port>
+ <ns0:properties>
+ <ns0:min-rate>200</ns0:min-rate>
+ <ns0:max-rate>300</ns0:max-rate>
+ </ns0:properties>
+ </ns0:queue>
+ </ns0:resources>
+ <ns0:logical-switches>
+ <ns0:switch>
+ <ns0:id>LogicalSwitch9</ns0:id>
+ <ns0:capabilities>
+ <ns0:max-buffered-packets>0</ns0:max-buffered-packets>
+ <ns0:max-tables>255</ns0:max-tables>
+ <ns0:max-ports>16777216</ns0:max-ports>
+ <ns0:flow-statistics>true</ns0:flow-statistics>
+ <ns0:table-statistics>true</ns0:table-statistics>
+ <ns0:port-statistics>true</ns0:port-statistics>
+ <ns0:group-statistics>true</ns0:group-statistics>
+ <ns0:queue-statistics>true</ns0:queue-statistics>
+ <ns0:reassemble-ip-fragments>false</ns0:reassemble-ip-fragments>
+ <ns0:block-looping-ports>false</ns0:block-looping-ports>
+ <ns0:reserved-port-types>
+ <ns0:type>all</ns0:type>
+ <ns0:type>controller</ns0:type>
+ <ns0:type>table</ns0:type>
+ <ns0:type>inport</ns0:type>
+ <ns0:type>any</ns0:type>
+ </ns0:reserved-port-types>
+ <ns0:group-types>
+ <ns0:type>all</ns0:type>
+ <ns0:type>select</ns0:type>
+ <ns0:type>indirect</ns0:type>
+ <ns0:type>fast-failover</ns0:type>
+ </ns0:group-types>
+ <ns0:group-capabilities>
+ <ns0:capability>select-weight</ns0:capability>
+ <ns0:capability>select-liveness</ns0:capability>
+ <ns0:capability>chaining</ns0:capability>
+ </ns0:group-capabilities>
+ <ns0:action-types>
+ <ns0:type>output</ns0:type>
+ <ns0:type>group</ns0:type>
+ <ns0:type>set-queue</ns0:type>
+ <ns0:type>set-mpls-ttl</ns0:type>
+ <ns0:type>dec-mpls-ttl</ns0:type>
+ <ns0:type>set-nw-ttl</ns0:type>
+ <ns0:type>dec-nw-ttl</ns0:type>
+ <ns0:type>copy-ttl-out</ns0:type>
+ <ns0:type>copy-ttl-in</ns0:type>
+ <ns0:type>push-vlan</ns0:type>
+ <ns0:type>pop-vlan</ns0:type>
+ <ns0:type>push-mpls</ns0:type>
+ <ns0:type>pop-mpls</ns0:type>
+ <ns0:type>push-pbb</ns0:type>
+ <ns0:type>pop-pbb</ns0:type>
+ <ns0:type>set-field</ns0:type>
+ </ns0:action-types>
+ <ns0:instruction-types>
+ <ns0:type>goto-table</ns0:type>
+ <ns0:type>write-metadata</ns0:type>
+ <ns0:type>write-actions</ns0:type>
+ <ns0:type>apply-actions</ns0:type>
+ <ns0:type>clear-actions</ns0:type>
+ <ns0:type>meter</ns0:type>
+ </ns0:instruction-types>
+ </ns0:capabilities>
+ <ns0:datapath-id>08:60:6E:7F:74:E7:00:09</ns0:datapath-id>
+ <ns0:enabled>true</ns0:enabled>
+ <ns0:check-controller-certificate>false
+ </ns0:check-controller-certificate>
+ <ns0:lost-connection-behavior>failSecureMode
+ </ns0:lost-connection-behavior>
+ <ns0:controllers>
+ <ns0:controller>
+ <ns0:id>Switch9-Controller</ns0:id>
+ <ns0:role>equal</ns0:role>
+ <ns0:ip-address>127.0.0.1</ns0:ip-address>
+ <ns0:port>6633</ns0:port>
+ <ns0:protocol>tcp</ns0:protocol>
+ <ns0:state>
+ <ns0:connection-state>down</ns0:connection-state>
+ <ns0:supported-versions>1.3</ns0:supported-versions>
+ </ns0:state>
+ </ns0:controller>
+ </ns0:controllers>
+ <ns0:resources>
+ <ns0:port>LogicalSwitch9-Port4</ns0:port>
+ <ns0:port>LogicalSwitch9-Port3</ns0:port>
+ <ns0:queue>LogicalSwitch9-Port4-Queue992</ns0:queue>
+ <ns0:queue>LogicalSwitch9-Port4-Queue991</ns0:queue>
+ </ns0:resources>
+ </ns0:switch>
+ <ns0:switch>
+ <ns0:id>LogicalSwitch7</ns0:id>
+ <ns0:capabilities>
+ <ns0:max-buffered-packets>0</ns0:max-buffered-packets>
+ <ns0:max-tables>255</ns0:max-tables>
+ <ns0:max-ports>16777216</ns0:max-ports>
+ <ns0:flow-statistics>true</ns0:flow-statistics>
+ <ns0:table-statistics>true</ns0:table-statistics>
+ <ns0:port-statistics>true</ns0:port-statistics>
+ <ns0:group-statistics>true</ns0:group-statistics>
+ <ns0:queue-statistics>true</ns0:queue-statistics>
+ <ns0:reassemble-ip-fragments>false</ns0:reassemble-ip-fragments>
+ <ns0:block-looping-ports>false</ns0:block-looping-ports>
+ <ns0:reserved-port-types>
+ <ns0:type>all</ns0:type>
+ <ns0:type>controller</ns0:type>
+ <ns0:type>table</ns0:type>
+ <ns0:type>inport</ns0:type>
+ <ns0:type>any</ns0:type>
+ </ns0:reserved-port-types>
+ <ns0:group-types>
+ <ns0:type>all</ns0:type>
+ <ns0:type>select</ns0:type>
+ <ns0:type>indirect</ns0:type>
+ <ns0:type>fast-failover</ns0:type>
+ </ns0:group-types>
+ <ns0:group-capabilities>
+ <ns0:capability>select-weight</ns0:capability>
+ <ns0:capability>select-liveness</ns0:capability>
+ <ns0:capability>chaining</ns0:capability>
+ </ns0:group-capabilities>
+ <ns0:action-types>
+ <ns0:type>output</ns0:type>
+ <ns0:type>group</ns0:type>
+ <ns0:type>set-queue</ns0:type>
+ <ns0:type>set-mpls-ttl</ns0:type>
+ <ns0:type>dec-mpls-ttl</ns0:type>
+ <ns0:type>set-nw-ttl</ns0:type>
+ <ns0:type>dec-nw-ttl</ns0:type>
+ <ns0:type>copy-ttl-out</ns0:type>
+ <ns0:type>copy-ttl-in</ns0:type>
+ <ns0:type>push-vlan</ns0:type>
+ <ns0:type>pop-vlan</ns0:type>
+ <ns0:type>push-mpls</ns0:type>
+ <ns0:type>pop-mpls</ns0:type>
+ <ns0:type>set-field</ns0:type>
+ </ns0:action-types>
+ <ns0:instruction-types>
+ <ns0:type>goto-table</ns0:type>
+ <ns0:type>write-metadata</ns0:type>
+ <ns0:type>write-actions</ns0:type>
+ <ns0:type>apply-actions</ns0:type>
+ <ns0:type>clear-actions</ns0:type>
+ </ns0:instruction-types>
+ </ns0:capabilities>
+ <ns0:datapath-id>08:60:6E:7F:74:E7:00:07</ns0:datapath-id>
+ <ns0:enabled>true</ns0:enabled>
+ <ns0:check-controller-certificate>false
+ </ns0:check-controller-certificate>
+ <ns0:lost-connection-behavior>failSecureMode
+ </ns0:lost-connection-behavior>
+ <ns0:controllers>
+ <ns0:controller>
+ <ns0:id>Switch7-Controller</ns0:id>
+ <ns0:role>equal</ns0:role>
+ <ns0:ip-address>127.0.0.1</ns0:ip-address>
+ <ns0:port>6633</ns0:port>
+ <ns0:protocol>tcp</ns0:protocol>
+ <ns0:state>
+ <ns0:connection-state>down</ns0:connection-state>
+ <ns0:supported-versions>1.2</ns0:supported-versions>
+ </ns0:state>
+ </ns0:controller>
+ </ns0:controllers>
+ <ns0:resources>
+ <ns0:port>LogicalSwitch7-Port2</ns0:port>
+ <ns0:port>LogicalSwitch7-Port1</ns0:port>
+ <ns0:queue>LogicalSwitch7-Port2-Queue994</ns0:queue>
+ <ns0:queue>LogicalSwitch7-Port2-Queue993</ns0:queue>
+ </ns0:resources>
+ </ns0:switch>
+ </ns0:logical-switches>
+</ns0:capable-switch>
+"""
+
+
+class Test_of_config_classes(unittest.TestCase):
+ """ Test case for ryu.lib.of_config.classes
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_parse(self):
+ for xml0 in [GET]:
+ o = ofc.OFCapableSwitchType.from_xml(xml0)
+ xml1 = o.to_xml('capable-switch')
+ ok_(xml_compare(ET.fromstring(xml0), ET.fromstring(xml1),
+ reporter=sys.stderr.write))
+
+ def test_alt_names(self):
+ xml0 = GET
+ o = ofc.OFCapableSwitchType.from_xml(xml0)
+ eq_(o.logical_switches, getattr(o, 'logical_switches'))
+ eq_(o.logical_switches, getattr(o, 'logical-switches'))
+
+ def test_iterate(self):
+ xml0 = GET
+ o = ofc.OFCapableSwitchType.from_xml(xml0)
+ for lsw in o.logical_switches.switch:
+ ok_(str(lsw.id).startswith('LogicalSwitch'))
diff --git a/tests/unit/lib/test_ofctl.py b/tests/unit/lib/test_ofctl.py
new file mode 100644
index 00000000..57fa8355
--- /dev/null
+++ b/tests/unit/lib/test_ofctl.py
@@ -0,0 +1,643 @@
+# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import functools
+import json
+import logging
+from nose.tools import eq_
+import os
+import sys
+import unittest
+
+from ryu.lib import ofctl_v1_0
+from ryu.lib import ofctl_v1_2
+from ryu.lib import ofctl_v1_3
+from ryu.lib import ofctl_v1_4
+from ryu.lib import ofctl_v1_5
+from ryu.ofproto import ofproto_parser
+from ryu.ofproto.ofproto_protocol import ProtocolDesc
+
+from tests import test_lib
+
+LOG = logging.getLogger(__name__)
+
+
+class DummyDatapath(ProtocolDesc):
+
+ def __init__(self, version):
+ super(DummyDatapath, self).__init__(version)
+ self.id = 1 # XXX
+ self.request_msg = None
+ self.reply_msg = None
+ self.waiters = None
+
+ @staticmethod
+ def set_xid(msg):
+ msg.set_xid(0)
+ return 0
+
+ def send_msg(self, msg):
+ msg.serialize()
+ self.request_msg = msg
+
+ if self.reply_msg:
+ lock, msgs = self.waiters[self.id][msg.xid]
+ msgs.append(self.reply_msg)
+ del self.waiters[self.id][msg.xid]
+ lock.set()
+
+ def set_reply(self, msg, waiters):
+ self.reply_msg = msg
+ self.waiters = waiters
+
+
+class Test_ofctl(unittest.TestCase):
+
+ def _test(self, name, dp, method, args, request, reply, expected):
+ print('processing %s ...' % name)
+ waiters = {}
+ dp.set_reply(reply, waiters)
+ if reply:
+ output = method(dp=dp, waiters=waiters, **args)
+ else:
+ output = method(dp=dp, **args)
+
+ # expected message <--> sent message
+ request.serialize()
+ try:
+ eq_(json.dumps(request.to_jsondict(), sort_keys=True),
+ json.dumps(dp.request_msg.to_jsondict(), sort_keys=True))
+ except AssertionError as e:
+ # For debugging
+ json.dump(dp.request_msg.to_jsondict(),
+ open('/tmp/' + name + '_request.json', 'w'),
+ indent=3, sort_keys=True)
+ raise e
+
+ # expected output <--> return of ofctl
+ def _remove(d, names):
+ def f(x):
+ return _remove(x, names)
+
+ if isinstance(d, list):
+ return list(map(f, d))
+ if isinstance(d, dict):
+ d2 = {}
+ for k, v in d.items():
+ if k in names:
+ continue
+ d2[k] = f(v)
+ return d2
+ return d
+
+ expected = _remove(expected, ['len', 'length'])
+ output = _remove(output, ['len', 'length'])
+ try:
+ eq_(json.dumps(expected, sort_keys=True),
+ json.dumps(output, sort_keys=True))
+ except AssertionError as e:
+ # For debugging
+ json.dump(output, open('/tmp/' + name + '_reply.json', 'w'),
+ indent=4)
+ raise e
+
+
+def _add_tests():
+ _ofp_vers = {
+ 'of10': 0x01,
+ 'of12': 0x03,
+ 'of13': 0x04,
+ 'of14': 0x05,
+ 'of15': 0x06,
+ }
+
+ _test_cases = {
+ 'of10': [
+ {
+ 'method': ofctl_v1_0.mod_flow_entry,
+ 'request': '1-2-ofp_flow_mod.packet.json',
+ 'reply': None
+ },
+ ],
+ 'of12': [
+ {
+ 'method': ofctl_v1_2.get_desc_stats,
+ 'request': '3-24-ofp_desc_stats_request.packet.json',
+ 'reply': '3-0-ofp_desc_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_queue_stats,
+ 'request': '3-37-ofp_queue_stats_request.packet.json',
+ 'reply': '3-38-ofp_queue_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_queue_stats,
+ 'request': 'lib-ofctl-ofp_queue_stats_request.packet1.json',
+ 'reply': '3-38-ofp_queue_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_queue_stats,
+ 'request': 'lib-ofctl-ofp_queue_stats_request.packet2.json',
+ 'reply': '3-38-ofp_queue_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_queue_stats,
+ 'request': 'lib-ofctl-ofp_queue_stats_request.packet3.json',
+ 'reply': '3-38-ofp_queue_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_queue_config,
+ 'request': '3-35-ofp_queue_get_config_request.packet.json',
+ 'reply': '3-36-ofp_queue_get_config_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_queue_config,
+ 'request': 'lib-ofctl-ofp_queue_get_config_request.packet.json',
+ 'reply': '3-36-ofp_queue_get_config_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_flow_stats,
+ 'request': '3-11-ofp_flow_stats_request.packet.json',
+ 'reply': '3-12-ofp_flow_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_aggregate_flow_stats,
+ 'request': '3-25-ofp_aggregate_stats_request.packet.json',
+ 'reply': '3-26-ofp_aggregate_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_table_stats,
+ 'request': '3-27-ofp_table_stats_request.packet.json',
+ 'reply': '3-28-ofp_table_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_port_stats,
+ 'request': '3-29-ofp_port_stats_request.packet.json',
+ 'reply': '3-30-ofp_port_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_port_stats,
+ 'request': 'lib-ofctl-ofp_port_stats_request.packet.json',
+ 'reply': '3-30-ofp_port_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_group_stats,
+ 'request': '3-61-ofp_group_stats_request.packet.json',
+ 'reply': '3-62-ofp_group_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_group_stats,
+ 'request': 'lib-ofctl-ofp_group_stats_request.packet.json',
+ 'reply': '3-62-ofp_group_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_group_features,
+ 'request': '3-31-ofp_group_features_stats_request.packet.json',
+ 'reply': '3-32-ofp_group_features_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.get_group_desc,
+ 'request': '3-33-ofp_group_desc_stats_request.packet.json',
+ 'reply': '3-34-ofp_group_desc_stats_reply.packet.json'
+ },
+ # In OpenFlow 1.2, ofp_port_desc is not defined.
+ # We use ofp_features_request to get ports description instead.
+ {
+ 'method': ofctl_v1_2.get_port_desc,
+ 'request': '3-5-ofp_features_request.packet.json',
+ 'reply': '3-6-ofp_features_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_2.mod_flow_entry,
+ 'request': '3-2-ofp_flow_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_2.mod_group_entry,
+ 'request': '3-21-ofp_group_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_2.mod_port_behavior,
+ 'request': '3-22-ofp_port_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_2.send_experimenter,
+ 'request': '3-16-ofp_experimenter.packet.json',
+ 'reply': None
+ },
+ ],
+ 'of13': [
+ {
+ 'method': ofctl_v1_3.get_desc_stats,
+ 'request': '4-24-ofp_desc_request.packet.json',
+ 'reply': '4-0-ofp_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_queue_stats,
+ 'request': '4-37-ofp_queue_stats_request.packet.json',
+ 'reply': '4-38-ofp_queue_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_queue_stats,
+ 'request': 'lib-ofctl-ofp_queue_stats_request.packet1.json',
+ 'reply': '4-38-ofp_queue_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_queue_stats,
+ 'request': 'lib-ofctl-ofp_queue_stats_request.packet2.json',
+ 'reply': '4-38-ofp_queue_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_queue_stats,
+ 'request': 'lib-ofctl-ofp_queue_stats_request.packet3.json',
+ 'reply': '4-38-ofp_queue_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_queue_config,
+ 'request': '4-35-ofp_queue_get_config_request.packet.json',
+ 'reply': '4-36-ofp_queue_get_config_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_queue_config,
+ 'request': 'lib-ofctl-ofp_queue_get_config_request.packet.json',
+ 'reply': '4-36-ofp_queue_get_config_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_flow_stats,
+ 'request': '4-11-ofp_flow_stats_request.packet.json',
+ 'reply': '4-12-ofp_flow_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_aggregate_flow_stats,
+ 'request': '4-25-ofp_aggregate_stats_request.packet.json',
+ 'reply': '4-26-ofp_aggregate_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_table_stats,
+ 'request': '4-27-ofp_table_stats_request.packet.json',
+ 'reply': '4-28-ofp_table_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_table_features,
+ 'request': 'lib-ofctl-ofp_table_features_request.packet.json',
+ 'reply': '4-56-ofp_table_features_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_port_stats,
+ 'request': '4-29-ofp_port_stats_request.packet.json',
+ 'reply': '4-30-ofp_port_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_port_stats,
+ 'request': 'lib-ofctl-ofp_port_stats_request.packet.json',
+ 'reply': '4-30-ofp_port_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_meter_stats,
+ 'request': '4-49-ofp_meter_stats_request.packet.json',
+ 'reply': '4-50-ofp_meter_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_meter_stats,
+ 'request': 'lib-ofctl-ofp_meter_stats_request.packet.json',
+ 'reply': '4-50-ofp_meter_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_meter_features,
+ 'request': '4-51-ofp_meter_features_request.packet.json',
+ 'reply': '4-52-ofp_meter_features_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_meter_config,
+ 'request': '4-47-ofp_meter_config_request.packet.json',
+ 'reply': '4-48-ofp_meter_config_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_meter_config,
+ 'request': 'lib-ofctl-ofp_meter_config_request.packet.json',
+ 'reply': '4-48-ofp_meter_config_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_group_stats,
+ 'request': '4-57-ofp_group_stats_request.packet.json',
+ 'reply': '4-58-ofp_group_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_group_stats,
+ 'request': 'lib-ofctl-ofp_group_stats_request.packet.json',
+ 'reply': '4-58-ofp_group_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_group_features,
+ 'request': '4-31-ofp_group_features_request.packet.json',
+ 'reply': '4-32-ofp_group_features_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_group_desc,
+ 'request': '4-33-ofp_group_desc_request.packet.json',
+ 'reply': '4-34-ofp_group_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.get_port_desc,
+ 'request': '4-53-ofp_port_desc_request.packet.json',
+ 'reply': '4-54-ofp_port_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_3.mod_flow_entry,
+ 'request': '4-2-ofp_flow_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_3.mod_meter_entry,
+ 'request': '4-45-ofp_meter_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_3.mod_group_entry,
+ 'request': '4-21-ofp_group_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_3.mod_port_behavior,
+ 'request': '4-22-ofp_port_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_3.send_experimenter,
+ 'request': '4-16-ofp_experimenter.packet.json',
+ 'reply': None
+ },
+ ],
+ 'of14': [
+ {
+ 'method': ofctl_v1_4.get_desc_stats,
+ 'request': '5-24-ofp_desc_request.packet.json',
+ 'reply': '5-0-ofp_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_queue_stats,
+ 'request': '5-35-ofp_queue_stats_request.packet.json',
+ 'reply': '5-36-ofp_queue_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_queue_desc,
+ 'request': '5-63-ofp_queue_desc_request.packet.json',
+ 'reply': '5-64-ofp_queue_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_flow_stats,
+ 'request': '5-11-ofp_flow_stats_request.packet.json',
+ 'reply': '5-12-ofp_flow_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_aggregate_flow_stats,
+ 'request': '5-25-ofp_aggregate_stats_request.packet.json',
+ 'reply': '5-26-ofp_aggregate_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_table_stats,
+ 'request': '5-27-ofp_table_stats_request.packet.json',
+ 'reply': '5-28-ofp_table_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_table_features,
+ 'request': 'lib-ofctl-ofp_table_features_request.packet.json',
+ 'reply': '5-54-ofp_table_features_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_port_stats,
+ 'request': '5-29-ofp_port_stats_request.packet.json',
+ 'reply': '5-30-ofp_port_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_meter_stats,
+ 'request': '5-47-ofp_meter_stats_request.packet.json',
+ 'reply': '5-48-ofp_meter_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_meter_features,
+ 'request': '5-49-ofp_meter_features_request.packet.json',
+ 'reply': '5-50-ofp_meter_features_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_meter_config,
+ 'request': '5-45-ofp_meter_config_request.packet.json',
+ 'reply': '5-46-ofp_meter_config_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_group_stats,
+ 'request': '5-55-ofp_group_stats_request.packet.json',
+ 'reply': '5-56-ofp_group_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_group_features,
+ 'request': '5-31-ofp_group_features_request.packet.json',
+ 'reply': '5-32-ofp_group_features_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_group_desc,
+ 'request': '5-33-ofp_group_desc_request.packet.json',
+ 'reply': '5-34-ofp_group_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.get_port_desc,
+ 'request': '5-51-ofp_port_desc_request.packet.json',
+ 'reply': '5-52-ofp_port_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_4.mod_flow_entry,
+ 'request': '5-2-ofp_flow_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_4.mod_meter_entry,
+ 'request': '5-43-ofp_meter_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_4.mod_group_entry,
+ 'request': '5-21-ofp_group_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_4.mod_port_behavior,
+ 'request': '5-22-ofp_port_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_4.send_experimenter,
+ 'request': '5-16-ofp_experimenter.packet.json',
+ 'reply': None
+ },
+ ],
+ 'of15': [
+ {
+ 'method': ofctl_v1_5.get_desc_stats,
+ 'request': 'libofproto-OFP15-desc_request.packet.json',
+ 'reply': 'libofproto-OFP15-desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_queue_stats,
+ 'request': 'lib-ofctl-ofp_queue_stats_request.packet.json',
+ 'reply': 'libofproto-OFP15-queue_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_queue_desc,
+ 'request': 'libofproto-OFP15-queue_desc_request.packet.json',
+ 'reply': 'libofproto-OFP15-queue_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_flow_stats,
+ 'request': 'libofproto-OFP15-flow_stats_request.packet.json',
+ 'reply': 'libofproto-OFP15-flow_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_flow_desc_stats,
+ 'request': 'libofproto-OFP15-flow_desc_request.packet.json',
+ 'reply': 'libofproto-OFP15-flow_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_flow_desc_stats,
+ 'request': 'lib-ofctl-OFP15-flow_desc_request.packet.json',
+ 'reply': 'lib-ofctl-OFP15-flow_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_aggregate_flow_stats,
+ 'request': 'libofproto-OFP15-aggregate_stats_request.packet.json',
+ 'reply': 'libofproto-OFP15-aggregate_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_table_stats,
+ 'request': 'libofproto-OFP15-table_stats_request.packet.json',
+ 'reply': 'libofproto-OFP15-table_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_table_features,
+ 'request': 'lib-ofctl-ofp_table_features_request.packet.json',
+ 'reply': 'libofproto-OFP15-table_features_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_port_stats,
+ 'request': 'libofproto-OFP15-port_stats_request.packet.json',
+ 'reply': 'libofproto-OFP15-port_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_meter_stats,
+ 'request': 'libofproto-OFP15-meter_stats_request.packet.json',
+ 'reply': 'libofproto-OFP15-meter_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_meter_features,
+ 'request': 'libofproto-OFP15-meter_features_request.packet.json',
+ 'reply': 'libofproto-OFP15-meter_features_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_meter_desc,
+ 'request': 'libofproto-OFP15-meter_desc_request.packet.json',
+ 'reply': 'libofproto-OFP15-meter_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_group_stats,
+ 'request': 'libofproto-OFP15-group_stats_request.packet.json',
+ 'reply': 'libofproto-OFP15-group_stats_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_group_features,
+ 'request': 'libofproto-OFP15-group_features_request.packet.json',
+ 'reply': 'libofproto-OFP15-group_features_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_group_desc,
+ 'request': 'libofproto-OFP15-group_desc_request.packet.json',
+ 'reply': 'libofproto-OFP15-group_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.get_port_desc,
+ 'request': 'libofproto-OFP15-port_desc_request.packet.json',
+ 'reply': 'libofproto-OFP15-port_desc_reply.packet.json'
+ },
+ {
+ 'method': ofctl_v1_5.mod_flow_entry,
+ 'request': 'libofproto-OFP15-flow_mod_no_nx.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_5.mod_flow_entry,
+ 'request': 'lib-ofctl-OFP15-flow_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_5.mod_meter_entry,
+ 'request': 'libofproto-OFP15-meter_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_5.mod_group_entry,
+ 'request': 'libofproto-OFP15-group_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_5.mod_port_behavior,
+ 'request': 'libofproto-OFP15-port_mod.packet.json',
+ 'reply': None
+ },
+ {
+ 'method': ofctl_v1_5.send_experimenter,
+ 'request': 'libofproto-OFP15-experimenter.packet.json',
+ 'reply': None
+ }
+ ],
+ }
+
+ def _jsonfile_to_msg(datapath, jsonfile):
+ return ofproto_parser.ofp_msg_from_jsondict(
+ datapath, json.load(open(jsonfile)))
+
+ this_dir = os.path.dirname(sys.modules[__name__].__file__)
+ parser_json_root = os.path.join(this_dir, '../ofproto/json/')
+ ofctl_json_root = os.path.join(this_dir, 'ofctl_json/')
+
+ for ofp_ver, tests in _test_cases.items():
+ dp = DummyDatapath(_ofp_vers[ofp_ver])
+ parser_json_dir = os.path.join(parser_json_root, ofp_ver)
+ ofctl_json_dir = os.path.join(ofctl_json_root, ofp_ver)
+ for test in tests:
+ name = 'test_ofctl_' + ofp_ver + '_' + test['request']
+ print('adding %s ...' % name)
+ args = {}
+ args_json_path = os.path.join(ofctl_json_dir, test['request'])
+ if os.path.exists(args_json_path):
+ args = json.load(open(args_json_path))
+ request = _jsonfile_to_msg(
+ dp, os.path.join(parser_json_dir, test['request']))
+ reply = None
+ expected = None
+ if test['reply']:
+ reply = _jsonfile_to_msg(
+ dp, os.path.join(parser_json_dir, test['reply']))
+ expected = json.load(
+ open(os.path.join(ofctl_json_dir, test['reply'])))
+ f = functools.partial(
+ Test_ofctl._test, name=name, dp=dp, method=test['method'],
+ args=args, request=request, reply=reply, expected=expected)
+ test_lib.add_method(Test_ofctl, name, f)
+
+
+_add_tests()
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/unit/lib/test_ofctl_action_match.py b/tests/unit/lib/test_ofctl_action_match.py
new file mode 100644
index 00000000..2b8707cf
--- /dev/null
+++ b/tests/unit/lib/test_ofctl_action_match.py
@@ -0,0 +1,869 @@
+# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import unittest
+import logging
+import netaddr
+import functools
+import inspect
+
+from nose.tools import *
+
+from ryu.lib import addrconv
+from ryu.lib import ofctl_v1_0
+from ryu.ofproto import ofproto_v1_0, ofproto_v1_0_parser
+from ryu.lib import ofctl_v1_2
+from ryu.ofproto import ofproto_v1_2, ofproto_v1_2_parser
+from ryu.lib import ofctl_v1_3
+from ryu.ofproto import ofproto_v1_3, ofproto_v1_3_parser
+from ryu.ofproto import ofproto_protocol
+from ryu.ofproto import inet
+
+from tests import test_lib
+
+LOG = logging.getLogger('test_ofctl_v1_2, v1_3')
+
+""" Common Functions """
+
+
+def _str_to_int(v):
+ try:
+ return int(v, 0)
+ except (ValueError, TypeError):
+ return v
+
+
+def _to_match_eth(value):
+ if '/' in value:
+ value = value.split('/')
+ return value[0], value[1]
+ else:
+ return value, None
+
+
+def _to_match_ip(value):
+ if '/' in value:
+ ip = netaddr.ip.IPNetwork(value)
+ ip_addr = str(ip.network)
+ ip_mask = str(ip.netmask)
+ return ip_addr, ip_mask
+ else:
+ return value, None
+
+
+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:
+ 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',
+ 'dl_type': 'eth_type',
+ 'dl_vlan': 'vlan_vid',
+ 'nw_src': 'ipv4_src',
+ 'nw_dst': 'ipv4_dst',
+ 'nw_proto': 'ip_proto'
+}
+
+
+conv_of12_to_of10_dict = {
+ 'eth_src': 'dl_src',
+ 'eth_dst': 'dl_dst',
+ 'eth_type': 'dl_type',
+ 'ipv4_dst': 'nw_dst',
+ 'ipv4_src': 'nw_src',
+ 'ip_proto': 'nw_proto',
+ 'vlan_vid': 'dl_vlan',
+ 'tcp_src': 'tp_src',
+ 'tcp_dst': 'tp_dst',
+ 'udp_src': 'tp_src',
+ 'udp_dst': 'tp_dst'
+}
+
+""" Test_ofctl """
+
+
+class Test_ofctl(unittest.TestCase):
+
+ def __init__(self, methodName):
+ super(Test_ofctl, self).__init__(methodName)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def _test_actions(self, act, test):
+ dp = ofproto_protocol.ProtocolDesc(version=test.ver)
+ act_type = act["type"]
+
+ # str -> action
+ insts = test.to_actions(dp, [act])
+
+ if test.ver == ofproto_v1_0.OFP_VERSION:
+ action = insts[0]
+ self._equal_str_to_act(action, act, act_type, test)
+ else:
+ inst = insts[0]
+ self._equal_str_to_inst(inst, act, act_type, test)
+
+ # action -> str
+ inst_str = test.actions_to_str(insts)
+ if test.ver == ofproto_v1_0.OFP_VERSION:
+ act_str = inst_str
+ self._equal_act_to_str(act_str, act, act_type, test)
+ else:
+ self._equal_inst_to_str(inst_str, act, act_type, test)
+
+ def _test_match(self, attrs, test):
+ dp = ofproto_protocol.ProtocolDesc(version=test.ver)
+
+ # str -> match
+ match = test.to_match(dp, attrs)
+
+ for key, value in attrs.items():
+ key = self._conv_key(test, key, attrs)
+ self._equal_str_to_match(key, value, match, test)
+
+ # match -> str
+ match_str = test.match_to_str(match)
+
+ for key, value in attrs.items():
+ if key in conv_of12_to_of10_dict:
+ key_old = conv_of12_to_of10_dict[key]
+ else:
+ key_old = key
+ self._equal_match_to_str(key_old, value, match_str, test)
+
+ def _equal_str_to_inst(self, inst, act, act_type, test):
+ if act_type in test.supported_action:
+ cls = test.supported_action[act_type]
+ else:
+ cls = None
+ if act_type == 'GOTO_TABLE':
+ ok_(isinstance(inst, cls))
+ eq_(inst.table_id, act["table_id"])
+ elif act_type == 'WRITE_METADATA':
+ ok_(isinstance(inst, cls))
+ eq_(inst.metadata, act["metadata"])
+ eq_(inst.metadata_mask, act["metadata_mask"])
+ elif act_type == 'METER':
+ ok_(isinstance(inst, cls))
+ eq_(inst.meter_id, act["meter_id"])
+ elif act_type == 'WRITE_ACTIONS':
+ ok_(isinstance(inst, cls))
+ eq_(inst.type, test._ofproto.OFPIT_WRITE_ACTIONS)
+ self._equal_str_to_act(inst.actions[0],
+ act["actions"][0],
+ act["actions"][0]["type"],
+ test)
+ elif act_type == 'CLEAR_ACTIONS':
+ ok_(isinstance(inst, cls))
+ eq_(inst.type, test._ofproto.OFPIT_CLEAR_ACTIONS)
+ else:
+ # APPLY_ACTIONS or Uknown Action Type
+ ok_(isinstance(inst, test._parser.OFPInstructionActions))
+ eq_(inst.type, test._ofproto.OFPIT_APPLY_ACTIONS)
+ self._equal_str_to_act(inst.actions[0], act,
+ act_type, test)
+
+ def _equal_str_to_act(self, action, act, act_type, test):
+ if act_type in test.supported_action:
+ cls = test.supported_action[act_type]
+ else:
+ cls = None
+ ok_(isinstance(action, cls))
+ if act_type == 'OUTPUT':
+ eq_(action.port, act["port"])
+ elif act_type == 'SET_VLAN_VID':
+ eq_(action.vlan_vid, act["vlan_vid"])
+ elif act_type == 'SET_VLAN_PCP':
+ eq_(action.vlan_pcp, act["vlan_pcp"])
+ elif act_type == 'SET_DL_SRC':
+ eq_(addrconv.mac.bin_to_text(action.dl_addr),
+ act["dl_src"])
+ elif act_type == 'SET_DL_DST':
+ eq_(addrconv.mac.bin_to_text(action.dl_addr),
+ act["dl_dst"])
+ elif act_type == 'SET_NW_SRC':
+ ip = netaddr.ip.IPAddress(action.nw_addr)
+ eq_(str(ip), act["nw_src"])
+ elif act_type == 'SET_NW_DST':
+ ip = netaddr.ip.IPAddress(action.nw_addr)
+ eq_(str(ip), act["nw_dst"])
+ elif act_type == 'SET_NW_TOS':
+ eq_(action.tos, act["nw_tos"])
+ elif act_type == 'SET_TP_SRC':
+ eq_(action.tp, act["tp_src"])
+ elif act_type == 'SET_TP_DST':
+ eq_(action.tp, act["tp_dst"])
+ elif act_type == 'ENQUEUE':
+ eq_(action.queue_id, act["queue_id"])
+ eq_(action.port, act["port"])
+ elif act_type == 'SET_MPLS_TTL':
+ eq_(action.mpls_ttl, act["mpls_ttl"])
+ elif act_type in ['PUSH_VLAN', 'PUSH_MPLS',
+ 'POP_MPLS', 'PUSH_PBB']:
+ eq_(action.ethertype, act["ethertype"])
+ elif act_type == 'SET_QUEUE':
+ eq_(action.queue_id, act["queue_id"])
+ elif act_type == 'GROUP':
+ eq_(action.group_id, act["group_id"])
+ elif act_type == 'SET_NW_TTL':
+ eq_(action.nw_ttl, act["nw_ttl"])
+ elif act_type == 'SET_FIELD':
+ eq_(action.key, act['field'])
+ eq_(action.value, act['value'])
+ elif act_type in ['STRIP_VLAN', 'COPY_TTL_OUT',
+ 'COPY_TTL_IN', 'DEC_MPLS_TTL',
+ 'POP_VLAN', 'DEC_NW_TTL', 'POP_PBB']:
+ pass
+ else: # Uknown Action Type
+ assert False
+
+ def _equal_inst_to_str(self, inst_str, act, act_type, test):
+ if act_type == 'WRITE_ACTIONS':
+ act_str = inst_str[0]["WRITE_ACTIONS"]
+ act = act["actions"][0]
+ act_type = act["type"]
+ self._equal_act_to_str(act_str, act, act_type, test)
+ else:
+ inst_str_list = inst_str[0].split(':', 1)
+ eq_(inst_str_list[0], act_type)
+ if act_type == 'GOTO_TABLE':
+ eq_(int(inst_str_list[1]), act["table_id"])
+ elif act_type == 'WRITE_METADATA':
+ met = inst_str_list[1].split('/')
+ eq_(int(met[0], 16), act["metadata"])
+ eq_(int(met[1], 16), act["metadata_mask"])
+ elif act_type == 'METER':
+ eq_(int(inst_str_list[1]), act["meter_id"])
+ elif act_type == 'CLEAR_ACTIONS':
+ pass
+ else:
+ # APPLY_ACTIONS
+ act_str = inst_str
+ self._equal_act_to_str(act_str, act, act_type, test)
+
+ def _equal_act_to_str(self, act_str, act, act_type, test):
+ act_str_list = act_str[0].split(':', 1)
+ eq_(act_str_list[0], act_type)
+ if act_type == 'OUTPUT':
+ eq_(int(act_str_list[1]), act["port"])
+ elif act_type == 'SET_VLAN_VID':
+ eq_(int(act_str_list[1]), act["vlan_vid"])
+ elif act_type == 'SET_VLAN_PCP':
+ eq_(int(act_str_list[1]), act["vlan_pcp"])
+ elif act_type == 'SET_DL_SRC':
+ eq_(act_str_list[1], act["dl_src"])
+ elif act_type == 'SET_DL_DST':
+ eq_(act_str_list[1], act["dl_dst"])
+ elif act_type == 'SET_NW_SRC':
+ eq_(act_str_list[1], act["nw_src"])
+ elif act_type == 'SET_NW_DST':
+ eq_(act_str_list[1], act["nw_dst"])
+ elif act_type == 'SET_NW_TOS':
+ eq_(int(act_str_list[1]), act["nw_tos"])
+ elif act_type == 'SET_TP_SRC':
+ eq_(int(act_str_list[1]), act["tp_src"])
+ elif act_type == 'SET_TP_DST':
+ eq_(int(act_str_list[1]), act["tp_dst"])
+ elif act_type == 'ENQUEUE':
+ enq = act_str_list[1].split(':')
+ eq_(int(enq[0], 10), act["port"])
+ eq_(int(enq[1], 10), act["queue_id"])
+ elif act_type == 'SET_MPLS_TTL':
+ eq_(int(act_str_list[1]), act["mpls_ttl"])
+ elif act_type == 'PUSH_VLAN':
+ eq_(int(act_str_list[1]), act["ethertype"])
+ elif act_type == 'PUSH_MPLS':
+ eq_(int(act_str_list[1]), act["ethertype"])
+ elif act_type == 'POP_MPLS':
+ eq_(int(act_str_list[1]), act["ethertype"])
+ elif act_type == 'SET_QUEUE':
+ eq_(int(act_str_list[1]), act["queue_id"])
+ elif act_type == 'GROUP':
+ eq_(int(act_str_list[1]), act["group_id"])
+ elif act_type == 'SET_NW_TTL':
+ eq_(int(act_str_list[1]), act["nw_ttl"])
+ elif act_type == 'SET_FIELD':
+ field, value = act_str_list[1].split(':')
+ eq_(field.strip(' {'), act["field"])
+ eq_(int(value.strip('} ')), act["value"])
+ elif act_type == 'PUSH_PBB':
+ eq_(int(act_str_list[1]), act["ethertype"])
+ elif act_type in ['STRIP_VLAN', 'COPY_TTL_OUT',
+ 'COPY_TTL_IN', 'DEC_MPLS_TTL',
+ 'POP_VLAN', 'DEC_NW_TTL', 'POP_PBB']:
+ pass
+ else:
+ assert False
+
+ def _equal_str_to_match(self, key, value, match, test):
+ field_value = self._get_field_value(test, key, match)
+
+ if key in ['eth_src', 'eth_dst', 'arp_sha', 'arp_tha']:
+ # MAC address
+ eth, mask = _to_match_eth(value)
+ if mask is not None:
+ # with mask
+ for i in range(0, len(mask)):
+ if mask[i] == 'f':
+ eq_(eth[i], field_value[0][i])
+ eq_(mask, field_value[1])
+ else:
+ # without mask
+ eq_(eth, field_value)
+ return
+ elif key in ['dl_src', 'dl_dst']:
+ eth, mask = _to_match_eth(value)
+ field_value = addrconv.mac.bin_to_text(field_value)
+ eq_(eth, field_value)
+ return
+ elif key in ['ipv4_src', 'ipv4_dst', 'arp_spa', 'arp_tpa']:
+ # IPv4 address
+ ipv4, mask = _to_match_ip(value)
+ if mask is not None:
+ # with mask
+ eq_(ipv4, field_value[0])
+ eq_(mask, field_value[1])
+ else:
+ # without mask
+ eq_(ipv4, field_value)
+ return
+ elif key in ['nw_src', 'nw_dst']:
+ # IPv4 address
+ ipv4, mask = _to_match_ip(value)
+ field_value = _to_match_ip(field_value)
+ if mask is not None:
+ # with mask
+ eq_(ipv4, field_value[0])
+ eq_(mask, field_value[1])
+ else:
+ # without mask
+ eq_(ipv4, field_value[0])
+ return
+ elif key in ['ipv6_src', 'ipv6_dst']:
+ # IPv6 address
+ ipv6, mask = _to_match_ip(value)
+ if mask is not None:
+ # with mask
+ eq_(ipv6, field_value[0])
+ eq_(mask, field_value[1])
+ else:
+ # without mask
+ eq_(ipv6, field_value)
+ return
+ elif key == 'vlan_vid':
+ if test.ver == ofproto_v1_0.OFP_VERSION:
+ eq_(value, field_value)
+ else:
+ eq_(test.expected_value['vlan_vid'][
+ value]['to_match'], field_value)
+ return
+ 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_(_str_to_int(value), field_value)
+ return
+
+ def _equal_match_to_str(self, key, value, match_str, test):
+ field_value = match_str[key]
+ if key in ['dl_src', 'dl_dst', 'arp_sha', 'arp_tha']:
+ # MAC address
+ eth, mask = _to_match_eth(value)
+ if mask is not None:
+ # with mask
+ field_value = field_value.split('/')
+ for i in range(0, len(mask)):
+ if mask[i] == 'f':
+ eq_(eth[i], field_value[0][i])
+ eq_(mask, field_value[1])
+ else:
+ # without mask
+ eq_(eth, field_value)
+ return
+ elif key in['nw_src', 'nw_dst', 'arp_spa', 'arp_tpa']:
+ # IPv4 address
+ if test.ver == ofproto_v1_0.OFP_VERSION:
+ ipv4, mask = _to_match_ip(value)
+ field_value = _to_match_ip(field_value)
+ if mask is not None:
+ # with mask
+ eq_(ipv4, field_value[0])
+ eq_(mask, field_value[1])
+ else:
+ # without mask
+ eq_(ipv4, field_value[0])
+ else:
+ ipv4, mask = _to_match_ip(value)
+ if mask is not None:
+ # with mask
+ field_value = field_value.split('/')
+ eq_(ipv4, field_value[0])
+ eq_(mask, field_value[1])
+ else:
+ # without mask
+ eq_(ipv4, field_value)
+ return
+ elif key in ['ipv6_src', 'ipv6_dst']:
+ # IPv6 address
+ ipv6, mask = _to_match_ip(value)
+ if mask is not None:
+ # with mask
+ field_value = field_value.split('/')
+ eq_(ipv6, field_value[0])
+ eq_(mask, field_value[1])
+ else:
+ # without mask
+ eq_(ipv6, field_value)
+ return
+ elif key == 'dl_vlan':
+ if test.ver == ofproto_v1_0.OFP_VERSION:
+ eq_(value, field_value)
+ else:
+ eq_(test.expected_value['vlan_vid'][
+ value]['to_str'], field_value)
+ return
+ else:
+ if isinstance(value, str) and '/' in value:
+ # with mask
+ value = _to_masked_int_str(value)
+ eq_(value, field_value)
+ else:
+ # without mask
+ eq_(_str_to_int(value), field_value)
+ return
+
+ def _conv_key(self, test, key, attrs):
+ if test.ver != ofproto_v1_0.OFP_VERSION:
+ if key in conv_of10_to_of12_dict:
+ # For old field name
+ key = conv_of10_to_of12_dict[key]
+ elif key == 'tp_src' or key == 'tp_dst':
+ # TCP/UDP port
+ conv = {inet.IPPROTO_TCP: {'tp_src': 'tcp_src',
+ 'tp_dst': 'tcp_dst'},
+ inet.IPPROTO_UDP: {'tp_src': 'udp_src',
+ 'tp_dst': 'udp_dst'}}
+ ip_proto = attrs.get('nw_proto', attrs.get('ip_proto', 0))
+ key = conv[ip_proto][key]
+
+ return key
+
+ def _get_field_value(self, test, key, match):
+ if test.ver == ofproto_v1_0.OFP_VERSION:
+ members = inspect.getmembers(match)
+ for member in members:
+ if member[0] == key:
+ field_value = member[1]
+ elif member[0] == 'wildcards':
+ wildcards = member[1]
+ if key == 'nw_src':
+ field_value = test.nw_src_to_str(wildcards, field_value)
+ elif key == 'nw_dst':
+ field_value = test.nw_dst_to_str(wildcards, field_value)
+ else:
+ field_value = match[key]
+
+ return field_value
+
+
+class test_data_base(object):
+ # followings must be an attribute of subclass.
+ # _ofctl
+ # _ofproto
+
+ def __init__(self):
+ self.ver = self._ofproto.OFP_VERSION
+ self.to_match = self._ofctl.to_match
+ self.match_to_str = self._ofctl.match_to_str
+ self.to_actions = self._ofctl.to_actions
+ self.actions_to_str = self._ofctl.actions_to_str
+
+
+class test_data_v1_0(test_data_base):
+ """ Test_data for of_v1_0 """
+ _ofctl = ofctl_v1_0
+ _ofproto = ofproto_v1_0
+ _parser = ofproto_v1_0_parser
+
+ def __init__(self):
+ super(test_data_v1_0, self).__init__()
+ self.nw_src_to_str = self._ofctl.nw_src_to_str
+ self.nw_dst_to_str = self._ofctl.nw_dst_to_str
+ self.supported_action = {}
+ self.act_list = [
+ {'type': 'OUTPUT', 'port': 3},
+ {'type': 'SET_VLAN_VID', 'vlan_vid': 5},
+ {'type': 'SET_VLAN_PCP', 'vlan_pcp': 3},
+ {'type': 'STRIP_VLAN'},
+ {'type': 'SET_DL_SRC', 'dl_src': 'aa:bb:cc:11:22:33'},
+ {'type': 'SET_DL_DST', 'dl_dst': 'aa:bb:cc:11:22:33'},
+ {'type': 'SET_NW_SRC', 'nw_src': '10.0.0.1'},
+ {'type': 'SET_NW_DST', 'nw_dst': '10.0.0.1'},
+ {'type': 'SET_NW_TOS', 'nw_tos': 184},
+ {'type': 'SET_TP_SRC', 'tp_src': 8080},
+ {'type': 'SET_TP_DST', 'tp_dst': 8080},
+ {'type': 'ENQUEUE', 'queue_id': 3, 'port': 1}
+ ]
+ self.attr_list = [
+ {'in_port': 7},
+ {'dl_src': 'aa:bb:cc:11:22:33'},
+ {'dl_dst': 'aa:bb:cc:11:22:33'},
+ {'dl_vlan': 5},
+ {'dl_vlan_pcp': 3},
+ {'dl_type': 123},
+ {'nw_tos': 16},
+ {'nw_proto': 5},
+ {'nw_src': '192.168.0.1'},
+ {'nw_src': '192.168.0.1/24'},
+ {'nw_dst': '192.168.0.1'},
+ {'nw_dst': '192.168.0.1/24'},
+ {'tp_src': 1},
+ {'tp_dst': 2}
+ ]
+ self.set_action()
+
+ def set_action(self):
+ self.supported_action.update(
+ {
+ 'OUTPUT': self._parser.OFPActionOutput,
+ 'SET_VLAN_VID': self._parser.OFPActionVlanVid,
+ 'SET_VLAN_PCP': self._parser.OFPActionVlanPcp,
+ 'STRIP_VLAN': self._parser.OFPActionStripVlan,
+ 'SET_DL_SRC': self._parser.OFPActionSetDlSrc,
+ 'SET_DL_DST': self._parser.OFPActionSetDlDst,
+ 'SET_NW_SRC': self._parser.OFPActionSetNwSrc,
+ 'SET_NW_DST': self._parser.OFPActionSetNwDst,
+ 'SET_NW_TOS': self._parser.OFPActionSetNwTos,
+ 'SET_TP_SRC': self._parser.OFPActionSetTpSrc,
+ 'SET_TP_DST': self._parser.OFPActionSetTpDst,
+ 'ENQUEUE': self._parser.OFPActionEnqueue
+ })
+
+
+class test_data_v1_2(test_data_base):
+ """ Test_data for of_v1_2 """
+ _ofctl = ofctl_v1_2
+ _ofproto = ofproto_v1_2
+ _parser = ofproto_v1_2_parser
+
+ def __init__(self):
+ super(test_data_v1_2, self).__init__()
+ self.supported_action = {}
+ self.act_list = [
+ {'type': 'OUTPUT', 'port': 3},
+ {'type': 'COPY_TTL_OUT'},
+ {'type': 'COPY_TTL_IN'},
+ {'type': 'SET_MPLS_TTL', 'mpls_ttl': 64},
+ {'type': 'DEC_MPLS_TTL'},
+ {'type': 'PUSH_VLAN', 'ethertype': 0x0800},
+ {'type': 'POP_VLAN'},
+ {'type': 'PUSH_MPLS', 'ethertype': 0x0800},
+ {'type': 'POP_MPLS', 'ethertype': 0x0800},
+ {'type': 'SET_QUEUE', 'queue_id': 7},
+ {'type': 'GROUP', 'group_id': 5},
+ {'type': 'SET_NW_TTL', 'nw_ttl': 64},
+ {'type': 'DEC_NW_TTL'},
+ {"type": "CLEAR_ACTIONS"},
+ {"type": "WRITE_ACTIONS",
+ "actions": [{"type": "OUTPUT", "port": 4}]},
+ {'type': 'GOTO_TABLE', 'table_id': 8},
+ {'type': 'WRITE_METADATA', 'metadata': 8,
+ 'metadata_mask': (1 << 64) - 1},
+ ]
+ 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"},
+ {'dl_src': "aa:bb:cc:11:22:33/00:00:00:00:ff:ff"},
+ {'dl_dst': "aa:bb:cc:11:22:33"},
+ {'dl_dst': "aa:bb:cc:11:22:33/00:00:00:00:ff:ff"},
+ {'dl_type': 123},
+ {'eth_src': "aa:bb:cc:11:22:33"},
+ {'eth_src': "aa:bb:cc:11:22:33/00:00:00:00:ff:ff"},
+ {'eth_dst': "aa:bb:cc:11:22:33"},
+ {'eth_dst': "aa:bb:cc:11:22:33/00:00:00:00:ff:ff"},
+ {'eth_type': 0x800},
+ {'dl_vlan': 0},
+ {'dl_vlan': 3},
+ {'dl_vlan': 4095},
+ {'dl_vlan': "0"},
+ {'dl_vlan': "3"},
+ {'dl_vlan': "4095"},
+ {'dl_vlan': "0x0000"},
+ {'dl_vlan': "0x0003"},
+ {'dl_vlan': "0x0fff"},
+ {'dl_vlan': "0x1000"},
+ {'dl_vlan': "0x1003"},
+ {'dl_vlan': "0x1fff"},
+ {'dl_vlan': "4096/4096"},
+ {'dl_vlan': "4096/4097"},
+ {'dl_vlan': "2744/2748"},
+ {'dl_vlan': "2748/2748"},
+ {'dl_vlan': "2748/2749"},
+ {'dl_vlan': "0x1000/0x1000"},
+ {'dl_vlan': "0x1000/0x1001"},
+ {'dl_vlan': "0x0ab8/0x0abc"},
+ {'dl_vlan': "0x0abc/0x0abc"},
+ {'dl_vlan': "0x0abc/0x0abd"},
+ {'vlan_pcp': 3, 'vlan_vid': 3},
+ {'ip_dscp': 3, 'eth_type': 0x0800},
+ {'ip_ecn': 4, 'eth_type': 0x86dd},
+ {'nw_src': "192.168.0.1", 'eth_type': 0x0800},
+ {'nw_src': "192.168.0.1/24", 'eth_type': 0x0800},
+ {'nw_src': "192.168.10.10/255.255.0.0", 'eth_type': 0x0800},
+ {'nw_dst': "192.168.0.1", 'eth_type': 0x0800},
+ {'nw_dst': "192.168.0.1/24", 'eth_type': 0x0800},
+ {'nw_dst': "192.168.10.10/255.255.255.0"},
+ {'nw_proto': 5, 'eth_type': 0x0800},
+ {'ip_proto': 5, 'eth_type': 0x86dd},
+ {'ipv4_src': "192.168.0.1", 'eth_type': 0x0800},
+ {'ipv4_src': "192.168.0.1/24", 'eth_type': 0x0800},
+ {'ipv4_src': "192.168.10.10/255.255.0.0", 'eth_type': 0x0800},
+ {'ipv4_dst': "192.168.0.1", 'eth_type': 0x0800},
+ {'ipv4_dst': "192.168.0.1/24", 'eth_type': 0x0800},
+ {'ipv4_dst': "192.168.10.10/255.255.255.0", 'eth_type': 0x0800},
+ {'tp_src': 1, 'ip_proto': 6},
+ {'tp_dst': 2, 'ip_proto': 6},
+ {'tp_src': 3, 'ip_proto': 17},
+ {'tp_dst': 4, 'ip_proto': 17},
+ {'vlan_vid': 0},
+ {'vlan_vid': 3},
+ {'vlan_vid': 4095},
+ {'vlan_vid': "0"},
+ {'vlan_vid': "3"},
+ {'vlan_vid': "4095"},
+ {'vlan_vid': "0x0000"},
+ {'vlan_vid': "0x0003"},
+ {'vlan_vid': "0x0fff"},
+ {'vlan_vid': "0x1000"},
+ {'vlan_vid': "0x1003"},
+ {'vlan_vid': "0x1fff"},
+ {'vlan_vid': "4096/4096"},
+ {'vlan_vid': "4096/4097"},
+ {'vlan_vid': "2744/2748"},
+ {'vlan_vid': "2748/2748"},
+ {'vlan_vid': "2748/2749"},
+ {'vlan_vid': "0x1000/0x1000"},
+ {'vlan_vid': "0x1000/0x1001"},
+ {'vlan_vid': "0x0ab8/0x0abc"},
+ {'vlan_vid': "0x0abc/0x0abc"},
+ {'vlan_vid': "0x0abc/0x0abd"},
+ {'tcp_src': 3, 'ip_proto': 6},
+ {'tcp_dst': 5, 'ip_proto': 6},
+ {'udp_src': 2, 'ip_proto': 17},
+ {'udp_dst': 6, 'ip_proto': 17},
+ {'sctp_src': 99, 'ip_proto': 132},
+ {'sctp_dst': 99, 'ip_proto': 132},
+ {'icmpv4_type': 5, 'ip_proto': 1},
+ {'icmpv4_code': 6, 'ip_proto': 1},
+ {'arp_op': 3, 'eth_type': 0x0806},
+ {'arp_spa': "192.168.0.11", 'eth_type': 0x0806},
+ {'arp_spa': "192.168.0.22/24", 'eth_type': 0x0806},
+ {'arp_tpa': "192.168.0.33", 'eth_type': 0x0806},
+ {'arp_tpa': "192.168.0.44/24", 'eth_type': 0x0806},
+ {'arp_sha': "aa:bb:cc:11:22:33", 'eth_type': 0x0806},
+ {'arp_sha': "aa:bb:cc:11:22:33/00:00:00:00:ff:ff",
+ 'eth_type': 0x0806},
+ {'arp_tha': "aa:bb:cc:11:22:33", 'eth_type': 0x0806},
+ {'arp_tha': "aa:bb:cc:11:22:33/00:00:00:00:ff:ff",
+ 'eth_type': 0x0806},
+ {'ipv6_src': '2001::aaaa:bbbb:cccc:1111', 'eth_type': 0x86dd},
+ {'ipv6_src': '2001::aaaa:bbbb:cccc:1111/64', 'eth_type': 0x86dd},
+ {'ipv6_dst': '2001::ffff:cccc:bbbb:1111', 'eth_type': 0x86dd},
+ {'ipv6_dst': '2001::ffff:cccc:bbbb:1111/64', 'eth_type': 0x86dd},
+ {'ipv6_flabel': 2, 'eth_type': 0x86dd},
+ {'icmpv6_type': 3, 'ip_proto': 58},
+ {'icmpv6_code': 4, 'ip_proto': 58},
+ {'ipv6_nd_target': '2001::ffff:cccc:bbbb:1111',
+ 'icmpv6_type': 135, 'ip_proto': 58},
+ {'ipv6_nd_sll': "aa:bb:cc:11:22:33",
+ 'icmpv6_type': 135, 'ip_proto': 58},
+ {'ipv6_nd_tll': "aa:bb:cc:11:22:33",
+ 'icmpv6_type': 136, 'ip_proto': 58},
+ {'mpls_label': 3, 'eth_type': 0x8848},
+ {'mpls_tc': 2, 'eth_type': 0x8848}
+ ]
+ self.supported_action.update(
+ {
+ 'OUTPUT': self._parser.OFPActionOutput,
+ 'COPY_TTL_OUT': self._parser.OFPActionCopyTtlOut,
+ 'COPY_TTL_IN': self._parser.OFPActionCopyTtlIn,
+ 'SET_MPLS_TTL': self._parser.OFPActionSetMplsTtl,
+ 'DEC_MPLS_TTL': self._parser.OFPActionDecMplsTtl,
+ 'PUSH_VLAN': self._parser.OFPActionPushVlan,
+ 'POP_VLAN': self._parser.OFPActionPopVlan,
+ 'PUSH_MPLS': self._parser.OFPActionPushMpls,
+ 'POP_MPLS': self._parser.OFPActionPopMpls,
+ 'SET_QUEUE': self._parser.OFPActionSetQueue,
+ 'GROUP': self._parser.OFPActionGroup,
+ 'SET_NW_TTL': self._parser.OFPActionSetNwTtl,
+ 'DEC_NW_TTL': self._parser.OFPActionDecNwTtl,
+ 'SET_FIELD': self._parser.OFPActionSetField,
+ 'GOTO_TABLE': self._parser.OFPInstructionGotoTable,
+ 'WRITE_METADATA': self._parser.OFPInstructionWriteMetadata,
+ 'WRITE_ACTIONS': self._parser.OFPInstructionActions,
+ 'CLEAR_ACTIONS': self._parser.OFPInstructionActions,
+ })
+ self.set_expected_value()
+
+ def set_expected_value(self):
+ vid_present = self._ofproto.OFPVID_PRESENT
+ self.expected_value = {
+ "vlan_vid": {
+ 0: {"to_match": 0 | vid_present, "to_str": "0"},
+ 3: {"to_match": 3 | vid_present, "to_str": "3"},
+ 4095: {"to_match": 4095 | vid_present, "to_str": "4095"},
+ "0": {"to_match": 0 | vid_present, "to_str": "0"},
+ "3": {"to_match": 3 | vid_present, "to_str": "3"},
+ "4095": {"to_match": 4095 | vid_present, "to_str": "4095"},
+ "0x0000": {"to_match": 0x0000, "to_str": "0x0000"},
+ "0x0003": {"to_match": 0x0003, "to_str": "0x0003"},
+ "0x0fff": {"to_match": 0x0fff, "to_str": "0x0fff"},
+ "0x1000": {"to_match": 0x1000, "to_str": "0"},
+ "0x1003": {"to_match": 0x1003, "to_str": "3"},
+ "0x1fff": {"to_match": 0x1fff, "to_str": "4095"},
+ "4096/4096": {"to_match": (4096, 4096),
+ "to_str": "0x1000/0x1000"},
+ "4096/4097": {"to_match": (4096, 4097),
+ "to_str": "0x1000/0x1001"},
+ "2744/2748": {"to_match": (2744, 2748),
+ "to_str": "0x0ab8/0x0abc"},
+ "2748/2748": {"to_match": (2748, 2748),
+ "to_str": "0x0abc/0x0abc"},
+ "2748/2749": {"to_match": (2748, 2749),
+ "to_str": "0x0abc/0x0abd"},
+ "0x1000/0x1000": {"to_match": (0x1000, 0x1000),
+ "to_str": "0x1000/0x1000"},
+ "0x1000/0x1001": {"to_match": (0x1000, 0x1001),
+ "to_str": "0x1000/0x1001"},
+ "0x0ab8/0x0abc": {"to_match": (0x0ab8, 0x0abc),
+ "to_str": "0x0ab8/0x0abc"},
+ "0x0abc/0x0abc": {"to_match": (0x0abc, 0x0abc),
+ "to_str": "0x0abc/0x0abc"},
+ "0x0abc/0x0abd": {"to_match": (0x0abc, 0x0abd),
+ "to_str": "0x0abc/0x0abd"}
+ }
+ }
+
+
+class test_data_v1_3(test_data_v1_2):
+ """ Test_data for of_v1_3 """
+ _ofctl = ofctl_v1_3
+ _ofproto = ofproto_v1_3
+ _parser = ofproto_v1_3_parser
+
+ def __init__(self):
+ super(test_data_v1_3, self).__init__()
+ self.act_list.extend(
+ [
+ {'type': 'PUSH_PBB', 'ethertype': 0x0800},
+ {'type': 'POP_PBB'},
+ {'type': 'METER', 'meter_id': 3},
+ ]
+ )
+ self.attr_list.extend(
+ [
+ {'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},
+ ]
+ )
+ self.supported_action.update(
+ {
+ 'PUSH_PBB': self._parser.OFPActionPushPbb,
+ 'POP_PBB': self._parser.OFPActionPopPbb,
+ 'METER': self._parser.OFPInstructionMeter,
+ })
+ self.set_expected_value()
+
+
+def _add_tests_actions(cls):
+ for act in cls.act_list:
+ method_name = 'test_' + str(cls.ver) + '_' + act["type"] + '_action'
+
+ def _run(self, name, act, cls):
+ print('processing %s ...' % name)
+ cls_ = Test_ofctl(name)
+ cls_._test_actions(act, cls)
+ print('adding %s ...' % method_name)
+ func = functools.partial(_run, name=method_name, act=act, cls=cls)
+ test_lib.add_method(Test_ofctl, method_name, func)
+
+
+def _add_tests_match(cls):
+ for attr in cls.attr_list:
+ for key, value in attr.items():
+ method_name = 'test_' + \
+ str(cls.ver) + '_' + key + '_' + str(
+ value) + str(type(value)) + '_match'
+
+ def _run(self, name, attr, cls):
+ print('processing %s ...' % name)
+ cls_ = Test_ofctl(name)
+ cls_._test_match(attr, cls)
+ print('adding %s ...' % method_name)
+ func = functools.partial(
+ _run, name=method_name, attr=attr, cls=cls)
+ test_lib.add_method(Test_ofctl, method_name, func)
+
+
+""" Test case """
+
+# for of10
+cls = test_data_v1_0()
+_add_tests_actions(cls)
+_add_tests_match(cls)
+
+# for of12
+cls = test_data_v1_2()
+_add_tests_actions(cls)
+_add_tests_match(cls)
+
+# for of13
+cls = test_data_v1_3()
+_add_tests_actions(cls)
+_add_tests_match(cls)
diff --git a/tests/unit/lib/test_ofctl_string.py b/tests/unit/lib/test_ofctl_string.py
new file mode 100644
index 00000000..fb491e39
--- /dev/null
+++ b/tests/unit/lib/test_ofctl_string.py
@@ -0,0 +1,151 @@
+# Copyright (C) 2017 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+
+from ryu.lib import ofctl_string
+from ryu.ofproto import ofproto_parser
+from ryu.ofproto.ofproto_protocol import ProtocolDesc
+from ryu.ofproto import ofproto_v1_5
+
+
+class Test_OfctlString(unittest.TestCase):
+ """Test cases for ryu.ofproto.ofp_instruction_from_str.
+ """
+
+ def __init__(self, methodName):
+ print('init %s' % methodName)
+ self.fake_dp_of15 = ProtocolDesc(ofproto_v1_5.OFP_VERSION)
+ self.maxDiff = None
+ super(Test_OfctlString, self).__init__(methodName)
+
+ def _test_str(self, dp, ofctl_str, *jsondict):
+ json = ofctl_string.ofp_instruction_from_str(
+ ofproto_v1_5, ofctl_str)
+ inst = ofproto_parser.ofp_instruction_from_jsondict(dp, json)
+ self.assertEqual(len(inst), len(jsondict))
+ for i in range(len(inst)):
+ self.assertEqual(jsondict[i], inst[i].to_jsondict())
+
+ def test_drop(self):
+ inst = ofctl_string.ofp_instruction_from_str(
+ ofproto_v1_5, 'drop')
+ self.assertEqual(inst, [])
+
+ def test_conjunction(self):
+ self._test_str(self.fake_dp_of15,
+ 'conjunction(0x234, 1/3),conjunction(0xdea, 2/2)',
+ {'OFPInstructionActions': {
+ 'actions': [
+ {'NXActionConjunction': {'clause': 0,
+ 'experimenter': 8992,
+ 'id': 0x234,
+ 'len': None,
+ 'n_clauses': 3,
+ 'subtype': 34,
+ 'type': 65535}},
+ {'NXActionConjunction': {'clause': 1,
+ 'experimenter': 8992,
+ 'id': 0xdea,
+ 'len': None,
+ 'n_clauses': 2,
+ 'subtype': 34,
+ 'type': 65535}}],
+ 'type': 4}})
+
+ def test_ct(self):
+ self._test_str(self.fake_dp_of15,
+ 'ct(commit)',
+ {'OFPInstructionActions': {
+ 'actions': [{'NXActionCT': {'actions': [],
+ 'alg': 0,
+ 'experimenter': 8992,
+ 'flags': 1,
+ 'len': None,
+ 'recirc_table': 255,
+ 'subtype': 35,
+ 'type': 65535,
+ 'zone_ofs_nbits': 0,
+ 'zone_src': u''}}],
+ 'type': 4}})
+
+ def test_ct_2(self):
+ self._test_str(self.fake_dp_of15,
+ 'ct(commit,zone=NXM_NX_REG8[0..15],'
+ 'exec(set_field:1->ct_mark))',
+ {'OFPInstructionActions': {
+ 'actions': [{'NXActionCT': {
+ 'actions': [
+ {'OFPActionSetField': {
+ 'field': {'OXMTlv': {'field': 'ct_mark',
+ 'mask': None,
+ 'value': 1}},
+ 'len': 8,
+ 'type': 25}}],
+ 'alg': 0,
+ 'experimenter': 8992,
+ 'flags': 1,
+ 'len': None,
+ 'recirc_table': 255,
+ 'subtype': 35,
+ 'type': 65535,
+ 'zone_ofs_nbits': 15,
+ 'zone_src': u'reg8'}}],
+ 'type': 4}})
+
+ def test_resubmit(self):
+ self._test_str(self.fake_dp_of15,
+ 'resubmit(,10)',
+ {'OFPInstructionActions':
+ {'actions': [{'NXActionResubmitTable': {
+ 'experimenter': 8992,
+ 'in_port': 65528,
+ 'len': None,
+ 'subtype': 14,
+ 'table_id': 10,
+ 'type': 65535}}],
+ 'type': 4}})
+
+ def test_set_field(self):
+ self._test_str(self.fake_dp_of15,
+ 'set_field:10/0xff->tun_id',
+ {'OFPInstructionActions':
+ {'actions': [{'OFPActionSetField': {
+ 'field': {'OXMTlv': {'field': 'tunnel_id',
+ 'mask': 255,
+ 'value': 10}},
+ 'len': 8,
+ 'type': 25}}],
+ 'type': 4}})
+
+ def test_pop_vlan(self):
+ self._test_str(self.fake_dp_of15,
+ 'pop_vlan',
+ {'OFPInstructionActions':
+ {'actions': [{'OFPActionPopVlan': {'len': 8,
+ 'type': 18}}],
+ 'type': 4}})
+
+ def test_multi(self):
+ self._test_str(self.fake_dp_of15,
+ 'pop_vlan,goto_table:33',
+ {'OFPInstructionActions':
+ {'actions': [{'OFPActionPopVlan': {'len': 8,
+ 'type': 18}}],
+ 'type': 4}},
+ {'OFPInstructionGotoTable':
+ {'len': 8,
+ 'table_id': 33,
+ 'type': 1}})
diff --git a/tests/unit/lib/test_ofctl_utils.py b/tests/unit/lib/test_ofctl_utils.py
new file mode 100644
index 00000000..2f02f43b
--- /dev/null
+++ b/tests/unit/lib/test_ofctl_utils.py
@@ -0,0 +1,142 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import unittest
+
+from ryu.lib import ofctl_utils
+from ryu.ofproto import ofproto_v1_3
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_ofctl_utils(unittest.TestCase):
+ # prepare test target
+ util = ofctl_utils.OFCtlUtil(ofproto_v1_3)
+
+ def _test_str_to_int(self, input_value, expected_value):
+ output_value = ofctl_utils.str_to_int(input_value)
+ self.assertEqual(expected_value, output_value)
+
+ def test_str_to_int(self):
+ self._test_str_to_int(1, 1) # int
+ self._test_str_to_int('0b10', 2) # binary digit
+ self._test_str_to_int('0o10', 8) # octal digit
+ self._test_str_to_int('0x10', 16) # hexadecimal digit
+
+ def test_ofp_port_from_user(self):
+ self.assertEqual(
+ ofproto_v1_3.OFPP_CONTROLLER,
+ self.util.ofp_port_from_user(ofproto_v1_3.OFPP_CONTROLLER) # int
+ )
+ self.assertEqual(
+ ofproto_v1_3.OFPP_CONTROLLER,
+ self.util.ofp_port_from_user('CONTROLLER') # str without prefix
+ )
+ self.assertEqual(
+ ofproto_v1_3.OFPP_CONTROLLER,
+ self.util.ofp_port_from_user('OFPP_CONTROLLER') # str with prefix
+ )
+
+ def test_ofp_port_to_user(self):
+ self.assertEqual(
+ 'CONTROLLER',
+ self.util.ofp_port_to_user(ofproto_v1_3.OFPP_CONTROLLER)
+ )
+ self.assertEqual(
+ 1,
+ self.util.ofp_port_to_user(1) # not matched
+ )
+
+ def test_ofp_table_from_user(self):
+ self.assertEqual(
+ ofproto_v1_3.OFPTT_ALL,
+ self.util.ofp_table_from_user('ALL')
+ )
+
+ def test_ofp_table_to_user(self):
+ self.assertEqual(
+ 'ALL',
+ self.util.ofp_table_to_user(ofproto_v1_3.OFPTT_ALL)
+ )
+
+ def test_ofp_cml_from_user(self):
+ self.assertEqual(
+ ofproto_v1_3.OFPCML_NO_BUFFER,
+ self.util.ofp_cml_from_user('NO_BUFFER')
+ )
+
+ def test_ofp_cml_to_user(self):
+ self.assertEqual(
+ 'NO_BUFFER',
+ self.util.ofp_cml_to_user(ofproto_v1_3.OFPCML_NO_BUFFER)
+ )
+
+ def test_ofp_group_from_user(self):
+ self.assertEqual(
+ ofproto_v1_3.OFPG_ANY,
+ self.util.ofp_group_from_user('ANY')
+ )
+
+ def test_ofp_group_to_user(self):
+ self.assertEqual(
+ 'ANY',
+ self.util.ofp_group_to_user(ofproto_v1_3.OFPG_ANY)
+ )
+
+ def test_ofp_buffer_from_user(self):
+ self.assertEqual(
+ ofproto_v1_3.OFP_NO_BUFFER,
+ self.util.ofp_buffer_from_user('NO_BUFFER')
+ )
+ self.assertEqual(
+ 1,
+ self.util.ofp_buffer_from_user(1) # not matched
+ )
+
+ def test_ofp_buffer_to_user(self):
+ self.assertEqual(
+ 'NO_BUFFER',
+ self.util.ofp_buffer_to_user(ofproto_v1_3.OFP_NO_BUFFER)
+ )
+ self.assertEqual(
+ 1,
+ self.util.ofp_buffer_to_user(1) # not matched
+ )
+
+ def test_ofp_meter_from_user(self):
+ self.assertEqual(
+ ofproto_v1_3.OFPM_ALL,
+ self.util.ofp_meter_from_user('ALL')
+ )
+
+ def test_ofp_meter_to_user(self):
+ self.assertEqual(
+ 'ALL',
+ self.util.ofp_meter_to_user(ofproto_v1_3.OFPM_ALL)
+ )
+
+ def test_ofp_queue_from_user(self):
+ self.assertEqual(
+ ofproto_v1_3.OFPQ_ALL,
+ self.util.ofp_queue_from_user('ALL')
+ )
+
+ def test_ofp_queue_to_user(self):
+ self.assertEqual(
+ 'ALL',
+ self.util.ofp_queue_to_user(ofproto_v1_3.OFPQ_ALL)
+ )
diff --git a/tests/unit/lib/test_ofctl_v1_3.py b/tests/unit/lib/test_ofctl_v1_3.py
new file mode 100644
index 00000000..81cfacbf
--- /dev/null
+++ b/tests/unit/lib/test_ofctl_v1_3.py
@@ -0,0 +1,54 @@
+# Copyright (C) 2013 Stratosphere Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+from nose.tools import *
+
+from ryu.lib import ofctl_v1_3
+from ryu.ofproto import ofproto_v1_3, ofproto_v1_3_parser
+from ryu.ofproto import ofproto_protocol
+from ryu.ofproto.ofproto_v1_3_parser import OFPActionPopMpls
+
+LOG = logging.getLogger('test_ofctl_v1_3')
+
+
+class Test_ofctl_v1_3(unittest.TestCase):
+
+ """ Test case for ofctl_v1_3
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_to_actions_pop_mpls(self):
+ dp = ofproto_protocol.ProtocolDesc(version=ofproto_v1_3.OFP_VERSION)
+
+ acts = [
+ {
+ 'type': 'POP_MPLS',
+ 'ethertype': 0x0800
+ }
+ ]
+ result = ofctl_v1_3.to_actions(dp, acts)
+ insts = result[0]
+ act = insts.actions[0]
+ ok_(isinstance(act, OFPActionPopMpls))
+ eq_(act.ethertype, 0x0800)
diff --git a/tests/unit/lib/test_ofp_pktinfilter.py b/tests/unit/lib/test_ofp_pktinfilter.py
new file mode 100644
index 00000000..2c037737
--- /dev/null
+++ b/tests/unit/lib/test_ofp_pktinfilter.py
@@ -0,0 +1,92 @@
+# Copyright (C) 2013 Stratosphere Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import six
+
+from nose.tools import *
+
+from ryu.controller import ofp_event
+from ryu.controller.handler import (
+ set_ev_cls,
+ MAIN_DISPATCHER,
+)
+from ryu.lib.packet import vlan, ethernet, ipv4
+from ryu.lib.ofp_pktinfilter import packet_in_filter, RequiredTypeFilter
+from ryu.lib import mac
+from ryu.ofproto import ether, ofproto_v1_3, ofproto_v1_3_parser
+from ryu.ofproto.ofproto_protocol import ProtocolDesc
+
+
+LOG = logging.getLogger('test_pktinfilter')
+
+
+class _PacketInFilterApp(object):
+ @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
+ @packet_in_filter(RequiredTypeFilter, {'types': [
+ vlan.vlan,
+ ]})
+ def packet_in_handler(self, ev):
+ return True
+
+
+class Test_packet_in_filter(unittest.TestCase):
+
+ """ Test case for pktinfilter
+ """
+
+ def setUp(self):
+ self.app = _PacketInFilterApp()
+
+ def tearDown(self):
+ pass
+
+ def test_pkt_in_filter_pass(self):
+ datapath = ProtocolDesc(version=ofproto_v1_3.OFP_VERSION)
+ e = ethernet.ethernet(mac.BROADCAST_STR,
+ mac.BROADCAST_STR,
+ ether.ETH_TYPE_8021Q)
+ v = vlan.vlan()
+ i = ipv4.ipv4()
+ pkt = (e / v / i)
+ pkt.serialize()
+ pkt_in = ofproto_v1_3_parser.OFPPacketIn(datapath,
+ data=six.binary_type(pkt.data))
+ ev = ofp_event.EventOFPPacketIn(pkt_in)
+ ok_(self.app.packet_in_handler(ev))
+
+ def test_pkt_in_filter_discard(self):
+ datapath = ProtocolDesc(version=ofproto_v1_3.OFP_VERSION)
+ e = ethernet.ethernet(mac.BROADCAST_STR,
+ mac.BROADCAST_STR,
+ ether.ETH_TYPE_IP)
+ i = ipv4.ipv4()
+ pkt = (e / i)
+ pkt.serialize()
+ pkt_in = ofproto_v1_3_parser.OFPPacketIn(datapath,
+ data=six.binary_type(pkt.data))
+ ev = ofp_event.EventOFPPacketIn(pkt_in)
+ ok_(not self.app.packet_in_handler(ev))
+
+ def test_pkt_in_filter_truncated(self):
+ datapath = ProtocolDesc(version=ofproto_v1_3.OFP_VERSION)
+ truncated_data = ''
+ pkt_in = ofproto_v1_3_parser.OFPPacketIn(datapath,
+ data=truncated_data)
+ ev = ofp_event.EventOFPPacketIn(pkt_in)
+ ok_(not self.app.packet_in_handler(ev))
diff --git a/tests/unit/lib/test_pack_utils.py b/tests/unit/lib/test_pack_utils.py
new file mode 100644
index 00000000..5bc99513
--- /dev/null
+++ b/tests/unit/lib/test_pack_utils.py
@@ -0,0 +1,59 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+import six
+import struct
+
+from nose.tools import ok_, eq_
+
+from ryu.lib import pack_utils
+
+
+class TestMsgPackInto(unittest.TestCase):
+ """ Test case for msg_pack_into
+ """
+
+ def _test_msg_pack_into(self, offset_type='e'):
+ fmt = '!HH'
+ len_ = struct.calcsize(fmt)
+ buf = bytearray(len_)
+ offset = len_
+ arg1 = 1
+ arg2 = 2
+
+ if offset_type == 'l':
+ offset += 1
+ elif offset_type == 'g':
+ offset -= 1
+
+ pack_utils.msg_pack_into(fmt, buf, offset, arg1, arg2)
+
+ check_offset = len(buf) - len_
+ res = struct.unpack_from(fmt, six.binary_type(buf), check_offset)
+
+ eq_(arg1, res[0])
+ eq_(arg2, res[1])
+
+ return True
+
+ def test_msg_pack_into(self):
+ ok_(self._test_msg_pack_into())
+
+ def test_msg_pack_into_less(self):
+ ok_(self._test_msg_pack_into('l'))
+
+ def test_msg_pack_into_greater(self):
+ ok_(self._test_msg_pack_into('g'))
diff --git a/tests/unit/lib/test_pcaplib.py b/tests/unit/lib/test_pcaplib.py
new file mode 100644
index 00000000..ac86904e
--- /dev/null
+++ b/tests/unit/lib/test_pcaplib.py
@@ -0,0 +1,230 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import logging
+import os
+import struct
+import sys
+import unittest
+
+try:
+ import mock # Python 2
+except ImportError:
+ from unittest import mock # Python 3
+
+from nose.tools import eq_
+from nose.tools import raises
+
+from ryu.utils import binary_str
+from ryu.lib import pcaplib
+
+LOG = logging.getLogger(__name__)
+
+PCAP_PACKET_DATA_DIR = os.path.join(
+ os.path.dirname(sys.modules[__name__].__file__),
+ '../../packet_data/pcap/')
+
+
+class Test_PcapFileHdr(unittest.TestCase):
+ """
+ Test case for pcaplib.PcapFileHdr class
+ """
+ hdr = pcaplib.PcapFileHdr(
+ magic=None, # temporary default
+ version_major=2,
+ version_minor=4,
+ thiszone=0x11223344,
+ sigfigs=0x22334455,
+ snaplen=0x33445566,
+ network=0x44556677,
+ )
+
+ buf_big = (
+ b'\xa1\xb2\xc3\xd4' # magic (Big Endian)
+ b'\x00\x02\x00\x04' # version_major, version_minor
+ b'\x11\x22\x33\x44' # thiszone
+ b'\x22\x33\x44\x55' # sigfigs
+ b'\x33\x44\x55\x66' # snaplen
+ b'\x44\x55\x66\x77' # network
+ )
+
+ buf_little = (
+ b'\xd4\xc3\xb2\xa1' # magic (Little Endian)
+ b'\x02\x00\x04\x00' # version_major, version_minor
+ b'\x44\x33\x22\x11' # thiszone
+ b'\x55\x44\x33\x22' # sigfigs
+ b'\x66\x55\x44\x33' # snaplen
+ b'\x77\x66\x55\x44' # network
+ )
+
+ buf_invalid = (
+ b'\xff\xff\xff\xff' # magic (Invalid)
+ b'\x02\x00\x04\x00' # version_major, version_minor
+ b'\x44\x33\x22\x11' # thiszone
+ b'\x55\x44\x33\x22' # sigfigs
+ b'\x66\x55\x44\x33' # snaplen
+ b'\x77\x66\x55\x44' # network
+ )
+
+ def _assert(self, magic, ret):
+ self.hdr.magic = magic
+ eq_(self.hdr.__dict__, ret.__dict__)
+
+ def test_parser_with_big_endian(self):
+ ret, byteorder = pcaplib.PcapFileHdr.parser(self.buf_big)
+ self._assert(pcaplib.PcapFileHdr.MAGIC_NUMBER_IDENTICAL, ret)
+ eq_('big', byteorder)
+
+ def test_parser_with_little_endian(self):
+ ret, byteorder = pcaplib.PcapFileHdr.parser(self.buf_little)
+ self._assert(pcaplib.PcapFileHdr.MAGIC_NUMBER_SWAPPED, ret)
+ eq_('little', byteorder)
+
+ @mock.patch('sys.byteorder', 'big')
+ def test_serialize_with_big_endian(self):
+ buf = self.hdr.serialize()
+ eq_(binary_str(self.buf_big), binary_str(buf))
+
+ @mock.patch('sys.byteorder', 'little')
+ def test_serialize_with_little_endian(self):
+ buf = self.hdr.serialize()
+ eq_(binary_str(self.buf_little), binary_str(buf))
+
+ @raises(struct.error)
+ def test_parser_with_invalid_magic_number(self):
+ pcaplib.PcapFileHdr.parser(self.buf_invalid)
+
+
+class Test_PcapPktHdr(unittest.TestCase):
+ """
+ Test case for pcaplib.PcapPktHdr class
+ """
+ expected_buf = b'test_data'
+
+ hdr = pcaplib.PcapPktHdr(
+ ts_sec=0x11223344,
+ ts_usec=0x22334455,
+ incl_len=len(expected_buf),
+ orig_len=0x44556677,
+ )
+
+ buf_big = (
+ b'\x11\x22\x33\x44' # ts_sec
+ b'\x22\x33\x44\x55' # ts_usec
+ b'\x00\x00\x00\x09' # incl_len = len(expected_buf)
+ b'\x44\x55\x66\x77' # orig_len
+ )
+
+ buf_little = (
+ b'\x44\x33\x22\x11' # ts_sec
+ b'\x55\x44\x33\x22' # ts_usec
+ b'\x09\x00\x00\x00' # incl_len = len(expected_buf)
+ b'\x77\x66\x55\x44' # orig_len
+ )
+
+ def test_parser_with_big_endian(self):
+ ret, buf = pcaplib.PcapPktHdr.parser(
+ self.buf_big + self.expected_buf, 'big')
+ eq_(self.hdr.__dict__, ret.__dict__)
+ eq_(self.expected_buf, buf)
+
+ def test_parser_with_little_endian(self):
+ ret, buf = pcaplib.PcapPktHdr.parser(
+ self.buf_little + self.expected_buf, 'little')
+ eq_(self.hdr.__dict__, ret.__dict__)
+ eq_(self.expected_buf, buf)
+
+ @mock.patch('sys.byteorder', 'big')
+ def test_serialize_with_big_endian(self):
+ buf = self.hdr.serialize()
+ eq_(binary_str(self.buf_big), binary_str(buf))
+
+ @mock.patch('sys.byteorder', 'little')
+ def test_serialize_with_little_endian(self):
+ buf = self.hdr.serialize()
+ eq_(binary_str(self.buf_little), binary_str(buf))
+
+
+class Test_pcaplib_Reader(unittest.TestCase):
+ """
+ Test case for pcaplib.Reader class
+ """
+
+ expected_outputs = [
+ (0x1234 + (0x5678 / 1e6), b'test_data_1'), # sec=0x1234, usec=0x5678
+ (0x2345 + (0x6789 / 1e6), b'test_data_2'), # sec=0x2345, usec=0x6789
+ ]
+
+ def _test(self, file_name):
+ outputs = []
+ for ts, buf in pcaplib.Reader(open(file_name, 'rb')):
+ outputs.append((ts, buf))
+
+ eq_(self.expected_outputs, outputs)
+
+ def test_with_big_endian(self):
+ self._test(os.path.join(PCAP_PACKET_DATA_DIR, 'big_endian.pcap'))
+
+ def test_with_little_endian(self):
+ self._test(os.path.join(PCAP_PACKET_DATA_DIR, 'little_endian.pcap'))
+
+
+class DummyFile(object):
+
+ def __init__(self):
+ self.buf = b''
+
+ def write(self, buf):
+ self.buf += buf
+
+ def close(self):
+ pass
+
+
+class Test_pcaplib_Writer(unittest.TestCase):
+ """
+ Test case for pcaplib.Writer class
+ """
+
+ @staticmethod
+ def _test(file_name):
+ expected_buf = open(file_name, 'rb').read()
+ f = DummyFile()
+ w = pcaplib.Writer(f)
+ w.write_pkt(b'test_data_1', ts=(0x1234 + (0x5678 / 1e6)))
+ w.write_pkt(b'test_data_2', ts=(0x2345 + (0x6789 / 1e6)))
+ eq_(expected_buf, f.buf)
+
+ @mock.patch('sys.byteorder', 'big')
+ def test_with_big_endian(self):
+ self._test(os.path.join(PCAP_PACKET_DATA_DIR, 'big_endian.pcap'))
+
+ @mock.patch('sys.byteorder', 'little')
+ def test_with_little_endian(self):
+ self._test(os.path.join(PCAP_PACKET_DATA_DIR, 'little_endian.pcap'))
+
+ @staticmethod
+ @mock.patch.object(pcaplib.Writer, '_write_pcap_file_hdr', mock.MagicMock)
+ @mock.patch.object(pcaplib.Writer, '_write_pkt_hdr', mock.MagicMock)
+ def test_with_longer_buf():
+ f = DummyFile()
+ snaplen = 4
+ w = pcaplib.Writer(f, snaplen=snaplen)
+ w.write_pkt(b'hogehoge', ts=0)
+ expected_buf = b'hoge' # b'hogehoge'[:snaplen]
+ eq_(expected_buf, f.buf)
+ eq_(snaplen, len(f.buf))
diff --git a/tests/unit/lib/test_rpc.py b/tests/unit/lib/test_rpc.py
new file mode 100644
index 00000000..2df123ee
--- /dev/null
+++ b/tests/unit/lib/test_rpc.py
@@ -0,0 +1,360 @@
+# Copyright (C) 2013-2015 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013-2015 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import numbers
+import socket
+import struct
+import unittest
+
+from nose.tools import raises
+import six
+
+from ryu.lib import hub
+from ryu.lib import rpc
+
+
+class MyException(BaseException):
+ pass
+
+
+class Test_rpc(unittest.TestCase):
+ """ Test case for ryu.lib.rpc
+ """
+
+ def _handle_request(self, m):
+ e = self._server_endpoint
+ msgid, method, params = m
+ if method == 'resp':
+ e.send_response(msgid, result=params[0])
+ elif method == 'err':
+ e.send_response(msgid, error=params[0])
+ elif method == 'callback':
+ n, cb, v = params
+ assert n > 0
+ self._requests.add(e.send_request(cb, [msgid, n, cb, v]))
+ elif method == 'notify1':
+ e.send_notification(params[1], params[2])
+ e.send_response(msgid, result=params[0])
+ elif method == 'shutdown':
+ how = getattr(socket, params[0])
+ self._server_sock.shutdown(how)
+ e.send_response(msgid, result=method)
+ else:
+ raise Exception("unknown method %s" % method)
+
+ def _handle_notification(self, m):
+ e = self._server_endpoint
+ method, params = m
+ if method == 'notify2':
+ e.send_notification(params[0], params[1])
+
+ def _handle_response(self, m):
+ e = self._server_endpoint
+ msgid, error, result = m
+ assert error is None
+ self._requests.remove(msgid)
+ omsgid, n, cb, v = result
+ assert n >= 0
+ if n == 0:
+ e.send_response(omsgid, result=v)
+ else:
+ self._requests.add(e.send_request(cb, [omsgid, n, cb, v]))
+
+ def setUp(self):
+ self._server_sock, self._client_sock = socket.socketpair()
+ table = {
+ rpc.MessageType.REQUEST: self._handle_request,
+ rpc.MessageType.RESPONSE: self._handle_response,
+ rpc.MessageType.NOTIFY: self._handle_notification
+ }
+ self._requests = set()
+ self._server_sock.setblocking(0)
+ self._server_endpoint = rpc.EndPoint(self._server_sock,
+ disp_table=table)
+ self._server_thread = hub.spawn(self._server_endpoint.serve)
+
+ def tearDown(self):
+ hub.kill(self._server_thread)
+ hub.joinall([self._server_thread])
+
+ def test_0_call_str(self):
+ c = rpc.Client(self._client_sock)
+ obj = 'hoge'
+ result = c.call('resp', [obj])
+ assert result == obj
+ assert isinstance(result, str)
+
+ def test_0_call_int(self):
+ c = rpc.Client(self._client_sock)
+ obj = 12345
+ assert isinstance(obj, int)
+ result = c.call('resp', [obj])
+ assert result == obj
+ assert isinstance(result, numbers.Integral)
+
+ def test_0_call_int2(self):
+ c = rpc.Client(self._client_sock)
+ obj = six.MAXSIZE
+ assert isinstance(obj, int)
+ result = c.call('resp', [obj])
+ assert result == obj
+ assert isinstance(result, numbers.Integral)
+
+ def test_0_call_int3(self):
+ c = rpc.Client(self._client_sock)
+ obj = - six.MAXSIZE - 1
+ assert isinstance(obj, int)
+ result = c.call('resp', [obj])
+ assert result == obj
+ assert isinstance(result, numbers.Integral)
+
+ def test_0_call_long(self):
+ c = rpc.Client(self._client_sock)
+ obj = 0xffffffffffffffff # max value for msgpack
+ assert isinstance(obj, numbers.Integral)
+ result = c.call('resp', [obj])
+ assert result == obj
+ assert isinstance(result, numbers.Integral)
+
+ def test_0_call_long2(self):
+ c = rpc.Client(self._client_sock)
+ # Note: the python type of this value is int for 64-bit arch
+ obj = -0x8000000000000000 # min value for msgpack
+ assert isinstance(obj, numbers.Integral)
+ result = c.call('resp', [obj])
+ assert result == obj
+ assert isinstance(result, numbers.Integral)
+
+ @raises(TypeError)
+ def test_0_call_bytearray(self):
+ c = rpc.Client(self._client_sock)
+ obj = bytearray(b'foo')
+ result = c.call('resp', [obj])
+ assert result == obj
+ assert isinstance(result, str)
+
+ def test_1_shutdown_wr(self):
+ # test if the server shutdown on disconnect
+ self._client_sock.shutdown(socket.SHUT_WR)
+ hub.joinall([self._server_thread])
+
+ @raises(EOFError)
+ def test_1_client_shutdown_wr(self):
+ c = rpc.Client(self._client_sock)
+ c.call('shutdown', ['SHUT_WR'])
+
+ def test_1_call_True(self):
+ c = rpc.Client(self._client_sock)
+ obj = True
+ assert c.call('resp', [obj]) == obj
+
+ def test_2_call_None(self):
+ c = rpc.Client(self._client_sock)
+ obj = None
+ assert c.call('resp', [obj]) is None
+
+ def test_2_call_False(self):
+ c = rpc.Client(self._client_sock)
+ obj = False
+ assert c.call('resp', [obj]) == obj
+
+ def test_2_call_dict(self):
+ c = rpc.Client(self._client_sock)
+ obj = {'hoge': 1, 'fuga': 2}
+ assert c.call('resp', [obj]) == obj
+
+ def test_2_call_empty_dict(self):
+ c = rpc.Client(self._client_sock)
+ obj = {}
+ assert c.call('resp', [obj]) == obj
+
+ def test_2_call_array(self):
+ c = rpc.Client(self._client_sock)
+ obj = [1, 2, 3, 4]
+ assert c.call('resp', [obj]) == obj
+
+ def test_2_call_empty_array(self):
+ c = rpc.Client(self._client_sock)
+ obj = []
+ assert c.call('resp', [obj]) == obj
+
+ def test_2_call_tuple(self):
+ c = rpc.Client(self._client_sock)
+ # Note: msgpack library implicitly convert a tuple into a list
+ obj = (1, 2, 3)
+ assert c.call('resp', [obj]) == list(obj)
+
+ def test_2_call_unicode(self):
+ c = rpc.Client(self._client_sock)
+ # Note: We use encoding='utf-8' option in msgpack.Packer/Unpacker
+ # in order to support Python 3.
+ # With this option, utf-8 encoded bytes will be decoded into unicode
+ # type in Python 2 and str type in Python 3.
+ obj = u"hoge"
+ result = c.call('resp', [obj])
+ assert result == obj
+ assert isinstance(result, six.text_type)
+
+ def test_2_call_small_binary(self):
+ c = rpc.Client(self._client_sock)
+ obj = struct.pack("100x")
+ result = c.call('resp', [obj])
+ assert result == obj
+ assert isinstance(result, six.binary_type)
+
+ def test_3_call_complex(self):
+ c = rpc.Client(self._client_sock)
+ obj = [1, 'hoge', {'foo': 1, 3: 'bar'}]
+ assert c.call('resp', [obj]) == obj
+
+ @unittest.skip("doesn't work with eventlet 0.18 and later")
+ def test_4_call_large_binary(self):
+ c = rpc.Client(self._client_sock)
+ obj = struct.pack("10000000x")
+ result = c.call('resp', [obj])
+ assert result == obj
+ assert isinstance(result, six.binary_type)
+
+ def test_0_notification1(self):
+ l = []
+
+ def callback(n):
+ l.append(n)
+ c = rpc.Client(self._client_sock, notification_callback=callback)
+ obj = 'hogehoge'
+ robj = 'fugafuga'
+ assert c.call('notify1', [robj, 'notify_hoge', [obj]]) == robj
+ c.receive_notification()
+ assert len(l) == 1
+ n = l.pop(0)
+ assert n is not None
+ method, params = n
+ assert method == 'notify_hoge'
+ assert params[0] == obj
+
+ def test_0_notification2(self):
+ l = []
+
+ def callback(n):
+ l.append(n)
+ c = rpc.Client(self._client_sock, notification_callback=callback)
+ obj = 'hogehogehoge'
+ c.send_notification('notify2', ['notify_hoge', [obj]])
+ c.receive_notification()
+ assert len(l) == 1
+ n = l.pop(0)
+ assert n is not None
+ method, params = n
+ assert method == 'notify_hoge'
+ assert params[0] == obj
+
+ def test_0_call_error(self):
+ c = rpc.Client(self._client_sock)
+ obj = 'hoge'
+ try:
+ c.call('err', [obj])
+ raise Exception("unexpected")
+ except rpc.RPCError as e:
+ assert e.get_value() == obj
+
+ def test_0_call_error_notification(self):
+ l = []
+
+ def callback(n):
+ l.append(n)
+ c = rpc.Client(self._client_sock, notification_callback=callback)
+ c.send_notification('notify2', ['notify_foo', []])
+ hub.sleep(0.5) # give the peer a chance to run
+ obj = 'hoge'
+ try:
+ c.call('err', [obj])
+ raise Exception("unexpected")
+ except rpc.RPCError as e:
+ assert e.get_value() == obj
+ assert len(l) == 1
+ n = l.pop(0)
+ method, params = n
+ assert method == 'notify_foo'
+ assert params == []
+
+ def test_4_async_call(self):
+ """send a bunch of requests and then wait for responses
+ """
+ num_calls = 9999
+ old_blocking = self._client_sock.setblocking(0)
+ try:
+ e = rpc.EndPoint(self._client_sock)
+ s = set()
+ for i in range(1, num_calls + 1):
+ s.add(e.send_request('resp', [i]))
+ sum = 0
+ while s:
+ e.block()
+ e.process()
+ done = set()
+ for x in s:
+ r = e.get_response(x)
+ if r is None:
+ continue
+ res, error = r
+ assert error is None
+ sum += res
+ done.add(x)
+ assert done.issubset(s)
+ s -= done
+ assert sum == (1 + num_calls) * num_calls / 2
+ finally:
+ self._client_sock.setblocking(old_blocking)
+
+ def test_4_async_call2(self):
+ """both sides act as rpc client and server
+ """
+ assert not self._requests
+ num_calls = 100
+ old_blocking = self._client_sock.setblocking(0)
+ try:
+ e = rpc.EndPoint(self._client_sock)
+ s = set()
+ for i in range(1, num_calls + 1):
+ s.add(e.send_request('callback', [i, 'ourcallback', 0]))
+ sum = 0
+ while s:
+ e.block()
+ e.process()
+ done = set()
+ for x in s:
+ r = e.get_response(x)
+ if r is None:
+ continue
+ res, error = r
+ assert error is None
+ sum += res
+ done.add(x)
+ assert done.issubset(s)
+ s -= done
+ r = e.get_request()
+ if r is not None:
+ msgid, method, params = r
+ assert method == 'ourcallback'
+ omsgid, n, cb, v = params
+ assert omsgid in s
+ assert cb == 'ourcallback'
+ assert n > 0
+ e.send_response(msgid, result=[omsgid, n - 1, cb, v + 1])
+ assert sum == (1 + num_calls) * num_calls / 2
+ finally:
+ self._client_sock.setblocking(old_blocking)
+ assert not self._requests
diff --git a/tests/unit/lib/test_stringify.py b/tests/unit/lib/test_stringify.py
new file mode 100644
index 00000000..46fb21f0
--- /dev/null
+++ b/tests/unit/lib/test_stringify.py
@@ -0,0 +1,75 @@
+# Copyright (C) 2013-2015 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013-2015 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import base64
+import six
+import unittest
+from nose.tools import eq_
+
+from ryu.lib import stringify
+
+
+class C1(stringify.StringifyMixin):
+ def __init__(self, a, c):
+ print("init %s %s" % (a, c))
+ self.a = a
+ self._b = 'B'
+ self.c = c
+
+
+class Test_stringify(unittest.TestCase):
+ """ Test case for ryu.lib.stringify
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_jsondict(self):
+ if six.PY3:
+ def b64encode(s):
+ return base64.b64encode(s).decode('ascii')
+ else:
+ b64encode = base64.b64encode
+ j = {'C1': {'a': 'QUFB', 'c': 'Q0ND'}}
+ eq_(j['C1']['a'], b64encode(b'AAA'))
+ eq_(j['C1']['c'], b64encode(b'CCC'))
+ c = C1(a=b'AAA', c=b'CCC')
+ c2 = C1.from_jsondict(j['C1'])
+ eq_(c.__class__, c2.__class__)
+ eq_(c.__dict__, c2.__dict__)
+ eq_(j, c.to_jsondict())
+
+ def test_jsondict2(self):
+
+ def my_encode(x):
+ return x.lower()
+
+ def my_decode(x):
+ return x.upper()
+
+ j = {'C1': {'a': 'aaa', 'c': 'ccc'}}
+ eq_(j['C1']['a'], my_encode('AAA'))
+ eq_(j['C1']['c'], my_encode('CCC'))
+ c = C1(a='AAA', c='CCC')
+ c2 = C1.from_jsondict(j['C1'], decode_string=my_decode)
+ eq_(c.__class__, c2.__class__)
+ eq_(c.__dict__, c2.__dict__)
+ eq_(j, c.to_jsondict(encode_string=my_encode))
diff --git a/tests/unit/ofproto/__init__.py b/tests/unit/ofproto/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/ofproto/__init__.py
diff --git a/tests/unit/ofproto/json/of10/1-1-ofp_packet_out.packet.json b/tests/unit/ofproto/json/of10/1-1-ofp_packet_out.packet.json
new file mode 100644
index 00000000..0dc98f49
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/1-1-ofp_packet_out.packet.json
@@ -0,0 +1,15 @@
+{
+ "OFPPacketOut": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "max_len": 65535,
+ "port": 65532
+ }
+ }
+ ],
+ "buffer_id": 4294967295,
+ "data": "8guk0D9w8gukffjqCABFAABU+BoAAP8Br4sKAAABCgAAAggAAgj3YAAAMdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vAAAAAAAAAAA=",
+ "in_port": 65533
+ }
+}
diff --git a/tests/unit/ofproto/json/of10/1-2-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of10/1-2-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..4a63685e
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/1-2-ofp_flow_mod.packet.json
@@ -0,0 +1,37 @@
+{
+ "OFPFlowMod": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "max_len": 65535,
+ "port": 6
+ }
+ }
+ ],
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "match": {
+ "OFPMatch": {
+ "dl_dst": "f2:0b:a4:7d:f8:ea",
+ "dl_src": "00:00:00:00:00:00",
+ "dl_type": 0,
+ "dl_vlan": 0,
+ "dl_vlan_pcp": 0,
+ "in_port": 0,
+ "nw_dst": "0.0.0.0",
+ "nw_proto": 0,
+ "nw_src": "0.0.0.0",
+ "nw_tos": 0,
+ "tp_dst": 0,
+ "tp_src": 0,
+ "wildcards": 4194295
+ }
+ },
+ "out_port": 65532,
+ "priority": 123
+ }
+}
diff --git a/tests/unit/ofproto/json/of10/1-4-ofp_packet_in.packet.json b/tests/unit/ofproto/json/of10/1-4-ofp_packet_in.packet.json
new file mode 100644
index 00000000..6ccd2fb8
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/1-4-ofp_packet_in.packet.json
@@ -0,0 +1,9 @@
+{
+ "OFPPacketIn": {
+ "buffer_id": 2,
+ "data": "////////8gukffjqCAYAAQgABgQAAfILpH346goAAAEAAAAAAAAKAAAD",
+ "in_port": 99,
+ "reason": 1,
+ "total_len": 42
+ }
+}
diff --git a/tests/unit/ofproto/json/of10/1-5-features_request.packet.json b/tests/unit/ofproto/json/of10/1-5-features_request.packet.json
new file mode 100644
index 00000000..8f48ad5a
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/1-5-features_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPFeaturesRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of10/1-6-ofp_switch_features.packet.json b/tests/unit/ofproto/json/of10/1-6-ofp_switch_features.packet.json
new file mode 100644
index 00000000..208431f7
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/1-6-ofp_switch_features.packet.json
@@ -0,0 +1,37 @@
+{
+ "OFPSwitchFeatures": {
+ "actions": 2115,
+ "capabilities": 169,
+ "datapath_id": 1095522080376,
+ "n_buffers": 0,
+ "n_tables": 255,
+ "ports": {
+ "6": {
+ "OFPPhyPort": {
+ "advertised": 640,
+ "config": 0,
+ "curr": 648,
+ "hw_addr": "f2:0b:a4:7d:f8:ea",
+ "name": "Port6",
+ "peer": 648,
+ "port_no": 6,
+ "state": 2,
+ "supported": 648
+ }
+ },
+ "7": {
+ "OFPPhyPort": {
+ "advertised": 640,
+ "config": 0,
+ "curr": 648,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "name": "Port7",
+ "peer": 648,
+ "port_no": 7,
+ "state": 16,
+ "supported": 648
+ }
+ }
+ }
+ }
+}
diff --git a/tests/unit/ofproto/json/of10/libofproto-OFP10-ofp_packet_out_packet_library.packet.json b/tests/unit/ofproto/json/of10/libofproto-OFP10-ofp_packet_out_packet_library.packet.json
new file mode 100644
index 00000000..f8e38d71
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/libofproto-OFP10-ofp_packet_out_packet_library.packet.json
@@ -0,0 +1,58 @@
+{
+ "OFPPacketOut": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "max_len": 65535,
+ "port": 65532
+ }
+ }
+ ],
+ "buffer_id": 4294967295,
+ "data": {
+ "Packet": {
+ "protocols": [
+ {
+ "ethernet": {
+ "dst": "f2:0b:a4:d0:3f:70",
+ "ethertype": 2048,
+ "src": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "ipv4": {
+ "csum": 44939,
+ "dst": "10.0.0.2",
+ "flags": 0,
+ "header_length": 5,
+ "identification": 63514,
+ "offset": 0,
+ "option": null,
+ "proto": 1,
+ "src": "10.0.0.1",
+ "tos": 0,
+ "total_length": 84,
+ "ttl": 255,
+ "version": 4
+ }
+ },
+ {
+ "icmp": {
+ "code": 0,
+ "csum": 520,
+ "data": {
+ "echo": {
+ "data": "MdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vAAAAAAAAAAA=",
+ "id": 63328,
+ "seq": 0
+ }
+ },
+ "type": 8
+ }
+ }
+ ]
+ }
+ },
+ "in_port": 65533
+ }
+}
diff --git a/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_dec_mpls_ttl.packet.json b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_dec_mpls_ttl.packet.json
new file mode 100644
index 00000000..a41c2b64
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_dec_mpls_ttl.packet.json
@@ -0,0 +1,37 @@
+{
+ "OFPFlowMod": {
+ "actions": [
+ {
+ "NXActionDecMplsTtl": {
+ "subtype": 26,
+ "vendor": 8992
+ }
+ }
+ ],
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "match": {
+ "OFPMatch": {
+ "dl_dst": "00:00:00:00:00:00",
+ "dl_src": "00:00:00:00:00:00",
+ "dl_type": 34887,
+ "dl_vlan": 0,
+ "dl_vlan_pcp": 0,
+ "in_port": 0,
+ "nw_dst": "0.0.0.0",
+ "nw_proto": 0,
+ "nw_src": "0.0.0.0",
+ "nw_tos": 0,
+ "tp_dst": 0,
+ "tp_src": 0,
+ "wildcards": 3678447
+ }
+ },
+ "out_port": 65535,
+ "priority": 100
+ }
+}
diff --git a/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_dec_nw_ttl.packet.json b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_dec_nw_ttl.packet.json
new file mode 100644
index 00000000..3f6806c8
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_dec_nw_ttl.packet.json
@@ -0,0 +1,37 @@
+{
+ "OFPFlowMod": {
+ "actions": [
+ {
+ "NXActionDecTtl": {
+ "subtype": 18,
+ "vendor": 8992
+ }
+ }
+ ],
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "match": {
+ "OFPMatch": {
+ "dl_dst": "00:00:00:00:00:00",
+ "dl_src": "00:00:00:00:00:00",
+ "dl_type": 34887,
+ "dl_vlan": 0,
+ "dl_vlan_pcp": 0,
+ "in_port": 0,
+ "nw_dst": "0.0.0.0",
+ "nw_proto": 0,
+ "nw_src": "0.0.0.0",
+ "nw_tos": 0,
+ "tp_dst": 0,
+ "tp_src": 0,
+ "wildcards": 3678447
+ }
+ },
+ "out_port": 65535,
+ "priority": 100
+ }
+}
diff --git a/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_pop_mpls.packet.json b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_pop_mpls.packet.json
new file mode 100644
index 00000000..69c0d70b
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_pop_mpls.packet.json
@@ -0,0 +1,38 @@
+{
+ "OFPFlowMod": {
+ "actions": [
+ {
+ "NXActionPopMpls": {
+ "ethertype": 2048,
+ "subtype": 24,
+ "vendor": 8992
+ }
+ }
+ ],
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "match": {
+ "OFPMatch": {
+ "dl_dst": "00:00:00:00:00:00",
+ "dl_src": "00:00:00:00:00:00",
+ "dl_type": 34887,
+ "dl_vlan": 0,
+ "dl_vlan_pcp": 0,
+ "in_port": 0,
+ "nw_dst": "0.0.0.0",
+ "nw_proto": 0,
+ "nw_src": "0.0.0.0",
+ "nw_tos": 0,
+ "tp_dst": 0,
+ "tp_src": 0,
+ "wildcards": 3678447
+ }
+ },
+ "out_port": 65535,
+ "priority": 100
+ }
+}
diff --git a/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_push_mpls.packet.json b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_push_mpls.packet.json
new file mode 100644
index 00000000..9e7853cb
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_push_mpls.packet.json
@@ -0,0 +1,38 @@
+{
+ "OFPFlowMod": {
+ "actions": [
+ {
+ "NXActionPushMpls": {
+ "ethertype": 34887,
+ "subtype": 23,
+ "vendor": 8992
+ }
+ }
+ ],
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "match": {
+ "OFPMatch": {
+ "dl_dst": "00:00:00:00:00:00",
+ "dl_src": "00:00:00:00:00:00",
+ "dl_type": 2048,
+ "dl_vlan": 0,
+ "dl_vlan_pcp": 0,
+ "in_port": 0,
+ "nw_dst": "0.0.0.0",
+ "nw_proto": 0,
+ "nw_src": "0.0.0.0",
+ "nw_tos": 0,
+ "tp_dst": 0,
+ "tp_src": 0,
+ "wildcards": 3678447
+ }
+ },
+ "out_port": 65535,
+ "priority": 100
+ }
+}
diff --git a/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_label.packet.json b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_label.packet.json
new file mode 100644
index 00000000..4cc001b2
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_label.packet.json
@@ -0,0 +1,38 @@
+{
+ "OFPFlowMod": {
+ "actions": [
+ {
+ "NXActionSetMplsLabel": {
+ "label": 10,
+ "subtype": 30,
+ "vendor": 8992
+ }
+ }
+ ],
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "match": {
+ "OFPMatch": {
+ "dl_dst": "00:00:00:00:00:00",
+ "dl_src": "00:00:00:00:00:00",
+ "dl_type": 34887,
+ "dl_vlan": 0,
+ "dl_vlan_pcp": 0,
+ "in_port": 0,
+ "nw_dst": "0.0.0.0",
+ "nw_proto": 0,
+ "nw_src": "0.0.0.0",
+ "nw_tos": 0,
+ "tp_dst": 0,
+ "tp_src": 0,
+ "wildcards": 3678447
+ }
+ },
+ "out_port": 65535,
+ "priority": 100
+ }
+}
diff --git a/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_tc.packet.json b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_tc.packet.json
new file mode 100644
index 00000000..864fd7e7
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_tc.packet.json
@@ -0,0 +1,38 @@
+{
+ "OFPFlowMod": {
+ "actions": [
+ {
+ "NXActionSetMplsTc": {
+ "subtype": 31,
+ "tc": 10,
+ "vendor": 8992
+ }
+ }
+ ],
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "match": {
+ "OFPMatch": {
+ "dl_dst": "00:00:00:00:00:00",
+ "dl_src": "00:00:00:00:00:00",
+ "dl_type": 34887,
+ "dl_vlan": 0,
+ "dl_vlan_pcp": 0,
+ "in_port": 0,
+ "nw_dst": "0.0.0.0",
+ "nw_proto": 0,
+ "nw_src": "0.0.0.0",
+ "nw_tos": 0,
+ "tp_dst": 0,
+ "tp_src": 0,
+ "wildcards": 3678447
+ }
+ },
+ "out_port": 65535,
+ "priority": 100
+ }
+}
diff --git a/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_ttl.packet.json b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_ttl.packet.json
new file mode 100644
index 00000000..da6e86f9
--- /dev/null
+++ b/tests/unit/ofproto/json/of10/ovs-ofctl-of10-action_set_mpls_ttl.packet.json
@@ -0,0 +1,38 @@
+{
+ "OFPFlowMod": {
+ "actions": [
+ {
+ "NXActionSetMplsTtl": {
+ "subtype": 25,
+ "ttl": 127,
+ "vendor": 8992
+ }
+ }
+ ],
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "match": {
+ "OFPMatch": {
+ "dl_dst": "00:00:00:00:00:00",
+ "dl_src": "00:00:00:00:00:00",
+ "dl_type": 34887,
+ "dl_vlan": 0,
+ "dl_vlan_pcp": 0,
+ "in_port": 0,
+ "nw_dst": "0.0.0.0",
+ "nw_proto": 0,
+ "nw_src": "0.0.0.0",
+ "nw_tos": 0,
+ "tp_dst": 0,
+ "tp_src": 0,
+ "wildcards": 3678447
+ }
+ },
+ "out_port": 65535,
+ "priority": 100
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-0-ofp_desc_stats_reply.packet.json b/tests/unit/ofproto/json/of12/3-0-ofp_desc_stats_reply.packet.json
new file mode 100644
index 00000000..4d5181ca
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-0-ofp_desc_stats_reply.packet.json
@@ -0,0 +1,15 @@
+{
+ "OFPStatsReply": {
+ "body": {
+ "OFPDescStats": {
+ "dp_desc": "dp",
+ "hw_desc": "hw",
+ "mfr_desc": "mfr",
+ "serial_num": "serial",
+ "sw_desc": "sw"
+ }
+ },
+ "flags": 0,
+ "type": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-1-ofp_packet_out.packet.json b/tests/unit/ofproto/json/of12/3-1-ofp_packet_out.packet.json
new file mode 100644
index 00000000..efb39e2d
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-1-ofp_packet_out.packet.json
@@ -0,0 +1,18 @@
+{
+ "OFPPacketOut": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 4294967292,
+ "type": 0
+ }
+ }
+ ],
+ "actions_len": 16,
+ "buffer_id": 4294967295,
+ "data": "8guk0D9w8gukffjqCABFAABU+BoAAP8Br4sKAAABCgAAAggAAgj3YAAAMdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vAAAAAAAAAAA=",
+ "in_port": 4294967293
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-10-ofp_hello.packet.json b/tests/unit/ofproto/json/of12/3-10-ofp_hello.packet.json
new file mode 100644
index 00000000..ce07cebd
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-10-ofp_hello.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPHello": {}
+}
diff --git a/tests/unit/ofproto/json/of12/3-11-ofp_flow_stats_request.packet.json b/tests/unit/ofproto/json/of12/3-11-ofp_flow_stats_request.packet.json
new file mode 100644
index 00000000..d12cac71
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-11-ofp_flow_stats_request.packet.json
@@ -0,0 +1,17 @@
+{
+ "OFPFlowStatsRequest": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-12-ofp_flow_stats_reply.packet.json b/tests/unit/ofproto/json/of12/3-12-ofp_flow_stats_reply.packet.json
new file mode 100644
index 00000000..5f802b45
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-12-ofp_flow_stats_reply.packet.json
@@ -0,0 +1,161 @@
+{
+ "OFPStatsReply": {
+ "body": [
+ {
+ "OFPFlowStats": {
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115277000,
+ "duration_sec": 358,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [],
+ "length": 56,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "packet_count": 0,
+ "priority": 65535,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPFlowStats": {
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115055000,
+ "duration_sec": 358,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 0,
+ "port": 4294967290,
+ "type": 0
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "length": 88,
+ "match": {
+ "OFPMatch": {
+ "length": 10,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "packet_count": 0,
+ "priority": 65534,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPFlowStats": {
+ "byte_count": 238,
+ "cookie": 0,
+ "duration_nsec": 511582000,
+ "duration_sec": 316220,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 1,
+ "type": 1
+ }
+ }
+ ],
+ "length": 80,
+ "match": {
+ "OFPMatch": {
+ "length": 22,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 6
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "packet_count": 3,
+ "priority": 123,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPFlowStats": {
+ "byte_count": 98,
+ "cookie": 0,
+ "duration_nsec": 980901000,
+ "duration_sec": 313499,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 4294967293,
+ "type": 0
+ }
+ }
+ ],
+ "len": 24,
+ "type": 3
+ }
+ }
+ ],
+ "length": 80,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "packet_count": 1,
+ "priority": 0,
+ "table_id": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-13-ofp_echo_request.packet.json b/tests/unit/ofproto/json/of12/3-13-ofp_echo_request.packet.json
new file mode 100644
index 00000000..e1f2af42
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-13-ofp_echo_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPEchoRequest": {
+ "data": "aG9nZQ=="
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-14-ofp_echo_reply.packet.json b/tests/unit/ofproto/json/of12/3-14-ofp_echo_reply.packet.json
new file mode 100644
index 00000000..2a573634
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-14-ofp_echo_reply.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPEchoReply": {
+ "data": "aG9nZQ=="
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-15-ofp_error_msg.packet.json b/tests/unit/ofproto/json/of12/3-15-ofp_error_msg.packet.json
new file mode 100644
index 00000000..e9ab2b5e
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-15-ofp_error_msg.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPErrorMsg": {
+ "code": 11,
+ "data": "ZnVnYWZ1Z2E=",
+ "type": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-16-ofp_experimenter.packet.json b/tests/unit/ofproto/json/of12/3-16-ofp_experimenter.packet.json
new file mode 100644
index 00000000..4ad13c73
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-16-ofp_experimenter.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPExperimenter": {
+ "data": "bmF6bw==",
+ "exp_type": 123456789,
+ "experimenter": 98765432
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-17-ofp_barrier_request.packet.json b/tests/unit/ofproto/json/of12/3-17-ofp_barrier_request.packet.json
new file mode 100644
index 00000000..2aae9ec3
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-17-ofp_barrier_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPBarrierRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of12/3-18-ofp_barrier_reply.packet.json b/tests/unit/ofproto/json/of12/3-18-ofp_barrier_reply.packet.json
new file mode 100644
index 00000000..11f8cfcc
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-18-ofp_barrier_reply.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPBarrierReply": {}
+}
diff --git a/tests/unit/ofproto/json/of12/3-19-ofp_role_request.packet.json b/tests/unit/ofproto/json/of12/3-19-ofp_role_request.packet.json
new file mode 100644
index 00000000..5cdbc2f1
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-19-ofp_role_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPRoleRequest": {
+ "generation_id": 17294086455919964160,
+ "role": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-2-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of12/3-2-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..43e0e3c9
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-2-ofp_flow_mod.packet.json
@@ -0,0 +1,82 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 258
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 6,
+ "type": 0
+ }
+ }
+ ],
+ "len": 40,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "01:02:03:04:05:06"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-20-ofp_role_reply.packet.json b/tests/unit/ofproto/json/of12/3-20-ofp_role_reply.packet.json
new file mode 100644
index 00000000..3fd9a13f
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-20-ofp_role_reply.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPRoleReply": {
+ "generation_id": 17294086455919964160,
+ "role": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-21-ofp_group_mod.packet.json b/tests/unit/ofproto/json/of12/3-21-ofp_group_mod.packet.json
new file mode 100644
index 00000000..1a3767da
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-21-ofp_group_mod.packet.json
@@ -0,0 +1,27 @@
+{
+ "OFPGroupMod": {
+ "buckets": [
+ {
+ "OFPBucket": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 2,
+ "type": 0
+ }
+ }
+ ],
+ "len": 32,
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ }
+ ],
+ "command": 0,
+ "group_id": 1,
+ "type": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-22-ofp_port_mod.packet.json b/tests/unit/ofproto/json/of12/3-22-ofp_port_mod.packet.json
new file mode 100644
index 00000000..e334f5d8
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-22-ofp_port_mod.packet.json
@@ -0,0 +1,9 @@
+{
+ "OFPPortMod": {
+ "advertise": 4096,
+ "config": 0,
+ "hw_addr": "00-11-00-00-11-11",
+ "mask": 0,
+ "port_no": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-23-ofp_table_mod.packet.json b/tests/unit/ofproto/json/of12/3-23-ofp_table_mod.packet.json
new file mode 100644
index 00000000..5019c29b
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-23-ofp_table_mod.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPTableMod": {
+ "config": 0,
+ "table_id": 255
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-24-ofp_desc_stats_request.packet.json b/tests/unit/ofproto/json/of12/3-24-ofp_desc_stats_request.packet.json
new file mode 100644
index 00000000..6129d409
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-24-ofp_desc_stats_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPDescStatsRequest": {
+ "flags": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-25-ofp_aggregate_stats_request.packet.json b/tests/unit/ofproto/json/of12/3-25-ofp_aggregate_stats_request.packet.json
new file mode 100644
index 00000000..cc3d76fd
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-25-ofp_aggregate_stats_request.packet.json
@@ -0,0 +1,17 @@
+{
+ "OFPAggregateStatsRequest": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 255
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-26-ofp_aggregate_stats_reply.packet.json b/tests/unit/ofproto/json/of12/3-26-ofp_aggregate_stats_reply.packet.json
new file mode 100644
index 00000000..ed1473aa
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-26-ofp_aggregate_stats_reply.packet.json
@@ -0,0 +1,13 @@
+{
+ "OFPStatsReply": {
+ "body": {
+ "OFPAggregateStatsReply": {
+ "byte_count": 574,
+ "flow_count": 6,
+ "packet_count": 7
+ }
+ },
+ "flags": 0,
+ "type": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-27-ofp_table_stats_request.packet.json b/tests/unit/ofproto/json/of12/3-27-ofp_table_stats_request.packet.json
new file mode 100644
index 00000000..03adedd1
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-27-ofp_table_stats_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPTableStatsRequest": {
+ "flags": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-28-ofp_table_stats_reply.packet.json b/tests/unit/ofproto/json/of12/3-28-ofp_table_stats_reply.packet.json
new file mode 100644
index 00000000..7480fde4
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-28-ofp_table_stats_reply.packet.json
@@ -0,0 +1,5108 @@
+{
+ "OFPStatsReply": {
+ "body": [
+ {
+ "OFPTableStats": {
+ "active_count": 4,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 4,
+ "match": 68719476733,
+ "matched_count": 4,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "\u79c1\u306e\u30c6\u30fc\u30d6\u30eb",
+ "table_id": 0,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 2,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 3,
+ "match": 68719476733,
+ "matched_count": 3,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x01",
+ "table_id": 1,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x02",
+ "table_id": 2,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x03",
+ "table_id": 3,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x04",
+ "table_id": 4,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x05",
+ "table_id": 5,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x06",
+ "table_id": 6,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x07",
+ "table_id": 7,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x08",
+ "table_id": 8,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x09",
+ "table_id": 9,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x0a",
+ "table_id": 10,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x0b",
+ "table_id": 11,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x0c",
+ "table_id": 12,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x0d",
+ "table_id": 13,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x0e",
+ "table_id": 14,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x0f",
+ "table_id": 15,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x10",
+ "table_id": 16,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x11",
+ "table_id": 17,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x12",
+ "table_id": 18,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x13",
+ "table_id": 19,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x14",
+ "table_id": 20,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x15",
+ "table_id": 21,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x16",
+ "table_id": 22,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x17",
+ "table_id": 23,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x18",
+ "table_id": 24,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x19",
+ "table_id": 25,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x1a",
+ "table_id": 26,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x1b",
+ "table_id": 27,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x1c",
+ "table_id": 28,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x1d",
+ "table_id": 29,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x1e",
+ "table_id": 30,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x1f",
+ "table_id": 31,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x20",
+ "table_id": 32,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x21",
+ "table_id": 33,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x22",
+ "table_id": 34,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x23",
+ "table_id": 35,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x24",
+ "table_id": 36,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x25",
+ "table_id": 37,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x26",
+ "table_id": 38,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x27",
+ "table_id": 39,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x28",
+ "table_id": 40,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x29",
+ "table_id": 41,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x2a",
+ "table_id": 42,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x2b",
+ "table_id": 43,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x2c",
+ "table_id": 44,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x2d",
+ "table_id": 45,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x2e",
+ "table_id": 46,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x2f",
+ "table_id": 47,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x30",
+ "table_id": 48,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x31",
+ "table_id": 49,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x32",
+ "table_id": 50,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x33",
+ "table_id": 51,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x34",
+ "table_id": 52,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x35",
+ "table_id": 53,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x36",
+ "table_id": 54,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x37",
+ "table_id": 55,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x38",
+ "table_id": 56,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x39",
+ "table_id": 57,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x3a",
+ "table_id": 58,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x3b",
+ "table_id": 59,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x3c",
+ "table_id": 60,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x3d",
+ "table_id": 61,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x3e",
+ "table_id": 62,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x3f",
+ "table_id": 63,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x40",
+ "table_id": 64,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x41",
+ "table_id": 65,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x42",
+ "table_id": 66,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x43",
+ "table_id": 67,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x44",
+ "table_id": 68,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x45",
+ "table_id": 69,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x46",
+ "table_id": 70,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x47",
+ "table_id": 71,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x48",
+ "table_id": 72,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x49",
+ "table_id": 73,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x4a",
+ "table_id": 74,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x4b",
+ "table_id": 75,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x4c",
+ "table_id": 76,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x4d",
+ "table_id": 77,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x4e",
+ "table_id": 78,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x4f",
+ "table_id": 79,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x50",
+ "table_id": 80,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x51",
+ "table_id": 81,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x52",
+ "table_id": 82,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x53",
+ "table_id": 83,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x54",
+ "table_id": 84,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x55",
+ "table_id": 85,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x56",
+ "table_id": 86,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x57",
+ "table_id": 87,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x58",
+ "table_id": 88,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x59",
+ "table_id": 89,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x5a",
+ "table_id": 90,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x5b",
+ "table_id": 91,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x5c",
+ "table_id": 92,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x5d",
+ "table_id": 93,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x5e",
+ "table_id": 94,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x5f",
+ "table_id": 95,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x60",
+ "table_id": 96,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x61",
+ "table_id": 97,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x62",
+ "table_id": 98,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x63",
+ "table_id": 99,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x64",
+ "table_id": 100,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x65",
+ "table_id": 101,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x66",
+ "table_id": 102,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x67",
+ "table_id": 103,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x68",
+ "table_id": 104,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x69",
+ "table_id": 105,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x6a",
+ "table_id": 106,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x6b",
+ "table_id": 107,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x6c",
+ "table_id": 108,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x6d",
+ "table_id": 109,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x6e",
+ "table_id": 110,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x6f",
+ "table_id": 111,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x70",
+ "table_id": 112,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x71",
+ "table_id": 113,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x72",
+ "table_id": 114,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x73",
+ "table_id": 115,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x74",
+ "table_id": 116,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x75",
+ "table_id": 117,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x76",
+ "table_id": 118,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x77",
+ "table_id": 119,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x78",
+ "table_id": 120,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x79",
+ "table_id": 121,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x7a",
+ "table_id": 122,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x7b",
+ "table_id": 123,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x7c",
+ "table_id": 124,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x7d",
+ "table_id": 125,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x7e",
+ "table_id": 126,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x7f",
+ "table_id": 127,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x80",
+ "table_id": 128,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x81",
+ "table_id": 129,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x82",
+ "table_id": 130,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x83",
+ "table_id": 131,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x84",
+ "table_id": 132,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x85",
+ "table_id": 133,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x86",
+ "table_id": 134,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x87",
+ "table_id": 135,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x88",
+ "table_id": 136,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x89",
+ "table_id": 137,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x8a",
+ "table_id": 138,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x8b",
+ "table_id": 139,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x8c",
+ "table_id": 140,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x8d",
+ "table_id": 141,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x8e",
+ "table_id": 142,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x8f",
+ "table_id": 143,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x90",
+ "table_id": 144,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x91",
+ "table_id": 145,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x92",
+ "table_id": 146,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x93",
+ "table_id": 147,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x94",
+ "table_id": 148,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x95",
+ "table_id": 149,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x96",
+ "table_id": 150,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x97",
+ "table_id": 151,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x98",
+ "table_id": 152,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x99",
+ "table_id": 153,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x9a",
+ "table_id": 154,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x9b",
+ "table_id": 155,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x9c",
+ "table_id": 156,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x9d",
+ "table_id": 157,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x9e",
+ "table_id": 158,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x9f",
+ "table_id": 159,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xa0",
+ "table_id": 160,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xa1",
+ "table_id": 161,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xa2",
+ "table_id": 162,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xa3",
+ "table_id": 163,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xa4",
+ "table_id": 164,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xa5",
+ "table_id": 165,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xa6",
+ "table_id": 166,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xa7",
+ "table_id": 167,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xa8",
+ "table_id": 168,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xa9",
+ "table_id": 169,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xaa",
+ "table_id": 170,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xab",
+ "table_id": 171,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xac",
+ "table_id": 172,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xad",
+ "table_id": 173,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xae",
+ "table_id": 174,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xaf",
+ "table_id": 175,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xb0",
+ "table_id": 176,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xb1",
+ "table_id": 177,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xb2",
+ "table_id": 178,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xb3",
+ "table_id": 179,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xb4",
+ "table_id": 180,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xb5",
+ "table_id": 181,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xb6",
+ "table_id": 182,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xb7",
+ "table_id": 183,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xb8",
+ "table_id": 184,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xb9",
+ "table_id": 185,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xba",
+ "table_id": 186,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xbb",
+ "table_id": 187,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xbc",
+ "table_id": 188,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xbd",
+ "table_id": 189,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xbe",
+ "table_id": 190,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xbf",
+ "table_id": 191,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xc0",
+ "table_id": 192,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xc1",
+ "table_id": 193,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xc2",
+ "table_id": 194,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xc3",
+ "table_id": 195,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xc4",
+ "table_id": 196,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xc5",
+ "table_id": 197,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xc6",
+ "table_id": 198,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xc7",
+ "table_id": 199,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xc8",
+ "table_id": 200,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xc9",
+ "table_id": 201,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xca",
+ "table_id": 202,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xcb",
+ "table_id": 203,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xcc",
+ "table_id": 204,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xcd",
+ "table_id": 205,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xce",
+ "table_id": 206,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xcf",
+ "table_id": 207,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xd0",
+ "table_id": 208,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xd1",
+ "table_id": 209,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xd2",
+ "table_id": 210,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xd3",
+ "table_id": 211,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xd4",
+ "table_id": 212,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xd5",
+ "table_id": 213,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xd6",
+ "table_id": 214,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xd7",
+ "table_id": 215,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xd8",
+ "table_id": 216,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xd9",
+ "table_id": 217,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xda",
+ "table_id": 218,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xdb",
+ "table_id": 219,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xdc",
+ "table_id": 220,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xdd",
+ "table_id": 221,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xde",
+ "table_id": 222,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xdf",
+ "table_id": 223,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xe0",
+ "table_id": 224,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xe1",
+ "table_id": 225,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xe2",
+ "table_id": 226,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xe3",
+ "table_id": 227,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xe4",
+ "table_id": 228,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xe5",
+ "table_id": 229,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xe6",
+ "table_id": 230,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xe7",
+ "table_id": 231,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xe8",
+ "table_id": 232,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xe9",
+ "table_id": 233,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xea",
+ "table_id": 234,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xeb",
+ "table_id": 235,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xec",
+ "table_id": 236,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xed",
+ "table_id": 237,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xee",
+ "table_id": 238,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xef",
+ "table_id": 239,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xf0",
+ "table_id": 240,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xf1",
+ "table_id": 241,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xf2",
+ "table_id": 242,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xf3",
+ "table_id": 243,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xf4",
+ "table_id": 244,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xf5",
+ "table_id": 245,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xf6",
+ "table_id": 246,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xf7",
+ "table_id": 247,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xf8",
+ "table_id": 248,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xf9",
+ "table_id": 249,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xfa",
+ "table_id": 250,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xfb",
+ "table_id": 251,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xfc",
+ "table_id": 252,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xfd",
+ "table_id": 253,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 0,
+ "apply_actions": 67082241,
+ "apply_setfields": 0,
+ "config": 0,
+ "instructions": 62,
+ "lookup_count": 0,
+ "match": 68719476733,
+ "matched_count": 0,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0xfe",
+ "table_id": 254,
+ "wildcards": 68719476733,
+ "write_actions": 67082241,
+ "write_setfields": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-29-ofp_port_stats_request.packet.json b/tests/unit/ofproto/json/of12/3-29-ofp_port_stats_request.packet.json
new file mode 100644
index 00000000..9a94ed8b
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-29-ofp_port_stats_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPPortStatsRequest": {
+ "flags": 0,
+ "port_no": 4294967295
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-3-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of12/3-3-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..cd68b51f
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-3-ofp_flow_mod.packet.json
@@ -0,0 +1,46 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 1,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 22,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 6
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-30-ofp_port_stats_reply.packet.json b/tests/unit/ofproto/json/of12/3-30-ofp_port_stats_reply.packet.json
new file mode 100644
index 00000000..9afd8cd4
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-30-ofp_port_stats_reply.packet.json
@@ -0,0 +1,42 @@
+{
+ "OFPStatsReply": {
+ "body": [
+ {
+ "OFPPortStats": {
+ "collisions": 0,
+ "port_no": 7,
+ "rx_bytes": 0,
+ "rx_crc_err": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "rx_packets": 0,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ },
+ {
+ "OFPPortStats": {
+ "collisions": 0,
+ "port_no": 6,
+ "rx_bytes": 336,
+ "rx_crc_err": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "rx_packets": 4,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-31-ofp_group_features_stats_request.packet.json b/tests/unit/ofproto/json/of12/3-31-ofp_group_features_stats_request.packet.json
new file mode 100644
index 00000000..03974d3e
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-31-ofp_group_features_stats_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPGroupFeaturesStatsRequest": {
+ "flags": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-32-ofp_group_features_stats_reply.packet.json b/tests/unit/ofproto/json/of12/3-32-ofp_group_features_stats_reply.packet.json
new file mode 100644
index 00000000..7e867868
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-32-ofp_group_features_stats_reply.packet.json
@@ -0,0 +1,25 @@
+{
+ "OFPStatsReply": {
+ "body": {
+ "OFPGroupFeaturesStats": {
+ "actions": [
+ 67082241,
+ 67082241,
+ 67082241,
+ 67082241
+ ],
+ "capabilities": 5,
+ "length": 40,
+ "max_groups": [
+ 16777216,
+ 16777216,
+ 16777216,
+ 16777216
+ ],
+ "types": 15
+ }
+ },
+ "flags": 0,
+ "type": 8
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-33-ofp_group_desc_stats_request.packet.json b/tests/unit/ofproto/json/of12/3-33-ofp_group_desc_stats_request.packet.json
new file mode 100644
index 00000000..e62fe9a0
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-33-ofp_group_desc_stats_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPGroupDescStatsRequest": {
+ "flags": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-34-ofp_group_desc_stats_reply.packet.json b/tests/unit/ofproto/json/of12/3-34-ofp_group_desc_stats_reply.packet.json
new file mode 100644
index 00000000..5166d1ce
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-34-ofp_group_desc_stats_reply.packet.json
@@ -0,0 +1,35 @@
+{
+ "OFPStatsReply": {
+ "body": [
+ {
+ "OFPGroupDescStats": {
+ "buckets": [
+ {
+ "OFPBucket": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 2,
+ "type": 0
+ }
+ }
+ ],
+ "len": 32,
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ }
+ ],
+ "group_id": 1,
+ "length": 40,
+ "type": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 7
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-35-ofp_queue_get_config_request.packet.json b/tests/unit/ofproto/json/of12/3-35-ofp_queue_get_config_request.packet.json
new file mode 100644
index 00000000..a50308c0
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-35-ofp_queue_get_config_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPQueueGetConfigRequest": {
+ "port": 4294967295
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-36-ofp_queue_get_config_reply.packet.json b/tests/unit/ofproto/json/of12/3-36-ofp_queue_get_config_reply.packet.json
new file mode 100644
index 00000000..7d0a7bbe
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-36-ofp_queue_get_config_reply.packet.json
@@ -0,0 +1,53 @@
+{
+ "OFPQueueGetConfigReply": {
+ "port": 4294967295,
+ "queues": [
+ {
+ "OFPPacketQueue": {
+ "len": 48,
+ "port": 77,
+ "properties": [
+ {
+ "OFPQueuePropMinRate": {
+ "len": 16,
+ "property": 1,
+ "rate": 10
+ }
+ },
+ {
+ "OFPQueuePropMaxRate": {
+ "len": 16,
+ "property": 2,
+ "rate": 900
+ }
+ }
+ ],
+ "queue_id": 99
+ }
+ },
+ {
+ "OFPPacketQueue": {
+ "len": 48,
+ "port": 77,
+ "properties": [
+ {
+ "OFPQueuePropMinRate": {
+ "len": 16,
+ "property": 1,
+ "rate": 100
+ }
+ },
+ {
+ "OFPQueuePropMaxRate": {
+ "len": 16,
+ "property": 2,
+ "rate": 200
+ }
+ }
+ ],
+ "queue_id": 88
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-37-ofp_queue_stats_request.packet.json b/tests/unit/ofproto/json/of12/3-37-ofp_queue_stats_request.packet.json
new file mode 100644
index 00000000..5c7479d3
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-37-ofp_queue_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPQueueStatsRequest": {
+ "flags": 0,
+ "port_no": 4294967295,
+ "queue_id": 4294967295
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-38-ofp_queue_stats_reply.packet.json b/tests/unit/ofproto/json/of12/3-38-ofp_queue_stats_reply.packet.json
new file mode 100644
index 00000000..fb21c96a
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-38-ofp_queue_stats_reply.packet.json
@@ -0,0 +1,35 @@
+{
+ "OFPStatsReply": {
+ "body": [
+ {
+ "OFPQueueStats": {
+ "port_no": 7,
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ },
+ {
+ "OFPQueueStats": {
+ "port_no": 6,
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ },
+ {
+ "OFPQueueStats": {
+ "port_no": 7,
+ "queue_id": 2,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 5
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-39-ofp_port_status.packet.json b/tests/unit/ofproto/json/of12/3-39-ofp_port_status.packet.json
new file mode 100644
index 00000000..a842932e
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-39-ofp_port_status.packet.json
@@ -0,0 +1,20 @@
+{
+ "OFPPortStatus": {
+ "desc": {
+ "OFPPort": {
+ "advertised": 10240,
+ "config": 0,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "max_speed": 5000,
+ "name": "\u79c1\u306e\u30dd\u30fc\u30c8",
+ "peer": 10248,
+ "port_no": 7,
+ "state": 4,
+ "supported": 10248
+ }
+ },
+ "reason": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-4-ofp_packet_in.packet.json b/tests/unit/ofproto/json/of12/3-4-ofp_packet_in.packet.json
new file mode 100644
index 00000000..b211934e
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-4-ofp_packet_in.packet.json
@@ -0,0 +1,80 @@
+{
+ "OFPPacketIn": {
+ "buffer_id": 2,
+ "data": "////////8gukffjqCAYAAQgABgQAAfILpH346goAAAEAAAAAAAAKAAAD",
+ "match": {
+ "OFPMatch": {
+ "length": 80,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 6
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "ff:ff:ff:ff:ff:ff"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_op",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_spa",
+ "mask": null,
+ "value": "10.0.0.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tpa",
+ "mask": null,
+ "value": "10.0.0.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_sha",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tha",
+ "mask": null,
+ "value": "00:00:00:00:00:00"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "reason": 1,
+ "table_id": 1,
+ "total_len": 42
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-40-ofp_flow_removed.packet.json b/tests/unit/ofproto/json/of12/3-40-ofp_flow_removed.packet.json
new file mode 100644
index 00000000..994953e6
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-40-ofp_flow_removed.packet.json
@@ -0,0 +1,29 @@
+{
+ "OFPFlowRemoved": {
+ "byte_count": 86,
+ "cookie": 0,
+ "duration_nsec": 48825000,
+ "duration_sec": 3,
+ "hard_timeout": 0,
+ "idle_timeout": 3,
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "packet_count": 1,
+ "priority": 65535,
+ "reason": 0,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-41-ofp_error_msg_experimenter.packet.json b/tests/unit/ofproto/json/of12/3-41-ofp_error_msg_experimenter.packet.json
new file mode 100644
index 00000000..37bfb6a9
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-41-ofp_error_msg_experimenter.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPErrorExperimenterMsg": {
+ "data": "amlra2VuIGRhdGE=",
+ "exp_type": 60000,
+ "experimenter": 999999,
+ "type": 65535
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-5-ofp_features_request.packet.json b/tests/unit/ofproto/json/of12/3-5-ofp_features_request.packet.json
new file mode 100644
index 00000000..8f48ad5a
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-5-ofp_features_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPFeaturesRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of12/3-59-ofp_packet_in.packet.json b/tests/unit/ofproto/json/of12/3-59-ofp_packet_in.packet.json
new file mode 100644
index 00000000..5b365a22
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-59-ofp_packet_in.packet.json
@@ -0,0 +1,262 @@
+{
+ "OFPPacketIn": {
+ "buffer_id": 4026531840,
+ "data": "",
+ "match": {
+ "OFPMatch": {
+ "length": 294,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 84281096
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "in_phy_port",
+ "mask": null,
+ "value": 16909060
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "metadata",
+ "mask": null,
+ "value": 283686952306183
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "ff:ff:ff:ff:ff:ff"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 999
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_dscp",
+ "mask": null,
+ "value": 9
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_ecn",
+ "mask": null,
+ "value": 3
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_proto",
+ "mask": null,
+ "value": 99
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_src",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_src",
+ "mask": null,
+ "value": 8080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_dst",
+ "mask": null,
+ "value": 18080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_src",
+ "mask": null,
+ "value": 28080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_dst",
+ "mask": null,
+ "value": 55936
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_src",
+ "mask": null,
+ "value": 48080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_dst",
+ "mask": null,
+ "value": 59328
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_type",
+ "mask": null,
+ "value": 100
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_code",
+ "mask": null,
+ "value": 101
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_op",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_spa",
+ "mask": null,
+ "value": "10.0.0.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tpa",
+ "mask": null,
+ "value": "10.0.0.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_sha",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tha",
+ "mask": null,
+ "value": "00:00:00:00:00:00"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_src",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe48:28a5"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_dst",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe05:b7dc"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_flabel",
+ "mask": null,
+ "value": 541473
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_type",
+ "mask": null,
+ "value": 200
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_code",
+ "mask": null,
+ "value": 201
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_target",
+ "mask": null,
+ "value": "fe80::a60:6eff:fe7f:74e7"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_sll",
+ "mask": null,
+ "value": "00:00:00:00:02:9a"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_tll",
+ "mask": null,
+ "value": "00:00:00:00:02:2b"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_label",
+ "mask": null,
+ "value": 624485
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_tc",
+ "mask": null,
+ "value": 5
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "reason": 0,
+ "table_id": 200,
+ "total_len": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-6-ofp_features_reply.packet.json b/tests/unit/ofproto/json/of12/3-6-ofp_features_reply.packet.json
new file mode 100644
index 00000000..7b9233ac
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-6-ofp_features_reply.packet.json
@@ -0,0 +1,40 @@
+{
+ "OFPSwitchFeatures": {
+ "capabilities": 79,
+ "datapath_id": 9210263729383,
+ "n_buffers": 0,
+ "n_tables": 255,
+ "ports": {
+ "6": {
+ "OFPPort": {
+ "advertised": 10240,
+ "config": 0,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "hw_addr": "f2:0b:a4:7d:f8:ea",
+ "max_speed": 5000,
+ "name": "Port6",
+ "peer": 10248,
+ "port_no": 6,
+ "state": 4,
+ "supported": 10248
+ }
+ },
+ "7": {
+ "OFPPort": {
+ "advertised": 10240,
+ "config": 0,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "max_speed": 5000,
+ "name": "Port7",
+ "peer": 10248,
+ "port_no": 7,
+ "state": 4,
+ "supported": 10248
+ }
+ }
+ }
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-60-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of12/3-60-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..f5de7cef
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-60-ofp_flow_mod.packet.json
@@ -0,0 +1,269 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [],
+ "match": {
+ "OFPMatch": {
+ "length": 294,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 84281096
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "in_phy_port",
+ "mask": null,
+ "value": 16909060
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "metadata",
+ "mask": null,
+ "value": 283686952306183
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "ff:ff:ff:ff:ff:ff"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 999
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_dscp",
+ "mask": null,
+ "value": 9
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_ecn",
+ "mask": null,
+ "value": 3
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_proto",
+ "mask": null,
+ "value": 99
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_src",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_src",
+ "mask": null,
+ "value": 8080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_dst",
+ "mask": null,
+ "value": 18080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_src",
+ "mask": null,
+ "value": 28080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_dst",
+ "mask": null,
+ "value": 55936
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_src",
+ "mask": null,
+ "value": 48080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_dst",
+ "mask": null,
+ "value": 59328
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_type",
+ "mask": null,
+ "value": 100
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_code",
+ "mask": null,
+ "value": 101
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_op",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_spa",
+ "mask": null,
+ "value": "10.0.0.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tpa",
+ "mask": null,
+ "value": "10.0.0.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_sha",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tha",
+ "mask": null,
+ "value": "00:00:00:00:00:00"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_src",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe48:28a5"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_dst",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe05:b7dc"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_flabel",
+ "mask": null,
+ "value": 541473
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_type",
+ "mask": null,
+ "value": 200
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_code",
+ "mask": null,
+ "value": 201
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_target",
+ "mask": null,
+ "value": "fe80::a60:6eff:fe7f:74e7"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_sll",
+ "mask": null,
+ "value": "00:00:00:00:02:9a"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_tll",
+ "mask": null,
+ "value": "00:00:00:00:02:2b"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_label",
+ "mask": null,
+ "value": 624485
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_tc",
+ "mask": null,
+ "value": 5
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-61-ofp_group_stats_request.packet.json b/tests/unit/ofproto/json/of12/3-61-ofp_group_stats_request.packet.json
new file mode 100644
index 00000000..2d1afdc0
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-61-ofp_group_stats_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGroupStatsRequest": {
+ "flags": 0,
+ "group_id": 4294967292
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-62-ofp_group_stats_reply.packet.json b/tests/unit/ofproto/json/of12/3-62-ofp_group_stats_reply.packet.json
new file mode 100644
index 00000000..8cb8f8ce
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-62-ofp_group_stats_reply.packet.json
@@ -0,0 +1,25 @@
+{
+ "OFPStatsReply": {
+ "body": [
+ {
+ "OFPGroupStats": {
+ "bucket_counters": [
+ {
+ "OFPBucketCounter": {
+ "byte_count": 2345,
+ "packet_count": 234
+ }
+ }
+ ],
+ "byte_count": 12345,
+ "group_id": 1,
+ "length": 48,
+ "packet_count": 123,
+ "ref_count": 2
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 6
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-7-ofp_set_config.packet.json b/tests/unit/ofproto/json/of12/3-7-ofp_set_config.packet.json
new file mode 100644
index 00000000..cd5398b7
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-7-ofp_set_config.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPSetConfig": {
+ "flags": 0,
+ "miss_send_len": 128
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/3-8-ofp_get_config_request.packet.json b/tests/unit/ofproto/json/of12/3-8-ofp_get_config_request.packet.json
new file mode 100644
index 00000000..06fe51f4
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-8-ofp_get_config_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPGetConfigRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of12/3-9-ofp_get_config_reply.packet.json b/tests/unit/ofproto/json/of12/3-9-ofp_get_config_reply.packet.json
new file mode 100644
index 00000000..62b37b4d
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/3-9-ofp_get_config_reply.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGetConfigReply": {
+ "flags": 0,
+ "miss_send_len": 128
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/lib-ofctl-ofp_group_stats_request.packet.json b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_group_stats_request.packet.json
new file mode 100644
index 00000000..542ae726
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_group_stats_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGroupStatsRequest": {
+ "flags": 0,
+ "group_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/lib-ofctl-ofp_port_stats_request.packet.json b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_port_stats_request.packet.json
new file mode 100644
index 00000000..884c5fd2
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_port_stats_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPPortStatsRequest": {
+ "flags": 0,
+ "port_no": 7
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_get_config_request.packet.json b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_get_config_request.packet.json
new file mode 100644
index 00000000..a50308c0
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_get_config_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPQueueGetConfigRequest": {
+ "port": 4294967295
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet1.json b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet1.json
new file mode 100644
index 00000000..77535806
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet1.json
@@ -0,0 +1,7 @@
+{
+ "OFPQueueStatsRequest": {
+ "flags": 0,
+ "port_no": 7,
+ "queue_id": 4294967295
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet2.json b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet2.json
new file mode 100644
index 00000000..66127d31
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet2.json
@@ -0,0 +1,7 @@
+{
+ "OFPQueueStatsRequest": {
+ "flags": 0,
+ "port_no": 7,
+ "queue_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet3.json b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet3.json
new file mode 100644
index 00000000..1a798837
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/lib-ofctl-ofp_queue_stats_request.packet3.json
@@ -0,0 +1,7 @@
+{
+ "OFPQueueStatsRequest": {
+ "flags": 0,
+ "port_no": 4294967295,
+ "queue_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of12/libofproto-OFP12-ofp_packet_out_packet_library.packet.json b/tests/unit/ofproto/json/of12/libofproto-OFP12-ofp_packet_out_packet_library.packet.json
new file mode 100644
index 00000000..b859650d
--- /dev/null
+++ b/tests/unit/ofproto/json/of12/libofproto-OFP12-ofp_packet_out_packet_library.packet.json
@@ -0,0 +1,61 @@
+{
+ "OFPPacketOut": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 4294967292,
+ "type": 0
+ }
+ }
+ ],
+ "actions_len": 16,
+ "buffer_id": 4294967295,
+ "data": {
+ "Packet": {
+ "protocols": [
+ {
+ "ethernet": {
+ "dst": "f2:0b:a4:d0:3f:70",
+ "ethertype": 2048,
+ "src": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "ipv4": {
+ "csum": 44939,
+ "dst": "10.0.0.2",
+ "flags": 0,
+ "header_length": 5,
+ "identification": 63514,
+ "offset": 0,
+ "option": null,
+ "proto": 1,
+ "src": "10.0.0.1",
+ "tos": 0,
+ "total_length": 84,
+ "ttl": 255,
+ "version": 4
+ }
+ },
+ {
+ "icmp": {
+ "code": 0,
+ "csum": 520,
+ "data": {
+ "echo": {
+ "data": "MdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vAAAAAAAAAAA=",
+ "id": 63328,
+ "seq": 0
+ }
+ },
+ "type": 8
+ }
+ }
+ ]
+ }
+ },
+ "in_port": 4294967293
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-0-ofp_desc_reply.packet.json b/tests/unit/ofproto/json/of13/4-0-ofp_desc_reply.packet.json
new file mode 100644
index 00000000..26e5dc2d
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-0-ofp_desc_reply.packet.json
@@ -0,0 +1,15 @@
+{
+ "OFPDescStatsReply": {
+ "body": {
+ "OFPDescStats": {
+ "dp_desc": "dp",
+ "hw_desc": "hw",
+ "mfr_desc": "mfr",
+ "serial_num": "serial",
+ "sw_desc": "sw"
+ }
+ },
+ "flags": 0,
+ "type": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-1-ofp_packet_out.packet.json b/tests/unit/ofproto/json/of13/4-1-ofp_packet_out.packet.json
new file mode 100644
index 00000000..efb39e2d
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-1-ofp_packet_out.packet.json
@@ -0,0 +1,18 @@
+{
+ "OFPPacketOut": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 4294967292,
+ "type": 0
+ }
+ }
+ ],
+ "actions_len": 16,
+ "buffer_id": 4294967295,
+ "data": "8guk0D9w8gukffjqCABFAABU+BoAAP8Br4sKAAABCgAAAggAAgj3YAAAMdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vAAAAAAAAAAA=",
+ "in_port": 4294967293
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-10-ofp_hello.packet.json b/tests/unit/ofproto/json/of13/4-10-ofp_hello.packet.json
new file mode 100644
index 00000000..d03ff84b
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-10-ofp_hello.packet.json
@@ -0,0 +1,20 @@
+{
+ "OFPHello": {
+ "elements": [
+ {
+ "OFPHelloElemVersionBitmap": {
+ "length": 8,
+ "type": 1,
+ "versions": [
+ 1,
+ 2,
+ 3,
+ 9,
+ 10,
+ 30
+ ]
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-11-ofp_flow_stats_request.packet.json b/tests/unit/ofproto/json/of13/4-11-ofp_flow_stats_request.packet.json
new file mode 100644
index 00000000..2baccad4
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-11-ofp_flow_stats_request.packet.json
@@ -0,0 +1,18 @@
+{
+ "OFPFlowStatsRequest": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 0,
+ "type": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-12-ofp_flow_stats_reply.packet.json b/tests/unit/ofproto/json/of13/4-12-ofp_flow_stats_reply.packet.json
new file mode 100644
index 00000000..04339dc3
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-12-ofp_flow_stats_reply.packet.json
@@ -0,0 +1,343 @@
+{
+ "OFPFlowStatsReply": {
+ "body": [
+ {
+ "OFPFlowStats": {
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115277000,
+ "duration_sec": 358,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [],
+ "length": 56,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "packet_count": 0,
+ "priority": 65535,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPFlowStats": {
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115055000,
+ "duration_sec": 358,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 0,
+ "port": 4294967290,
+ "type": 0
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "length": 88,
+ "match": {
+ "OFPMatch": {
+ "length": 10,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "packet_count": 0,
+ "priority": 65534,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPFlowStats": {
+ "byte_count": 238,
+ "cookie": 0,
+ "duration_nsec": 511582000,
+ "duration_sec": 316220,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 1,
+ "type": 1
+ }
+ }
+ ],
+ "length": 80,
+ "match": {
+ "OFPMatch": {
+ "length": 22,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 6
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "packet_count": 3,
+ "priority": 123,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPFlowStats": {
+ "byte_count": 98,
+ "cookie": 0,
+ "duration_nsec": 980901000,
+ "duration_sec": 313499,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 258
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionCopyTtlOut": {
+ "len": 8,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionPopPbb": {
+ "len": 8,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionPushPbb": {
+ "ethertype": 4660,
+ "len": 8,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionPopMpls": {
+ "ethertype": 39030,
+ "len": 8,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionPushMpls": {
+ "ethertype": 34887,
+ "len": 8,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionPushVlan": {
+ "ethertype": 33024,
+ "len": 8,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionDecMplsTtl": {
+ "len": 8,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionSetMplsTtl": {
+ "len": 8,
+ "mpls_ttl": 10,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionDecNwTtl": {
+ "len": 8,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionSetNwTtl": {
+ "len": 8,
+ "nw_ttl": 10,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionSetQueue": {
+ "len": 8,
+ "queue_id": 3,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionGroup": {
+ "group_id": 99,
+ "len": 8,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 6,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionExperimenterUnknown": {
+ "len": 16,
+ "data": "ZXhwX2RhdGE=",
+ "experimenter": 98765432,
+ "type": 65535
+ }
+ },
+ {
+ "NXActionUnknown": {
+ "len": 16,
+ "data": "cF9kYXRh",
+ "experimenter": 8992,
+ "type": 65535,
+ "subtype": 25976
+ }
+ }
+ ],
+ "len": 192,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "01:02:03:04:05:06"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "pbb_uca",
+ "mask": null,
+ "value": 1
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ }
+ ],
+ "len": 40,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 4294967293,
+ "type": 0
+ }
+ }
+ ],
+ "len": 24,
+ "type": 3
+ }
+ }
+ ],
+ "length": 312,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "packet_count": 1,
+ "priority": 0,
+ "table_id": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-13-ofp_echo_request.packet.json b/tests/unit/ofproto/json/of13/4-13-ofp_echo_request.packet.json
new file mode 100644
index 00000000..e1f2af42
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-13-ofp_echo_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPEchoRequest": {
+ "data": "aG9nZQ=="
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-14-ofp_echo_reply.packet.json b/tests/unit/ofproto/json/of13/4-14-ofp_echo_reply.packet.json
new file mode 100644
index 00000000..2a573634
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-14-ofp_echo_reply.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPEchoReply": {
+ "data": "aG9nZQ=="
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-15-ofp_error_msg.packet.json b/tests/unit/ofproto/json/of13/4-15-ofp_error_msg.packet.json
new file mode 100644
index 00000000..e9ab2b5e
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-15-ofp_error_msg.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPErrorMsg": {
+ "code": 11,
+ "data": "ZnVnYWZ1Z2E=",
+ "type": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-16-ofp_experimenter.packet.json b/tests/unit/ofproto/json/of13/4-16-ofp_experimenter.packet.json
new file mode 100644
index 00000000..4ad13c73
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-16-ofp_experimenter.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPExperimenter": {
+ "data": "bmF6bw==",
+ "exp_type": 123456789,
+ "experimenter": 98765432
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-17-ofp_barrier_request.packet.json b/tests/unit/ofproto/json/of13/4-17-ofp_barrier_request.packet.json
new file mode 100644
index 00000000..2aae9ec3
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-17-ofp_barrier_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPBarrierRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of13/4-18-ofp_barrier_reply.packet.json b/tests/unit/ofproto/json/of13/4-18-ofp_barrier_reply.packet.json
new file mode 100644
index 00000000..11f8cfcc
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-18-ofp_barrier_reply.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPBarrierReply": {}
+}
diff --git a/tests/unit/ofproto/json/of13/4-19-ofp_role_request.packet.json b/tests/unit/ofproto/json/of13/4-19-ofp_role_request.packet.json
new file mode 100644
index 00000000..5cdbc2f1
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-19-ofp_role_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPRoleRequest": {
+ "generation_id": 17294086455919964160,
+ "role": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-2-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of13/4-2-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..0e3a2cc3
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-2-ofp_flow_mod.packet.json
@@ -0,0 +1,201 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 258
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionCopyTtlOut": {
+ "len": 8,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionPopPbb": {
+ "len": 8,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionPushPbb": {
+ "ethertype": 4660,
+ "len": 8,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionPopMpls": {
+ "ethertype": 39030,
+ "len": 8,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionPushMpls": {
+ "ethertype": 34887,
+ "len": 8,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionPushVlan": {
+ "ethertype": 33024,
+ "len": 8,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionDecMplsTtl": {
+ "len": 8,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionSetMplsTtl": {
+ "len": 8,
+ "mpls_ttl": 10,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionDecNwTtl": {
+ "len": 8,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionSetNwTtl": {
+ "len": 8,
+ "nw_ttl": 10,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionExperimenterUnknown": {
+ "data": "AAECAwQFBgc=",
+ "experimenter": 101,
+ "len": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPActionSetQueue": {
+ "len": 8,
+ "queue_id": 3,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionGroup": {
+ "group_id": 99,
+ "len": 8,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 6,
+ "type": 0
+ }
+ }
+ ],
+ "len": 176,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "01:02:03:04:05:06"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "pbb_uca",
+ "mask": null,
+ "value": 1
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ }
+ ],
+ "len": 40,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-20-ofp_role_reply.packet.json b/tests/unit/ofproto/json/of13/4-20-ofp_role_reply.packet.json
new file mode 100644
index 00000000..3fd9a13f
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-20-ofp_role_reply.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPRoleReply": {
+ "generation_id": 17294086455919964160,
+ "role": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-21-ofp_group_mod.packet.json b/tests/unit/ofproto/json/of13/4-21-ofp_group_mod.packet.json
new file mode 100644
index 00000000..1a3767da
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-21-ofp_group_mod.packet.json
@@ -0,0 +1,27 @@
+{
+ "OFPGroupMod": {
+ "buckets": [
+ {
+ "OFPBucket": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 2,
+ "type": 0
+ }
+ }
+ ],
+ "len": 32,
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ }
+ ],
+ "command": 0,
+ "group_id": 1,
+ "type": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-22-ofp_port_mod.packet.json b/tests/unit/ofproto/json/of13/4-22-ofp_port_mod.packet.json
new file mode 100644
index 00000000..ecb8d66f
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-22-ofp_port_mod.packet.json
@@ -0,0 +1,9 @@
+{
+ "OFPPortMod": {
+ "advertise": 4096,
+ "config": 0,
+ "hw_addr": "00:11:00:00:11:11",
+ "mask": 0,
+ "port_no": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-23-ofp_table_mod.packet.json b/tests/unit/ofproto/json/of13/4-23-ofp_table_mod.packet.json
new file mode 100644
index 00000000..5019c29b
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-23-ofp_table_mod.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPTableMod": {
+ "config": 0,
+ "table_id": 255
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-24-ofp_desc_request.packet.json b/tests/unit/ofproto/json/of13/4-24-ofp_desc_request.packet.json
new file mode 100644
index 00000000..5b23f8bc
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-24-ofp_desc_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPDescStatsRequest": {
+ "flags": 0,
+ "type": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-25-ofp_aggregate_stats_request.packet.json b/tests/unit/ofproto/json/of13/4-25-ofp_aggregate_stats_request.packet.json
new file mode 100644
index 00000000..248131fd
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-25-ofp_aggregate_stats_request.packet.json
@@ -0,0 +1,18 @@
+{
+ "OFPAggregateStatsRequest": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 255,
+ "type": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-26-ofp_aggregate_stats_reply.packet.json b/tests/unit/ofproto/json/of13/4-26-ofp_aggregate_stats_reply.packet.json
new file mode 100644
index 00000000..153ad4f0
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-26-ofp_aggregate_stats_reply.packet.json
@@ -0,0 +1,13 @@
+{
+ "OFPAggregateStatsReply": {
+ "body": {
+ "OFPAggregateStats": {
+ "byte_count": 574,
+ "flow_count": 6,
+ "packet_count": 7
+ }
+ },
+ "flags": 0,
+ "type": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-27-ofp_table_stats_request.packet.json b/tests/unit/ofproto/json/of13/4-27-ofp_table_stats_request.packet.json
new file mode 100644
index 00000000..1f965d77
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-27-ofp_table_stats_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPTableStatsRequest": {
+ "flags": 0,
+ "type": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-28-ofp_table_stats_reply.packet.json b/tests/unit/ofproto/json/of13/4-28-ofp_table_stats_reply.packet.json
new file mode 100644
index 00000000..94801adb
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-28-ofp_table_stats_reply.packet.json
@@ -0,0 +1,24 @@
+{
+ "OFPTableStatsReply": {
+ "body": [
+ {
+ "OFPTableStats": {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 1
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-29-ofp_port_stats_request.packet.json b/tests/unit/ofproto/json/of13/4-29-ofp_port_stats_request.packet.json
new file mode 100644
index 00000000..5228710d
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-29-ofp_port_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPPortStatsRequest": {
+ "flags": 0,
+ "port_no": 4294967295,
+ "type": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-3-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of13/4-3-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..cd68b51f
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-3-ofp_flow_mod.packet.json
@@ -0,0 +1,46 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 1,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 22,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 6
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-30-ofp_port_stats_reply.packet.json b/tests/unit/ofproto/json/of13/4-30-ofp_port_stats_reply.packet.json
new file mode 100644
index 00000000..01157449
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-30-ofp_port_stats_reply.packet.json
@@ -0,0 +1,46 @@
+{
+ "OFPPortStatsReply": {
+ "body": [
+ {
+ "OFPPortStats": {
+ "collisions": 0,
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 7,
+ "rx_bytes": 0,
+ "rx_crc_err": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "rx_packets": 0,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ },
+ {
+ "OFPPortStats": {
+ "collisions": 0,
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 6,
+ "rx_bytes": 336,
+ "rx_crc_err": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "rx_packets": 4,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-31-ofp_group_features_request.packet.json b/tests/unit/ofproto/json/of13/4-31-ofp_group_features_request.packet.json
new file mode 100644
index 00000000..edba5dc5
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-31-ofp_group_features_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGroupFeaturesStatsRequest": {
+ "flags": 0,
+ "type": 8
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-32-ofp_group_features_reply.packet.json b/tests/unit/ofproto/json/of13/4-32-ofp_group_features_reply.packet.json
new file mode 100644
index 00000000..f059f994
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-32-ofp_group_features_reply.packet.json
@@ -0,0 +1,24 @@
+{
+ "OFPGroupFeaturesStatsReply": {
+ "body": {
+ "OFPGroupFeaturesStats": {
+ "actions": [
+ 67082241,
+ 67082241,
+ 67082241,
+ 67082241
+ ],
+ "capabilities": 5,
+ "max_groups": [
+ 16777216,
+ 16777216,
+ 16777216,
+ 16777216
+ ],
+ "types": 15
+ }
+ },
+ "flags": 0,
+ "type": 8
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-33-ofp_group_desc_request.packet.json b/tests/unit/ofproto/json/of13/4-33-ofp_group_desc_request.packet.json
new file mode 100644
index 00000000..bea140c2
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-33-ofp_group_desc_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGroupDescStatsRequest": {
+ "flags": 0,
+ "type": 7
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-34-ofp_group_desc_reply.packet.json b/tests/unit/ofproto/json/of13/4-34-ofp_group_desc_reply.packet.json
new file mode 100644
index 00000000..c30d7da6
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-34-ofp_group_desc_reply.packet.json
@@ -0,0 +1,35 @@
+{
+ "OFPGroupDescStatsReply": {
+ "body": [
+ {
+ "OFPGroupDescStats": {
+ "buckets": [
+ {
+ "OFPBucket": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 2,
+ "type": 0
+ }
+ }
+ ],
+ "len": 32,
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ }
+ ],
+ "group_id": 1,
+ "length": 40,
+ "type": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 7
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-35-ofp_queue_get_config_request.packet.json b/tests/unit/ofproto/json/of13/4-35-ofp_queue_get_config_request.packet.json
new file mode 100644
index 00000000..a50308c0
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-35-ofp_queue_get_config_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPQueueGetConfigRequest": {
+ "port": 4294967295
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-36-ofp_queue_get_config_reply.packet.json b/tests/unit/ofproto/json/of13/4-36-ofp_queue_get_config_reply.packet.json
new file mode 100644
index 00000000..ce1f4123
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-36-ofp_queue_get_config_reply.packet.json
@@ -0,0 +1,105 @@
+{
+ "OFPQueueGetConfigReply": {
+ "port": 4294967295,
+ "queues": [
+ {
+ "OFPPacketQueue": {
+ "len": 64,
+ "port": 77,
+ "properties": [
+ {
+ "OFPQueuePropMinRate": {
+ "len": 16,
+ "property": 1,
+ "rate": 10
+ }
+ },
+ {
+ "OFPQueuePropMaxRate": {
+ "len": 16,
+ "property": 2,
+ "rate": 900
+ }
+ },
+ {
+ "OFPQueuePropExperimenter": {
+ "data": [],
+ "experimenter": 999,
+ "len": 16,
+ "property": 65535
+ }
+ }
+ ],
+ "queue_id": 99
+ }
+ },
+ {
+ "OFPPacketQueue": {
+ "len": 65,
+ "port": 77,
+ "properties": [
+ {
+ "OFPQueuePropMinRate": {
+ "len": 16,
+ "property": 1,
+ "rate": 100
+ }
+ },
+ {
+ "OFPQueuePropMaxRate": {
+ "len": 16,
+ "property": 2,
+ "rate": 200
+ }
+ },
+ {
+ "OFPQueuePropExperimenter": {
+ "experimenter": 999,
+ "data": [
+ 1
+ ],
+ "len": 17,
+ "property": 65535
+ }
+ }
+ ],
+ "queue_id": 88
+ }
+ },
+ {
+ "OFPPacketQueue": {
+ "len": 66,
+ "port": 77,
+ "properties": [
+ {
+ "OFPQueuePropMinRate": {
+ "len": 16,
+ "property": 1,
+ "rate": 200
+ }
+ },
+ {
+ "OFPQueuePropMaxRate": {
+ "len": 16,
+ "property": 2,
+ "rate": 400
+ }
+ },
+ {
+ "OFPQueuePropExperimenter": {
+ "experimenter": 999,
+ "data": [
+ 1,
+ 2
+ ],
+ "len": 18,
+ "property": 65535
+ }
+ }
+ ],
+ "queue_id": 77
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-37-ofp_queue_stats_request.packet.json b/tests/unit/ofproto/json/of13/4-37-ofp_queue_stats_request.packet.json
new file mode 100644
index 00000000..7a12acc3
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-37-ofp_queue_stats_request.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPQueueStatsRequest": {
+ "flags": 0,
+ "port_no": 4294967295,
+ "queue_id": 4294967295,
+ "type": 5
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-38-ofp_queue_stats_reply.packet.json b/tests/unit/ofproto/json/of13/4-38-ofp_queue_stats_reply.packet.json
new file mode 100644
index 00000000..80b59cf2
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-38-ofp_queue_stats_reply.packet.json
@@ -0,0 +1,41 @@
+{
+ "OFPQueueStatsReply": {
+ "body": [
+ {
+ "OFPQueueStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 7,
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ },
+ {
+ "OFPQueueStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 6,
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ },
+ {
+ "OFPQueueStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "port_no": 7,
+ "queue_id": 2,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 5
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-39-ofp_port_status.packet.json b/tests/unit/ofproto/json/of13/4-39-ofp_port_status.packet.json
new file mode 100644
index 00000000..a842932e
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-39-ofp_port_status.packet.json
@@ -0,0 +1,20 @@
+{
+ "OFPPortStatus": {
+ "desc": {
+ "OFPPort": {
+ "advertised": 10240,
+ "config": 0,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "max_speed": 5000,
+ "name": "\u79c1\u306e\u30dd\u30fc\u30c8",
+ "peer": 10248,
+ "port_no": 7,
+ "state": 4,
+ "supported": 10248
+ }
+ },
+ "reason": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-4-ofp_packet_in.packet.json b/tests/unit/ofproto/json/of13/4-4-ofp_packet_in.packet.json
new file mode 100644
index 00000000..b3051d1c
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-4-ofp_packet_in.packet.json
@@ -0,0 +1,81 @@
+{
+ "OFPPacketIn": {
+ "buffer_id": 2,
+ "cookie": 283686884868096,
+ "data": "////////8gukffjqCAYAAQgABgQAAfILpH346goAAAEAAAAAAAAKAAAD",
+ "match": {
+ "OFPMatch": {
+ "length": 80,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 6
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "ff:ff:ff:ff:ff:ff"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_op",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_spa",
+ "mask": null,
+ "value": "10.0.0.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tpa",
+ "mask": null,
+ "value": "10.0.0.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_sha",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tha",
+ "mask": null,
+ "value": "00:00:00:00:00:00"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "reason": 1,
+ "table_id": 1,
+ "total_len": 42
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-40-ofp_flow_removed.packet.json b/tests/unit/ofproto/json/of13/4-40-ofp_flow_removed.packet.json
new file mode 100644
index 00000000..994953e6
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-40-ofp_flow_removed.packet.json
@@ -0,0 +1,29 @@
+{
+ "OFPFlowRemoved": {
+ "byte_count": 86,
+ "cookie": 0,
+ "duration_nsec": 48825000,
+ "duration_sec": 3,
+ "hard_timeout": 0,
+ "idle_timeout": 3,
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "packet_count": 1,
+ "priority": 65535,
+ "reason": 0,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-41-ofp_error_msg_experimenter.packet.json b/tests/unit/ofproto/json/of13/4-41-ofp_error_msg_experimenter.packet.json
new file mode 100644
index 00000000..37bfb6a9
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-41-ofp_error_msg_experimenter.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPErrorExperimenterMsg": {
+ "data": "amlra2VuIGRhdGE=",
+ "exp_type": 60000,
+ "experimenter": 999999,
+ "type": 65535
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-42-ofp_get_async_request.packet.json b/tests/unit/ofproto/json/of13/4-42-ofp_get_async_request.packet.json
new file mode 100644
index 00000000..7daa5a0f
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-42-ofp_get_async_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPGetAsyncRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of13/4-43-ofp_get_async_reply.packet.json b/tests/unit/ofproto/json/of13/4-43-ofp_get_async_reply.packet.json
new file mode 100644
index 00000000..abccf043
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-43-ofp_get_async_reply.packet.json
@@ -0,0 +1,16 @@
+{
+ "OFPGetAsyncReply": {
+ "flow_removed_mask": [
+ 15,
+ 3
+ ],
+ "packet_in_mask": [
+ 5,
+ 1
+ ],
+ "port_status_mask": [
+ 7,
+ 3
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-44-ofp_set_async.packet.json b/tests/unit/ofproto/json/of13/4-44-ofp_set_async.packet.json
new file mode 100644
index 00000000..da85b880
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-44-ofp_set_async.packet.json
@@ -0,0 +1,16 @@
+{
+ "OFPSetAsync": {
+ "flow_removed_mask": [
+ 15,
+ 3
+ ],
+ "packet_in_mask": [
+ 5,
+ 1
+ ],
+ "port_status_mask": [
+ 7,
+ 3
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-45-ofp_meter_mod.packet.json b/tests/unit/ofproto/json/of13/4-45-ofp_meter_mod.packet.json
new file mode 100644
index 00000000..eba4540a
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-45-ofp_meter_mod.packet.json
@@ -0,0 +1,35 @@
+{
+ "OFPMeterMod": {
+ "bands": [
+ {
+ "OFPMeterBandDrop": {
+ "burst_size": 10,
+ "len": 16,
+ "rate": 1000,
+ "type": 1
+ }
+ },
+ {
+ "OFPMeterBandDscpRemark": {
+ "burst_size": 10,
+ "len": 16,
+ "prec_level": 1,
+ "rate": 1000,
+ "type": 2
+ }
+ },
+ {
+ "OFPMeterBandExperimenter": {
+ "burst_size": 10,
+ "experimenter": 999,
+ "len": 16,
+ "rate": 1000,
+ "type": 65535
+ }
+ }
+ ],
+ "command": 0,
+ "flags": 14,
+ "meter_id": 100
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-46-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of13/4-46-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..f4e59c76
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-46-ofp_flow_mod.packet.json
@@ -0,0 +1,55 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionMeter": {
+ "len": 8,
+ "meter_id": 1,
+ "type": 6
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 6,
+ "type": 0
+ }
+ }
+ ],
+ "len": 24,
+ "type": 3
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-47-ofp_meter_config_request.packet.json b/tests/unit/ofproto/json/of13/4-47-ofp_meter_config_request.packet.json
new file mode 100644
index 00000000..4703588e
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-47-ofp_meter_config_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPMeterConfigStatsRequest": {
+ "flags": 0,
+ "meter_id": 4294967295,
+ "type": 10
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-48-ofp_meter_config_reply.packet.json b/tests/unit/ofproto/json/of13/4-48-ofp_meter_config_reply.packet.json
new file mode 100644
index 00000000..08cc97e6
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-48-ofp_meter_config_reply.packet.json
@@ -0,0 +1,25 @@
+{
+ "OFPMeterConfigStatsReply": {
+ "body": [
+ {
+ "OFPMeterConfigStats": {
+ "bands": [
+ {
+ "OFPMeterBandDrop": {
+ "burst_size": 10,
+ "len": 16,
+ "rate": 1000,
+ "type": 1
+ }
+ }
+ ],
+ "flags": 14,
+ "length": 24,
+ "meter_id": 100
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 10
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-49-ofp_meter_stats_request.packet.json b/tests/unit/ofproto/json/of13/4-49-ofp_meter_stats_request.packet.json
new file mode 100644
index 00000000..8d45799b
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-49-ofp_meter_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPMeterStatsRequest": {
+ "flags": 0,
+ "meter_id": 4294967295,
+ "type": 9
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-5-ofp_features_request.packet.json b/tests/unit/ofproto/json/of13/4-5-ofp_features_request.packet.json
new file mode 100644
index 00000000..8f48ad5a
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-5-ofp_features_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPFeaturesRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of13/4-50-ofp_meter_stats_reply.packet.json b/tests/unit/ofproto/json/of13/4-50-ofp_meter_stats_reply.packet.json
new file mode 100644
index 00000000..b4fd8226
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-50-ofp_meter_stats_reply.packet.json
@@ -0,0 +1,27 @@
+{
+ "OFPMeterStatsReply": {
+ "body": [
+ {
+ "OFPMeterStats": {
+ "band_stats": [
+ {
+ "OFPMeterBandStats": {
+ "byte_band_count": 0,
+ "packet_band_count": 0
+ }
+ }
+ ],
+ "byte_in_count": 0,
+ "duration_nsec": 480000,
+ "duration_sec": 0,
+ "flow_count": 0,
+ "len": 56,
+ "meter_id": 100,
+ "packet_in_count": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 9
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-51-ofp_meter_features_request.packet.json b/tests/unit/ofproto/json/of13/4-51-ofp_meter_features_request.packet.json
new file mode 100644
index 00000000..7363a342
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-51-ofp_meter_features_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPMeterFeaturesStatsRequest": {
+ "flags": 0,
+ "type": 11
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-52-ofp_meter_features_reply.packet.json b/tests/unit/ofproto/json/of13/4-52-ofp_meter_features_reply.packet.json
new file mode 100644
index 00000000..e3f6918f
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-52-ofp_meter_features_reply.packet.json
@@ -0,0 +1,17 @@
+{
+ "OFPMeterFeaturesStatsReply": {
+ "body": [
+ {
+ "OFPMeterFeaturesStats": {
+ "band_types": 2147483654,
+ "capabilities": 15,
+ "max_bands": 255,
+ "max_color": 0,
+ "max_meter": 16777216
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 11
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-53-ofp_port_desc_request.packet.json b/tests/unit/ofproto/json/of13/4-53-ofp_port_desc_request.packet.json
new file mode 100644
index 00000000..f166c34a
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-53-ofp_port_desc_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPPortDescStatsRequest": {
+ "flags": 0,
+ "type": 13
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-54-ofp_port_desc_reply.packet.json b/tests/unit/ofproto/json/of13/4-54-ofp_port_desc_reply.packet.json
new file mode 100644
index 00000000..5da460a0
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-54-ofp_port_desc_reply.packet.json
@@ -0,0 +1,38 @@
+{
+ "OFPPortDescStatsReply": {
+ "body": [
+ {
+ "OFPPort": {
+ "advertised": 10240,
+ "config": 0,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "max_speed": 5000,
+ "name": "Port7",
+ "peer": 10248,
+ "port_no": 7,
+ "state": 4,
+ "supported": 10248
+ }
+ },
+ {
+ "OFPPort": {
+ "advertised": 10240,
+ "config": 0,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "hw_addr": "f2:0b:a4:7d:f8:ea",
+ "max_speed": 5000,
+ "name": "Port6",
+ "peer": 10248,
+ "port_no": 6,
+ "state": 4,
+ "supported": 10248
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 13
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-55-ofp_table_features_request.packet.json b/tests/unit/ofproto/json/of13/4-55-ofp_table_features_request.packet.json
new file mode 100644
index 00000000..2a1a4308
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-55-ofp_table_features_request.packet.json
@@ -0,0 +1,15945 @@
+{
+ "OFPTableFeaturesStatsRequest": {
+ "body": [
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1168,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x00",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 258,
+ "table_ids": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65534
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65534
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65534
+ }
+ }
+ ],
+ "table_id": 0
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1112,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x01",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 257,
+ "table_ids": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 1
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x02",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 256,
+ "table_ids": [
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 2
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x03",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 255,
+ "table_ids": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 3
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x04",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 254,
+ "table_ids": [
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 4
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x05",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 253,
+ "table_ids": [
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 5
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x06",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 252,
+ "table_ids": [
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 6
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x07",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 251,
+ "table_ids": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 7
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x08",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 250,
+ "table_ids": [
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 8
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x09",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 249,
+ "table_ids": [
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 9
+ }
+ }
+ ],
+ "flags": 1,
+ "type": 12
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-56-ofp_table_features_reply.packet.json b/tests/unit/ofproto/json/of13/4-56-ofp_table_features_reply.packet.json
new file mode 100644
index 00000000..ea056e8f
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-56-ofp_table_features_reply.packet.json
@@ -0,0 +1,15945 @@
+{
+ "OFPTableFeaturesStatsReply": {
+ "body": [
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1168,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "\u79c1\u306e\u30c6\u30fc\u30d6\u30eb",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 258,
+ "table_ids": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65534
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65534
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65534
+ }
+ }
+ ],
+ "table_id": 0
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1112,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x01",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 257,
+ "table_ids": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 1
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x02",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 256,
+ "table_ids": [
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 2
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x03",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 255,
+ "table_ids": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 3
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x04",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 254,
+ "table_ids": [
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 4
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x05",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 253,
+ "table_ids": [
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 5
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x06",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 252,
+ "table_ids": [
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 6
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x07",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 251,
+ "table_ids": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 7
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x08",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 250,
+ "table_ids": [
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 8
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x09",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 249,
+ "table_ids": [
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 9
+ }
+ }
+ ],
+ "flags": 1,
+ "type": 12
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-57-ofp_group_stats_request.packet.json b/tests/unit/ofproto/json/of13/4-57-ofp_group_stats_request.packet.json
new file mode 100644
index 00000000..b200a81c
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-57-ofp_group_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPGroupStatsRequest": {
+ "flags": 0,
+ "group_id": 4294967292,
+ "type": 6
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-58-ofp_group_stats_reply.packet.json b/tests/unit/ofproto/json/of13/4-58-ofp_group_stats_reply.packet.json
new file mode 100644
index 00000000..cb979e54
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-58-ofp_group_stats_reply.packet.json
@@ -0,0 +1,27 @@
+{
+ "OFPGroupStatsReply": {
+ "body": [
+ {
+ "OFPGroupStats": {
+ "bucket_stats": [
+ {
+ "OFPBucketCounter": {
+ "byte_count": 2345,
+ "packet_count": 234
+ }
+ }
+ ],
+ "byte_count": 12345,
+ "duration_nsec": 609036000,
+ "duration_sec": 9,
+ "group_id": 1,
+ "length": 56,
+ "packet_count": 123,
+ "ref_count": 2
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 6
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-59-ofp_packet_in.packet.json b/tests/unit/ofproto/json/of13/4-59-ofp_packet_in.packet.json
new file mode 100644
index 00000000..c5837d26
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-59-ofp_packet_in.packet.json
@@ -0,0 +1,312 @@
+{
+ "OFPPacketIn": {
+ "buffer_id": 4026531840,
+ "cookie": 283686884868096,
+ "data": "",
+ "match": {
+ "OFPMatch": {
+ "length": 351,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 84281096
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "in_phy_port",
+ "mask": null,
+ "value": 16909060
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "metadata",
+ "mask": null,
+ "value": 283686952306183
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "ff:ff:ff:ff:ff:ff"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 999
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_dscp",
+ "mask": null,
+ "value": 9
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_ecn",
+ "mask": null,
+ "value": 3
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_proto",
+ "mask": null,
+ "value": 99
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_src",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_src",
+ "mask": null,
+ "value": 8080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_dst",
+ "mask": null,
+ "value": 18080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_src",
+ "mask": null,
+ "value": 28080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_dst",
+ "mask": null,
+ "value": 55936
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_src",
+ "mask": null,
+ "value": 48080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_dst",
+ "mask": null,
+ "value": 59328
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_type",
+ "mask": null,
+ "value": 100
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_code",
+ "mask": null,
+ "value": 101
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_op",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_spa",
+ "mask": null,
+ "value": "10.0.0.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tpa",
+ "mask": null,
+ "value": "10.0.0.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_sha",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tha",
+ "mask": null,
+ "value": "00:00:00:00:00:00"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_src",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe48:28a5"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_dst",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe05:b7dc"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_flabel",
+ "mask": null,
+ "value": 541473
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_type",
+ "mask": null,
+ "value": 200
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_code",
+ "mask": null,
+ "value": 201
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_target",
+ "mask": null,
+ "value": "fe80::a60:6eff:fe7f:74e7"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_sll",
+ "mask": null,
+ "value": "00:00:00:00:02:9a"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_tll",
+ "mask": null,
+ "value": "00:00:00:00:02:2b"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_label",
+ "mask": null,
+ "value": 624485
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_tc",
+ "mask": null,
+ "value": 5
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_bos",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pbb_isid",
+ "mask": null,
+ "value": 11259375
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 651061555542690057
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_exthdr",
+ "mask": null,
+ "value": 500
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pbb_uca",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "reason": 0,
+ "table_id": 200,
+ "total_len": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-6-ofp_features_reply.packet.json b/tests/unit/ofproto/json/of13/4-6-ofp_features_reply.packet.json
new file mode 100644
index 00000000..12e8744a
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-6-ofp_features_reply.packet.json
@@ -0,0 +1,9 @@
+{
+ "OFPSwitchFeatures": {
+ "auxiliary_id": 99,
+ "capabilities": 79,
+ "datapath_id": 9210263729383,
+ "n_buffers": 0,
+ "n_tables": 255
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..1c594e8f
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-60-ofp_flow_mod.packet.json
@@ -0,0 +1,318 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [],
+ "match": {
+ "OFPMatch": {
+ "length": 351,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 84281096
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "in_phy_port",
+ "mask": null,
+ "value": 16909060
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "metadata",
+ "mask": null,
+ "value": 283686952306183
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "ff:ff:ff:ff:ff:ff"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 999
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_dscp",
+ "mask": null,
+ "value": 9
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_ecn",
+ "mask": null,
+ "value": 3
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_proto",
+ "mask": null,
+ "value": 99
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_src",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_src",
+ "mask": null,
+ "value": 8080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_dst",
+ "mask": null,
+ "value": 18080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_src",
+ "mask": null,
+ "value": 28080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_dst",
+ "mask": null,
+ "value": 55936
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_src",
+ "mask": null,
+ "value": 48080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_dst",
+ "mask": null,
+ "value": 59328
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_type",
+ "mask": null,
+ "value": 100
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_code",
+ "mask": null,
+ "value": 101
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_op",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_spa",
+ "mask": null,
+ "value": "10.0.0.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tpa",
+ "mask": null,
+ "value": "10.0.0.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_sha",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tha",
+ "mask": null,
+ "value": "00:00:00:00:00:00"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_src",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe48:28a5"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_dst",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe05:b7dc"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_flabel",
+ "mask": null,
+ "value": 541473
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_type",
+ "mask": null,
+ "value": 200
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_code",
+ "mask": null,
+ "value": 201
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_target",
+ "mask": null,
+ "value": "fe80::a60:6eff:fe7f:74e7"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_sll",
+ "mask": null,
+ "value": "00:00:00:00:02:9a"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_tll",
+ "mask": null,
+ "value": "00:00:00:00:02:2b"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_label",
+ "mask": null,
+ "value": 624485
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_tc",
+ "mask": null,
+ "value": 5
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_bos",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pbb_isid",
+ "mask": null,
+ "value": 11259375
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 651061555542690057
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_exthdr",
+ "mask": null,
+ "value": 500
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pbb_uca",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-61-ofp_experimenter_request.packet.json b/tests/unit/ofproto/json/of13/4-61-ofp_experimenter_request.packet.json
new file mode 100644
index 00000000..93af3039
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-61-ofp_experimenter_request.packet.json
@@ -0,0 +1,9 @@
+{
+ "OFPExperimenterStatsRequest": {
+ "data": "aG9nZWhvZ2U=",
+ "exp_type": 3405678728,
+ "experimenter": 3735928495,
+ "flags": 0,
+ "type": 65535
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-62-ofp_experimenter_reply.packet.json b/tests/unit/ofproto/json/of13/4-62-ofp_experimenter_reply.packet.json
new file mode 100644
index 00000000..1eb06b84
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-62-ofp_experimenter_reply.packet.json
@@ -0,0 +1,13 @@
+{
+ "OFPExperimenterStatsReply": {
+ "body": {
+ "OFPExperimenterMultipart": {
+ "data": "dGVzdGRhdGE5OTk5OTk5OQ==",
+ "exp_type": 3405674359,
+ "experimenter": 3735928495
+ }
+ },
+ "flags": 0,
+ "type": 65535
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-63-onf_flow_monitor_request.packet.json b/tests/unit/ofproto/json/of13/4-63-onf_flow_monitor_request.packet.json
new file mode 100644
index 00000000..c5e166d8
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-63-onf_flow_monitor_request.packet.json
@@ -0,0 +1,337 @@
+{
+ "ONFFlowMonitorStatsRequest": {
+ "body": [
+ {
+ "ONFFlowMonitorRequest": {
+ "flags": 15,
+ "id": 100000000,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "match_len": 0,
+ "out_port": 22,
+ "table_id": 33
+ }
+ },
+ {
+ "ONFFlowMonitorRequest": {
+ "flags": 49,
+ "id": 999,
+ "match": {
+ "OFPMatch": {
+ "length": 351,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 84281096
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "in_phy_port",
+ "mask": null,
+ "value": 16909060
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "metadata",
+ "mask": null,
+ "value": 283686952306183
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "ff:ff:ff:ff:ff:ff"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 999
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_dscp",
+ "mask": null,
+ "value": 9
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_ecn",
+ "mask": null,
+ "value": 3
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_proto",
+ "mask": null,
+ "value": 99
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_src",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_src",
+ "mask": null,
+ "value": 8080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_dst",
+ "mask": null,
+ "value": 18080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_src",
+ "mask": null,
+ "value": 28080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_dst",
+ "mask": null,
+ "value": 55936
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_src",
+ "mask": null,
+ "value": 48080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_dst",
+ "mask": null,
+ "value": 59328
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_type",
+ "mask": null,
+ "value": 100
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_code",
+ "mask": null,
+ "value": 101
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_op",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_spa",
+ "mask": null,
+ "value": "10.0.0.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tpa",
+ "mask": null,
+ "value": "10.0.0.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_sha",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tha",
+ "mask": null,
+ "value": "00:00:00:00:00:00"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_src",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe48:28a5"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_dst",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe05:b7dc"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_flabel",
+ "mask": null,
+ "value": 541473
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_type",
+ "mask": null,
+ "value": 200
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_code",
+ "mask": null,
+ "value": 201
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_target",
+ "mask": null,
+ "value": "fe80::a60:6eff:fe7f:74e7"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_sll",
+ "mask": null,
+ "value": "00:00:00:00:02:9a"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_tll",
+ "mask": null,
+ "value": "00:00:00:00:02:2b"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_label",
+ "mask": null,
+ "value": 624485
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_tc",
+ "mask": null,
+ "value": 5
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_bos",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pbb_isid",
+ "mask": null,
+ "value": 11259375
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 651061555542690057
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_exthdr",
+ "mask": null,
+ "value": 500
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pbb_uca",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "match_len": 347,
+ "out_port": 4294967295,
+ "table_id": 255
+ }
+ }
+ ],
+ "exp_type": 1870,
+ "experimenter": 1330529792,
+ "flags": 0,
+ "type": 65535
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-7-ofp_set_config.packet.json b/tests/unit/ofproto/json/of13/4-7-ofp_set_config.packet.json
new file mode 100644
index 00000000..cd5398b7
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-7-ofp_set_config.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPSetConfig": {
+ "flags": 0,
+ "miss_send_len": 128
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/4-8-ofp_get_config_request.packet.json b/tests/unit/ofproto/json/of13/4-8-ofp_get_config_request.packet.json
new file mode 100644
index 00000000..06fe51f4
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-8-ofp_get_config_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPGetConfigRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of13/4-9-ofp_get_config_reply.packet.json b/tests/unit/ofproto/json/of13/4-9-ofp_get_config_reply.packet.json
new file mode 100644
index 00000000..62b37b4d
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/4-9-ofp_get_config_reply.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGetConfigReply": {
+ "flags": 0,
+ "miss_send_len": 128
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/lib-ofctl-ofp_group_stats_request.packet.json b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_group_stats_request.packet.json
new file mode 100644
index 00000000..311b0381
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_group_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPGroupStatsRequest": {
+ "flags": 0,
+ "group_id": 1,
+ "type": 6
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/lib-ofctl-ofp_meter_config_request.packet.json b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_meter_config_request.packet.json
new file mode 100644
index 00000000..9967bd29
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_meter_config_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPMeterConfigStatsRequest": {
+ "flags": 0,
+ "meter_id": 1,
+ "type": 10
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/lib-ofctl-ofp_meter_stats_request.packet.json b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_meter_stats_request.packet.json
new file mode 100644
index 00000000..570c2b6d
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_meter_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPMeterStatsRequest": {
+ "flags": 0,
+ "meter_id": 1,
+ "type": 9
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/lib-ofctl-ofp_port_stats_request.packet.json b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_port_stats_request.packet.json
new file mode 100644
index 00000000..f1258076
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_port_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPPortStatsRequest": {
+ "flags": 0,
+ "port_no": 7,
+ "type": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_get_config_request.packet.json b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_get_config_request.packet.json
new file mode 100644
index 00000000..a50308c0
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_get_config_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPQueueGetConfigRequest": {
+ "port": 4294967295
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet1.json b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet1.json
new file mode 100644
index 00000000..b216fe97
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet1.json
@@ -0,0 +1,8 @@
+{
+ "OFPQueueStatsRequest": {
+ "flags": 0,
+ "port_no": 7,
+ "queue_id": 4294967295,
+ "type": 5
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet2.json b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet2.json
new file mode 100644
index 00000000..cc00e1ea
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet2.json
@@ -0,0 +1,8 @@
+{
+ "OFPQueueStatsRequest": {
+ "flags": 0,
+ "port_no": 7,
+ "queue_id": 1,
+ "type": 5
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet3.json b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet3.json
new file mode 100644
index 00000000..5f6579be
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_queue_stats_request.packet3.json
@@ -0,0 +1,8 @@
+{
+ "OFPQueueStatsRequest": {
+ "flags": 0,
+ "port_no": 4294967295,
+ "queue_id": 1,
+ "type": 5
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/lib-ofctl-ofp_table_features_request.packet.json b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_table_features_request.packet.json
new file mode 100644
index 00000000..6501de15
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/lib-ofctl-ofp_table_features_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPTableFeaturesStatsRequest": {
+ "body": [],
+ "flags": 0,
+ "type": 12
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-echo_reply.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-echo_reply.packet.json
new file mode 100644
index 00000000..011bd6de
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-echo_reply.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPEchoReply": {
+ "data": ""
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-echo_request.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-echo_request.packet.json
new file mode 100644
index 00000000..501a8479
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-echo_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPEchoRequest": {
+ "data": ""
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-error_msg.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-error_msg.packet.json
new file mode 100644
index 00000000..b12d0d9a
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-error_msg.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPErrorMsg": {
+ "code": 6,
+ "data": "BA4ACAAAAAA=",
+ "type": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-features_reply.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-features_reply.packet.json
new file mode 100644
index 00000000..3d828093
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-features_reply.packet.json
@@ -0,0 +1,9 @@
+{
+ "OFPSwitchFeatures": {
+ "auxiliary_id": 0,
+ "capabilities": 79,
+ "datapath_id": 1,
+ "n_buffers": 255,
+ "n_tables": 255
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod.packet.json
new file mode 100644
index 00000000..7de40ef3
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod.packet.json
@@ -0,0 +1,192 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 0,
+ "command": 0,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.9"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "NXActionLearn": {
+ "cookie": 0,
+ "experimenter": 8992,
+ "fin_hard_timeout": 0,
+ "fin_idle_timeout": 0,
+ "flags": 0,
+ "hard_timeout": 300,
+ "idle_timeout": 0,
+ "len": 96,
+ "priority": 1,
+ "specs": [
+ {
+ "NXFlowSpecMatch": {
+ "dst": [
+ "vlan_vid",
+ 0
+ ],
+ "n_bits": 12,
+ "src": [
+ "vlan_vid",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecMatch": {
+ "dst": [
+ "eth_dst_nxm",
+ 0
+ ],
+ "n_bits": 48,
+ "src": [
+ "eth_src_nxm",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecLoad": {
+ "dst": [
+ "vlan_vid",
+ 0
+ ],
+ "n_bits": 12,
+ "src": 0
+ }
+ },
+ {
+ "NXFlowSpecLoad": {
+ "dst": [
+ "tunnel_id_nxm",
+ 0
+ ],
+ "n_bits": 64,
+ "src": [
+ "tunnel_id_nxm",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecOutput": {
+ "dst": "",
+ "n_bits": 32,
+ "src": [
+ "in_port",
+ 0
+ ]
+ }
+ }
+ ],
+ "subtype": 16,
+ "table_id": 99,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 128,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 100,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 70,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "aa:bb:cc:99:88:77"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5095
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 50000
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "192.168.2.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 0,
+ "out_port": 0,
+ "priority": 0,
+ "table_id": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod.packet.truncated64.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod.packet.truncated64.json
new file mode 100644
index 00000000..707e3096
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod.packet.truncated64.json
@@ -0,0 +1,33 @@
+{
+ "OFPTruncatedMessage": {
+ "OFPFlowMod": {
+ "buffer_id": 0,
+ "command": 0,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [],
+ "match": {
+ "OFPMatch": {
+ "length": 70,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 0,
+ "out_port": 0,
+ "priority": 0,
+ "table_id": 2
+ }
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod_conjunction.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod_conjunction.packet.json
new file mode 100644
index 00000000..209067e8
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod_conjunction.packet.json
@@ -0,0 +1,100 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 0,
+ "command": 0,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionConjunction": {
+ "clause": 1,
+ "experimenter": 8992,
+ "id": 11259375,
+ "len": 16,
+ "n_clauses": 2,
+ "subtype": 34,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 70,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "aa:bb:cc:99:88:77"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5095
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 50000
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "192.168.2.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 0,
+ "out_port": 0,
+ "priority": 0,
+ "table_id": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod_match_conj.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod_match_conj.packet.json
new file mode 100644
index 00000000..4fd8c4d4
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_mod_match_conj.packet.json
@@ -0,0 +1,66 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 0,
+ "command": 0,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.9"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ }
+ ],
+ "len": 32,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 100,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 12,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "conj_id",
+ "mask": null,
+ "value": 11259375
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 0,
+ "out_port": 0,
+ "priority": 0,
+ "table_id": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_removed.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_removed.packet.json
new file mode 100644
index 00000000..63ec9424
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-flow_removed.packet.json
@@ -0,0 +1,78 @@
+{
+ "OFPFlowRemoved": {
+ "byte_count": 100,
+ "cookie": 1311768467463790320,
+ "duration_nsec": 500,
+ "duration_sec": 600,
+ "hard_timeout": 300,
+ "idle_timeout": 400,
+ "match": {
+ "OFPMatch": {
+ "length": 70,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "aa:bb:cc:99:88:77"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5095
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 50000
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "192.168.2.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "packet_count": 200,
+ "priority": 100,
+ "reason": 0,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-get_config_reply.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-get_config_reply.packet.json
new file mode 100644
index 00000000..62b37b4d
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-get_config_reply.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGetConfigReply": {
+ "flags": 0,
+ "miss_send_len": 128
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-hello.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-hello.packet.json
new file mode 100644
index 00000000..5a116313
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-hello.packet.json
@@ -0,0 +1,15 @@
+{
+ "OFPHello": {
+ "elements": [
+ {
+ "OFPHelloElemVersionBitmap": {
+ "length": 8,
+ "type": 1,
+ "versions": [
+ 4
+ ]
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-meter_mod.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-meter_mod.packet.json
new file mode 100644
index 00000000..5bb43719
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-meter_mod.packet.json
@@ -0,0 +1,26 @@
+{
+ "OFPMeterMod": {
+ "bands": [
+ {
+ "OFPMeterBandDrop": {
+ "burst_size": 10,
+ "len": 16,
+ "rate": 1000,
+ "type": 1
+ }
+ },
+ {
+ "OFPMeterBandDscpRemark": {
+ "burst_size": 10,
+ "len": 16,
+ "prec_level": 1,
+ "rate": 1000,
+ "type": 2
+ }
+ }
+ ],
+ "command": 0,
+ "flags": 14,
+ "meter_id": 100
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-ofp_packet_out_packet_library.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-ofp_packet_out_packet_library.packet.json
new file mode 100644
index 00000000..4e8ad336
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-ofp_packet_out_packet_library.packet.json
@@ -0,0 +1,61 @@
+{
+ "OFPPacketOut": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 4294967292,
+ "type": 0
+ }
+ }
+ ],
+ "actions_len": 16,
+ "buffer_id": 4294967295,
+ "data": {
+ "Packet": {
+ "protocols": [
+ {
+ "ethernet": {
+ "dst": "f2:0b:a4:d0:3f:70",
+ "ethertype": 2048,
+ "src": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "ipv4": {
+ "csum": 44939,
+ "dst": "10.0.0.2",
+ "flags": 0,
+ "header_length": 5,
+ "identification": 63514,
+ "offset": 0,
+ "option": null,
+ "proto": 1,
+ "src": "10.0.0.1",
+ "tos": 0,
+ "total_length": 84,
+ "ttl": 255,
+ "version": 4
+ }
+ },
+ {
+ "icmp": {
+ "code": 0,
+ "csum": 520,
+ "data": {
+ "echo": {
+ "data": "MdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vAAAAAAAAAAA=",
+ "id": 63328,
+ "seq": 0
+ }
+ },
+ "type": 8
+ }
+ }
+ ]
+ }
+ },
+ "in_port": 4294967293
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-packet_in.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-packet_in.packet.json
new file mode 100644
index 00000000..e5fd0bd9
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-packet_in.packet.json
@@ -0,0 +1,46 @@
+{
+ "OFPPacketIn": {
+ "buffer_id": 200,
+ "cookie": 0,
+ "data": "aG9nZQ==",
+ "match": {
+ "OFPMatch": {
+ "length": 40,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 50000
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "192.168.2.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "reason": 0,
+ "table_id": 100,
+ "total_len": 1000
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-port_mod.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-port_mod.packet.json
new file mode 100644
index 00000000..5c6c29a0
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-port_mod.packet.json
@@ -0,0 +1,9 @@
+{
+ "OFPPortMod": {
+ "advertise": 10248,
+ "config": 1,
+ "hw_addr": "aa:bb:cc:99:88:77",
+ "mask": 1,
+ "port_no": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-port_status.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-port_status.packet.json
new file mode 100644
index 00000000..b82d10ee
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-port_status.packet.json
@@ -0,0 +1,20 @@
+{
+ "OFPPortStatus": {
+ "desc": {
+ "OFPPort": {
+ "advertised": 10248,
+ "config": 0,
+ "curr": 10248,
+ "curr_speed": 50000,
+ "hw_addr": "ff:ff:ff:ff:ff:ff",
+ "max_speed": 100000,
+ "name": "eth0",
+ "peer": 10248,
+ "port_no": 1,
+ "state": 4,
+ "supported": 10248
+ }
+ },
+ "reason": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-set_config.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-set_config.packet.json
new file mode 100644
index 00000000..cd5398b7
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-set_config.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPSetConfig": {
+ "flags": 0,
+ "miss_send_len": 128
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/libofproto-OFP13-table_mod.packet.json b/tests/unit/ofproto/json/of13/libofproto-OFP13-table_mod.packet.json
new file mode 100644
index 00000000..5019c29b
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/libofproto-OFP13-table_mod.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPTableMod": {
+ "config": 0,
+ "table_id": 255
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_conjunction.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_conjunction.packet.json
new file mode 100644
index 00000000..edc10939
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_conjunction.packet.json
@@ -0,0 +1,100 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 1,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionConjunction": {
+ "clause": 0,
+ "experimenter": 8992,
+ "id": 11259375,
+ "len": 16,
+ "n_clauses": 2,
+ "subtype": 34,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 70,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "aa:bb:cc:99:88:77"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5095
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 50000
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "192.168.2.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_controller.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_controller.packet.json
new file mode 100644
index 00000000..95bc3f51
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_controller.packet.json
@@ -0,0 +1,43 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionController": {
+ "controller_id": 1,
+ "experimenter": 8992,
+ "len": 16,
+ "max_len": 1024,
+ "reason": 5,
+ "subtype": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 100,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_controller2.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_controller2.packet.json
new file mode 100644
index 00000000..f5e57f3d
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_controller2.packet.json
@@ -0,0 +1,51 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionController2": {
+ "controller_id": 10,
+ "experimenter": 8992,
+ "len": 64,
+ "max_len": 1024,
+ "pause": true,
+ "reason": 5,
+ "subtype": 37,
+ "type": 65535,
+ "userdata": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ]
+ }
+ }
+ ],
+ "len": 72,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 100,
+ "table_id": 0
+ }
+} \ No newline at end of file
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json
new file mode 100644
index 00000000..b1157e9a
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct.packet.json
@@ -0,0 +1,61 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionCT": {
+ "actions": [],
+ "alg": 0,
+ "experimenter": 8992,
+ "flags": 0,
+ "len": 24,
+ "recirc_table": 4,
+ "subtype": 35,
+ "type": 65535,
+ "zone_ofs_nbits": 283,
+ "zone_src": "reg0"
+ }
+ }
+ ],
+ "len": 32,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 22,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ct_state",
+ "mask": 32,
+ "value": 0
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json
new file mode 100644
index 00000000..e3fcd3bc
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_exec.packet.json
@@ -0,0 +1,75 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionCT": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "ct_mark",
+ "mask": null,
+ "value": 6636321
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ }
+ ],
+ "alg": 0,
+ "experimenter": 8992,
+ "flags": 1,
+ "len": 40,
+ "recirc_table": 255,
+ "subtype": 35,
+ "type": 65535,
+ "zone_ofs_nbits": 0,
+ "zone_src": ""
+ }
+ }
+ ],
+ "len": 48,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 22,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ct_state",
+ "mask": 34,
+ "value": 34
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json
new file mode 100644
index 00000000..5a38d8f7
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat.packet.json
@@ -0,0 +1,70 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionCT": {
+ "actions": [
+ {
+ "NXActionNAT": {
+ "experimenter": 8992,
+ "flags": 1,
+ "len": 32,
+ "range_ipv4_max": "10.1.13.255",
+ "range_ipv4_min": "10.1.12.0",
+ "range_ipv6_max": "",
+ "range_ipv6_min": "",
+ "range_proto_max": 1023,
+ "range_proto_min": 1,
+ "subtype": 36,
+ "type": 65535
+ }
+ }
+ ],
+ "alg": 0,
+ "experimenter": 8992,
+ "flags": 1,
+ "len": 56,
+ "recirc_table": 255,
+ "subtype": 35,
+ "type": 65535,
+ "zone_ofs_nbits": 0,
+ "zone_src": ""
+ }
+ }
+ ],
+ "len": 64,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 10,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json
new file mode 100644
index 00000000..5c1c8c07
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_ct_nat_v6.packet.json
@@ -0,0 +1,70 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionCT": {
+ "actions": [
+ {
+ "NXActionNAT": {
+ "experimenter": 8992,
+ "flags": 2,
+ "len": 48,
+ "range_ipv4_max": "",
+ "range_ipv4_min": "",
+ "range_ipv6_max": "2001:1::ffff",
+ "range_ipv6_min": "2001:1::1",
+ "range_proto_max": null,
+ "range_proto_min": null,
+ "subtype": 36,
+ "type": 65535
+ }
+ }
+ ],
+ "alg": 0,
+ "experimenter": 8992,
+ "flags": 1,
+ "len": 72,
+ "recirc_table": 255,
+ "subtype": 35,
+ "type": 65535,
+ "zone_ofs_nbits": 0,
+ "zone_src": ""
+ }
+ }
+ ],
+ "len": 80,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 10,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 34525
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_dec_ttl_cnt_ids.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_dec_ttl_cnt_ids.packet.json
new file mode 100644
index 00000000..c5e44d07
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_dec_ttl_cnt_ids.packet.json
@@ -0,0 +1,62 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionDecTtlCntIds": {
+ "cnt_ids": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "experimenter": 8992,
+ "len": 32,
+ "subtype": 21,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 40,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 15,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_proto",
+ "mask": null,
+ "value": 6
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 100,
+ "table_id": 0
+ }
+} \ No newline at end of file
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_fintimeout.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_fintimeout.packet.json
new file mode 100644
index 00000000..c0e02de9
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_fintimeout.packet.json
@@ -0,0 +1,57 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionFinTimeout": {
+ "experimenter": 8992,
+ "fin_hard_timeout": 60,
+ "fin_idle_timeout": 30,
+ "len": 16,
+ "subtype": 19,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 15,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_proto",
+ "mask": null,
+ "value": 6
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 100,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_learn.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_learn.packet.json
new file mode 100644
index 00000000..c874c2e9
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_learn.packet.json
@@ -0,0 +1,192 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.9"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "NXActionLearn": {
+ "cookie": 0,
+ "experimenter": 8992,
+ "fin_hard_timeout": 0,
+ "fin_idle_timeout": 0,
+ "flags": 0,
+ "hard_timeout": 300,
+ "idle_timeout": 0,
+ "len": 96,
+ "priority": 1,
+ "specs": [
+ {
+ "NXFlowSpecMatch": {
+ "dst": [
+ "vlan_vid",
+ 0
+ ],
+ "n_bits": 12,
+ "src": [
+ "vlan_vid",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecMatch": {
+ "dst": [
+ "eth_dst_nxm",
+ 0
+ ],
+ "n_bits": 48,
+ "src": [
+ "eth_src_nxm",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecLoad": {
+ "dst": [
+ "vlan_vid",
+ 0
+ ],
+ "n_bits": 12,
+ "src": 0
+ }
+ },
+ {
+ "NXFlowSpecLoad": {
+ "dst": [
+ "tunnel_id_nxm",
+ 0
+ ],
+ "n_bits": 64,
+ "src": [
+ "tunnel_id_nxm",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecOutput": {
+ "dst": "",
+ "n_bits": 32,
+ "src": [
+ "in_port",
+ 0
+ ]
+ }
+ }
+ ],
+ "subtype": 16,
+ "table_id": 99,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 128,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 100,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 70,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "aa:bb:cc:99:88:77"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5095
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 50000
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "192.168.2.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_note.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_note.packet.json
new file mode 100644
index 00000000..330000da
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_note.packet.json
@@ -0,0 +1,48 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionNote": {
+ "experimenter": 8992,
+ "len": 16,
+ "note": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 0,
+ 0
+ ],
+ "subtype": 8,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 100,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_output_trunc.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_output_trunc.packet.json
new file mode 100644
index 00000000..84657335
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_output_trunc.packet.json
@@ -0,0 +1,42 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionOutputTrunc": {
+ "experimenter": 8992,
+ "len": 16,
+ "max_len": 1024,
+ "port": 8080,
+ "subtype": 39,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 100,
+ "table_id": 0
+ }
+} \ No newline at end of file
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_resubmit.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_resubmit.packet.json
new file mode 100644
index 00000000..1fdedc55
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_resubmit.packet.json
@@ -0,0 +1,99 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionResubmitTable": {
+ "experimenter": 8992,
+ "in_port": 1234,
+ "len": 16,
+ "subtype": 14,
+ "table_id": 99,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 70,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "aa:bb:cc:99:88:77"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5095
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 50000
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "192.168.2.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_sample.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_sample.packet.json
new file mode 100644
index 00000000..a5a374ad
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_sample.packet.json
@@ -0,0 +1,44 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionSample": {
+ "collector_set_id": 1,
+ "experimenter": 8992,
+ "len": 24,
+ "obs_domain_id": 2,
+ "obs_point_id": 3,
+ "probability": 3,
+ "subtype": 29,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 32,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 100,
+ "table_id": 0
+ }
+} \ No newline at end of file
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_sample2.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_sample2.packet.json
new file mode 100644
index 00000000..c767bff3
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_sample2.packet.json
@@ -0,0 +1,45 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionSample2": {
+ "collector_set_id": 1,
+ "experimenter": 8992,
+ "len": 32,
+ "obs_domain_id": 2,
+ "obs_point_id": 3,
+ "probability": 3,
+ "sampling_port": 8080,
+ "subtype": 38,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 40,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 100,
+ "table_id": 0
+ }
+} \ No newline at end of file
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_stack_pop.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_stack_pop.packet.json
new file mode 100644
index 00000000..0322a36a
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_stack_pop.packet.json
@@ -0,0 +1,43 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionStackPop": {
+ "end": 5,
+ "experimenter": 8992,
+ "field": "reg2",
+ "len": 24,
+ "start": 1,
+ "subtype": 28,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 32,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 100,
+ "table_id": 0
+ }
+} \ No newline at end of file
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_stack_push.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_stack_push.packet.json
new file mode 100644
index 00000000..86d29e74
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-action_stack_push.packet.json
@@ -0,0 +1,43 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionStackPush": {
+ "end": 5,
+ "experimenter": 8992,
+ "field": "reg2",
+ "len": 24,
+ "start": 1,
+ "subtype": 27,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 32,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 100,
+ "table_id": 0
+ }
+} \ No newline at end of file
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_conj.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_conj.packet.json
new file mode 100644
index 00000000..6b1c2864
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_conj.packet.json
@@ -0,0 +1,60 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 1,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ }
+ ],
+ "len": 16,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 100,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 18,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "conj_id",
+ "mask": null,
+ "value": 11259375
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5330
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json
new file mode 100644
index 00000000..c60851a0
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_load_nx_register.packet.json
@@ -0,0 +1,58 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 1,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionRegLoad": {
+ "dst": "reg0",
+ "experimenter": 8992,
+ "len": 24,
+ "ofs_nbits": 283,
+ "subtype": 7,
+ "type": 65535,
+ "value": 233495534
+ }
+ }
+ ],
+ "len": 32,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 24,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "reg0",
+ "mask": null,
+ "value": 4660
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "reg5",
+ "mask": 65535,
+ "value": 43981
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 3
+ }
+} \ No newline at end of file
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_move_nx_register.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_move_nx_register.packet.json
new file mode 100644
index 00000000..7457278b
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_move_nx_register.packet.json
@@ -0,0 +1,60 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 1,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionRegMove": {
+ "dst_field": "reg1",
+ "dst_ofs": 0,
+ "experimenter": 8992,
+ "len": 24,
+ "n_bits": 6,
+ "src_field": "reg0",
+ "src_ofs": 10,
+ "subtype": 6,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 32,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 24,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "reg0",
+ "mask": null,
+ "value": 4660
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "reg5",
+ "mask": 65535,
+ "value": 43981
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 3
+ }
+} \ No newline at end of file
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_pkt_mark.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_pkt_mark.packet.json
new file mode 100644
index 00000000..61aee954
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_pkt_mark.packet.json
@@ -0,0 +1,60 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 1,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ }
+ ],
+ "len": 16,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 100,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 18,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5330
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pkt_mark",
+ "mask": null,
+ "value": 54321
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_pkt_mark_masked.packet.json b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_pkt_mark_masked.packet.json
new file mode 100644
index 00000000..a7bd2367
--- /dev/null
+++ b/tests/unit/ofproto/json/of13/ovs-ofctl-of13-match_pkt_mark_masked.packet.json
@@ -0,0 +1,60 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 4294967295,
+ "command": 1,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ }
+ ],
+ "len": 16,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 100,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 22,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5330
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pkt_mark",
+ "mask": 65535,
+ "value": 54321
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 32768,
+ "table_id": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-0-ofp_desc_reply.packet.json b/tests/unit/ofproto/json/of14/5-0-ofp_desc_reply.packet.json
new file mode 100644
index 00000000..26e5dc2d
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-0-ofp_desc_reply.packet.json
@@ -0,0 +1,15 @@
+{
+ "OFPDescStatsReply": {
+ "body": {
+ "OFPDescStats": {
+ "dp_desc": "dp",
+ "hw_desc": "hw",
+ "mfr_desc": "mfr",
+ "serial_num": "serial",
+ "sw_desc": "sw"
+ }
+ },
+ "flags": 0,
+ "type": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-1-ofp_packet_out.packet.json b/tests/unit/ofproto/json/of14/5-1-ofp_packet_out.packet.json
new file mode 100644
index 00000000..efb39e2d
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-1-ofp_packet_out.packet.json
@@ -0,0 +1,18 @@
+{
+ "OFPPacketOut": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 4294967292,
+ "type": 0
+ }
+ }
+ ],
+ "actions_len": 16,
+ "buffer_id": 4294967295,
+ "data": "8guk0D9w8gukffjqCABFAABU+BoAAP8Br4sKAAABCgAAAggAAgj3YAAAMdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vAAAAAAAAAAA=",
+ "in_port": 4294967293
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-10-ofp_hello.packet.json b/tests/unit/ofproto/json/of14/5-10-ofp_hello.packet.json
new file mode 100644
index 00000000..d03ff84b
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-10-ofp_hello.packet.json
@@ -0,0 +1,20 @@
+{
+ "OFPHello": {
+ "elements": [
+ {
+ "OFPHelloElemVersionBitmap": {
+ "length": 8,
+ "type": 1,
+ "versions": [
+ 1,
+ 2,
+ 3,
+ 9,
+ 10,
+ 30
+ ]
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-11-ofp_flow_stats_request.packet.json b/tests/unit/ofproto/json/of14/5-11-ofp_flow_stats_request.packet.json
new file mode 100644
index 00000000..2baccad4
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-11-ofp_flow_stats_request.packet.json
@@ -0,0 +1,18 @@
+{
+ "OFPFlowStatsRequest": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 0,
+ "type": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-12-ofp_flow_stats_reply.packet.json b/tests/unit/ofproto/json/of14/5-12-ofp_flow_stats_reply.packet.json
new file mode 100644
index 00000000..42eacf37
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-12-ofp_flow_stats_reply.packet.json
@@ -0,0 +1,347 @@
+{
+ "OFPFlowStatsReply": {
+ "body": [
+ {
+ "OFPFlowStats": {
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115277000,
+ "duration_sec": 358,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [],
+ "length": 56,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "packet_count": 0,
+ "priority": 65535,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPFlowStats": {
+ "byte_count": 0,
+ "cookie": 0,
+ "duration_nsec": 115055000,
+ "duration_sec": 358,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 0,
+ "port": 4294967290,
+ "type": 0
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "length": 88,
+ "match": {
+ "OFPMatch": {
+ "length": 10,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "packet_count": 0,
+ "priority": 65534,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPFlowStats": {
+ "byte_count": 238,
+ "cookie": 0,
+ "duration_nsec": 511582000,
+ "duration_sec": 316220,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 1,
+ "type": 1
+ }
+ }
+ ],
+ "length": 80,
+ "match": {
+ "OFPMatch": {
+ "length": 22,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 6
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "packet_count": 3,
+ "priority": 123,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPFlowStats": {
+ "byte_count": 98,
+ "cookie": 0,
+ "duration_nsec": 980901000,
+ "duration_sec": 313499,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 258
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionCopyTtlOut": {
+ "len": 8,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionPopPbb": {
+ "len": 8,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionPushPbb": {
+ "ethertype": 4660,
+ "len": 8,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionPopMpls": {
+ "ethertype": 39030,
+ "len": 8,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionPushMpls": {
+ "ethertype": 34887,
+ "len": 8,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionPushVlan": {
+ "ethertype": 33024,
+ "len": 8,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionDecMplsTtl": {
+ "len": 8,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionSetMplsTtl": {
+ "len": 8,
+ "mpls_ttl": 10,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionDecNwTtl": {
+ "len": 8,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionSetNwTtl": {
+ "len": 8,
+ "nw_ttl": 10,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionSetQueue": {
+ "len": 8,
+ "queue_id": 3,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionGroup": {
+ "group_id": 99,
+ "len": 8,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 6,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionExperimenterUnknown": {
+ "len": 16,
+ "data": "ZXhwX2RhdGE=",
+ "experimenter": 98765432,
+ "type": 65535
+ }
+ },
+ {
+ "NXActionUnknown": {
+ "len": 16,
+ "data": "cF9kYXRh",
+ "experimenter": 8992,
+ "type": 65535,
+ "subtype": 25976
+ }
+ }
+ ],
+ "len": 192,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "01:02:03:04:05:06"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "pbb_uca",
+ "mask": null,
+ "value": 1
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ }
+ ],
+ "len": 40,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 4294967293,
+ "type": 0
+ }
+ }
+ ],
+ "len": 24,
+ "type": 3
+ }
+ }
+ ],
+ "length": 312,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "packet_count": 1,
+ "priority": 0,
+ "table_id": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-13-ofp_echo_request.packet.json b/tests/unit/ofproto/json/of14/5-13-ofp_echo_request.packet.json
new file mode 100644
index 00000000..e1f2af42
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-13-ofp_echo_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPEchoRequest": {
+ "data": "aG9nZQ=="
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-14-ofp_echo_reply.packet.json b/tests/unit/ofproto/json/of14/5-14-ofp_echo_reply.packet.json
new file mode 100644
index 00000000..2a573634
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-14-ofp_echo_reply.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPEchoReply": {
+ "data": "aG9nZQ=="
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-15-ofp_error_msg.packet.json b/tests/unit/ofproto/json/of14/5-15-ofp_error_msg.packet.json
new file mode 100644
index 00000000..e9ab2b5e
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-15-ofp_error_msg.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPErrorMsg": {
+ "code": 11,
+ "data": "ZnVnYWZ1Z2E=",
+ "type": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-16-ofp_experimenter.packet.json b/tests/unit/ofproto/json/of14/5-16-ofp_experimenter.packet.json
new file mode 100644
index 00000000..4ad13c73
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-16-ofp_experimenter.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPExperimenter": {
+ "data": "bmF6bw==",
+ "exp_type": 123456789,
+ "experimenter": 98765432
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-17-ofp_barrier_request.packet.json b/tests/unit/ofproto/json/of14/5-17-ofp_barrier_request.packet.json
new file mode 100644
index 00000000..2aae9ec3
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-17-ofp_barrier_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPBarrierRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of14/5-18-ofp_barrier_reply.packet.json b/tests/unit/ofproto/json/of14/5-18-ofp_barrier_reply.packet.json
new file mode 100644
index 00000000..11f8cfcc
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-18-ofp_barrier_reply.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPBarrierReply": {}
+}
diff --git a/tests/unit/ofproto/json/of14/5-19-ofp_role_request.packet.json b/tests/unit/ofproto/json/of14/5-19-ofp_role_request.packet.json
new file mode 100644
index 00000000..5cdbc2f1
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-19-ofp_role_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPRoleRequest": {
+ "generation_id": 17294086455919964160,
+ "role": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-2-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of14/5-2-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..5f789d52
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-2-ofp_flow_mod.packet.json
@@ -0,0 +1,202 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 258
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionCopyTtlOut": {
+ "len": 8,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionPopPbb": {
+ "len": 8,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionPushPbb": {
+ "ethertype": 4660,
+ "len": 8,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionPopMpls": {
+ "ethertype": 39030,
+ "len": 8,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionPushMpls": {
+ "ethertype": 34887,
+ "len": 8,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionPushVlan": {
+ "ethertype": 33024,
+ "len": 8,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionDecMplsTtl": {
+ "len": 8,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionSetMplsTtl": {
+ "len": 8,
+ "mpls_ttl": 10,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionDecNwTtl": {
+ "len": 8,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionSetNwTtl": {
+ "len": 8,
+ "nw_ttl": 10,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionExperimenterUnknown": {
+ "data": "AAECAwQFBgc=",
+ "experimenter": 101,
+ "len": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPActionSetQueue": {
+ "len": 8,
+ "queue_id": 3,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionGroup": {
+ "group_id": 99,
+ "len": 8,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 6,
+ "type": 0
+ }
+ }
+ ],
+ "len": 176,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "01:02:03:04:05:06"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "pbb_uca",
+ "mask": null,
+ "value": 1
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ }
+ ],
+ "len": 40,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-20-ofp_role_reply.packet.json b/tests/unit/ofproto/json/of14/5-20-ofp_role_reply.packet.json
new file mode 100644
index 00000000..3fd9a13f
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-20-ofp_role_reply.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPRoleReply": {
+ "generation_id": 17294086455919964160,
+ "role": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-21-ofp_group_mod.packet.json b/tests/unit/ofproto/json/of14/5-21-ofp_group_mod.packet.json
new file mode 100644
index 00000000..1a3767da
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-21-ofp_group_mod.packet.json
@@ -0,0 +1,27 @@
+{
+ "OFPGroupMod": {
+ "buckets": [
+ {
+ "OFPBucket": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 2,
+ "type": 0
+ }
+ }
+ ],
+ "len": 32,
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ }
+ ],
+ "command": 0,
+ "group_id": 1,
+ "type": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-22-ofp_port_mod.packet.json b/tests/unit/ofproto/json/of14/5-22-ofp_port_mod.packet.json
new file mode 100644
index 00000000..a255b9dd
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-22-ofp_port_mod.packet.json
@@ -0,0 +1,60 @@
+{
+ "OFPPortMod": {
+ "config": 0,
+ "hw_addr": "00:11:00:00:11:11",
+ "mask": 0,
+ "port_no": 1,
+ "properties": [
+ {
+ "OFPPortModPropEthernet": {
+ "advertise": 4096,
+ "length": 8,
+ "type": 0
+ }
+ },
+ {
+ "OFPPortModPropOptical": {
+ "configure": 3,
+ "fl_offset": 2000,
+ "freq_lmda": 1500,
+ "grid_span": 3000,
+ "length": 24,
+ "tx_pwr": 300,
+ "type": 1
+ }
+ },
+ {
+ "OFPPortModPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortModPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortModPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-23-ofp_table_mod.packet.json b/tests/unit/ofproto/json/of14/5-23-ofp_table_mod.packet.json
new file mode 100644
index 00000000..97acd144
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-23-ofp_table_mod.packet.json
@@ -0,0 +1,56 @@
+{
+ "OFPTableMod": {
+ "config": 0,
+ "properties": [
+ {
+ "OFPTableModPropEviction": {
+ "flags": 0,
+ "length": 8,
+ "type": 2
+ }
+ },
+ {
+ "OFPTableModPropVacancy": {
+ "length": 8,
+ "type": 3,
+ "vacancy": 0,
+ "vacancy_down": 0,
+ "vacancy_up": 0
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "table_id": 255
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-24-ofp_desc_request.packet.json b/tests/unit/ofproto/json/of14/5-24-ofp_desc_request.packet.json
new file mode 100644
index 00000000..5b23f8bc
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-24-ofp_desc_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPDescStatsRequest": {
+ "flags": 0,
+ "type": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-25-ofp_aggregate_stats_request.packet.json b/tests/unit/ofproto/json/of14/5-25-ofp_aggregate_stats_request.packet.json
new file mode 100644
index 00000000..248131fd
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-25-ofp_aggregate_stats_request.packet.json
@@ -0,0 +1,18 @@
+{
+ "OFPAggregateStatsRequest": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 255,
+ "type": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-26-ofp_aggregate_stats_reply.packet.json b/tests/unit/ofproto/json/of14/5-26-ofp_aggregate_stats_reply.packet.json
new file mode 100644
index 00000000..153ad4f0
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-26-ofp_aggregate_stats_reply.packet.json
@@ -0,0 +1,13 @@
+{
+ "OFPAggregateStatsReply": {
+ "body": {
+ "OFPAggregateStats": {
+ "byte_count": 574,
+ "flow_count": 6,
+ "packet_count": 7
+ }
+ },
+ "flags": 0,
+ "type": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-27-ofp_table_stats_request.packet.json b/tests/unit/ofproto/json/of14/5-27-ofp_table_stats_request.packet.json
new file mode 100644
index 00000000..1f965d77
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-27-ofp_table_stats_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPTableStatsRequest": {
+ "flags": 0,
+ "type": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-28-ofp_table_stats_reply.packet.json b/tests/unit/ofproto/json/of14/5-28-ofp_table_stats_reply.packet.json
new file mode 100644
index 00000000..94801adb
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-28-ofp_table_stats_reply.packet.json
@@ -0,0 +1,24 @@
+{
+ "OFPTableStatsReply": {
+ "body": [
+ {
+ "OFPTableStats": {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 1
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-29-ofp_port_stats_request.packet.json b/tests/unit/ofproto/json/of14/5-29-ofp_port_stats_request.packet.json
new file mode 100644
index 00000000..5228710d
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-29-ofp_port_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPPortStatsRequest": {
+ "flags": 0,
+ "port_no": 4294967295,
+ "type": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-3-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of14/5-3-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..061e3cd0
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-3-ofp_flow_mod.packet.json
@@ -0,0 +1,47 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 1,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 22,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 6
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-30-ofp_port_stats_reply.packet.json b/tests/unit/ofproto/json/of14/5-30-ofp_port_stats_reply.packet.json
new file mode 100644
index 00000000..4ea41742
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-30-ofp_port_stats_reply.packet.json
@@ -0,0 +1,113 @@
+{
+ "OFPPortStatsReply": {
+ "body": [
+ {
+ "OFPPortStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 224,
+ "port_no": 7,
+ "properties": [
+ {
+ "OFPPortStatsPropEthernet": {
+ "collisions": 0,
+ "length": 40,
+ "rx_crc_err": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "type": 0
+ }
+ },
+ {
+ "OFPPortStatsPropOptical": {
+ "bias_current": 300,
+ "flags": 3,
+ "length": 44,
+ "rx_freq_lmda": 1500,
+ "rx_grid_span": 500,
+ "rx_offset": 700,
+ "rx_pwr": 2000,
+ "temperature": 273,
+ "tx_freq_lmda": 1500,
+ "tx_grid_span": 500,
+ "tx_offset": 700,
+ "tx_pwr": 2000,
+ "type": 1
+ }
+ },
+ {
+ "OFPPortStatsPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortStatsPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortStatsPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "rx_bytes": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_packets": 0,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ },
+ {
+ "OFPPortStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 120,
+ "port_no": 6,
+ "properties": [
+ {
+ "OFPPortStatsPropEthernet": {
+ "collisions": 0,
+ "length": 40,
+ "rx_crc_err": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "type": 0
+ }
+ }
+ ],
+ "rx_bytes": 336,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_packets": 4,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-31-ofp_group_features_request.packet.json b/tests/unit/ofproto/json/of14/5-31-ofp_group_features_request.packet.json
new file mode 100644
index 00000000..edba5dc5
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-31-ofp_group_features_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGroupFeaturesStatsRequest": {
+ "flags": 0,
+ "type": 8
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-32-ofp_group_features_reply.packet.json b/tests/unit/ofproto/json/of14/5-32-ofp_group_features_reply.packet.json
new file mode 100644
index 00000000..f059f994
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-32-ofp_group_features_reply.packet.json
@@ -0,0 +1,24 @@
+{
+ "OFPGroupFeaturesStatsReply": {
+ "body": {
+ "OFPGroupFeaturesStats": {
+ "actions": [
+ 67082241,
+ 67082241,
+ 67082241,
+ 67082241
+ ],
+ "capabilities": 5,
+ "max_groups": [
+ 16777216,
+ 16777216,
+ 16777216,
+ 16777216
+ ],
+ "types": 15
+ }
+ },
+ "flags": 0,
+ "type": 8
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-33-ofp_group_desc_request.packet.json b/tests/unit/ofproto/json/of14/5-33-ofp_group_desc_request.packet.json
new file mode 100644
index 00000000..bea140c2
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-33-ofp_group_desc_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGroupDescStatsRequest": {
+ "flags": 0,
+ "type": 7
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-34-ofp_group_desc_reply.packet.json b/tests/unit/ofproto/json/of14/5-34-ofp_group_desc_reply.packet.json
new file mode 100644
index 00000000..c30d7da6
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-34-ofp_group_desc_reply.packet.json
@@ -0,0 +1,35 @@
+{
+ "OFPGroupDescStatsReply": {
+ "body": [
+ {
+ "OFPGroupDescStats": {
+ "buckets": [
+ {
+ "OFPBucket": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 2,
+ "type": 0
+ }
+ }
+ ],
+ "len": 32,
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ }
+ ],
+ "group_id": 1,
+ "length": 40,
+ "type": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 7
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-35-ofp_queue_stats_request.packet.json b/tests/unit/ofproto/json/of14/5-35-ofp_queue_stats_request.packet.json
new file mode 100644
index 00000000..7a12acc3
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-35-ofp_queue_stats_request.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPQueueStatsRequest": {
+ "flags": 0,
+ "port_no": 4294967295,
+ "queue_id": 4294967295,
+ "type": 5
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-36-ofp_queue_stats_reply.packet.json b/tests/unit/ofproto/json/of14/5-36-ofp_queue_stats_reply.packet.json
new file mode 100644
index 00000000..2c190977
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-36-ofp_queue_stats_reply.packet.json
@@ -0,0 +1,80 @@
+{
+ "OFPQueueStatsReply": {
+ "body": [
+ {
+ "OFPQueueStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 104,
+ "port_no": 7,
+ "properties": [
+ {
+ "OFPQueueStatsPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPQueueStatsPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPQueueStatsPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ },
+ {
+ "OFPQueueStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 48,
+ "port_no": 6,
+ "properties": [],
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ },
+ {
+ "OFPQueueStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 48,
+ "port_no": 7,
+ "properties": [],
+ "queue_id": 2,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 5
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-37-ofp_port_status.packet.json b/tests/unit/ofproto/json/of14/5-37-ofp_port_status.packet.json
new file mode 100644
index 00000000..b273ac22
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-37-ofp_port_status.packet.json
@@ -0,0 +1,76 @@
+{
+ "OFPPortStatus": {
+ "desc": {
+ "OFPPort": {
+ "config": 0,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "length": 168,
+ "name": "\u79c1\u306e\u30dd\u30fc\u30c8",
+ "port_no": 7,
+ "properties": [
+ {
+ "OFPPortDescPropEthernet": {
+ "advertised": 10240,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "length": 32,
+ "max_speed": 5000,
+ "peer": 10248,
+ "supported": 10248,
+ "type": 0
+ }
+ },
+ {
+ "OFPPortDescPropOptical": {
+ "length": 40,
+ "rx_grid_freq_lmda": 1500,
+ "rx_max_freq_lmda": 2000,
+ "rx_min_freq_lmda": 1000,
+ "supported": 1,
+ "tx_grid_freq_lmda": 1500,
+ "tx_max_freq_lmda": 2000,
+ "tx_min_freq_lmda": 1000,
+ "tx_pwr_max": 2000,
+ "tx_pwr_min": 1000,
+ "type": 1
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "state": 4
+ }
+ },
+ "reason": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-38-ofp_flow_removed.packet.json b/tests/unit/ofproto/json/of14/5-38-ofp_flow_removed.packet.json
new file mode 100644
index 00000000..994953e6
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-38-ofp_flow_removed.packet.json
@@ -0,0 +1,29 @@
+{
+ "OFPFlowRemoved": {
+ "byte_count": 86,
+ "cookie": 0,
+ "duration_nsec": 48825000,
+ "duration_sec": 3,
+ "hard_timeout": 0,
+ "idle_timeout": 3,
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "packet_count": 1,
+ "priority": 65535,
+ "reason": 0,
+ "table_id": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-39-ofp_error_msg_experimenter.packet.json b/tests/unit/ofproto/json/of14/5-39-ofp_error_msg_experimenter.packet.json
new file mode 100644
index 00000000..37bfb6a9
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-39-ofp_error_msg_experimenter.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPErrorExperimenterMsg": {
+ "data": "amlra2VuIGRhdGE=",
+ "exp_type": 60000,
+ "experimenter": 999999,
+ "type": 65535
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-4-ofp_packet_in.packet.json b/tests/unit/ofproto/json/of14/5-4-ofp_packet_in.packet.json
new file mode 100644
index 00000000..b281edd7
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-4-ofp_packet_in.packet.json
@@ -0,0 +1,81 @@
+{
+ "OFPPacketIn": {
+ "buffer_id": 2,
+ "cookie": 283686884868096,
+ "data": "////////8gukffjqCAYAAQgABgQAAfILpH346goAAAEAAAAAAAAKAAAD",
+ "match": {
+ "OFPMatch": {
+ "length": 80,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 6
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "ff:ff:ff:ff:ff:ff"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_op",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_spa",
+ "mask": null,
+ "value": "10.0.0.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tpa",
+ "mask": null,
+ "value": "10.0.0.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_sha",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tha",
+ "mask": null,
+ "value": "00:00:00:00:00:00"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "reason": 3,
+ "table_id": 1,
+ "total_len": 42
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-40-ofp_get_async_request.packet.json b/tests/unit/ofproto/json/of14/5-40-ofp_get_async_request.packet.json
new file mode 100644
index 00000000..7daa5a0f
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-40-ofp_get_async_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPGetAsyncRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of14/5-41-ofp_get_async_reply.packet.json b/tests/unit/ofproto/json/of14/5-41-ofp_get_async_reply.packet.json
new file mode 100644
index 00000000..82c9e794
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-41-ofp_get_async_reply.packet.json
@@ -0,0 +1,122 @@
+{
+ "OFPGetAsyncReply": {
+ "properties": [
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 0
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 1
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 2
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 3
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 4
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 5
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 6
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 7
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 24,
+ "type": 8
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 24,
+ "type": 9
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 10
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 11
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65534
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-42-ofp_set_async.packet.json b/tests/unit/ofproto/json/of14/5-42-ofp_set_async.packet.json
new file mode 100644
index 00000000..0802c14e
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-42-ofp_set_async.packet.json
@@ -0,0 +1,122 @@
+{
+ "OFPSetAsync": {
+ "properties": [
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 0
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 1
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 2
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 3
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 4
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 5
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 6
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 7
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 24,
+ "type": 8
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 24,
+ "type": 9
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 10
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 11
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65534
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-43-ofp_meter_mod.packet.json b/tests/unit/ofproto/json/of14/5-43-ofp_meter_mod.packet.json
new file mode 100644
index 00000000..eba4540a
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-43-ofp_meter_mod.packet.json
@@ -0,0 +1,35 @@
+{
+ "OFPMeterMod": {
+ "bands": [
+ {
+ "OFPMeterBandDrop": {
+ "burst_size": 10,
+ "len": 16,
+ "rate": 1000,
+ "type": 1
+ }
+ },
+ {
+ "OFPMeterBandDscpRemark": {
+ "burst_size": 10,
+ "len": 16,
+ "prec_level": 1,
+ "rate": 1000,
+ "type": 2
+ }
+ },
+ {
+ "OFPMeterBandExperimenter": {
+ "burst_size": 10,
+ "experimenter": 999,
+ "len": 16,
+ "rate": 1000,
+ "type": 65535
+ }
+ }
+ ],
+ "command": 0,
+ "flags": 14,
+ "meter_id": 100
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-44-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of14/5-44-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..b8c28362
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-44-ofp_flow_mod.packet.json
@@ -0,0 +1,56 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [
+ {
+ "OFPInstructionMeter": {
+ "len": 8,
+ "meter_id": 1,
+ "type": 6
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 6,
+ "type": 0
+ }
+ }
+ ],
+ "len": 24,
+ "type": 3
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-45-ofp_meter_config_request.packet.json b/tests/unit/ofproto/json/of14/5-45-ofp_meter_config_request.packet.json
new file mode 100644
index 00000000..4703588e
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-45-ofp_meter_config_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPMeterConfigStatsRequest": {
+ "flags": 0,
+ "meter_id": 4294967295,
+ "type": 10
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-46-ofp_meter_config_reply.packet.json b/tests/unit/ofproto/json/of14/5-46-ofp_meter_config_reply.packet.json
new file mode 100644
index 00000000..08cc97e6
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-46-ofp_meter_config_reply.packet.json
@@ -0,0 +1,25 @@
+{
+ "OFPMeterConfigStatsReply": {
+ "body": [
+ {
+ "OFPMeterConfigStats": {
+ "bands": [
+ {
+ "OFPMeterBandDrop": {
+ "burst_size": 10,
+ "len": 16,
+ "rate": 1000,
+ "type": 1
+ }
+ }
+ ],
+ "flags": 14,
+ "length": 24,
+ "meter_id": 100
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 10
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-47-ofp_meter_stats_request.packet.json b/tests/unit/ofproto/json/of14/5-47-ofp_meter_stats_request.packet.json
new file mode 100644
index 00000000..8d45799b
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-47-ofp_meter_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPMeterStatsRequest": {
+ "flags": 0,
+ "meter_id": 4294967295,
+ "type": 9
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-48-ofp_meter_stats_reply.packet.json b/tests/unit/ofproto/json/of14/5-48-ofp_meter_stats_reply.packet.json
new file mode 100644
index 00000000..b4fd8226
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-48-ofp_meter_stats_reply.packet.json
@@ -0,0 +1,27 @@
+{
+ "OFPMeterStatsReply": {
+ "body": [
+ {
+ "OFPMeterStats": {
+ "band_stats": [
+ {
+ "OFPMeterBandStats": {
+ "byte_band_count": 0,
+ "packet_band_count": 0
+ }
+ }
+ ],
+ "byte_in_count": 0,
+ "duration_nsec": 480000,
+ "duration_sec": 0,
+ "flow_count": 0,
+ "len": 56,
+ "meter_id": 100,
+ "packet_in_count": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 9
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-49-ofp_meter_features_request.packet.json b/tests/unit/ofproto/json/of14/5-49-ofp_meter_features_request.packet.json
new file mode 100644
index 00000000..7363a342
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-49-ofp_meter_features_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPMeterFeaturesStatsRequest": {
+ "flags": 0,
+ "type": 11
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-5-ofp_features_request.packet.json b/tests/unit/ofproto/json/of14/5-5-ofp_features_request.packet.json
new file mode 100644
index 00000000..8f48ad5a
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-5-ofp_features_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPFeaturesRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of14/5-50-ofp_meter_features_reply.packet.json b/tests/unit/ofproto/json/of14/5-50-ofp_meter_features_reply.packet.json
new file mode 100644
index 00000000..e3f6918f
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-50-ofp_meter_features_reply.packet.json
@@ -0,0 +1,17 @@
+{
+ "OFPMeterFeaturesStatsReply": {
+ "body": [
+ {
+ "OFPMeterFeaturesStats": {
+ "band_types": 2147483654,
+ "capabilities": 15,
+ "max_bands": 255,
+ "max_color": 0,
+ "max_meter": 16777216
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 11
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-51-ofp_port_desc_request.packet.json b/tests/unit/ofproto/json/of14/5-51-ofp_port_desc_request.packet.json
new file mode 100644
index 00000000..f166c34a
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-51-ofp_port_desc_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPPortDescStatsRequest": {
+ "flags": 0,
+ "type": 13
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-52-ofp_port_desc_reply.packet.json b/tests/unit/ofproto/json/of14/5-52-ofp_port_desc_reply.packet.json
new file mode 100644
index 00000000..c281c0f8
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-52-ofp_port_desc_reply.packet.json
@@ -0,0 +1,103 @@
+{
+ "OFPPortDescStatsReply": {
+ "body": [
+ {
+ "OFPPort": {
+ "config": 0,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "length": 168,
+ "name": "Port7",
+ "port_no": 7,
+ "properties": [
+ {
+ "OFPPortDescPropEthernet": {
+ "advertised": 10240,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "length": 32,
+ "max_speed": 5000,
+ "peer": 10248,
+ "supported": 10248,
+ "type": 0
+ }
+ },
+ {
+ "OFPPortDescPropOptical": {
+ "length": 40,
+ "rx_grid_freq_lmda": 1500,
+ "rx_max_freq_lmda": 2000,
+ "rx_min_freq_lmda": 1000,
+ "supported": 1,
+ "tx_grid_freq_lmda": 1500,
+ "tx_max_freq_lmda": 2000,
+ "tx_min_freq_lmda": 1000,
+ "tx_pwr_max": 2000,
+ "tx_pwr_min": 1000,
+ "type": 1
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "state": 4
+ }
+ },
+ {
+ "OFPPort": {
+ "config": 0,
+ "hw_addr": "f2:0b:a4:7d:f8:ea",
+ "length": 72,
+ "name": "Port6",
+ "port_no": 6,
+ "properties": [
+ {
+ "OFPPortDescPropEthernet": {
+ "advertised": 10240,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "length": 32,
+ "max_speed": 5000,
+ "peer": 10248,
+ "supported": 10248,
+ "type": 0
+ }
+ }
+ ],
+ "state": 4
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 13
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-53-ofp_table_features_request.packet.json b/tests/unit/ofproto/json/of14/5-53-ofp_table_features_request.packet.json
new file mode 100644
index 00000000..2a1a4308
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-53-ofp_table_features_request.packet.json
@@ -0,0 +1,15945 @@
+{
+ "OFPTableFeaturesStatsRequest": {
+ "body": [
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1168,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x00",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 258,
+ "table_ids": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65534
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65534
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65534
+ }
+ }
+ ],
+ "table_id": 0
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1112,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x01",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 257,
+ "table_ids": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 1
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x02",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 256,
+ "table_ids": [
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 2
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x03",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 255,
+ "table_ids": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 3
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x04",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 254,
+ "table_ids": [
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 4
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x05",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 253,
+ "table_ids": [
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 5
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x06",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 252,
+ "table_ids": [
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 6
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x07",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 251,
+ "table_ids": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 7
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x08",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 250,
+ "table_ids": [
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 8
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x09",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 249,
+ "table_ids": [
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 9
+ }
+ }
+ ],
+ "flags": 1,
+ "type": 12
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-54-ofp_table_features_reply.packet.json b/tests/unit/ofproto/json/of14/5-54-ofp_table_features_reply.packet.json
new file mode 100644
index 00000000..ea056e8f
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-54-ofp_table_features_reply.packet.json
@@ -0,0 +1,15945 @@
+{
+ "OFPTableFeaturesStatsReply": {
+ "body": [
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1168,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "\u79c1\u306e\u30c6\u30fc\u30d6\u30eb",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 258,
+ "table_ids": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65534
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65534
+ }
+ },
+ {
+ "OFPTableFeaturePropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65534
+ }
+ }
+ ],
+ "table_id": 0
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1112,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x01",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 257,
+ "table_ids": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 1
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x02",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 256,
+ "table_ids": [
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 2
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x03",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 255,
+ "table_ids": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 3
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x04",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 254,
+ "table_ids": [
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 4
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x05",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 253,
+ "table_ids": [
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 5
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x06",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 252,
+ "table_ids": [
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 6
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x07",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 251,
+ "table_ids": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 7
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x08",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 250,
+ "table_ids": [
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 8
+ }
+ },
+ {
+ "OFPTableFeaturesStats": {
+ "config": 0,
+ "length": 1104,
+ "max_entries": 16777216,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "Flow Table 0x09",
+ "properties": [
+ {
+ "OFPTableFeaturePropInstructions": {
+ "instruction_ids": [
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 2
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 5
+ }
+ },
+ {
+ "OFPInstructionId": {
+ "len": 4,
+ "type": 6
+ }
+ }
+ ],
+ "length": 28,
+ "type": 0
+ }
+ },
+ {
+ "OFPTableFeaturePropNextTables": {
+ "length": 249,
+ "table_ids": [
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 113,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 162,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254
+ ],
+ "type": 2
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 4
+ }
+ },
+ {
+ "OFPTableFeaturePropActions": {
+ "action_ids": [
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 0
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionId": {
+ "len": 4,
+ "type": 25
+ }
+ }
+ ],
+ "length": 68,
+ "type": 6
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 8
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 10
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 12
+ }
+ },
+ {
+ "OFPTableFeaturePropOxm": {
+ "length": 152,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "in_port"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "metadata"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "eth_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_vid"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "vlan_pcp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_dscp"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_ecn"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ip_proto"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv4_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "tcp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "udp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "sctp_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv4_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_op"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_spa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tpa"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_sha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "arp_tha"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_dst"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_flabel"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_type"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "icmpv6_code"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_target"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_sll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "ipv6_nd_tll"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_label"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_tc"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "mpls_bos"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": 0,
+ "length": 0,
+ "type": "pbb_isid"
+ }
+ }
+ ],
+ "type": 14
+ }
+ }
+ ],
+ "table_id": 9
+ }
+ }
+ ],
+ "flags": 1,
+ "type": 12
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-55-ofp_group_stats_request.packet.json b/tests/unit/ofproto/json/of14/5-55-ofp_group_stats_request.packet.json
new file mode 100644
index 00000000..b200a81c
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-55-ofp_group_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPGroupStatsRequest": {
+ "flags": 0,
+ "group_id": 4294967292,
+ "type": 6
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-56-ofp_group_stats_reply.packet.json b/tests/unit/ofproto/json/of14/5-56-ofp_group_stats_reply.packet.json
new file mode 100644
index 00000000..cb979e54
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-56-ofp_group_stats_reply.packet.json
@@ -0,0 +1,27 @@
+{
+ "OFPGroupStatsReply": {
+ "body": [
+ {
+ "OFPGroupStats": {
+ "bucket_stats": [
+ {
+ "OFPBucketCounter": {
+ "byte_count": 2345,
+ "packet_count": 234
+ }
+ }
+ ],
+ "byte_count": 12345,
+ "duration_nsec": 609036000,
+ "duration_sec": 9,
+ "group_id": 1,
+ "length": 56,
+ "packet_count": 123,
+ "ref_count": 2
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 6
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-57-ofp_packet_in.packet.json b/tests/unit/ofproto/json/of14/5-57-ofp_packet_in.packet.json
new file mode 100644
index 00000000..d326b907
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-57-ofp_packet_in.packet.json
@@ -0,0 +1,298 @@
+{
+ "OFPPacketIn": {
+ "buffer_id": 4026531840,
+ "cookie": 283686884868096,
+ "data": "",
+ "match": {
+ "OFPMatch": {
+ "length": 329,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 84281096
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "in_phy_port",
+ "mask": null,
+ "value": 16909060
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "metadata",
+ "mask": null,
+ "value": 283686952306183
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "ff:ff:ff:ff:ff:ff"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 999
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_dscp",
+ "mask": null,
+ "value": 9
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_ecn",
+ "mask": null,
+ "value": 3
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_proto",
+ "mask": null,
+ "value": 99
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_src",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_src",
+ "mask": null,
+ "value": 8080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_dst",
+ "mask": null,
+ "value": 18080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_src",
+ "mask": null,
+ "value": 28080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_dst",
+ "mask": null,
+ "value": 55936
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_src",
+ "mask": null,
+ "value": 48080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_dst",
+ "mask": null,
+ "value": 59328
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_type",
+ "mask": null,
+ "value": 100
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_code",
+ "mask": null,
+ "value": 101
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_op",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_spa",
+ "mask": null,
+ "value": "10.0.0.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tpa",
+ "mask": null,
+ "value": "10.0.0.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_sha",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tha",
+ "mask": null,
+ "value": "00:00:00:00:00:00"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_src",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe48:28a5"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_dst",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe05:b7dc"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_flabel",
+ "mask": null,
+ "value": 541473
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_type",
+ "mask": null,
+ "value": 200
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_code",
+ "mask": null,
+ "value": 201
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_target",
+ "mask": null,
+ "value": "fe80::a60:6eff:fe7f:74e7"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_sll",
+ "mask": null,
+ "value": "00:00:00:00:02:9a"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_tll",
+ "mask": null,
+ "value": "00:00:00:00:02:2b"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_label",
+ "mask": null,
+ "value": 624485
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_tc",
+ "mask": null,
+ "value": 5
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_bos",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pbb_isid",
+ "mask": null,
+ "value": 11259375
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 651061555542690057
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_exthdr",
+ "mask": null,
+ "value": 500
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pbb_uca",
+ "mask": null,
+ "value": 1
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "reason": 0,
+ "table_id": 200,
+ "total_len": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-58-ofp_flow_mod.packet.json b/tests/unit/ofproto/json/of14/5-58-ofp_flow_mod.packet.json
new file mode 100644
index 00000000..7095f751
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-58-ofp_flow_mod.packet.json
@@ -0,0 +1,305 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [],
+ "match": {
+ "OFPMatch": {
+ "length": 329,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 84281096
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "in_phy_port",
+ "mask": null,
+ "value": 16909060
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "metadata",
+ "mask": null,
+ "value": 283686952306183
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "ff:ff:ff:ff:ff:ff"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 999
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_dscp",
+ "mask": null,
+ "value": 9
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_ecn",
+ "mask": null,
+ "value": 3
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ip_proto",
+ "mask": null,
+ "value": 99
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_src",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "1.2.3.4"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_src",
+ "mask": null,
+ "value": 8080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tcp_dst",
+ "mask": null,
+ "value": 18080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_src",
+ "mask": null,
+ "value": 28080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "udp_dst",
+ "mask": null,
+ "value": 55936
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_src",
+ "mask": null,
+ "value": 48080
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "sctp_dst",
+ "mask": null,
+ "value": 59328
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_type",
+ "mask": null,
+ "value": 100
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv4_code",
+ "mask": null,
+ "value": 101
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_op",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_spa",
+ "mask": null,
+ "value": "10.0.0.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tpa",
+ "mask": null,
+ "value": "10.0.0.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_sha",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "arp_tha",
+ "mask": null,
+ "value": "00:00:00:00:00:00"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_src",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe48:28a5"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_dst",
+ "mask": null,
+ "value": "fe80::f00b:a4ff:fe05:b7dc"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_flabel",
+ "mask": null,
+ "value": 541473
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_type",
+ "mask": null,
+ "value": 200
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "icmpv6_code",
+ "mask": null,
+ "value": 201
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_target",
+ "mask": null,
+ "value": "fe80::a60:6eff:fe7f:74e7"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_sll",
+ "mask": null,
+ "value": "00:00:00:00:02:9a"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_nd_tll",
+ "mask": null,
+ "value": "00:00:00:00:02:2b"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_label",
+ "mask": null,
+ "value": 624485
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_tc",
+ "mask": null,
+ "value": 5
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "mpls_bos",
+ "mask": null,
+ "value": 1
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pbb_isid",
+ "mask": null,
+ "value": 11259375
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 651061555542690057
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv6_exthdr",
+ "mask": null,
+ "value": 500
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "pbb_uca",
+ "mask": null,
+ "value": 1
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-59-ofp_experimenter_request.packet.json b/tests/unit/ofproto/json/of14/5-59-ofp_experimenter_request.packet.json
new file mode 100644
index 00000000..93af3039
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-59-ofp_experimenter_request.packet.json
@@ -0,0 +1,9 @@
+{
+ "OFPExperimenterStatsRequest": {
+ "data": "aG9nZWhvZ2U=",
+ "exp_type": 3405678728,
+ "experimenter": 3735928495,
+ "flags": 0,
+ "type": 65535
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-6-ofp_features_reply.packet.json b/tests/unit/ofproto/json/of14/5-6-ofp_features_reply.packet.json
new file mode 100644
index 00000000..12e8744a
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-6-ofp_features_reply.packet.json
@@ -0,0 +1,9 @@
+{
+ "OFPSwitchFeatures": {
+ "auxiliary_id": 99,
+ "capabilities": 79,
+ "datapath_id": 9210263729383,
+ "n_buffers": 0,
+ "n_tables": 255
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-60-ofp_experimenter_reply.packet.json b/tests/unit/ofproto/json/of14/5-60-ofp_experimenter_reply.packet.json
new file mode 100644
index 00000000..1eb06b84
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-60-ofp_experimenter_reply.packet.json
@@ -0,0 +1,13 @@
+{
+ "OFPExperimenterStatsReply": {
+ "body": {
+ "OFPExperimenterMultipart": {
+ "data": "dGVzdGRhdGE5OTk5OTk5OQ==",
+ "exp_type": 3405674359,
+ "experimenter": 3735928495
+ }
+ },
+ "flags": 0,
+ "type": 65535
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-61-ofp_table_desc_request.packet.json b/tests/unit/ofproto/json/of14/5-61-ofp_table_desc_request.packet.json
new file mode 100644
index 00000000..f5a4cde0
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-61-ofp_table_desc_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPTableDescStatsRequest": {
+ "flags": 0,
+ "type": 14
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-62-ofp_table_desc_reply.packet.json b/tests/unit/ofproto/json/of14/5-62-ofp_table_desc_reply.packet.json
new file mode 100644
index 00000000..1f3d7142
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-62-ofp_table_desc_reply.packet.json
@@ -0,0 +1,83 @@
+{
+ "OFPTableDescStatsReply": {
+ "body": [
+ {
+ "OFPTableDesc": {
+ "config": 0,
+ "length": 24,
+ "properties": [
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ }
+ ],
+ "table_id": 7
+ }
+ },
+ {
+ "OFPTableDesc": {
+ "config": 0,
+ "length": 80,
+ "properties": [
+ {
+ "OFPTableModPropEviction": {
+ "flags": 0,
+ "length": 8,
+ "type": 2
+ }
+ },
+ {
+ "OFPTableModPropVacancy": {
+ "length": 8,
+ "type": 3,
+ "vacancy": 0,
+ "vacancy_down": 0,
+ "vacancy_up": 0
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "table_id": 8
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 14
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-63-ofp_queue_desc_request.packet.json b/tests/unit/ofproto/json/of14/5-63-ofp_queue_desc_request.packet.json
new file mode 100644
index 00000000..d58a2b05
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-63-ofp_queue_desc_request.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPQueueDescStatsRequest": {
+ "flags": 0,
+ "port_no": 7,
+ "queue_id": 4294967295,
+ "type": 15
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-64-ofp_queue_desc_reply.packet.json b/tests/unit/ofproto/json/of14/5-64-ofp_queue_desc_reply.packet.json
new file mode 100644
index 00000000..26c8f7d5
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-64-ofp_queue_desc_reply.packet.json
@@ -0,0 +1,81 @@
+{
+ "OFPQueueDescStatsReply": {
+ "body": [
+ {
+ "OFPQueueDesc": {
+ "len": 32,
+ "port_no": 7,
+ "properties": [
+ {
+ "OFPQueueDescPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ }
+ ],
+ "queue_id": 0
+ }
+ },
+ {
+ "OFPQueueDesc": {
+ "len": 88,
+ "port_no": 8,
+ "properties": [
+ {
+ "OFPQueueDescPropMinRate": {
+ "length": 8,
+ "rate": 300,
+ "type": 1
+ }
+ },
+ {
+ "OFPQueueDescPropMaxRate": {
+ "length": 8,
+ "rate": 900,
+ "type": 2
+ }
+ },
+ {
+ "OFPQueueDescPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPQueueDescPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPQueueDescPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "queue_id": 1
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 15
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-65-ofp_role_status.packet.json b/tests/unit/ofproto/json/of14/5-65-ofp_role_status.packet.json
new file mode 100644
index 00000000..08e46df3
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-65-ofp_role_status.packet.json
@@ -0,0 +1,41 @@
+{
+ "OFPRoleStatus": {
+ "generation_id": 7,
+ "properties": [
+ {
+ "OFPRolePropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPRolePropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPRolePropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "reason": 0,
+ "role": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-66-ofp_flow_monitor_request.packet.json b/tests/unit/ofproto/json/of14/5-66-ofp_flow_monitor_request.packet.json
new file mode 100644
index 00000000..aed7ddaa
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-66-ofp_flow_monitor_request.packet.json
@@ -0,0 +1,27 @@
+{
+ "OFPFlowMonitorRequest": {
+ "command": 0,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "monitor_flags": 15,
+ "monitor_id": 100000000,
+ "out_group": 4294967295,
+ "out_port": 22,
+ "table_id": 33,
+ "type": 16
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-67-ofp_flow_monitor_reply.packet.json b/tests/unit/ofproto/json/of14/5-67-ofp_flow_monitor_reply.packet.json
new file mode 100644
index 00000000..8c028877
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-67-ofp_flow_monitor_reply.packet.json
@@ -0,0 +1,66 @@
+{
+ "OFPFlowMonitorReply": {
+ "body": [
+ {
+ "OFPFlowUpdateFull": {
+ "cookie": 0,
+ "event": 0,
+ "hard_timeout": 700,
+ "idle_timeout": 600,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 0,
+ "port": 4294967290,
+ "type": 0
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "length": 64,
+ "match": {
+ "OFPMatch": {
+ "length": 10,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "priority": 3,
+ "reason": 0,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPFlowUpdateAbbrev": {
+ "event": 4,
+ "length": 8,
+ "xid": 1234
+ }
+ },
+ {
+ "OFPFlowUpdatePaused": {
+ "event": 5,
+ "length": 8
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 16
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-68-ofp_table_status.packet.json b/tests/unit/ofproto/json/of14/5-68-ofp_table_status.packet.json
new file mode 100644
index 00000000..fde5fb77
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-68-ofp_table_status.packet.json
@@ -0,0 +1,62 @@
+{
+ "OFPTableStatus": {
+ "reason": 3,
+ "table": {
+ "OFPTableDesc": {
+ "config": 0,
+ "length": 80,
+ "properties": [
+ {
+ "OFPTableModPropEviction": {
+ "flags": 0,
+ "length": 8,
+ "type": 2
+ }
+ },
+ {
+ "OFPTableModPropVacancy": {
+ "length": 8,
+ "type": 3,
+ "vacancy": 0,
+ "vacancy_down": 0,
+ "vacancy_up": 0
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "table_id": 8
+ }
+ }
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-69-ofp_bundle_ctrl_msg.packet.json b/tests/unit/ofproto/json/of14/5-69-ofp_bundle_ctrl_msg.packet.json
new file mode 100644
index 00000000..3e996eb5
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-69-ofp_bundle_ctrl_msg.packet.json
@@ -0,0 +1,41 @@
+{
+ "OFPBundleCtrlMsg": {
+ "bundle_id": 1234,
+ "flags": 1,
+ "properties": [
+ {
+ "OFPBundlePropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPBundlePropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPBundlePropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "type": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-7-ofp_set_config.packet.json b/tests/unit/ofproto/json/of14/5-7-ofp_set_config.packet.json
new file mode 100644
index 00000000..cd5398b7
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-7-ofp_set_config.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPSetConfig": {
+ "flags": 0,
+ "miss_send_len": 128
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-70-ofp_bundle_add_msg.packet.json b/tests/unit/ofproto/json/of14/5-70-ofp_bundle_add_msg.packet.json
new file mode 100644
index 00000000..53e9f7ea
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-70-ofp_bundle_add_msg.packet.json
@@ -0,0 +1,45 @@
+{
+ "OFPBundleAddMsg": {
+ "bundle_id": 1234,
+ "flags": 1,
+ "message": {
+ "OFPEchoRequest": {
+ "data": null
+ }
+ },
+ "properties": [
+ {
+ "OFPBundlePropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPBundlePropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPBundlePropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-71-ofp_requestforward.packet.json b/tests/unit/ofproto/json/of14/5-71-ofp_requestforward.packet.json
new file mode 100644
index 00000000..e2def4fc
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-71-ofp_requestforward.packet.json
@@ -0,0 +1,31 @@
+{
+ "OFPRequestForward": {
+ "request": {
+ "OFPGroupMod": {
+ "buckets": [
+ {
+ "OFPBucket": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 2,
+ "type": 0
+ }
+ }
+ ],
+ "len": 32,
+ "watch_group": 1,
+ "watch_port": 1,
+ "weight": 1
+ }
+ }
+ ],
+ "command": 0,
+ "group_id": 1,
+ "type": 0
+ }
+ }
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/5-8-ofp_get_config_request.packet.json b/tests/unit/ofproto/json/of14/5-8-ofp_get_config_request.packet.json
new file mode 100644
index 00000000..06fe51f4
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-8-ofp_get_config_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPGetConfigRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of14/5-9-ofp_get_config_reply.packet.json b/tests/unit/ofproto/json/of14/5-9-ofp_get_config_reply.packet.json
new file mode 100644
index 00000000..62b37b4d
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/5-9-ofp_get_config_reply.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGetConfigReply": {
+ "flags": 0,
+ "miss_send_len": 128
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/lib-ofctl-ofp_table_features_request.packet.json b/tests/unit/ofproto/json/of14/lib-ofctl-ofp_table_features_request.packet.json
new file mode 100644
index 00000000..6501de15
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/lib-ofctl-ofp_table_features_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPTableFeaturesStatsRequest": {
+ "body": [],
+ "flags": 0,
+ "type": 12
+ }
+}
diff --git a/tests/unit/ofproto/json/of14/libofproto-OFP14-ofp_packet_out_packet_library.packet.json b/tests/unit/ofproto/json/of14/libofproto-OFP14-ofp_packet_out_packet_library.packet.json
new file mode 100644
index 00000000..b859650d
--- /dev/null
+++ b/tests/unit/ofproto/json/of14/libofproto-OFP14-ofp_packet_out_packet_library.packet.json
@@ -0,0 +1,61 @@
+{
+ "OFPPacketOut": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 4294967292,
+ "type": 0
+ }
+ }
+ ],
+ "actions_len": 16,
+ "buffer_id": 4294967295,
+ "data": {
+ "Packet": {
+ "protocols": [
+ {
+ "ethernet": {
+ "dst": "f2:0b:a4:d0:3f:70",
+ "ethertype": 2048,
+ "src": "f2:0b:a4:7d:f8:ea"
+ }
+ },
+ {
+ "ipv4": {
+ "csum": 44939,
+ "dst": "10.0.0.2",
+ "flags": 0,
+ "header_length": 5,
+ "identification": 63514,
+ "offset": 0,
+ "option": null,
+ "proto": 1,
+ "src": "10.0.0.1",
+ "tos": 0,
+ "total_length": 84,
+ "ttl": 255,
+ "version": 4
+ }
+ },
+ {
+ "icmp": {
+ "code": 0,
+ "csum": 520,
+ "data": {
+ "echo": {
+ "data": "MdYCAAAAAACrjS0xAAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vAAAAAAAAAAA=",
+ "id": 63328,
+ "seq": 0
+ }
+ },
+ "type": 8
+ }
+ }
+ ]
+ }
+ },
+ "in_port": 4294967293
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_desc_reply.packet.json b/tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_desc_reply.packet.json
new file mode 100644
index 00000000..9626ceea
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_desc_reply.packet.json
@@ -0,0 +1,105 @@
+{
+ "OFPFlowDescStatsReply": {
+ "body": [
+ {
+ "OFPFlowDesc": {
+ "cookie": 1234605616436508552,
+ "flags": 1,
+ "hard_timeout": 255,
+ "idle_timeout": 255,
+ "importance": 43690,
+ "instructions": [
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 2,
+ "type": 1
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionMeter": {
+ "len": 8,
+ "meter_id": 2,
+ "type": 29
+ }
+ }
+ ],
+ "len": 8,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionCopyField": {
+ "type": 28,
+ "len": 20,
+ "n_bits": 32,
+ "src_offset": 1,
+ "dst_offset": 2,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": false,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": false,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "len": 28,
+ "type": 4
+ }
+ }
+ ],
+ "length": 84,
+ "match": {
+ "OFPMatch": {
+ "length": 12,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 1
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "priority": 5,
+ "stats": {
+ "OFPStats": {
+ "length": 12,
+ "oxs_fields": [
+ {
+ "OXSTlv": {
+ "field": "flow_count",
+ "value": 1
+ }
+ }
+ ]
+ }
+ },
+ "table_id": 1
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_desc_request.packet.json b/tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_desc_request.packet.json
new file mode 100644
index 00000000..62e46c65
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_desc_request.packet.json
@@ -0,0 +1,26 @@
+{
+ "OFPFlowDescStatsRequest": {
+ "cookie": 1234605616436508552,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 12,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 1
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 1,
+ "type": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_mod.packet.json b/tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_mod.packet.json
new file mode 100644
index 00000000..7fc12ed3
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/lib-ofctl-OFP15-flow_mod.packet.json
@@ -0,0 +1,234 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 258
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionCopyTtlOut": {
+ "len": 8,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionPopPbb": {
+ "len": 8,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionPushPbb": {
+ "ethertype": 4660,
+ "len": 8,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionPopMpls": {
+ "ethertype": 39030,
+ "len": 8,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionPushMpls": {
+ "ethertype": 34887,
+ "len": 8,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionPushVlan": {
+ "ethertype": 33024,
+ "len": 8,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionDecMplsTtl": {
+ "len": 8,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionSetMplsTtl": {
+ "len": 8,
+ "mpls_ttl": 10,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionDecNwTtl": {
+ "len": 8,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionSetNwTtl": {
+ "len": 8,
+ "nw_ttl": 10,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionExperimenterUnknown": {
+ "data": "AAECAwQFBgc=",
+ "experimenter": 101,
+ "len": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPActionSetQueue": {
+ "len": 8,
+ "queue_id": 3,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionMeter": {
+ "len": 8,
+ "meter_id": 2,
+ "type": 29
+ }
+ },
+ {
+ "OFPActionGroup": {
+ "group_id": 99,
+ "len": 8,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 6,
+ "type": 0
+ }
+ }
+ ],
+ "len": 176,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "01:02:03:04:05:06"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "pbb_uca",
+ "mask": null,
+ "value": 1
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionCopyField": {
+ "type": 28,
+ "len": 20,
+ "n_bits": 32,
+ "src_offset": 1,
+ "dst_offset": 2,
+ "oxm_ids": [
+ {
+ "OFPOxmId": {
+ "hasmask": false,
+ "length": 0,
+ "type": "eth_src"
+ }
+ },
+ {
+ "OFPOxmId": {
+ "hasmask": false,
+ "length": 0,
+ "type": "eth_dst"
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "len": 60,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/lib-ofctl-ofp_queue_stats_request.packet.json b/tests/unit/ofproto/json/of15/lib-ofctl-ofp_queue_stats_request.packet.json
new file mode 100644
index 00000000..41d30f70
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/lib-ofctl-ofp_queue_stats_request.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPQueueStatsRequest": {
+ "flags": 0,
+ "port_no": 4294967295,
+ "queue_id": 4294967295,
+ "type": 5
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/lib-ofctl-ofp_table_features_request.packet.json b/tests/unit/ofproto/json/of15/lib-ofctl-ofp_table_features_request.packet.json
new file mode 100644
index 00000000..6501de15
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/lib-ofctl-ofp_table_features_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPTableFeaturesStatsRequest": {
+ "body": [],
+ "flags": 0,
+ "type": 12
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-aggregate_stats_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-aggregate_stats_reply.packet.json
new file mode 100644
index 00000000..07cb6c2f
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-aggregate_stats_reply.packet.json
@@ -0,0 +1,24 @@
+{
+ "OFPAggregateStatsReply": {
+ "body": {
+ "OFPAggregateStats": {
+ "length": 16,
+ "stats": {
+ "OFPStats": {
+ "length": 12,
+ "oxs_fields": [
+ {
+ "OXSTlv": {
+ "field": "flow_count",
+ "value": 1
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "flags": 0,
+ "type": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-aggregate_stats_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-aggregate_stats_request.packet.json
new file mode 100644
index 00000000..248131fd
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-aggregate_stats_request.packet.json
@@ -0,0 +1,18 @@
+{
+ "OFPAggregateStatsRequest": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 255,
+ "type": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-barrier_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-barrier_reply.packet.json
new file mode 100644
index 00000000..11f8cfcc
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-barrier_reply.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPBarrierReply": {}
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-barrier_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-barrier_request.packet.json
new file mode 100644
index 00000000..2aae9ec3
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-barrier_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPBarrierRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_add.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_add.packet.json
new file mode 100644
index 00000000..5a1ddb19
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_add.packet.json
@@ -0,0 +1,200 @@
+{
+ "OFPBundleAddMsg": {
+ "bundle_id": 99999999,
+ "flags": 1,
+ "message": {
+ "OFPFlowMod": {
+ "buffer_id": 0,
+ "command": 0,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 39032,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.9"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "NXActionLearn": {
+ "cookie": 0,
+ "experimenter": 8992,
+ "fin_hard_timeout": 0,
+ "fin_idle_timeout": 0,
+ "flags": 0,
+ "hard_timeout": 300,
+ "idle_timeout": 0,
+ "len": 96,
+ "priority": 1,
+ "specs": [
+ {
+ "NXFlowSpecMatch": {
+ "dst": [
+ "vlan_vid",
+ 0
+ ],
+ "n_bits": 12,
+ "src": [
+ "vlan_vid",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecMatch": {
+ "dst": [
+ "eth_dst_nxm",
+ 0
+ ],
+ "n_bits": 48,
+ "src": [
+ "eth_src_nxm",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecLoad": {
+ "dst": [
+ "vlan_vid",
+ 0
+ ],
+ "n_bits": 12,
+ "src": 0
+ }
+ },
+ {
+ "NXFlowSpecLoad": {
+ "dst": [
+ "tunnel_id_nxm",
+ 0
+ ],
+ "n_bits": 64,
+ "src": [
+ "tunnel_id_nxm",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecOutput": {
+ "dst": "",
+ "n_bits": 32,
+ "src": [
+ "in_port",
+ 0
+ ]
+ }
+ }
+ ],
+ "subtype": 16,
+ "table_id": 99,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 128,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 100,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 70,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "aa:bb:cc:99:88:77"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5095
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 50000
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "192.168.2.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 0,
+ "out_port": 0,
+ "priority": 0,
+ "table_id": 2
+ }
+ },
+ "properties": []
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_ctrl.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_ctrl.packet.json
new file mode 100644
index 00000000..d7e858fd
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_ctrl.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPBundleCtrlMsg": {
+ "bundle_id": 99999999,
+ "flags": 1,
+ "properties": [],
+ "type": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_features_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_features_reply.packet.json
new file mode 100644
index 00000000..943d7857
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_features_reply.packet.json
@@ -0,0 +1,43 @@
+{
+ "OFPBundleFeaturesStatsReply": {
+ "body": {
+ "OFPBundleFeaturesStats": {
+ "capabilities": 7,
+ "properties": [
+ {
+ "OFPBundleFeaturesPropTime": {
+ "length": 72,
+ "sched_accuracy": {
+ "OFPTime": {
+ "nanoseconds": 1717986918,
+ "seconds": 6148914691236517205
+ }
+ },
+ "sched_max_future": {
+ "OFPTime": {
+ "nanoseconds": 2290649224,
+ "seconds": 8608480567731124087
+ }
+ },
+ "sched_max_past": {
+ "OFPTime": {
+ "nanoseconds": 2863311530,
+ "seconds": 11068046444225730969
+ }
+ },
+ "timestamp": {
+ "OFPTime": {
+ "nanoseconds": 3435973836,
+ "seconds": 13527612320720337851
+ }
+ },
+ "type": 1
+ }
+ }
+ ]
+ }
+ },
+ "flags": 0,
+ "type": 19
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_features_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_features_request.packet.json
new file mode 100644
index 00000000..325181c1
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-bundle_features_request.packet.json
@@ -0,0 +1,39 @@
+{
+ "OFPBundleFeaturesStatsRequest": {
+ "feature_request_flags": 3,
+ "flags": 0,
+ "properties": [
+ {
+ "OFPBundleFeaturesPropTime": {
+ "length": 72,
+ "sched_accuracy": {
+ "OFPTime": {
+ "nanoseconds": 1717986918,
+ "seconds": 6148914691236517205
+ }
+ },
+ "sched_max_future": {
+ "OFPTime": {
+ "nanoseconds": 2290649224,
+ "seconds": 8608480567731124087
+ }
+ },
+ "sched_max_past": {
+ "OFPTime": {
+ "nanoseconds": 2863311530,
+ "seconds": 11068046444225730969
+ }
+ },
+ "timestamp": {
+ "OFPTime": {
+ "nanoseconds": 3435973836,
+ "seconds": 13527612320720337851
+ }
+ },
+ "type": 1
+ }
+ }
+ ],
+ "type": 19
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status.packet.json
new file mode 100644
index 00000000..d9a74bfe
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status.packet.json
@@ -0,0 +1,22 @@
+{
+ "OFPControllerStatus": {
+ "status": {
+ "OFPControllerStatusStats": {
+ "channel_status": 1,
+ "length": 48,
+ "properties": [
+ {
+ "OFPControllerStatusPropUri": {
+ "length": 26,
+ "type": 0,
+ "uri": "tls:192.168.34.23:6653"
+ }
+ }
+ ],
+ "reason": 1,
+ "role": 1,
+ "short_id": 65535
+ }
+ }
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status_reply.packet.json
new file mode 100644
index 00000000..002f0f1d
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status_reply.packet.json
@@ -0,0 +1,26 @@
+{
+ "OFPControllerStatusStatsReply": {
+ "body": [
+ {
+ "OFPControllerStatusStats": {
+ "channel_status": 1,
+ "length": 48,
+ "properties": [
+ {
+ "OFPControllerStatusPropUri": {
+ "length": 26,
+ "type": 0,
+ "uri": "tls:192.168.34.23:6653"
+ }
+ }
+ ],
+ "reason": 1,
+ "role": 1,
+ "short_id": 65535
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 18
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status_request.packet.json
new file mode 100644
index 00000000..d9a8ef8b
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-controller_status_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPControllerStatusStatsRequest": {
+ "flags": 0,
+ "type": 18
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-desc_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-desc_reply.packet.json
new file mode 100644
index 00000000..26e5dc2d
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-desc_reply.packet.json
@@ -0,0 +1,15 @@
+{
+ "OFPDescStatsReply": {
+ "body": {
+ "OFPDescStats": {
+ "dp_desc": "dp",
+ "hw_desc": "hw",
+ "mfr_desc": "mfr",
+ "serial_num": "serial",
+ "sw_desc": "sw"
+ }
+ },
+ "flags": 0,
+ "type": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-desc_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-desc_request.packet.json
new file mode 100644
index 00000000..5b23f8bc
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-desc_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPDescStatsRequest": {
+ "flags": 0,
+ "type": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-echo_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-echo_reply.packet.json
new file mode 100644
index 00000000..011bd6de
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-echo_reply.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPEchoReply": {
+ "data": ""
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-echo_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-echo_request.packet.json
new file mode 100644
index 00000000..501a8479
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-echo_request.packet.json
@@ -0,0 +1,5 @@
+{
+ "OFPEchoRequest": {
+ "data": ""
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-error_msg.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-error_msg.packet.json
new file mode 100644
index 00000000..b76f05c7
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-error_msg.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPErrorMsg": {
+ "code": 6,
+ "data": "Bg4ACAAAAAA=",
+ "type": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-error_msg_experimenter.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-error_msg_experimenter.packet.json
new file mode 100644
index 00000000..37bfb6a9
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-error_msg_experimenter.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPErrorExperimenterMsg": {
+ "data": "amlra2VuIGRhdGE=",
+ "exp_type": 60000,
+ "experimenter": 999999,
+ "type": 65535
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter.packet.json
new file mode 100644
index 00000000..0e749179
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPExperimenter": {
+ "data": "bmF6bw==",
+ "exp_type": 123456789,
+ "experimenter": 98765432
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter_reply.packet.json
new file mode 100644
index 00000000..1eb06b84
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter_reply.packet.json
@@ -0,0 +1,13 @@
+{
+ "OFPExperimenterStatsReply": {
+ "body": {
+ "OFPExperimenterMultipart": {
+ "data": "dGVzdGRhdGE5OTk5OTk5OQ==",
+ "exp_type": 3405674359,
+ "experimenter": 3735928495
+ }
+ },
+ "flags": 0,
+ "type": 65535
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter_request.packet.json
new file mode 100644
index 00000000..93af3039
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-experimenter_request.packet.json
@@ -0,0 +1,9 @@
+{
+ "OFPExperimenterStatsRequest": {
+ "data": "aG9nZWhvZ2U=",
+ "exp_type": 3405678728,
+ "experimenter": 3735928495,
+ "flags": 0,
+ "type": 65535
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-features_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-features_reply.packet.json
new file mode 100644
index 00000000..3d828093
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-features_reply.packet.json
@@ -0,0 +1,9 @@
+{
+ "OFPSwitchFeatures": {
+ "auxiliary_id": 0,
+ "capabilities": 79,
+ "datapath_id": 1,
+ "n_buffers": 255,
+ "n_tables": 255
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-features_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-features_request.packet.json
new file mode 100644
index 00000000..8f48ad5a
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-features_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPFeaturesRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_desc_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_desc_reply.packet.json
new file mode 100644
index 00000000..3caab6f9
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_desc_reply.packet.json
@@ -0,0 +1,57 @@
+{
+ "OFPFlowDescStatsReply": {
+ "body": [
+ {
+ "OFPFlowDesc": {
+ "cookie": 1234605616436508552,
+ "flags": 1,
+ "hard_timeout": 255,
+ "idle_timeout": 255,
+ "importance": 43690,
+ "instructions": [
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 2,
+ "type": 1
+ }
+ }
+ ],
+ "length": 64,
+ "match": {
+ "OFPMatch": {
+ "length": 12,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 1
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "priority": 5,
+ "stats": {
+ "OFPStats": {
+ "length": 12,
+ "oxs_fields": [
+ {
+ "OXSTlv": {
+ "field": "flow_count",
+ "value": 1
+ }
+ }
+ ]
+ }
+ },
+ "table_id": 1
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_desc_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_desc_request.packet.json
new file mode 100644
index 00000000..62e46c65
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_desc_request.packet.json
@@ -0,0 +1,26 @@
+{
+ "OFPFlowDescStatsRequest": {
+ "cookie": 1234605616436508552,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 12,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 1
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 1,
+ "type": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod.packet.json
new file mode 100644
index 00000000..ac6dce7e
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod.packet.json
@@ -0,0 +1,193 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 0,
+ "command": 0,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 39032,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.9"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "NXActionLearn": {
+ "cookie": 0,
+ "experimenter": 8992,
+ "fin_hard_timeout": 0,
+ "fin_idle_timeout": 0,
+ "flags": 0,
+ "hard_timeout": 300,
+ "idle_timeout": 0,
+ "len": 96,
+ "priority": 1,
+ "specs": [
+ {
+ "NXFlowSpecMatch": {
+ "dst": [
+ "vlan_vid",
+ 0
+ ],
+ "n_bits": 12,
+ "src": [
+ "vlan_vid",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecMatch": {
+ "dst": [
+ "eth_dst_nxm",
+ 0
+ ],
+ "n_bits": 48,
+ "src": [
+ "eth_src_nxm",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecLoad": {
+ "dst": [
+ "vlan_vid",
+ 0
+ ],
+ "n_bits": 12,
+ "src": 0
+ }
+ },
+ {
+ "NXFlowSpecLoad": {
+ "dst": [
+ "tunnel_id_nxm",
+ 0
+ ],
+ "n_bits": 64,
+ "src": [
+ "tunnel_id_nxm",
+ 0
+ ]
+ }
+ },
+ {
+ "NXFlowSpecOutput": {
+ "dst": "",
+ "n_bits": 32,
+ "src": [
+ "in_port",
+ 0
+ ]
+ }
+ }
+ ],
+ "subtype": 16,
+ "table_id": 99,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 128,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 100,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 70,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "aa:bb:cc:99:88:77"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5095
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 50000
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "192.168.2.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 0,
+ "out_port": 0,
+ "priority": 0,
+ "table_id": 2
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_conjunction.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_conjunction.packet.json
new file mode 100644
index 00000000..6ca74d51
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_conjunction.packet.json
@@ -0,0 +1,101 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 0,
+ "command": 0,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 39032,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "NXActionConjunction": {
+ "clause": 1,
+ "experimenter": 8992,
+ "id": 11259375,
+ "len": 16,
+ "n_clauses": 2,
+ "subtype": 34,
+ "type": 65535
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 70,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "aa:bb:cc:99:88:77"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2048
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 5095
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.1"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 50000
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "192.168.2.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 0,
+ "out_port": 0,
+ "priority": 0,
+ "table_id": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_match_conj.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_match_conj.packet.json
new file mode 100644
index 00000000..2d0b9ad4
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_match_conj.packet.json
@@ -0,0 +1,67 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 0,
+ "command": 0,
+ "cookie": 1311768467463790320,
+ "cookie_mask": 18446744073709551615,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 39032,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.9"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ }
+ ],
+ "len": 32,
+ "type": 4
+ }
+ },
+ {
+ "OFPInstructionGotoTable": {
+ "len": 8,
+ "table_id": 100,
+ "type": 1
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 12,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "conj_id",
+ "mask": null,
+ "value": 11259375
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 0,
+ "out_port": 0,
+ "priority": 0,
+ "table_id": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_no_nx.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_no_nx.packet.json
new file mode 100644
index 00000000..5f789d52
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_mod_no_nx.packet.json
@@ -0,0 +1,202 @@
+{
+ "OFPFlowMod": {
+ "buffer_id": 65535,
+ "command": 0,
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "hard_timeout": 0,
+ "idle_timeout": 0,
+ "importance": 0,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "vlan_vid",
+ "mask": null,
+ "value": 258
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionCopyTtlOut": {
+ "len": 8,
+ "type": 11
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionCopyTtlIn": {
+ "len": 8,
+ "type": 12
+ }
+ },
+ {
+ "OFPActionPopPbb": {
+ "len": 8,
+ "type": 27
+ }
+ },
+ {
+ "OFPActionPushPbb": {
+ "ethertype": 4660,
+ "len": 8,
+ "type": 26
+ }
+ },
+ {
+ "OFPActionPopMpls": {
+ "ethertype": 39030,
+ "len": 8,
+ "type": 20
+ }
+ },
+ {
+ "OFPActionPushMpls": {
+ "ethertype": 34887,
+ "len": 8,
+ "type": 19
+ }
+ },
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionPushVlan": {
+ "ethertype": 33024,
+ "len": 8,
+ "type": 17
+ }
+ },
+ {
+ "OFPActionDecMplsTtl": {
+ "len": 8,
+ "type": 16
+ }
+ },
+ {
+ "OFPActionSetMplsTtl": {
+ "len": 8,
+ "mpls_ttl": 10,
+ "type": 15
+ }
+ },
+ {
+ "OFPActionDecNwTtl": {
+ "len": 8,
+ "type": 24
+ }
+ },
+ {
+ "OFPActionSetNwTtl": {
+ "len": 8,
+ "nw_ttl": 10,
+ "type": 23
+ }
+ },
+ {
+ "OFPActionExperimenterUnknown": {
+ "data": "AAECAwQFBgc=",
+ "experimenter": 101,
+ "len": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPActionSetQueue": {
+ "len": 8,
+ "queue_id": 3,
+ "type": 21
+ }
+ },
+ {
+ "OFPActionGroup": {
+ "group_id": 99,
+ "len": 8,
+ "type": 22
+ }
+ },
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 6,
+ "type": 0
+ }
+ }
+ ],
+ "len": 176,
+ "type": 3
+ }
+ },
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "01:02:03:04:05:06"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "pbb_uca",
+ "mask": null,
+ "value": 1
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ }
+ ],
+ "len": 40,
+ "type": 4
+ }
+ }
+ ],
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "priority": 123,
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_monitor_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_monitor_reply.packet.json
new file mode 100644
index 00000000..8c028877
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_monitor_reply.packet.json
@@ -0,0 +1,66 @@
+{
+ "OFPFlowMonitorReply": {
+ "body": [
+ {
+ "OFPFlowUpdateFull": {
+ "cookie": 0,
+ "event": 0,
+ "hard_timeout": 700,
+ "idle_timeout": 600,
+ "instructions": [
+ {
+ "OFPInstructionActions": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 0,
+ "port": 4294967290,
+ "type": 0
+ }
+ }
+ ],
+ "len": 24,
+ "type": 4
+ }
+ }
+ ],
+ "length": 64,
+ "match": {
+ "OFPMatch": {
+ "length": 10,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_type",
+ "mask": null,
+ "value": 2054
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "priority": 3,
+ "reason": 0,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPFlowUpdateAbbrev": {
+ "event": 4,
+ "length": 8,
+ "xid": 1234
+ }
+ },
+ {
+ "OFPFlowUpdatePaused": {
+ "event": 5,
+ "length": 8
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 16
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_monitor_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_monitor_request.packet.json
new file mode 100644
index 00000000..aed7ddaa
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_monitor_request.packet.json
@@ -0,0 +1,27 @@
+{
+ "OFPFlowMonitorRequest": {
+ "command": 0,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 14,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "eth_dst",
+ "mask": null,
+ "value": "f2:0b:a4:7d:f8:ea"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "monitor_flags": 15,
+ "monitor_id": 100000000,
+ "out_group": 4294967295,
+ "out_port": 22,
+ "table_id": 33,
+ "type": 16
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_removed.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_removed.packet.json
new file mode 100644
index 00000000..daf05248
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_removed.packet.json
@@ -0,0 +1,38 @@
+{
+ "OFPFlowRemoved": {
+ "cookie": 1234605616436508552,
+ "hard_timeout": 255,
+ "idle_timeout": 255,
+ "match": {
+ "OFPMatch": {
+ "length": 12,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 1
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "priority": 1,
+ "reason": 0,
+ "stats": {
+ "OFPStats": {
+ "length": 12,
+ "oxs_fields": [
+ {
+ "OXSTlv": {
+ "field": "flow_count",
+ "value": 1
+ }
+ }
+ ]
+ }
+ },
+ "table_id": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_stats_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_stats_reply.packet.json
new file mode 100644
index 00000000..e2713569
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_stats_reply.packet.json
@@ -0,0 +1,44 @@
+{
+ "OFPFlowStatsReply": {
+ "body": [
+ {
+ "OFPFlowStats": {
+ "length": 40,
+ "match": {
+ "OFPMatch": {
+ "length": 12,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 1
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "priority": 1,
+ "reason": 0,
+ "stats": {
+ "OFPStats": {
+ "length": 12,
+ "oxs_fields": [
+ {
+ "OXSTlv": {
+ "field": "flow_count",
+ "value": 1
+ }
+ }
+ ]
+ }
+ },
+ "table_id": 1
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 17
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_stats_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_stats_request.packet.json
new file mode 100644
index 00000000..cc9de0a6
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-flow_stats_request.packet.json
@@ -0,0 +1,18 @@
+{
+ "OFPFlowStatsRequest": {
+ "cookie": 0,
+ "cookie_mask": 0,
+ "flags": 0,
+ "match": {
+ "OFPMatch": {
+ "length": 4,
+ "oxm_fields": [],
+ "type": 1
+ }
+ },
+ "out_group": 4294967295,
+ "out_port": 4294967295,
+ "table_id": 0,
+ "type": 17
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-get_async_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-get_async_reply.packet.json
new file mode 100644
index 00000000..82c9e794
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-get_async_reply.packet.json
@@ -0,0 +1,122 @@
+{
+ "OFPGetAsyncReply": {
+ "properties": [
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 0
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 1
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 2
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 3
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 4
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 5
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 6
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 7
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 24,
+ "type": 8
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 24,
+ "type": 9
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 10
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 11
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65534
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-get_async_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-get_async_request.packet.json
new file mode 100644
index 00000000..7daa5a0f
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-get_async_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPGetAsyncRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-get_config_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-get_config_reply.packet.json
new file mode 100644
index 00000000..62b37b4d
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-get_config_reply.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGetConfigReply": {
+ "flags": 0,
+ "miss_send_len": 128
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-get_config_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-get_config_request.packet.json
new file mode 100644
index 00000000..06fe51f4
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-get_config_request.packet.json
@@ -0,0 +1,3 @@
+{
+ "OFPGetConfigRequest": {}
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-group_desc_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_desc_reply.packet.json
new file mode 100644
index 00000000..03c136d7
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_desc_reply.packet.json
@@ -0,0 +1,45 @@
+{
+ "OFPGroupDescStatsReply": {
+ "body": [
+ {
+ "OFPGroupDescStats": {
+ "bucket_array_len": 32,
+ "buckets": [
+ {
+ "OFPBucket": {
+ "action_array_len": 16,
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65509,
+ "port": 1,
+ "type": 0
+ }
+ }
+ ],
+ "bucket_id": 65535,
+ "len": 32,
+ "properties": [
+ {
+ "OFPGroupBucketPropWeight": {
+ "length": 8,
+ "type": 0,
+ "weight": 65535
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "group_id": 1,
+ "length": 48,
+ "properties": [],
+ "type": 1
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 7
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-group_desc_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_desc_request.packet.json
new file mode 100644
index 00000000..1589ed61
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_desc_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPGroupDescStatsRequest": {
+ "flags": 0,
+ "group_id": 52651,
+ "type": 7
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-group_features_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_features_reply.packet.json
new file mode 100644
index 00000000..f059f994
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_features_reply.packet.json
@@ -0,0 +1,24 @@
+{
+ "OFPGroupFeaturesStatsReply": {
+ "body": {
+ "OFPGroupFeaturesStats": {
+ "actions": [
+ 67082241,
+ 67082241,
+ 67082241,
+ 67082241
+ ],
+ "capabilities": 5,
+ "max_groups": [
+ 16777216,
+ 16777216,
+ 16777216,
+ 16777216
+ ],
+ "types": 15
+ }
+ },
+ "flags": 0,
+ "type": 8
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-group_features_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_features_request.packet.json
new file mode 100644
index 00000000..edba5dc5
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_features_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPGroupFeaturesStatsRequest": {
+ "flags": 0,
+ "type": 8
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-group_mod.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_mod.packet.json
new file mode 100644
index 00000000..d168fefd
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_mod.packet.json
@@ -0,0 +1,63 @@
+{
+ "OFPGroupMod": {
+ "bucket_array_len": 56,
+ "buckets": [
+ {
+ "OFPBucket": {
+ "action_array_len": 24,
+ "actions": [
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.9"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ }
+ ],
+ "bucket_id": 305419896,
+ "len": 56,
+ "properties": [
+ {
+ "OFPGroupBucketPropWeight": {
+ "length": 8,
+ "type": 0,
+ "weight": 52428
+ }
+ },
+ {
+ "OFPGroupBucketPropWatch": {
+ "length": 8,
+ "type": 1,
+ "watch": 56797
+ }
+ },
+ {
+ "OFPGroupBucketPropWatch": {
+ "length": 8,
+ "type": 2,
+ "watch": 4008636142
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "command": 3,
+ "command_bucket_id": 3149642683,
+ "group_id": 2863311530,
+ "properties": [],
+ "type": 1
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-group_stats_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_stats_reply.packet.json
new file mode 100644
index 00000000..cb979e54
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_stats_reply.packet.json
@@ -0,0 +1,27 @@
+{
+ "OFPGroupStatsReply": {
+ "body": [
+ {
+ "OFPGroupStats": {
+ "bucket_stats": [
+ {
+ "OFPBucketCounter": {
+ "byte_count": 2345,
+ "packet_count": 234
+ }
+ }
+ ],
+ "byte_count": 12345,
+ "duration_nsec": 609036000,
+ "duration_sec": 9,
+ "group_id": 1,
+ "length": 56,
+ "packet_count": 123,
+ "ref_count": 2
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 6
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-group_stats_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_stats_request.packet.json
new file mode 100644
index 00000000..b200a81c
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-group_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPGroupStatsRequest": {
+ "flags": 0,
+ "group_id": 4294967292,
+ "type": 6
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-hello.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-hello.packet.json
new file mode 100644
index 00000000..3c01f80b
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-hello.packet.json
@@ -0,0 +1,15 @@
+{
+ "OFPHello": {
+ "elements": [
+ {
+ "OFPHelloElemVersionBitmap": {
+ "length": 8,
+ "type": 1,
+ "versions": [
+ 6
+ ]
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_desc_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_desc_reply.packet.json
new file mode 100644
index 00000000..4ea5bfcf
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_desc_reply.packet.json
@@ -0,0 +1,25 @@
+{
+ "OFPMeterDescStatsReply": {
+ "body": [
+ {
+ "OFPMeterDescStats": {
+ "bands": [
+ {
+ "OFPMeterBandDrop": {
+ "burst_size": 10,
+ "len": 16,
+ "rate": 1000,
+ "type": 1
+ }
+ }
+ ],
+ "flags": 14,
+ "length": 24,
+ "meter_id": 100
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 10
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_desc_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_desc_request.packet.json
new file mode 100644
index 00000000..fdc1adc9
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_desc_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPMeterDescStatsRequest": {
+ "flags": 0,
+ "meter_id": 4294967295,
+ "type": 10
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_features_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_features_reply.packet.json
new file mode 100644
index 00000000..f9fb7848
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_features_reply.packet.json
@@ -0,0 +1,18 @@
+{
+ "OFPMeterFeaturesStatsReply": {
+ "body": [
+ {
+ "OFPMeterFeaturesStats": {
+ "band_types": 2147483654,
+ "capabilities": 15,
+ "features": 3,
+ "max_bands": 255,
+ "max_color": 0,
+ "max_meter": 16777216
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 11
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_features_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_features_request.packet.json
new file mode 100644
index 00000000..7363a342
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_features_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPMeterFeaturesStatsRequest": {
+ "flags": 0,
+ "type": 11
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_mod.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_mod.packet.json
new file mode 100644
index 00000000..5bb43719
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_mod.packet.json
@@ -0,0 +1,26 @@
+{
+ "OFPMeterMod": {
+ "bands": [
+ {
+ "OFPMeterBandDrop": {
+ "burst_size": 10,
+ "len": 16,
+ "rate": 1000,
+ "type": 1
+ }
+ },
+ {
+ "OFPMeterBandDscpRemark": {
+ "burst_size": 10,
+ "len": 16,
+ "prec_level": 1,
+ "rate": 1000,
+ "type": 2
+ }
+ }
+ ],
+ "command": 0,
+ "flags": 14,
+ "meter_id": 100
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_stats_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_stats_reply.packet.json
new file mode 100644
index 00000000..1bb4b39e
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_stats_reply.packet.json
@@ -0,0 +1,27 @@
+{
+ "OFPMeterStatsReply": {
+ "body": [
+ {
+ "OFPMeterStats": {
+ "band_stats": [
+ {
+ "OFPMeterBandStats": {
+ "byte_band_count": 0,
+ "packet_band_count": 0
+ }
+ }
+ ],
+ "byte_in_count": 0,
+ "duration_nsec": 480000,
+ "duration_sec": 0,
+ "ref_count": 0,
+ "len": 56,
+ "meter_id": 100,
+ "packet_in_count": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 9
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_stats_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_stats_request.packet.json
new file mode 100644
index 00000000..8d45799b
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-meter_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPMeterStatsRequest": {
+ "flags": 0,
+ "meter_id": 4294967295,
+ "type": 9
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-packet_in.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-packet_in.packet.json
new file mode 100644
index 00000000..e5fd0bd9
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-packet_in.packet.json
@@ -0,0 +1,46 @@
+{
+ "OFPPacketIn": {
+ "buffer_id": 200,
+ "cookie": 0,
+ "data": "aG9nZQ==",
+ "match": {
+ "OFPMatch": {
+ "length": 40,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 43981
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tunnel_id",
+ "mask": null,
+ "value": 50000
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_src",
+ "mask": null,
+ "value": "192.168.2.3"
+ }
+ },
+ {
+ "OXMTlv": {
+ "field": "tun_ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.4"
+ }
+ }
+ ],
+ "type": 1
+ }
+ },
+ "reason": 0,
+ "table_id": 100,
+ "total_len": 1000
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-packet_out.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-packet_out.packet.json
new file mode 100644
index 00000000..d8287cce
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-packet_out.packet.json
@@ -0,0 +1,32 @@
+{
+ "OFPPacketOut": {
+ "actions": [
+ {
+ "OFPActionOutput": {
+ "len": 16,
+ "max_len": 65535,
+ "port": 4294967291,
+ "type": 0
+ }
+ }
+ ],
+ "actions_len": 16,
+ "buffer_id": 4294967295,
+ "data": "dGVzdA==",
+ "match": {
+ "OFPMatch": {
+ "length": 12,
+ "oxm_fields": [
+ {
+ "OXMTlv": {
+ "field": "in_port",
+ "mask": null,
+ "value": 4294967040
+ }
+ }
+ ],
+ "type": 1
+ }
+ }
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-port_desc_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_desc_reply.packet.json
new file mode 100644
index 00000000..c281c0f8
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_desc_reply.packet.json
@@ -0,0 +1,103 @@
+{
+ "OFPPortDescStatsReply": {
+ "body": [
+ {
+ "OFPPort": {
+ "config": 0,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "length": 168,
+ "name": "Port7",
+ "port_no": 7,
+ "properties": [
+ {
+ "OFPPortDescPropEthernet": {
+ "advertised": 10240,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "length": 32,
+ "max_speed": 5000,
+ "peer": 10248,
+ "supported": 10248,
+ "type": 0
+ }
+ },
+ {
+ "OFPPortDescPropOptical": {
+ "length": 40,
+ "rx_grid_freq_lmda": 1500,
+ "rx_max_freq_lmda": 2000,
+ "rx_min_freq_lmda": 1000,
+ "supported": 1,
+ "tx_grid_freq_lmda": 1500,
+ "tx_max_freq_lmda": 2000,
+ "tx_min_freq_lmda": 1000,
+ "tx_pwr_max": 2000,
+ "tx_pwr_min": 1000,
+ "type": 1
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "state": 4
+ }
+ },
+ {
+ "OFPPort": {
+ "config": 0,
+ "hw_addr": "f2:0b:a4:7d:f8:ea",
+ "length": 72,
+ "name": "Port6",
+ "port_no": 6,
+ "properties": [
+ {
+ "OFPPortDescPropEthernet": {
+ "advertised": 10240,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "length": 32,
+ "max_speed": 5000,
+ "peer": 10248,
+ "supported": 10248,
+ "type": 0
+ }
+ }
+ ],
+ "state": 4
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 13
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-port_desc_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_desc_request.packet.json
new file mode 100644
index 00000000..478f1327
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_desc_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPPortDescStatsRequest": {
+ "flags": 0,
+ "port_no": 48346,
+ "type": 13
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-port_mod.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_mod.packet.json
new file mode 100644
index 00000000..a255b9dd
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_mod.packet.json
@@ -0,0 +1,60 @@
+{
+ "OFPPortMod": {
+ "config": 0,
+ "hw_addr": "00:11:00:00:11:11",
+ "mask": 0,
+ "port_no": 1,
+ "properties": [
+ {
+ "OFPPortModPropEthernet": {
+ "advertise": 4096,
+ "length": 8,
+ "type": 0
+ }
+ },
+ {
+ "OFPPortModPropOptical": {
+ "configure": 3,
+ "fl_offset": 2000,
+ "freq_lmda": 1500,
+ "grid_span": 3000,
+ "length": 24,
+ "tx_pwr": 300,
+ "type": 1
+ }
+ },
+ {
+ "OFPPortModPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortModPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortModPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-port_stats_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_stats_reply.packet.json
new file mode 100644
index 00000000..4ea41742
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_stats_reply.packet.json
@@ -0,0 +1,113 @@
+{
+ "OFPPortStatsReply": {
+ "body": [
+ {
+ "OFPPortStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 224,
+ "port_no": 7,
+ "properties": [
+ {
+ "OFPPortStatsPropEthernet": {
+ "collisions": 0,
+ "length": 40,
+ "rx_crc_err": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "type": 0
+ }
+ },
+ {
+ "OFPPortStatsPropOptical": {
+ "bias_current": 300,
+ "flags": 3,
+ "length": 44,
+ "rx_freq_lmda": 1500,
+ "rx_grid_span": 500,
+ "rx_offset": 700,
+ "rx_pwr": 2000,
+ "temperature": 273,
+ "tx_freq_lmda": 1500,
+ "tx_grid_span": 500,
+ "tx_offset": 700,
+ "tx_pwr": 2000,
+ "type": 1
+ }
+ },
+ {
+ "OFPPortStatsPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortStatsPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortStatsPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "rx_bytes": 0,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_packets": 0,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ },
+ {
+ "OFPPortStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 120,
+ "port_no": 6,
+ "properties": [
+ {
+ "OFPPortStatsPropEthernet": {
+ "collisions": 0,
+ "length": 40,
+ "rx_crc_err": 0,
+ "rx_frame_err": 0,
+ "rx_over_err": 0,
+ "type": 0
+ }
+ }
+ ],
+ "rx_bytes": 336,
+ "rx_dropped": 0,
+ "rx_errors": 0,
+ "rx_packets": 4,
+ "tx_bytes": 336,
+ "tx_dropped": 0,
+ "tx_errors": 0,
+ "tx_packets": 4
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-port_stats_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_stats_request.packet.json
new file mode 100644
index 00000000..5228710d
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_stats_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPPortStatsRequest": {
+ "flags": 0,
+ "port_no": 4294967295,
+ "type": 4
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-port_status.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_status.packet.json
new file mode 100644
index 00000000..b273ac22
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-port_status.packet.json
@@ -0,0 +1,76 @@
+{
+ "OFPPortStatus": {
+ "desc": {
+ "OFPPort": {
+ "config": 0,
+ "hw_addr": "f2:0b:a4:d0:3f:70",
+ "length": 168,
+ "name": "\u79c1\u306e\u30dd\u30fc\u30c8",
+ "port_no": 7,
+ "properties": [
+ {
+ "OFPPortDescPropEthernet": {
+ "advertised": 10240,
+ "curr": 10248,
+ "curr_speed": 5000,
+ "length": 32,
+ "max_speed": 5000,
+ "peer": 10248,
+ "supported": 10248,
+ "type": 0
+ }
+ },
+ {
+ "OFPPortDescPropOptical": {
+ "length": 40,
+ "rx_grid_freq_lmda": 1500,
+ "rx_max_freq_lmda": 2000,
+ "rx_min_freq_lmda": 1000,
+ "supported": 1,
+ "tx_grid_freq_lmda": 1500,
+ "tx_max_freq_lmda": 2000,
+ "tx_min_freq_lmda": 1000,
+ "tx_pwr_max": 2000,
+ "tx_pwr_min": 1000,
+ "type": 1
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPPortDescPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "state": 4
+ }
+ },
+ "reason": 0
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_desc_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_desc_reply.packet.json
new file mode 100644
index 00000000..26c8f7d5
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_desc_reply.packet.json
@@ -0,0 +1,81 @@
+{
+ "OFPQueueDescStatsReply": {
+ "body": [
+ {
+ "OFPQueueDesc": {
+ "len": 32,
+ "port_no": 7,
+ "properties": [
+ {
+ "OFPQueueDescPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ }
+ ],
+ "queue_id": 0
+ }
+ },
+ {
+ "OFPQueueDesc": {
+ "len": 88,
+ "port_no": 8,
+ "properties": [
+ {
+ "OFPQueueDescPropMinRate": {
+ "length": 8,
+ "rate": 300,
+ "type": 1
+ }
+ },
+ {
+ "OFPQueueDescPropMaxRate": {
+ "length": 8,
+ "rate": 900,
+ "type": 2
+ }
+ },
+ {
+ "OFPQueueDescPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPQueueDescPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPQueueDescPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "queue_id": 1
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 15
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_desc_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_desc_request.packet.json
new file mode 100644
index 00000000..db1f85d5
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_desc_request.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPQueueDescStatsRequest": {
+ "flags": 0,
+ "port_no": 52651,
+ "queue_id": 57020,
+ "type": 15
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_stats_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_stats_reply.packet.json
new file mode 100644
index 00000000..2c190977
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_stats_reply.packet.json
@@ -0,0 +1,80 @@
+{
+ "OFPQueueStatsReply": {
+ "body": [
+ {
+ "OFPQueueStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 104,
+ "port_no": 7,
+ "properties": [
+ {
+ "OFPQueueStatsPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPQueueStatsPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPQueueStatsPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ },
+ {
+ "OFPQueueStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 48,
+ "port_no": 6,
+ "properties": [],
+ "queue_id": 1,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ },
+ {
+ "OFPQueueStats": {
+ "duration_nsec": 0,
+ "duration_sec": 0,
+ "length": 48,
+ "port_no": 7,
+ "properties": [],
+ "queue_id": 2,
+ "tx_bytes": 0,
+ "tx_errors": 0,
+ "tx_packets": 0
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 5
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_stats_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_stats_request.packet.json
new file mode 100644
index 00000000..99d8505d
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-queue_stats_request.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPQueueStatsRequest": {
+ "flags": 0,
+ "port_no": 43981,
+ "queue_id": 4294967295,
+ "type": 5
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-requestforward.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-requestforward.packet.json
new file mode 100644
index 00000000..66368c20
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-requestforward.packet.json
@@ -0,0 +1,67 @@
+{
+ "OFPRequestForward": {
+ "request": {
+ "OFPGroupMod": {
+ "bucket_array_len": 56,
+ "buckets": [
+ {
+ "OFPBucket": {
+ "action_array_len": 24,
+ "actions": [
+ {
+ "OFPActionPopVlan": {
+ "len": 8,
+ "type": 18
+ }
+ },
+ {
+ "OFPActionSetField": {
+ "field": {
+ "OXMTlv": {
+ "field": "ipv4_dst",
+ "mask": null,
+ "value": "192.168.2.9"
+ }
+ },
+ "len": 16,
+ "type": 25
+ }
+ }
+ ],
+ "bucket_id": 305419896,
+ "len": 56,
+ "properties": [
+ {
+ "OFPGroupBucketPropWeight": {
+ "length": 8,
+ "type": 0,
+ "weight": 52428
+ }
+ },
+ {
+ "OFPGroupBucketPropWatch": {
+ "length": 8,
+ "type": 1,
+ "watch": 56797
+ }
+ },
+ {
+ "OFPGroupBucketPropWatch": {
+ "length": 8,
+ "type": 2,
+ "watch": 4008636142
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "command": 3,
+ "command_bucket_id": 3149642683,
+ "group_id": 2863311530,
+ "properties": [],
+ "type": 1
+ }
+ }
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-role_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-role_reply.packet.json
new file mode 100644
index 00000000..e8be5895
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-role_reply.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPRoleReply": {
+ "generation_id": 1234605616436508552,
+ "role": 1,
+ "short_id": 43690
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-role_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-role_request.packet.json
new file mode 100644
index 00000000..c0c120f6
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-role_request.packet.json
@@ -0,0 +1,7 @@
+{
+ "OFPRoleRequest": {
+ "generation_id": 1234605616436508552,
+ "role": 1,
+ "short_id": 43690
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-role_status.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-role_status.packet.json
new file mode 100644
index 00000000..c88d3bfa
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-role_status.packet.json
@@ -0,0 +1,8 @@
+{
+ "OFPRoleStatus": {
+ "generation_id": 17356517385562371090,
+ "properties": [],
+ "reason": 0,
+ "role": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-set_async.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-set_async.packet.json
new file mode 100644
index 00000000..0802c14e
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-set_async.packet.json
@@ -0,0 +1,122 @@
+{
+ "OFPSetAsync": {
+ "properties": [
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 0
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 1
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 2
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 3
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 4
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 5
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 6
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 7
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 24,
+ "type": 8
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 24,
+ "type": 9
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 10
+ }
+ },
+ {
+ "OFPAsyncConfigPropReasons": {
+ "length": 8,
+ "mask": 3,
+ "type": 11
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65534
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPAsyncConfigPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-set_config.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-set_config.packet.json
new file mode 100644
index 00000000..cd5398b7
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-set_config.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPSetConfig": {
+ "flags": 0,
+ "miss_send_len": 128
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-table_desc_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_desc_reply.packet.json
new file mode 100644
index 00000000..1f3d7142
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_desc_reply.packet.json
@@ -0,0 +1,83 @@
+{
+ "OFPTableDescStatsReply": {
+ "body": [
+ {
+ "OFPTableDesc": {
+ "config": 0,
+ "length": 24,
+ "properties": [
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ }
+ ],
+ "table_id": 7
+ }
+ },
+ {
+ "OFPTableDesc": {
+ "config": 0,
+ "length": 80,
+ "properties": [
+ {
+ "OFPTableModPropEviction": {
+ "flags": 0,
+ "length": 8,
+ "type": 2
+ }
+ },
+ {
+ "OFPTableModPropVacancy": {
+ "length": 8,
+ "type": 3,
+ "vacancy": 0,
+ "vacancy_down": 0,
+ "vacancy_up": 0
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "table_id": 8
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 14
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-table_desc_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_desc_request.packet.json
new file mode 100644
index 00000000..f5a4cde0
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_desc_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPTableDescStatsRequest": {
+ "flags": 0,
+ "type": 14
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-table_features_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_features_reply.packet.json
new file mode 100644
index 00000000..864a85fd
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_features_reply.packet.json
@@ -0,0 +1,38 @@
+{
+ "OFPTableFeaturesStatsReply": {
+ "body": [
+ {
+ "OFPTableFeaturesStats": {
+ "capabilities": 4,
+ "command": 1,
+ "features": 1,
+ "length": 80,
+ "max_entries": 255,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "table1",
+ "properties": [
+ {
+ "OFPTableFeaturePropOxmValues": {
+ "length": 14,
+ "oxm_values": [
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "aa:bb:cc:dd:ee:ff"
+ }
+ }
+ ],
+ "type": 22
+ }
+ }
+ ],
+ "table_id": 1
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 12
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-table_features_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_features_request.packet.json
new file mode 100644
index 00000000..986e1439
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_features_request.packet.json
@@ -0,0 +1,38 @@
+{
+ "OFPTableFeaturesStatsRequest": {
+ "body": [
+ {
+ "OFPTableFeaturesStats": {
+ "capabilities": 4,
+ "command": 1,
+ "features": 1,
+ "length": 80,
+ "max_entries": 255,
+ "metadata_match": 18446744073709551615,
+ "metadata_write": 18446744073709551615,
+ "name": "table1",
+ "properties": [
+ {
+ "OFPTableFeaturePropOxmValues": {
+ "length": 14,
+ "oxm_values": [
+ {
+ "OXMTlv": {
+ "field": "eth_src",
+ "mask": null,
+ "value": "aa:bb:cc:dd:ee:ff"
+ }
+ }
+ ],
+ "type": 22
+ }
+ }
+ ],
+ "table_id": 1
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 12
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-table_mod.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_mod.packet.json
new file mode 100644
index 00000000..5adf812f
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_mod.packet.json
@@ -0,0 +1,15 @@
+{
+ "OFPTableMod": {
+ "config": 4,
+ "properties": [
+ {
+ "OFPTableModPropEviction": {
+ "flags": 2,
+ "length": 8,
+ "type": 2
+ }
+ }
+ ],
+ "table_id": 255
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-table_stats_reply.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_stats_reply.packet.json
new file mode 100644
index 00000000..94801adb
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_stats_reply.packet.json
@@ -0,0 +1,24 @@
+{
+ "OFPTableStatsReply": {
+ "body": [
+ {
+ "OFPTableStats": {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 0
+ }
+ },
+ {
+ "OFPTableStats": {
+ "active_count": 4,
+ "lookup_count": 4,
+ "matched_count": 4,
+ "table_id": 1
+ }
+ }
+ ],
+ "flags": 0,
+ "type": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-table_stats_request.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_stats_request.packet.json
new file mode 100644
index 00000000..1f965d77
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_stats_request.packet.json
@@ -0,0 +1,6 @@
+{
+ "OFPTableStatsRequest": {
+ "flags": 0,
+ "type": 3
+ }
+}
diff --git a/tests/unit/ofproto/json/of15/libofproto-OFP15-table_status.packet.json b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_status.packet.json
new file mode 100644
index 00000000..fde5fb77
--- /dev/null
+++ b/tests/unit/ofproto/json/of15/libofproto-OFP15-table_status.packet.json
@@ -0,0 +1,62 @@
+{
+ "OFPTableStatus": {
+ "reason": 3,
+ "table": {
+ "OFPTableDesc": {
+ "config": 0,
+ "length": 80,
+ "properties": [
+ {
+ "OFPTableModPropEviction": {
+ "flags": 0,
+ "length": 8,
+ "type": 2
+ }
+ },
+ {
+ "OFPTableModPropVacancy": {
+ "length": 8,
+ "type": 3,
+ "vacancy": 0,
+ "vacancy_down": 0,
+ "vacancy_up": 0
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [],
+ "exp_type": 0,
+ "experimenter": 101,
+ "length": 12,
+ "type": 65535
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [
+ 1
+ ],
+ "exp_type": 1,
+ "experimenter": 101,
+ "length": 16,
+ "type": 65535
+ }
+ },
+ {
+ "OFPTableModPropExperimenter": {
+ "data": [
+ 1,
+ 2
+ ],
+ "exp_type": 2,
+ "experimenter": 101,
+ "length": 20,
+ "type": 65535
+ }
+ }
+ ],
+ "table_id": 8
+ }
+ }
+ }
+}
diff --git a/tests/unit/ofproto/test_ether.py b/tests/unit/ofproto/test_ether.py
new file mode 100644
index 00000000..dead1a43
--- /dev/null
+++ b/tests/unit/ofproto/test_ether.py
@@ -0,0 +1,37 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+from nose.tools import eq_
+from ryu.ofproto.ether import *
+
+
+LOG = logging.getLogger('test_ether')
+
+
+class TestInet(unittest.TestCase):
+ """ Test case for ether
+ """
+
+ def test_ether_type(self):
+ eq_(ETH_TYPE_IP, 0x0800)
+ eq_(ETH_TYPE_ARP, 0x0806)
+ eq_(ETH_TYPE_8021Q, 0x8100)
+ eq_(ETH_TYPE_IPV6, 0x86dd)
+ eq_(ETH_TYPE_MPLS, 0x8847)
+ eq_(ETH_TYPE_SLOW, 0x8809)
diff --git a/tests/unit/ofproto/test_inet.py b/tests/unit/ofproto/test_inet.py
new file mode 100644
index 00000000..92a82ac4
--- /dev/null
+++ b/tests/unit/ofproto/test_inet.py
@@ -0,0 +1,43 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+from nose.tools import eq_
+from ryu.ofproto.inet import *
+
+
+LOG = logging.getLogger('test_inet')
+
+
+class TestInet(unittest.TestCase):
+ """ Test case for inet
+ """
+
+ def test_ip_proto(self):
+ eq_(IPPROTO_IP, 0)
+ eq_(IPPROTO_HOPOPTS, 0)
+ eq_(IPPROTO_ICMP, 1)
+ eq_(IPPROTO_TCP, 6)
+ eq_(IPPROTO_UDP, 17)
+ eq_(IPPROTO_ROUTING, 43)
+ eq_(IPPROTO_FRAGMENT, 44)
+ eq_(IPPROTO_AH, 51)
+ eq_(IPPROTO_ICMPV6, 58)
+ eq_(IPPROTO_NONE, 59)
+ eq_(IPPROTO_DSTOPTS, 60)
+ eq_(IPPROTO_SCTP, 132)
diff --git a/tests/unit/ofproto/test_nx_flow_spec.py b/tests/unit/ofproto/test_nx_flow_spec.py
new file mode 100644
index 00000000..e0bf6b4e
--- /dev/null
+++ b/tests/unit/ofproto/test_nx_flow_spec.py
@@ -0,0 +1,95 @@
+# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2015 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+
+import ryu.ofproto.ofproto_v1_3_parser as ofpp
+
+
+class Test_FlowSpec(unittest.TestCase):
+ def test_flowspec_src_0_dst_0(self):
+ user = ofpp.NXFlowSpecMatch(src=('in_port', 0),
+ dst=('in_port', 0),
+ n_bits=16)
+ on_wire = (
+ b'\x00\x10'
+ b'\x80\x00\x00\x04\x00\x00'
+ b'\x80\x00\x00\x04\x00\x00'
+ )
+ self.assertEqual(on_wire, user.serialize())
+ (o, rest) = ofpp._NXFlowSpec.parse(on_wire)
+ self.assertEqual(user.to_jsondict(), o.to_jsondict())
+ self.assertEqual(str(user), str(o))
+ self.assertEqual(b'', rest)
+
+ def test_flowspec_src_1_dst_0(self):
+ user = ofpp.NXFlowSpecMatch(src=99,
+ dst=('in_port', 0),
+ n_bits=16)
+ on_wire = (
+ b'\x20\x10'
+ b'\x00\x63'
+ b'\x80\x00\x00\x04\x00\x00'
+ )
+ self.assertEqual(on_wire, user.serialize())
+ (o, rest) = ofpp._NXFlowSpec.parse(on_wire)
+ self.assertEqual(user.to_jsondict(), o.to_jsondict())
+ self.assertEqual(str(user), str(o))
+ self.assertEqual(b'', rest)
+
+ def test_flowspec_src_0_dst_1(self):
+ user = ofpp.NXFlowSpecLoad(src=('in_port', 0),
+ dst=('in_port', 0),
+ n_bits=16)
+ on_wire = (
+ b'\x08\x10'
+ b'\x80\x00\x00\x04\x00\x00'
+ b'\x80\x00\x00\x04\x00\x00'
+ )
+ self.assertEqual(on_wire, user.serialize())
+ (o, rest) = ofpp._NXFlowSpec.parse(on_wire)
+ self.assertEqual(user.to_jsondict(), o.to_jsondict())
+ self.assertEqual(str(user), str(o))
+ self.assertEqual(b'', rest)
+
+ def test_flowspec_src_1_dst_1(self):
+ user = ofpp.NXFlowSpecLoad(src=99,
+ dst=('in_port', 0),
+ n_bits=16)
+ on_wire = (
+ b'\x28\x10'
+ b'\x00\x63'
+ b'\x80\x00\x00\x04\x00\x00'
+ )
+ self.assertEqual(on_wire, user.serialize())
+ (o, rest) = ofpp._NXFlowSpec.parse(on_wire)
+ self.assertEqual(user.to_jsondict(), o.to_jsondict())
+ self.assertEqual(str(user), str(o))
+ self.assertEqual(b'', rest)
+
+ def test_flowspec_src_0_dst_2(self):
+ user = ofpp.NXFlowSpecOutput(src=('in_port', 0),
+ dst='',
+ n_bits=16)
+ on_wire = (
+ b'\x10\x10'
+ b'\x80\x00\x00\x04\x00\x00'
+ )
+ self.assertEqual(on_wire, user.serialize())
+ (o, rest) = ofpp._NXFlowSpec.parse(on_wire)
+ self.assertEqual(user.to_jsondict(), o.to_jsondict())
+ self.assertEqual(str(user), str(o))
+ self.assertEqual(b'', rest)
diff --git a/tests/unit/ofproto/test_ofproto.py b/tests/unit/ofproto/test_ofproto.py
new file mode 100644
index 00000000..47f1e544
--- /dev/null
+++ b/tests/unit/ofproto/test_ofproto.py
@@ -0,0 +1,81 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 Isaku Yamahata <yamahata at private email ne jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+try:
+ # Python 3
+ from imp import reload
+except ImportError:
+ # Python 2
+ pass
+
+import unittest
+import logging
+from nose.tools import eq_
+
+
+LOG = logging.getLogger('test_ofproto')
+
+
+class TestOfprotCommon(unittest.TestCase):
+ """ Test case for ofproto
+ """
+
+ def test_ofp_event(self):
+ import ryu.ofproto
+ reload(ryu.ofproto)
+ import ryu.controller.ofp_event
+ reload(ryu.controller.ofp_event)
+
+ def test_ofproto(self):
+ # When new version of OFP support is added,
+ # this test must be updated.
+ import ryu.ofproto
+ reload(ryu.ofproto)
+ ofp_modules = ryu.ofproto.get_ofp_modules()
+
+ import ryu.ofproto.ofproto_v1_0
+ import ryu.ofproto.ofproto_v1_2
+ import ryu.ofproto.ofproto_v1_3
+ import ryu.ofproto.ofproto_v1_4
+ import ryu.ofproto.ofproto_v1_5
+ eq_(set(ofp_modules.keys()), set([ryu.ofproto.ofproto_v1_0.OFP_VERSION,
+ ryu.ofproto.ofproto_v1_2.OFP_VERSION,
+ ryu.ofproto.ofproto_v1_3.OFP_VERSION,
+ ryu.ofproto.ofproto_v1_4.OFP_VERSION,
+ ryu.ofproto.ofproto_v1_5.OFP_VERSION,
+ ]))
+ consts_mods = set([ofp_mod[0] for ofp_mod in ofp_modules.values()])
+ eq_(consts_mods, set([ryu.ofproto.ofproto_v1_0,
+ ryu.ofproto.ofproto_v1_2,
+ ryu.ofproto.ofproto_v1_3,
+ ryu.ofproto.ofproto_v1_4,
+ ryu.ofproto.ofproto_v1_5,
+ ]))
+
+ parser_mods = set([ofp_mod[1] for ofp_mod in ofp_modules.values()])
+ import ryu.ofproto.ofproto_v1_0_parser
+ import ryu.ofproto.ofproto_v1_2_parser
+ import ryu.ofproto.ofproto_v1_3_parser
+ import ryu.ofproto.ofproto_v1_4_parser
+ import ryu.ofproto.ofproto_v1_5_parser
+ eq_(parser_mods, set([ryu.ofproto.ofproto_v1_0_parser,
+ ryu.ofproto.ofproto_v1_2_parser,
+ ryu.ofproto.ofproto_v1_3_parser,
+ ryu.ofproto.ofproto_v1_4_parser,
+ ryu.ofproto.ofproto_v1_5_parser,
+ ]))
diff --git a/tests/unit/ofproto/test_ofproto_common.py b/tests/unit/ofproto/test_ofproto_common.py
new file mode 100644
index 00000000..6a63236e
--- /dev/null
+++ b/tests/unit/ofproto/test_ofproto_common.py
@@ -0,0 +1,37 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+from nose.tools import eq_
+from ryu.ofproto.ofproto_common import *
+
+
+LOG = logging.getLogger('test_ofproto_common')
+
+
+class TestOfprotCommon(unittest.TestCase):
+ """ Test case for ofproto_common
+ """
+
+ def test_struct_ofp_header(self):
+ eq_(OFP_HEADER_PACK_STR, '!BBHI')
+ eq_(OFP_HEADER_SIZE, 8)
+
+ def test_define_constants(self):
+ eq_(OFP_TCP_PORT, 6653)
+ eq_(OFP_SSL_PORT, 6653)
diff --git a/tests/unit/ofproto/test_ofproto_parser.py b/tests/unit/ofproto/test_ofproto_parser.py
new file mode 100644
index 00000000..bc3c1fd1
--- /dev/null
+++ b/tests/unit/ofproto/test_ofproto_parser.py
@@ -0,0 +1,244 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import six
+
+import binascii
+import unittest
+from nose.tools import *
+import struct
+from ryu import exception
+
+from ryu.ofproto import ofproto_common, ofproto_parser
+from ryu.ofproto import ofproto_v1_0, ofproto_v1_0_parser
+
+import logging
+LOG = logging.getLogger(__name__)
+
+if six.PY3:
+ buffer = bytes
+
+
+class TestOfproto_Parser(unittest.TestCase):
+ def setUp(self):
+ LOG.debug('setUp')
+ self.bufHello = binascii.unhexlify('0100000800000001')
+
+ fr = '010600b0000000020000000000000abc' \
+ + '00000100010000000000008700000fff' \
+ + '0002aefa39d2b9177472656d61302d30' \
+ + '00000000000000000000000000000000' \
+ + '000000c0000000000000000000000000' \
+ + 'fffe723f9a764cc87673775f30786162' \
+ + '63000000000000000000000100000001' \
+ + '00000082000000000000000000000000' \
+ + '00012200d6c5a1947472656d61312d30' \
+ + '00000000000000000000000000000000' \
+ + '000000c0000000000000000000000000'
+ self.bufFeaturesReply = binascii.unhexlify(fr)
+
+ pi = '010a005200000000000001010040' \
+ + '00020000000000000002000000000001' \
+ + '080045000032000000004011f967c0a8' \
+ + '0001c0a8000200010001001e00000000' \
+ + '00000000000000000000000000000000' \
+ + '00000000'
+ self.bufPacketIn = binascii.unhexlify(pi)
+
+ def tearDown(self):
+ LOG.debug('tearDown')
+ pass
+
+ def testHello(self):
+ (version,
+ msg_type,
+ msg_len,
+ xid) = ofproto_parser.header(self.bufHello)
+ eq_(version, 1)
+ eq_(msg_type, 0)
+ eq_(msg_len, 8)
+ eq_(xid, 1)
+
+ def testFeaturesReply(self):
+ (version,
+ msg_type,
+ msg_len,
+ xid) = ofproto_parser.header(self.bufFeaturesReply)
+
+ msg = ofproto_parser.msg(self,
+ version,
+ msg_type,
+ msg_len,
+ xid,
+ self.bufFeaturesReply)
+ LOG.debug(msg)
+
+ ok_(isinstance(msg, ofproto_v1_0_parser.OFPSwitchFeatures))
+ LOG.debug(msg.ports[65534])
+ ok_(isinstance(msg.ports[1], ofproto_v1_0_parser.OFPPhyPort))
+ ok_(isinstance(msg.ports[2], ofproto_v1_0_parser.OFPPhyPort))
+ ok_(isinstance(msg.ports[65534], ofproto_v1_0_parser.OFPPhyPort))
+
+ def testPacketIn(self):
+ (version,
+ msg_type,
+ msg_len,
+ xid) = ofproto_parser.header(self.bufPacketIn)
+
+ msg = ofproto_parser.msg(self,
+ version,
+ msg_type,
+ msg_len,
+ xid,
+ self.bufPacketIn)
+ LOG.debug(msg)
+ ok_(isinstance(msg, ofproto_v1_0_parser.OFPPacketIn))
+
+ @raises(AssertionError)
+ def test_check_msg_len(self):
+ (version,
+ msg_type,
+ msg_len,
+ xid) = ofproto_parser.header(self.bufPacketIn)
+
+ msg_len = len(self.bufPacketIn) + 1
+ ofproto_parser.msg(self,
+ version,
+ msg_type,
+ msg_len,
+ xid,
+ self.bufPacketIn)
+
+ @raises(exception.OFPUnknownVersion)
+ def test_check_msg_parser(self):
+ (version,
+ msg_type,
+ msg_len,
+ xid) = ofproto_parser.header(self.bufPacketIn)
+
+ version = 0xff
+ ofproto_parser.msg(self,
+ version,
+ msg_type,
+ msg_len,
+ xid,
+ self.bufPacketIn)
+
+
+class TestMsgBase(unittest.TestCase):
+ """ Test case for ofproto_parser.MsgBase
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_set_xid(self):
+ xid = 3841413783
+ c = ofproto_parser.MsgBase(object)
+ c.set_xid(xid)
+ eq_(xid, c.xid)
+
+ @raises(AssertionError)
+ def test_set_xid_check_xid(self):
+ xid = 2160492514
+ c = ofproto_parser.MsgBase(object)
+ c.xid = xid
+ c.set_xid(xid)
+
+ def _test_parser(self, msg_type=ofproto_v1_0.OFPT_HELLO):
+ version = ofproto_v1_0.OFP_VERSION
+ msg_len = ofproto_v1_0.OFP_HEADER_SIZE
+ xid = 2183948390
+ data = b'\x00\x01\x02\x03'
+
+ fmt = ofproto_v1_0.OFP_HEADER_PACK_STR
+ buf = struct.pack(fmt, version, msg_type, msg_len, xid) \
+ + data
+
+ res = ofproto_v1_0_parser.OFPHello.parser(
+ object, version, msg_type, msg_len, xid, bytearray(buf))
+
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(buffer(buf), res.buf)
+
+ # test __str__()
+ list_ = ('version', 'msg_type', 'msg_len', 'xid')
+ check = {}
+ for s in str(res).rsplit(','):
+ if '=' in s:
+ (k, v,) = s.rsplit('=')
+ if k in list_:
+ check[k] = v
+
+ eq_(hex(ofproto_v1_0.OFP_VERSION), check['version'])
+ eq_(hex(ofproto_v1_0.OFPT_HELLO), check['msg_type'])
+ eq_(hex(msg_len), check['msg_len'])
+ eq_(hex(xid), check['xid'])
+
+ return True
+
+ def test_parser(self):
+ ok_(self._test_parser())
+
+ @raises(AssertionError)
+ def test_parser_check_msg_type(self):
+ self._test_parser(ofproto_v1_0.OFPT_ERROR)
+
+ def _test_serialize(self):
+
+ class Datapath(object):
+ ofproto = ofproto_v1_0
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = ofproto_v1_0_parser.OFPHello(Datapath)
+
+ c.serialize()
+ eq_(ofproto_v1_0.OFP_VERSION, c.version)
+ eq_(ofproto_v1_0.OFPT_HELLO, c.msg_type)
+ eq_(0, c.xid)
+
+ return True
+
+ def test_serialize(self):
+ ok_(self._test_serialize())
+
+
+class TestMsgStrAttr(unittest.TestCase):
+ """ Test case for ofproto_parser.msg_str_attr
+ """
+
+ def test_msg_str_attr(self):
+ class Check(object):
+ check = 'msg_str_attr_test'
+
+ c = Check()
+ buf = ''
+
+ res = ofproto_parser.msg_str_attr(c, buf, ('check',))
+ str_ = str(res)
+ str_ = str_.rsplit()
+ eq_('check', str_[0])
+ eq_('msg_str_attr_test', str_[1])
diff --git a/tests/unit/ofproto/test_ofproto_v12.py b/tests/unit/ofproto/test_ofproto_v12.py
new file mode 100644
index 00000000..c1228a05
--- /dev/null
+++ b/tests/unit/ofproto/test_ofproto_v12.py
@@ -0,0 +1,717 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+from nose.tools import eq_
+from ryu.ofproto.ofproto_v1_2 import *
+
+
+LOG = logging.getLogger('test_ofproto_v12')
+
+
+class TestOfprot12(unittest.TestCase):
+ """ Test case for ofproto_v1_2
+ """
+
+ def test_struct_ofp_header(self):
+ eq_(OFP_HEADER_PACK_STR, '!BBHI')
+ eq_(OFP_HEADER_SIZE, 8)
+
+ def test_enum_ofp_type(self):
+ eq_(OFPT_HELLO, 0)
+ eq_(OFPT_ERROR, 1)
+ eq_(OFPT_ECHO_REQUEST, 2)
+ eq_(OFPT_ECHO_REPLY, 3)
+ eq_(OFPT_EXPERIMENTER, 4)
+ eq_(OFPT_FEATURES_REQUEST, 5)
+ eq_(OFPT_FEATURES_REPLY, 6)
+ eq_(OFPT_GET_CONFIG_REQUEST, 7)
+ eq_(OFPT_GET_CONFIG_REPLY, 8)
+ eq_(OFPT_SET_CONFIG, 9)
+ eq_(OFPT_PACKET_IN, 10)
+ eq_(OFPT_FLOW_REMOVED, 11)
+ eq_(OFPT_PORT_STATUS, 12)
+ eq_(OFPT_PACKET_OUT, 13)
+ eq_(OFPT_FLOW_MOD, 14)
+ eq_(OFPT_GROUP_MOD, 15)
+ eq_(OFPT_PORT_MOD, 16)
+ eq_(OFPT_TABLE_MOD, 17)
+ eq_(OFPT_STATS_REQUEST, 18)
+ eq_(OFPT_STATS_REPLY, 19)
+ eq_(OFPT_BARRIER_REQUEST, 20)
+ eq_(OFPT_BARRIER_REPLY, 21)
+ eq_(OFPT_QUEUE_GET_CONFIG_REQUEST, 22)
+ eq_(OFPT_QUEUE_GET_CONFIG_REPLY, 23)
+ eq_(OFPT_ROLE_REQUEST, 24)
+ eq_(OFPT_ROLE_REPLY, 25)
+
+ def test_struct_ofp_port(self):
+ eq_(OFP_PORT_PACK_STR, '!I4x6s2x16sIIIIIIII')
+ eq_(OFP_PORT_SIZE, 64)
+
+ def test_enum_ofp_port_config(self):
+ eq_(OFPPC_PORT_DOWN, 1 << 0)
+ eq_(OFPPC_NO_RECV, 1 << 2)
+ eq_(OFPPC_NO_FWD, 1 << 5)
+ eq_(OFPPC_NO_PACKET_IN, 1 << 6)
+
+ def test_enum_ofp_port_state(self):
+ eq_(OFPPS_LINK_DOWN, 1 << 0)
+ eq_(OFPPS_BLOCKED, 1 << 1)
+ eq_(OFPPS_LIVE, 1 << 2)
+
+ def test_enum_ofp_port_no(self):
+ eq_(OFPP_MAX, 0xffffff00)
+ eq_(OFPP_IN_PORT, 0xfffffff8)
+ eq_(OFPP_TABLE, 0xfffffff9)
+ eq_(OFPP_NORMAL, 0xfffffffa)
+ eq_(OFPP_FLOOD, 0xfffffffb)
+ eq_(OFPP_ALL, 0xfffffffc)
+ eq_(OFPP_CONTROLLER, 0xfffffffd)
+ eq_(OFPP_LOCAL, 0xfffffffe)
+ eq_(OFPP_ANY, 0xffffffff)
+ eq_(OFPQ_ALL, 0xffffffff)
+
+ def test_enum_ofp_port_features(self):
+ eq_(OFPPF_10MB_HD, 1 << 0)
+ eq_(OFPPF_10MB_FD, 1 << 1)
+ eq_(OFPPF_100MB_HD, 1 << 2)
+ eq_(OFPPF_100MB_FD, 1 << 3)
+ eq_(OFPPF_1GB_HD, 1 << 4)
+ eq_(OFPPF_1GB_FD, 1 << 5)
+ eq_(OFPPF_10GB_FD, 1 << 6)
+ eq_(OFPPF_40GB_FD, 1 << 7)
+ eq_(OFPPF_100GB_FD, 1 << 8)
+ eq_(OFPPF_1TB_FD, 1 << 9)
+ eq_(OFPPF_OTHER, 1 << 10)
+ eq_(OFPPF_COPPER, 1 << 11)
+ eq_(OFPPF_FIBER, 1 << 12)
+ eq_(OFPPF_AUTONEG, 1 << 13)
+ eq_(OFPPF_PAUSE, 1 << 14)
+ eq_(OFPPF_PAUSE_ASYM, 1 << 15)
+
+ def test_struct_ofp_packet_queue(self):
+ eq_(OFP_PACKET_QUEUE_PACK_STR, '!IIH6x')
+ eq_(OFP_PACKET_QUEUE_SIZE, 16)
+
+ def test_enum_ofp_queue_properties(self):
+ eq_(OFPQT_MIN_RATE, 1)
+ eq_(OFPQT_MAX_RATE, 2)
+ eq_(OFPQT_EXPERIMENTER, 0xffff)
+
+ def test_struct_ofp_queue_prop_header(self):
+ eq_(OFP_QUEUE_PROP_HEADER_PACK_STR, '!HH4x')
+ eq_(OFP_QUEUE_PROP_HEADER_SIZE, 8)
+
+ def test_struct_ofp_queue_prop_min_rate(self):
+ eq_(OFP_QUEUE_PROP_MIN_RATE_PACK_STR, '!H6x')
+ eq_(OFP_QUEUE_PROP_MIN_RATE_SIZE, 16)
+
+ def test_struct_ofp_queue_prop_max_rate(self):
+ eq_(OFP_QUEUE_PROP_MAX_RATE_PACK_STR, '!H6x')
+ eq_(OFP_QUEUE_PROP_MAX_RATE_SIZE, 16)
+
+ def test_struct_ofp_queue_prop_experimenter(self):
+ eq_(OFP_QUEUE_PROP_EXPERIMENTER_PACK_STR, '!I4x')
+ eq_(OFP_QUEUE_PROP_EXPERIMENTER_SIZE, 16)
+
+ def test_struct_ofp_match(self):
+ eq_(OFP_MATCH_PACK_STR, '!HHBBBB')
+ eq_(OFP_MATCH_SIZE, 8)
+
+ def test_enum_ofp_match_type(self):
+ eq_(OFPMT_STANDARD, 0)
+ eq_(OFPMT_OXM, 1)
+
+ def test_enum_ofp_oxm_class(self):
+ eq_(OFPXMC_NXM_0, 0x0000)
+ eq_(OFPXMC_NXM_1, 0x0001)
+ eq_(OFPXMC_OPENFLOW_BASIC, 0x8000)
+ eq_(OFPXMC_EXPERIMENTER, 0xFFFF)
+
+ def test_enmu_oxm_ofb_match_fields(self):
+ eq_(OFPXMT_OFB_IN_PORT, 0)
+ eq_(OFPXMT_OFB_IN_PHY_PORT, 1)
+ eq_(OFPXMT_OFB_METADATA, 2)
+ eq_(OFPXMT_OFB_ETH_DST, 3)
+ eq_(OFPXMT_OFB_ETH_SRC, 4)
+ eq_(OFPXMT_OFB_ETH_TYPE, 5)
+ eq_(OFPXMT_OFB_VLAN_VID, 6)
+ eq_(OFPXMT_OFB_VLAN_PCP, 7)
+ eq_(OFPXMT_OFB_IP_DSCP, 8)
+ eq_(OFPXMT_OFB_IP_ECN, 9)
+ eq_(OFPXMT_OFB_IP_PROTO, 10)
+ eq_(OFPXMT_OFB_IPV4_SRC, 11)
+ eq_(OFPXMT_OFB_IPV4_DST, 12)
+ eq_(OFPXMT_OFB_TCP_SRC, 13)
+ eq_(OFPXMT_OFB_TCP_DST, 14)
+ eq_(OFPXMT_OFB_UDP_SRC, 15)
+ eq_(OFPXMT_OFB_UDP_DST, 16)
+ eq_(OFPXMT_OFB_SCTP_SRC, 17)
+ eq_(OFPXMT_OFB_SCTP_DST, 18)
+ eq_(OFPXMT_OFB_ICMPV4_TYPE, 19)
+ eq_(OFPXMT_OFB_ICMPV4_CODE, 20)
+ eq_(OFPXMT_OFB_ARP_OP, 21)
+ eq_(OFPXMT_OFB_ARP_SPA, 22)
+ eq_(OFPXMT_OFB_ARP_TPA, 23)
+ eq_(OFPXMT_OFB_ARP_SHA, 24)
+ eq_(OFPXMT_OFB_ARP_THA, 25)
+ eq_(OFPXMT_OFB_IPV6_SRC, 26)
+ eq_(OFPXMT_OFB_IPV6_DST, 27)
+ eq_(OFPXMT_OFB_IPV6_FLABEL, 28)
+ eq_(OFPXMT_OFB_ICMPV6_TYPE, 29)
+ eq_(OFPXMT_OFB_ICMPV6_CODE, 30)
+ eq_(OFPXMT_OFB_IPV6_ND_TARGET, 31)
+ eq_(OFPXMT_OFB_IPV6_ND_SLL, 32)
+ eq_(OFPXMT_OFB_IPV6_ND_TLL, 33)
+ eq_(OFPXMT_OFB_MPLS_LABEL, 34)
+ eq_(OFPXMT_OFB_MPLS_TC, 35)
+
+ def test_enum_ofp_vlan_id(self):
+ eq_(OFPVID_PRESENT, 0x1000)
+ eq_(OFPVID_NONE, 0x0000)
+
+ def test_struct_ofp_oxm_experimenter_header(self):
+ eq_(OFP_OXM_EXPERIMENTER_HEADER_PACK_STR, '!II')
+ eq_(OFP_OXM_EXPERIMENTER_HEADER_SIZE, 8)
+
+ def test_enum_ofp_instruction_type(self):
+ eq_(OFPIT_GOTO_TABLE, 1)
+ eq_(OFPIT_WRITE_METADATA, 2)
+ eq_(OFPIT_WRITE_ACTIONS, 3)
+ eq_(OFPIT_APPLY_ACTIONS, 4)
+ eq_(OFPIT_CLEAR_ACTIONS, 5)
+ eq_(OFPIT_EXPERIMENTER, 0xFFFF)
+
+ def test_struct_ofp_instruction_goto_table(self):
+ eq_(OFP_INSTRUCTION_GOTO_TABLE_PACK_STR, '!HHB3x')
+ eq_(OFP_INSTRUCTION_GOTO_TABLE_SIZE, 8)
+
+ def test_struct_ofp_instruction_write_metadata(self):
+ eq_(OFP_INSTRUCTION_WRITE_METADATA_PACK_STR, '!HH4xQQ')
+ eq_(OFP_INSTRUCTION_WRITE_METADATA_SIZE, 24)
+
+ def test_struct_ofp_instaruction_actions(self):
+ eq_(OFP_INSTRUCTION_ACTIONS_PACK_STR, '!HH4x')
+ eq_(OFP_INSTRUCTION_ACTIONS_SIZE, 8)
+
+ def test_enum_ofp_action_type(self):
+ eq_(OFPAT_OUTPUT, 0)
+ eq_(OFPAT_COPY_TTL_OUT, 11)
+ eq_(OFPAT_COPY_TTL_IN, 12)
+ eq_(OFPAT_SET_MPLS_TTL, 15)
+ eq_(OFPAT_DEC_MPLS_TTL, 16)
+ eq_(OFPAT_PUSH_VLAN, 17)
+ eq_(OFPAT_POP_VLAN, 18)
+ eq_(OFPAT_PUSH_MPLS, 19)
+ eq_(OFPAT_POP_MPLS, 20)
+ eq_(OFPAT_SET_QUEUE, 21)
+ eq_(OFPAT_GROUP, 22)
+ eq_(OFPAT_SET_NW_TTL, 23)
+ eq_(OFPAT_DEC_NW_TTL, 24)
+ eq_(OFPAT_SET_FIELD, 25)
+ eq_(OFPAT_EXPERIMENTER, 0xffff)
+
+ def test_struct_ofp_action_header(self):
+ eq_(OFP_ACTION_HEADER_PACK_STR, '!HH4x')
+ eq_(OFP_ACTION_HEADER_SIZE, 8)
+
+ def test_struct_ofp_action_output(self):
+ eq_(OFP_ACTION_OUTPUT_PACK_STR, '!HHIH6x')
+ eq_(OFP_ACTION_OUTPUT_SIZE, 16)
+
+ def test_enum_ofp_controller_max_len(self):
+ eq_(OFPCML_MAX, 0xffe5)
+ eq_(OFPCML_NO_BUFFER, 0xffff)
+
+ def test_struct_ofp_action_group(self):
+ eq_(OFP_ACTION_GROUP_PACK_STR, '!HHI')
+ eq_(OFP_ACTION_GROUP_SIZE, 8)
+
+ def test_struct_ofp_action_set_queue(self):
+ eq_(OFP_ACTION_SET_QUEUE_PACK_STR, '!HHI')
+ eq_(OFP_ACTION_SET_QUEUE_SIZE, 8)
+
+ def test_struct_ofp_aciton_mpls_ttl(self):
+ eq_(OFP_ACTION_MPLS_TTL_PACK_STR, '!HHB3x')
+ eq_(OFP_ACTION_MPLS_TTL_SIZE, 8)
+
+ def test_struct_ofp_action_nw_ttl(self):
+ eq_(OFP_ACTION_NW_TTL_PACK_STR, '!HHB3x')
+ eq_(OFP_ACTION_NW_TTL_SIZE, 8)
+
+ def test_struct_ofp_action_push(self):
+ eq_(OFP_ACTION_PUSH_PACK_STR, '!HHH2x')
+ eq_(OFP_ACTION_PUSH_SIZE, 8)
+
+ def test_struct_ofp_action_pop_mpls(self):
+ eq_(OFP_ACTION_POP_MPLS_PACK_STR, '!HHH2x')
+ eq_(OFP_ACTION_POP_MPLS_SIZE, 8)
+
+ def test_struct_ofp_action_set_field(self):
+ eq_(OFP_ACTION_SET_FIELD_PACK_STR, '!HH4B')
+ eq_(OFP_ACTION_SET_FIELD_SIZE, 8)
+
+ def test_struct_ofp_action_experimenter_header(self):
+ eq_(OFP_ACTION_EXPERIMENTER_HEADER_PACK_STR, '!HHI')
+ eq_(OFP_ACTION_EXPERIMENTER_HEADER_SIZE, 8)
+
+ def test_struct_ofp_switch_feature(self):
+ eq_(OFP_SWITCH_FEATURES_PACK_STR, '!QIB3xII')
+ eq_(OFP_SWITCH_FEATURES_SIZE, 32)
+
+ def test_enum_ofp_capabilities(self):
+ eq_(OFPC_FLOW_STATS, 1 << 0)
+ eq_(OFPC_TABLE_STATS, 1 << 1)
+ eq_(OFPC_PORT_STATS, 1 << 2)
+ eq_(OFPC_GROUP_STATS, 1 << 3)
+ eq_(OFPC_IP_REASM, 1 << 5)
+ eq_(OFPC_QUEUE_STATS, 1 << 6)
+ eq_(OFPC_PORT_BLOCKED, 1 << 8)
+
+ def test_struct_ofp_switch_config(self):
+ eq_(OFP_SWITCH_CONFIG_PACK_STR, '!HH')
+ eq_(OFP_SWITCH_CONFIG_SIZE, 12)
+
+ def test_enum_ofp_config_flags(self):
+ eq_(OFPC_FRAG_NORMAL, 0)
+ eq_(OFPC_FRAG_DROP, 1 << 0)
+ eq_(OFPC_FRAG_REASM, 1 << 1)
+ eq_(OFPC_FRAG_MASK, 3)
+ eq_(OFPC_INVALID_TTL_TO_CONTROLLER, 1 << 2)
+
+ def test_enum_ofp_table(self):
+ eq_(OFPTT_MAX, 0xfe)
+ eq_(OFPTT_ALL, 0xff)
+
+ def test_struct_ofp_table_mod(self):
+ eq_(OFP_TABLE_MOD_PACK_STR, '!B3xI')
+ eq_(OFP_TABLE_MOD_SIZE, 16)
+
+ def test_enum_ofp_table_config(self):
+ eq_(OFPTC_TABLE_MISS_CONTROLLER, 0)
+ eq_(OFPTC_TABLE_MISS_CONTINUE, 1 << 0)
+ eq_(OFPTC_TABLE_MISS_DROP, 1 << 1)
+ eq_(OFPTC_TABLE_MISS_MASK, 3)
+
+ def test_struct_ofp_flow_mod(self):
+ eq_(OFP_FLOW_MOD_PACK_STR, '!QQBBHHHIIIH2xHHBBBB')
+ eq_(OFP_FLOW_MOD_SIZE, 56)
+
+ def test_enum_ofp_flow_mod_command(self):
+ eq_(OFPFC_ADD, 0)
+ eq_(OFPFC_MODIFY, 1)
+ eq_(OFPFC_MODIFY_STRICT, 2)
+ eq_(OFPFC_DELETE, 3)
+ eq_(OFPFC_DELETE_STRICT, 4)
+
+ def test_enum_ofp_flow_mod_flags(self):
+ eq_(OFPFF_SEND_FLOW_REM, 1 << 0)
+ eq_(OFPFF_CHECK_OVERLAP, 1 << 1)
+ eq_(OFPFF_RESET_COUNTS, 1 << 2)
+
+ def test_struct_ofp_group_mod(self):
+ eq_(OFP_GROUP_MOD_PACK_STR, '!HBxI')
+ eq_(OFP_GROUP_MOD_SIZE, 16)
+
+ # same to OFPP_*
+ def test_enum_ofp_group(self):
+ eq_(OFPG_MAX, 0xffffff00)
+ eq_(OFPG_ALL, 0xfffffffc)
+ eq_(OFPG_ANY, 0xffffffff)
+
+ def test_enum_ofp_group_mod_command(self):
+ eq_(OFPGC_ADD, 0)
+ eq_(OFPGC_MODIFY, 1)
+ eq_(OFPGC_DELETE, 2)
+
+ def test_enum_ofp_group_type(self):
+ eq_(OFPGT_ALL, 0)
+ eq_(OFPGT_SELECT, 1)
+ eq_(OFPGT_INDIRECT, 2)
+ eq_(OFPGT_FF, 3)
+
+ def test_struct_ofp_bucket(self):
+ eq_(OFP_BUCKET_PACK_STR, '!HHII4x')
+ eq_(OFP_BUCKET_SIZE, 16)
+
+ def test_struct_ofp_port_mod(self):
+ eq_(OFP_PORT_MOD_PACK_STR, '!I4x6s2xIII4x')
+ eq_(OFP_PORT_MOD_SIZE, 40)
+
+ def test_sturct_ofp_stats_request(self):
+ eq_(OFP_STATS_REQUEST_PACK_STR, '!HH4x')
+ eq_(OFP_STATS_REQUEST_SIZE, 16)
+
+ # OFPSF_REQ_* flags (none yet defined).
+ # The only value defined for flags in a reply is whether more
+ # replies will follow this one - this has the value 0x0001.
+ def test_enum_ofp_stats_reply_flags(self):
+ eq_(OFPSF_REPLY_MORE, 0x0001)
+
+ def test_struct_ofp_stats_reply(self):
+ eq_(OFP_STATS_REPLY_PACK_STR, '!HH4x')
+ eq_(OFP_STATS_REPLY_SIZE, 16)
+
+ def test_enum_ofp_stats_types(self):
+ eq_(OFPST_DESC, 0)
+ eq_(OFPST_FLOW, 1)
+ eq_(OFPST_AGGREGATE, 2)
+ eq_(OFPST_TABLE, 3)
+ eq_(OFPST_PORT, 4)
+ eq_(OFPST_QUEUE, 5)
+ eq_(OFPST_GROUP, 6)
+ eq_(OFPST_GROUP_DESC, 7)
+ eq_(OFPST_GROUP_FEATURES, 8)
+ eq_(OFPST_EXPERIMENTER, 0xffff)
+
+ def test_struct_ofp_desc_stats(self):
+ eq_(OFP_DESC_STATS_PACK_STR, '!256s256s256s32s256s')
+ eq_(OFP_DESC_STATS_SIZE, 1056)
+
+ def test_struct_ofp_flow_stats_request(self):
+ eq_(OFP_FLOW_STATS_REQUEST_PACK_STR, '!B3xII4xQQ')
+ eq_(OFP_FLOW_STATS_REQUEST_SIZE, 40)
+
+ def test_struct_ofp_flow_stats(self):
+ eq_(OFP_FLOW_STATS_PACK_STR, '!HBxIIHHH6xQQQ')
+ eq_(OFP_FLOW_STATS_SIZE, 56)
+
+ def test_struct_ofp_aggregate_stats_request(self):
+ eq_(OFP_AGGREGATE_STATS_REQUEST_PACK_STR, '!B3xII4xQQ')
+ eq_(OFP_AGGREGATE_STATS_REQUEST_SIZE, 40)
+
+ def test_struct_ofp_aggregate_stats_reply(self):
+ eq_(OFP_AGGREGATE_STATS_REPLY_PACK_STR, '!QQI4x')
+ eq_(OFP_AGGREGATE_STATS_REPLY_SIZE, 24)
+
+ def test_sturct_ofp_table_stats(self):
+ eq_(OFP_TABLE_STATS_PACK_STR, '!B7x32sQQIIQQQQIIIIQQ')
+ eq_(OFP_TABLE_STATS_SIZE, 128)
+
+ def test_struct_ofp_port_stats_request(self):
+ eq_(OFP_PORT_STATS_REQUEST_PACK_STR, '!I4x')
+ eq_(OFP_PORT_STATS_REQUEST_SIZE, 8)
+
+ def test_struct_ofp_port_stats(self):
+ eq_(OFP_PORT_STATS_PACK_STR, '!I4xQQQQQQQQQQQQ')
+ eq_(OFP_PORT_STATS_SIZE, 104)
+
+ def test_struct_ofp_queue_stats_request(self):
+ eq_(OFP_QUEUE_STATS_REQUEST_PACK_STR, '!II')
+ eq_(OFP_QUEUE_STATS_REQUEST_SIZE, 8)
+
+ def test_struct_ofp_queue_stats(self):
+ eq_(OFP_QUEUE_STATS_PACK_STR, '!IIQQQ')
+ eq_(OFP_QUEUE_STATS_SIZE, 32)
+
+ def test_struct_ofp_group_stats_request(self):
+ eq_(OFP_GROUP_STATS_REQUEST_PACK_STR, '!I4x')
+ eq_(OFP_GROUP_STATS_REQUEST_SIZE, 8)
+
+ def test_struct_ofp_group_stats(self):
+ eq_(OFP_GROUP_STATS_PACK_STR, '!H2xII4xQQ')
+ eq_(OFP_GROUP_STATS_SIZE, 32)
+
+ def test_struct_ofp_bucket_counter(self):
+ eq_(OFP_BUCKET_COUNTER_PACK_STR, '!QQ')
+ eq_(OFP_BUCKET_COUNTER_SIZE, 16)
+
+ def test_struct_ofp_group_desc_stats(self):
+ eq_(OFP_GROUP_DESC_STATS_PACK_STR, '!HBxI')
+ eq_(OFP_GROUP_DESC_STATS_SIZE, 8)
+
+ def test_struct_ofp_group_features_stats(self):
+ eq_(OFP_GROUP_FEATURES_STATS_PACK_STR, '!II4I4I')
+ eq_(OFP_GROUP_FEATURES_STATS_SIZE, 40)
+
+ def test_enmu_ofp_group_capabilities(self):
+ eq_(OFPGFC_SELECT_WEIGHT, 1 << 0)
+ eq_(OFPGFC_SELECT_LIVENESS, 1 << 1)
+ eq_(OFPGFC_CHAINING, 1 << 2)
+ eq_(OFPGFC_CHAINING_CHECKS, 1 << 3)
+
+ def test_struct_ofp_experimenter_stats_header(self):
+ eq_(OFP_EXPERIMENTER_STATS_HEADER_PACK_STR, '!II')
+ eq_(OFP_EXPERIMENTER_STATS_HEADER_SIZE, 8)
+
+ def test_struct_opf_queue_get_config_request(self):
+ eq_(OFP_QUEUE_GET_CONFIG_REQUEST_PACK_STR, '!I4x')
+ eq_(OFP_QUEUE_GET_CONFIG_REQUEST_SIZE, 16)
+
+ def test_struct_ofp_queue_get_config_reply(self):
+ eq_(OFP_QUEUE_GET_CONFIG_REPLY_PACK_STR, '!I4x')
+ eq_(OFP_QUEUE_GET_CONFIG_REPLY_SIZE, 16)
+
+ def test_struct_ofp_packet_out(self):
+ eq_(OFP_PACKET_OUT_PACK_STR, '!IIH6x')
+ eq_(OFP_PACKET_OUT_SIZE, 24)
+
+ def test_struct_ofp_role_request(self):
+ eq_(OFP_ROLE_REQUEST_PACK_STR, '!I4xQ')
+ eq_(OFP_ROLE_REQUEST_SIZE, 24)
+
+ def test_enum_ofp_controller_role(self):
+ eq_(OFPCR_ROLE_NOCHANGE, 0)
+ eq_(OFPCR_ROLE_EQUAL, 1)
+ eq_(OFPCR_ROLE_MASTER, 2)
+ eq_(OFPCR_ROLE_SLAVE, 3)
+
+ def test_struct_ofp_packet_in(self):
+ eq_(OFP_PACKET_IN_PACK_STR, '!IHBB')
+ eq_(OFP_PACKET_IN_SIZE, 24)
+
+ def test_enum_ofp_packet_in_reason(self):
+ eq_(OFPR_NO_MATCH, 0)
+ eq_(OFPR_ACTION, 1)
+ eq_(OFPR_INVALID_TTL, 2)
+
+ def test_struct_ofp_flow_removed(self):
+ eq_(OFP_FLOW_REMOVED_PACK_STR, '!QHBBIIHHQQHHBBBB')
+ eq_(OFP_FLOW_REMOVED_PACK_STR0, '!QHBBIIHHQQ')
+ eq_(OFP_FLOW_REMOVED_SIZE, 56)
+
+ def test_enum_ofp_flow_removed_reason(self):
+ eq_(OFPRR_IDLE_TIMEOUT, 0)
+ eq_(OFPRR_HARD_TIMEOUT, 1)
+ eq_(OFPRR_DELETE, 2)
+ eq_(OFPRR_GROUP_DELETE, 3)
+
+ def test_struct_ofp_port_status(self):
+ eq_(OFP_PORT_STATUS_PACK_STR, '!B7xI4x6s2x16sIIIIIIII')
+ eq_(OFP_PORT_STATUS_DESC_OFFSET, 16)
+ eq_(OFP_PORT_STATUS_SIZE, 80)
+
+ def test_enum_ofp_port_reason(self):
+ eq_(OFPPR_ADD, 0)
+ eq_(OFPPR_DELETE, 1)
+ eq_(OFPPR_MODIFY, 2)
+
+ def test_struct_ofp_error_msg(self):
+ eq_(OFP_ERROR_MSG_PACK_STR, '!HH')
+ eq_(OFP_ERROR_MSG_SIZE, 12)
+
+ def test_enum_ofp_error_type(self):
+ eq_(OFPET_HELLO_FAILED, 0)
+ eq_(OFPET_BAD_REQUEST, 1)
+ eq_(OFPET_BAD_ACTION, 2)
+ eq_(OFPET_BAD_INSTRUCTION, 3)
+ eq_(OFPET_BAD_MATCH, 4)
+ eq_(OFPET_FLOW_MOD_FAILED, 5)
+ eq_(OFPET_GROUP_MOD_FAILED, 6)
+ eq_(OFPET_PORT_MOD_FAILED, 7)
+ eq_(OFPET_TABLE_MOD_FAILED, 8)
+ eq_(OFPET_QUEUE_OP_FAILED, 9)
+ eq_(OFPET_SWITCH_CONFIG_FAILED, 10)
+ eq_(OFPET_ROLE_REQUEST_FAILED, 11)
+ eq_(OFPET_EXPERIMENTER, 0xffff)
+
+ def test_enum_ofp_hello_failed_code(self):
+ eq_(OFPHFC_INCOMPATIBLE, 0)
+ eq_(OFPHFC_EPERM, 1)
+
+ def test_enum_ofp_bad_request_code(self):
+ eq_(OFPBRC_BAD_VERSION, 0)
+ eq_(OFPBRC_BAD_TYPE, 1)
+ eq_(OFPBRC_BAD_STAT, 2)
+ eq_(OFPBRC_BAD_EXPERIMENTER, 3)
+ eq_(OFPBRC_BAD_EXP_TYPE, 4)
+ eq_(OFPBRC_EPERM, 5)
+ eq_(OFPBRC_BAD_LEN, 6)
+ eq_(OFPBRC_BUFFER_EMPTY, 7)
+ eq_(OFPBRC_BUFFER_UNKNOWN, 8)
+ eq_(OFPBRC_BAD_TABLE_ID, 9)
+ eq_(OFPBRC_IS_SLAVE, 10)
+ eq_(OFPBRC_BAD_PORT, 11)
+ eq_(OFPBRC_BAD_PACKET, 12)
+
+ def test_enum_ofp_bad_action_code(self):
+ eq_(OFPBAC_BAD_TYPE, 0)
+ eq_(OFPBAC_BAD_LEN, 1)
+ eq_(OFPBAC_BAD_EXPERIMENTER, 2)
+ eq_(OFPBAC_BAD_EXP_TYPE, 3)
+ eq_(OFPBAC_BAD_OUT_PORT, 4)
+ eq_(OFPBAC_BAD_ARGUMENT, 5)
+ eq_(OFPBAC_EPERM, 6)
+ eq_(OFPBAC_TOO_MANY, 7)
+ eq_(OFPBAC_BAD_QUEUE, 8)
+ eq_(OFPBAC_BAD_OUT_GROUP, 9)
+ eq_(OFPBAC_MATCH_INCONSISTENT, 10)
+ eq_(OFPBAC_UNSUPPORTED_ORDER, 11)
+ eq_(OFPBAC_BAD_TAG, 12)
+ eq_(OFPBAC_BAD_SET_TYPE, 13)
+ eq_(OFPBAC_BAD_SET_LEN, 14)
+ eq_(OFPBAC_BAD_SET_ARGUMENT, 15)
+
+ def test_enum_ofp_bad_instruction_code(self):
+ eq_(OFPBIC_UNKNOWN_INST, 0)
+ eq_(OFPBIC_UNSUP_INST, 1)
+ eq_(OFPBIC_BAD_TABLE_ID, 2)
+ eq_(OFPBIC_UNSUP_METADATA, 3)
+ eq_(OFPBIC_UNSUP_METADATA_MASK, 4)
+ eq_(OFPBIC_BAD_EXPERIMENTER, 5)
+ eq_(OFPBIC_BAD_EXP_TYPE, 6)
+ eq_(OFPBIC_BAD_LEN, 7)
+ eq_(OFPBIC_EPERM, 8)
+
+ def test_enum_ofp_bad_match_code(self):
+ eq_(OFPBMC_BAD_TYPE, 0)
+ eq_(OFPBMC_BAD_LEN, 1)
+ eq_(OFPBMC_BAD_TAG, 2)
+ eq_(OFPBMC_BAD_DL_ADDR_MASK, 3)
+ eq_(OFPBMC_BAD_NW_ADDR_MASK, 4)
+ eq_(OFPBMC_BAD_WILDCARDS, 5)
+ eq_(OFPBMC_BAD_FIELD, 6)
+ eq_(OFPBMC_BAD_VALUE, 7)
+ eq_(OFPBMC_BAD_MASK, 8)
+ eq_(OFPBMC_BAD_PREREQ, 9)
+ eq_(OFPBMC_DUP_FIELD, 10)
+ eq_(OFPBMC_EPERM, 11)
+
+ def test_enum_ofp_flow_mod_failed_code(self):
+ eq_(OFPFMFC_UNKNOWN, 0)
+ eq_(OFPFMFC_TABLE_FULL, 1)
+ eq_(OFPFMFC_BAD_TABLE_ID, 2)
+ eq_(OFPFMFC_OVERLAP, 3)
+ eq_(OFPFMFC_EPERM, 4)
+ eq_(OFPFMFC_BAD_TIMEOUT, 5)
+ eq_(OFPFMFC_BAD_COMMAND, 6)
+ eq_(OFPFMFC_BAD_FLAGS, 7)
+
+ def test_enum_ofp_group_mod_failed_code(self):
+ eq_(OFPGMFC_GROUP_EXISTS, 0)
+ eq_(OFPGMFC_INVALID_GROUP, 1)
+ eq_(OFPGMFC_WEIGHT_UNSUPPORTED, 2)
+ eq_(OFPGMFC_OUT_OF_GROUPS, 3)
+ eq_(OFPGMFC_OUT_OF_BUCKETS, 4)
+ eq_(OFPGMFC_CHAINING_UNSUPPORTED, 5)
+ eq_(OFPGMFC_WATCH_UNSUPPORTED, 6)
+ eq_(OFPGMFC_LOOP, 7)
+ eq_(OFPGMFC_UNKNOWN_GROUP, 8)
+ eq_(OFPGMFC_CHAINED_GROUP, 9)
+ eq_(OFPGMFC_BAD_TYPE, 10)
+ eq_(OFPGMFC_BAD_COMMAND, 11)
+ eq_(OFPGMFC_BAD_BUCKET, 12)
+ eq_(OFPGMFC_BAD_WATCH, 13)
+ eq_(OFPGMFC_EPERM, 14)
+
+ def test_enum_ofp_port_mod_failed_code(self):
+ eq_(OFPPMFC_BAD_PORT, 0)
+ eq_(OFPPMFC_BAD_HW_ADDR, 1)
+ eq_(OFPPMFC_BAD_CONFIG, 2)
+ eq_(OFPPMFC_BAD_ADVERTISE, 3)
+ eq_(OFPPMFC_EPERM, 4)
+
+ def test_enum_ofp_table_mod_failed_code(self):
+ eq_(OFPTMFC_BAD_TABLE, 0)
+ eq_(OFPTMFC_BAD_CONFIG, 1)
+ eq_(OFPTMFC_EPERM, 2)
+
+ def test_enum_ofp_queue_op_failed_code(self):
+ eq_(OFPQOFC_BAD_PORT, 0)
+ eq_(OFPQOFC_BAD_QUEUE, 1)
+ eq_(OFPQOFC_EPERM, 2)
+
+ def test_enum_ofp_switch_config_failed_code(self):
+ eq_(OFPSCFC_BAD_FLAGS, 0)
+ eq_(OFPSCFC_BAD_LEN, 1)
+ eq_(OFPSCFC_EPERM, 2)
+
+ def test_enum_ofp_role_request_failed_code(self):
+ eq_(OFPRRFC_STALE, 0)
+ eq_(OFPRRFC_UNSUP, 1)
+ eq_(OFPRRFC_BAD_ROLE, 2)
+
+ def test_struct_ofp_error_experimenter_msg(self):
+ eq_(OFP_ERROR_EXPERIMENTER_MSG_PACK_STR, '!HHI')
+ eq_(OFP_ERROR_EXPERIMENTER_MSG_SIZE, 16)
+
+ def test_struct_ofp_experimenter_header(self):
+ eq_(OFP_EXPERIMENTER_HEADER_PACK_STR, '!II')
+ eq_(OFP_EXPERIMENTER_HEADER_SIZE, 16)
+
+ # OXM is interpreted as a 32-bit word in network byte order.
+ # - oxm_class 17-bit to 32-bit (OFPXMC_*).
+ # - oxm_field 10-bit to 16-bit (OFPXMT_OFB_*).
+ # - oxm_hasmask 9-bit (Set if OXM include a bitmask).
+ # - oxm_length 1-bit to 8-bit (Lenght of OXM payload).
+ def _test_OXM(self, value, class_, field, hasmask, length):
+ virfy = (class_ << 16) | (field << 9) | (hasmask << 8) | length
+ eq_(value >> 32, 0)
+ eq_(value, virfy)
+
+ def _test_OXM_basic(self, value, field, hasmask, length):
+ self._test_OXM(value, OFPXMC_OPENFLOW_BASIC, field, hasmask, length)
+
+ def test_OXM_basic(self):
+ self._test_OXM_basic(OXM_OF_IN_PORT, OFPXMT_OFB_IN_PORT, 0, 4)
+ self._test_OXM_basic(OXM_OF_IN_PHY_PORT, OFPXMT_OFB_IN_PHY_PORT, 0, 4)
+ self._test_OXM_basic(OXM_OF_METADATA, OFPXMT_OFB_METADATA, 0, 8)
+ self._test_OXM_basic(OXM_OF_METADATA_W, OFPXMT_OFB_METADATA, 1, 16)
+ self._test_OXM_basic(OXM_OF_ETH_DST, OFPXMT_OFB_ETH_DST, 0, 6)
+ self._test_OXM_basic(OXM_OF_ETH_DST_W, OFPXMT_OFB_ETH_DST, 1, 12)
+ self._test_OXM_basic(OXM_OF_ETH_SRC, OFPXMT_OFB_ETH_SRC, 0, 6)
+ self._test_OXM_basic(OXM_OF_ETH_SRC_W, OFPXMT_OFB_ETH_SRC, 1, 12)
+ self._test_OXM_basic(OXM_OF_ETH_TYPE, OFPXMT_OFB_ETH_TYPE, 0, 2)
+ self._test_OXM_basic(OXM_OF_VLAN_VID, OFPXMT_OFB_VLAN_VID, 0, 2)
+ self._test_OXM_basic(OXM_OF_VLAN_VID_W, OFPXMT_OFB_VLAN_VID, 1, 4)
+ self._test_OXM_basic(OXM_OF_VLAN_PCP, OFPXMT_OFB_VLAN_PCP, 0, 1)
+ self._test_OXM_basic(OXM_OF_IP_DSCP, OFPXMT_OFB_IP_DSCP, 0, 1)
+ self._test_OXM_basic(OXM_OF_IP_ECN, OFPXMT_OFB_IP_ECN, 0, 1)
+ self._test_OXM_basic(OXM_OF_IP_PROTO, OFPXMT_OFB_IP_PROTO, 0, 1)
+ self._test_OXM_basic(OXM_OF_IPV4_SRC, OFPXMT_OFB_IPV4_SRC, 0, 4)
+ self._test_OXM_basic(OXM_OF_IPV4_SRC_W, OFPXMT_OFB_IPV4_SRC, 1, 8)
+ self._test_OXM_basic(OXM_OF_IPV4_DST, OFPXMT_OFB_IPV4_DST, 0, 4)
+ self._test_OXM_basic(OXM_OF_IPV4_DST_W, OFPXMT_OFB_IPV4_DST, 1, 8)
+ self._test_OXM_basic(OXM_OF_TCP_SRC, OFPXMT_OFB_TCP_SRC, 0, 2)
+ self._test_OXM_basic(OXM_OF_TCP_DST, OFPXMT_OFB_TCP_DST, 0, 2)
+ self._test_OXM_basic(OXM_OF_UDP_SRC, OFPXMT_OFB_UDP_SRC, 0, 2)
+ self._test_OXM_basic(OXM_OF_UDP_DST, OFPXMT_OFB_UDP_DST, 0, 2)
+ self._test_OXM_basic(OXM_OF_SCTP_SRC, OFPXMT_OFB_SCTP_SRC, 0, 2)
+ self._test_OXM_basic(OXM_OF_SCTP_DST, OFPXMT_OFB_SCTP_DST, 0, 2)
+ self._test_OXM_basic(OXM_OF_ICMPV4_TYPE, OFPXMT_OFB_ICMPV4_TYPE, 0, 1)
+ self._test_OXM_basic(OXM_OF_ICMPV4_CODE, OFPXMT_OFB_ICMPV4_CODE, 0, 1)
+ self._test_OXM_basic(OXM_OF_ARP_OP, OFPXMT_OFB_ARP_OP, 0, 2)
+ self._test_OXM_basic(OXM_OF_ARP_SPA, OFPXMT_OFB_ARP_SPA, 0, 4)
+ self._test_OXM_basic(OXM_OF_ARP_SPA_W, OFPXMT_OFB_ARP_SPA, 1, 8)
+ self._test_OXM_basic(OXM_OF_ARP_TPA, OFPXMT_OFB_ARP_TPA, 0, 4)
+ self._test_OXM_basic(OXM_OF_ARP_TPA_W, OFPXMT_OFB_ARP_TPA, 1, 8)
+ self._test_OXM_basic(OXM_OF_ARP_SHA, OFPXMT_OFB_ARP_SHA, 0, 6)
+ self._test_OXM_basic(OXM_OF_ARP_SHA_W, OFPXMT_OFB_ARP_SHA, 1, 12)
+ self._test_OXM_basic(OXM_OF_ARP_THA, OFPXMT_OFB_ARP_THA, 0, 6)
+ self._test_OXM_basic(OXM_OF_ARP_THA_W, OFPXMT_OFB_ARP_THA, 1, 12)
+ self._test_OXM_basic(OXM_OF_IPV6_SRC, OFPXMT_OFB_IPV6_SRC, 0, 16)
+ self._test_OXM_basic(OXM_OF_IPV6_SRC_W, OFPXMT_OFB_IPV6_SRC, 1, 32)
+ self._test_OXM_basic(OXM_OF_IPV6_DST, OFPXMT_OFB_IPV6_DST, 0, 16)
+ self._test_OXM_basic(OXM_OF_IPV6_DST_W, OFPXMT_OFB_IPV6_DST, 1, 32)
+ self._test_OXM_basic(OXM_OF_IPV6_FLABEL, OFPXMT_OFB_IPV6_FLABEL, 0, 4)
+ self._test_OXM_basic(OXM_OF_IPV6_FLABEL_W,
+ OFPXMT_OFB_IPV6_FLABEL, 1, 8)
+ self._test_OXM_basic(OXM_OF_ICMPV6_TYPE, OFPXMT_OFB_ICMPV6_TYPE, 0, 1)
+ self._test_OXM_basic(OXM_OF_ICMPV6_CODE, OFPXMT_OFB_ICMPV6_CODE, 0, 1)
+ self._test_OXM_basic(OXM_OF_IPV6_ND_TARGET,
+ OFPXMT_OFB_IPV6_ND_TARGET, 0, 16)
+ self._test_OXM_basic(OXM_OF_IPV6_ND_SLL, OFPXMT_OFB_IPV6_ND_SLL, 0, 6)
+ self._test_OXM_basic(OXM_OF_IPV6_ND_TLL, OFPXMT_OFB_IPV6_ND_TLL, 0, 6)
+ self._test_OXM_basic(OXM_OF_MPLS_LABEL, OFPXMT_OFB_MPLS_LABEL, 0, 4)
+ self._test_OXM_basic(OXM_OF_MPLS_TC, OFPXMT_OFB_MPLS_TC, 0, 1)
+
+ def test_define_constants(self):
+ eq_(OFP_VERSION, 0x03)
+ eq_(OFP_TCP_PORT, 6633)
+ eq_(MAX_XID, 0xffffffff)
diff --git a/tests/unit/ofproto/test_oxm.py b/tests/unit/ofproto/test_oxm.py
new file mode 100644
index 00000000..ffb762fc
--- /dev/null
+++ b/tests/unit/ofproto/test_oxm.py
@@ -0,0 +1,188 @@
+# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2015 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+
+import ryu.ofproto.ofproto_v1_3 as ofp
+
+
+class Test_OXM(unittest.TestCase):
+ def _test_encode(self, user, on_wire):
+ (f, uv) = user
+ (n, v, m) = ofp.oxm_from_user(f, uv)
+ buf = bytearray()
+ ofp.oxm_serialize(n, v, m, buf, 0)
+ self.assertEqual(on_wire, buf)
+
+ def _test_decode(self, user, on_wire):
+ (n, v, m, l) = ofp.oxm_parse(on_wire, 0)
+ self.assertEqual(len(on_wire), l)
+ (f, uv) = ofp.oxm_to_user(n, v, m)
+ self.assertEqual(user, (f, uv))
+
+ def _test_encode_header(self, user, on_wire):
+ f = user
+ n = ofp.oxm_from_user_header(f)
+ buf = bytearray()
+ ofp.oxm_serialize_header(n, buf, 0)
+ self.assertEqual(on_wire, buf)
+
+ def _test_decode_header(self, user, on_wire):
+ (n, l) = ofp.oxm_parse_header(on_wire, 0)
+ self.assertEqual(len(on_wire), l)
+ f = ofp.oxm_to_user_header(n)
+ self.assertEqual(user, f)
+
+ def _test(self, user, on_wire, header_bytes):
+ self._test_encode(user, on_wire)
+ self._test_decode(user, on_wire)
+ if isinstance(user[1], tuple): # has mask?
+ return
+ user_header = user[0]
+ on_wire_header = on_wire[:header_bytes]
+ self._test_decode_header(user_header, on_wire_header)
+ if user_header.startswith('field_'):
+ return # not supported
+ self._test_encode_header(user_header, on_wire_header)
+
+ def test_basic_nomask(self):
+ user = ('ipv4_src', '192.0.2.1')
+ on_wire = (
+ b'\x80\x00\x16\x04'
+ b'\xc0\x00\x02\x01'
+ )
+ self._test(user, on_wire, 4)
+
+ def test_basic_mask(self):
+ user = ('ipv4_src', ('192.0.2.1', '255.255.0.0'))
+ on_wire = (
+ b'\x80\x00\x17\x08'
+ b'\xc0\x00\x02\x01'
+ b'\xff\xff\x00\x00'
+ )
+ self._test(user, on_wire, 4)
+
+ def test_exp_nomask(self):
+ user = ('_dp_hash', 0x12345678)
+ on_wire = (
+ b'\xff\xff\x00\x08'
+ b'\x00\x00\x23\x20' # Nicira
+ b'\x12\x34\x56\x78'
+ )
+ self._test(user, on_wire, 8)
+
+ def test_exp_mask(self):
+ user = ('_dp_hash', (0x12345678, 0x7fffffff))
+ on_wire = (
+ b'\xff\xff\x01\x0c'
+ b'\x00\x00\x23\x20' # Nicira
+ b'\x12\x34\x56\x78'
+ b'\x7f\xff\xff\xff'
+ )
+ self._test(user, on_wire, 8)
+
+ def test_exp_nomask_2(self):
+ user = ('tcp_flags', 0x876)
+ on_wire = (
+ b'\xff\xff\x54\x06'
+ b'\x4f\x4e\x46\x00' # ONF
+ b'\x08\x76'
+ )
+ self._test(user, on_wire, 8)
+
+ def test_exp_mask_2(self):
+ user = ('tcp_flags', (0x876, 0x7ff))
+ on_wire = (
+ b'\xff\xff\x55\x08'
+ b'\x4f\x4e\x46\x00' # ONF
+ b'\x08\x76'
+ b'\x07\xff'
+ )
+ self._test(user, on_wire, 8)
+
+ def test_exp_nomask_3(self):
+ user = ('actset_output', 0x98765432)
+ on_wire = (
+ b'\xff\xff\x56\x08'
+ b'\x4f\x4e\x46\x00' # ONF
+ b'\x98\x76\x54\x32'
+ )
+ self._test(user, on_wire, 8)
+
+ def test_exp_mask_3(self):
+ user = ('actset_output', (0x98765432, 0xfffffffe))
+ on_wire = (
+ b'\xff\xff\x57\x0c'
+ b'\x4f\x4e\x46\x00' # ONF
+ b'\x98\x76\x54\x32'
+ b'\xff\xff\xff\xfe'
+ )
+ self._test(user, on_wire, 8)
+
+ def test_nxm_1_nomask(self):
+ user = ('tun_ipv4_src', '192.0.2.1')
+ on_wire = (
+ b'\x00\x01\x3e\x04'
+ b'\xc0\x00\x02\x01'
+ )
+ self._test(user, on_wire, 4)
+
+ def test_nxm_1_mask(self):
+ user = ('tun_ipv4_src', ('192.0.2.1', '255.255.0.0'))
+ on_wire = (
+ b'\x00\x01\x3f\x08'
+ b'\xc0\x00\x02\x01'
+ b'\xff\xff\x00\x00'
+ )
+ self._test(user, on_wire, 4)
+
+ def test_ext_256_nomask(self):
+ user = ('pbb_uca', 50)
+ on_wire = (
+ b'\xff\xff\x00\x07'
+ b'\x4f\x4e\x46\x00' # ONF
+ b'\x0a\x00'
+ b'\x32'
+ )
+ self._test(user, on_wire, 10)
+
+ def test_ext_256_mask(self):
+ user = ('pbb_uca', (50, 51))
+ on_wire = (
+ b'\xff\xff\x01\x08'
+ b'\x4f\x4e\x46\x00' # ONF
+ b'\x0a\x00'
+ b'\x32'
+ b'\x33'
+ )
+ self._test(user, on_wire, 10)
+
+ def test_basic_unknown_nomask(self):
+ user = ('field_100', 'aG9nZWhvZ2U=')
+ on_wire = (
+ b'\x00\x00\xc8\x08'
+ b'hogehoge'
+ )
+ self._test(user, on_wire, 4)
+
+ def test_basic_unknown_mask(self):
+ user = ('field_100', ('aG9nZWhvZ2U=', 'ZnVnYWZ1Z2E='))
+ on_wire = (
+ b'\x00\x00\xc9\x10'
+ b'hogehoge'
+ b'fugafuga'
+ )
+ self._test(user, on_wire, 4)
diff --git a/tests/unit/ofproto/test_oxs.py b/tests/unit/ofproto/test_oxs.py
new file mode 100644
index 00000000..289731f0
--- /dev/null
+++ b/tests/unit/ofproto/test_oxs.py
@@ -0,0 +1,116 @@
+# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import unittest
+
+import ryu.ofproto.ofproto_v1_5 as ofp
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_OXS(unittest.TestCase):
+ def _test_encode(self, user, on_wire):
+ """ test encording user value into on-wire bytes.
+
+ n: name of OXS field
+ uv: user vale
+ t: oxs_type
+ v: on-wire bytes value
+ """
+ (n, uv) = user
+ (t, v, _) = ofp.oxs_from_user(n, uv)
+ buf = bytearray()
+ ofp.oxs_serialize(t, v, None, buf, 0)
+ self.assertEqual(on_wire, buf)
+
+ def _test_decode(self, user, on_wire):
+ """ test decording user value from on-wire bytes.
+
+ t: oxs_type
+ v: on-wire bytes value
+ l: length of field
+ n: name of OXS field
+ uv: user vale
+ """
+ (t, v, _, l) = ofp.oxs_parse(on_wire, 0)
+ self.assertEqual(len(on_wire), l)
+ (n, uv) = ofp.oxs_to_user(t, v, None)
+ self.assertEqual(user, (n, uv))
+
+ def _test_encode_header(self, user, on_wire):
+ """ test encording header.
+
+ t: oxs_type
+ """
+ t = ofp.oxs_from_user_header(user)
+ buf = bytearray()
+ ofp.oxs_serialize_header(t, buf, 0)
+ self.assertEqual(on_wire, buf)
+
+ def _test_decode_header(self, user, on_wire):
+ """ test decording header.
+
+ t: oxs_type
+ l: length of header
+ n: name of OXS field
+ """
+ (t, l) = ofp.oxs_parse_header(on_wire, 0)
+ self.assertEqual(len(on_wire), l)
+ n = ofp.oxs_to_user_header(t)
+ self.assertEqual(user, n)
+
+ def _test(self, user, on_wire, header_bytes):
+ """ execute tests.
+
+ user: user specified value.
+ eg. user = ('duration', (100, 100))
+ on_wire: on-wire bytes
+ header_bytes: header length
+ """
+ self._test_encode(user, on_wire)
+ self._test_decode(user, on_wire)
+ user_header = user[0]
+ on_wire_header = on_wire[:header_bytes]
+ self._test_decode_header(user_header, on_wire_header)
+ if user_header.startswith('field_'):
+ return # not supported
+ self._test_encode_header(user_header, on_wire_header)
+
+ def test_basic_single(self):
+ user = ('flow_count', 100)
+ on_wire = (
+ b'\x80\x02\x06\x04'
+ b'\x00\x00\x00\x64'
+ )
+ self._test(user, on_wire, 4)
+
+ def test_basic_double(self):
+ user = ('duration', (100, 200))
+ on_wire = (
+ b'\x80\x02\x00\x08'
+ b'\x00\x00\x00\x64'
+ b'\x00\x00\x00\xc8'
+ )
+ self._test(user, on_wire, 4)
+
+ def test_basic_unknown(self):
+ user = ('field_100', 'aG9nZWhvZ2U=')
+ on_wire = (
+ b'\x00\x00\xc8\x08'
+ b'hogehoge'
+ )
+ self._test(user, on_wire, 4)
diff --git a/tests/unit/ofproto/test_parser.py b/tests/unit/ofproto/test_parser.py
new file mode 100644
index 00000000..9e19fd8f
--- /dev/null
+++ b/tests/unit/ofproto/test_parser.py
@@ -0,0 +1,312 @@
+# Copyright (C) 2013,2014,2015 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013,2014,2015 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import json
+import sys
+import unittest
+
+import six
+from nose.tools import eq_
+
+from ryu import exception
+from ryu.ofproto import ofproto_parser
+from ryu.ofproto import ofproto_protocol
+from ryu.ofproto import ofproto_v1_0
+from ryu.ofproto import ofproto_v1_2
+from ryu.ofproto import ofproto_v1_3
+from ryu.ofproto import ofproto_v1_4
+from ryu.ofproto import ofproto_v1_5
+
+from tests import test_lib
+
+
+# (has_parser, has_serializer)
+implemented = {
+ 1: {
+ ofproto_v1_0.OFPT_PACKET_OUT: (False, True),
+ ofproto_v1_0.OFPT_FEATURES_REQUEST: (False, True),
+ ofproto_v1_0.OFPT_FEATURES_REPLY: (True, False),
+ ofproto_v1_0.OFPT_PACKET_IN: (True, False),
+ ofproto_v1_0.OFPT_FLOW_MOD: (True, True),
+ },
+ 3: {
+ ofproto_v1_2.OFPT_FEATURES_REQUEST: (False, True),
+ ofproto_v1_2.OFPT_FEATURES_REPLY: (True, False),
+ ofproto_v1_2.OFPT_GET_CONFIG_REQUEST: (False, True),
+ ofproto_v1_2.OFPT_GET_CONFIG_REPLY: (True, False),
+ ofproto_v1_2.OFPT_SET_CONFIG: (False, True),
+ ofproto_v1_2.OFPT_PACKET_IN: (True, False),
+ ofproto_v1_2.OFPT_FLOW_REMOVED: (True, False),
+ ofproto_v1_2.OFPT_PORT_STATUS: (True, False),
+ ofproto_v1_2.OFPT_PACKET_OUT: (False, True),
+ ofproto_v1_2.OFPT_FLOW_MOD: (True, True),
+ ofproto_v1_2.OFPT_GROUP_MOD: (False, True),
+ ofproto_v1_2.OFPT_PORT_MOD: (False, True),
+ ofproto_v1_2.OFPT_TABLE_MOD: (False, True),
+ ofproto_v1_2.OFPT_STATS_REQUEST: (False, True),
+ ofproto_v1_2.OFPT_STATS_REPLY: (True, False),
+ ofproto_v1_2.OFPT_BARRIER_REQUEST: (False, True),
+ ofproto_v1_2.OFPT_QUEUE_GET_CONFIG_REQUEST: (False, True),
+ ofproto_v1_2.OFPT_QUEUE_GET_CONFIG_REPLY: (True, False),
+ ofproto_v1_2.OFPT_ROLE_REQUEST: (False, True),
+ ofproto_v1_2.OFPT_ROLE_REPLY: (True, False),
+ },
+ 4: {
+ ofproto_v1_3.OFPT_HELLO: (True, False),
+ ofproto_v1_3.OFPT_FEATURES_REQUEST: (False, True),
+ ofproto_v1_3.OFPT_FEATURES_REPLY: (True, False),
+ ofproto_v1_3.OFPT_GET_CONFIG_REQUEST: (False, True),
+ ofproto_v1_3.OFPT_GET_CONFIG_REPLY: (True, False),
+ ofproto_v1_3.OFPT_SET_CONFIG: (False, True),
+ ofproto_v1_3.OFPT_PACKET_IN: (True, False),
+ ofproto_v1_3.OFPT_FLOW_REMOVED: (True, False),
+ ofproto_v1_3.OFPT_PORT_STATUS: (True, False),
+ ofproto_v1_3.OFPT_PACKET_OUT: (False, True),
+ ofproto_v1_3.OFPT_FLOW_MOD: (True, True),
+ ofproto_v1_3.OFPT_GROUP_MOD: (False, True),
+ ofproto_v1_3.OFPT_PORT_MOD: (False, True),
+ ofproto_v1_3.OFPT_METER_MOD: (False, True),
+ ofproto_v1_3.OFPT_TABLE_MOD: (False, True),
+ ofproto_v1_3.OFPT_MULTIPART_REQUEST: (False, True),
+ ofproto_v1_3.OFPT_MULTIPART_REPLY: (True, False),
+ ofproto_v1_3.OFPT_BARRIER_REQUEST: (False, True),
+ ofproto_v1_3.OFPT_QUEUE_GET_CONFIG_REQUEST: (False, True),
+ ofproto_v1_3.OFPT_QUEUE_GET_CONFIG_REPLY: (True, False),
+ ofproto_v1_3.OFPT_ROLE_REQUEST: (False, True),
+ ofproto_v1_3.OFPT_ROLE_REPLY: (True, False),
+ ofproto_v1_3.OFPT_GET_ASYNC_REQUEST: (False, True),
+ ofproto_v1_3.OFPT_GET_ASYNC_REPLY: (True, False),
+ ofproto_v1_3.OFPT_SET_ASYNC: (False, True),
+ },
+ 5: {
+ ofproto_v1_4.OFPT_HELLO: (True, False),
+ ofproto_v1_4.OFPT_FEATURES_REQUEST: (False, True),
+ ofproto_v1_4.OFPT_FEATURES_REPLY: (True, False),
+ ofproto_v1_4.OFPT_GET_CONFIG_REQUEST: (False, True),
+ ofproto_v1_4.OFPT_GET_CONFIG_REPLY: (True, False),
+ ofproto_v1_4.OFPT_SET_CONFIG: (False, True),
+ ofproto_v1_4.OFPT_PACKET_IN: (True, False),
+ ofproto_v1_4.OFPT_FLOW_REMOVED: (True, False),
+ ofproto_v1_4.OFPT_PORT_STATUS: (True, False),
+ ofproto_v1_4.OFPT_PACKET_OUT: (False, True),
+ ofproto_v1_4.OFPT_FLOW_MOD: (True, True),
+ ofproto_v1_4.OFPT_GROUP_MOD: (True, True),
+ ofproto_v1_4.OFPT_PORT_MOD: (False, True),
+ ofproto_v1_4.OFPT_METER_MOD: (True, True),
+ ofproto_v1_4.OFPT_TABLE_MOD: (False, True),
+ ofproto_v1_4.OFPT_MULTIPART_REQUEST: (False, True),
+ ofproto_v1_4.OFPT_MULTIPART_REPLY: (True, False),
+ ofproto_v1_4.OFPT_BARRIER_REQUEST: (False, True),
+ ofproto_v1_4.OFPT_ROLE_REQUEST: (False, True),
+ ofproto_v1_4.OFPT_ROLE_REPLY: (True, False),
+ ofproto_v1_4.OFPT_GET_ASYNC_REQUEST: (False, True),
+ ofproto_v1_4.OFPT_GET_ASYNC_REPLY: (True, False),
+ ofproto_v1_4.OFPT_SET_ASYNC: (False, True),
+ ofproto_v1_4.OFPT_ROLE_STATUS: (True, False),
+ ofproto_v1_4.OFPT_TABLE_STATUS: (True, False),
+ ofproto_v1_4.OFPT_REQUESTFORWARD: (True, True),
+ ofproto_v1_4.OFPT_BUNDLE_CONTROL: (False, True),
+ ofproto_v1_4.OFPT_BUNDLE_ADD_MESSAGE: (False, True),
+ },
+ 6: {
+ ofproto_v1_5.OFPT_HELLO: (True, False),
+ ofproto_v1_5.OFPT_FEATURES_REQUEST: (False, True),
+ ofproto_v1_5.OFPT_FEATURES_REPLY: (True, False),
+ ofproto_v1_5.OFPT_GET_CONFIG_REQUEST: (False, True),
+ ofproto_v1_5.OFPT_GET_CONFIG_REPLY: (True, False),
+ ofproto_v1_5.OFPT_SET_CONFIG: (False, True),
+ ofproto_v1_5.OFPT_PACKET_IN: (True, False),
+ ofproto_v1_5.OFPT_FLOW_REMOVED: (True, False),
+ ofproto_v1_5.OFPT_PORT_STATUS: (True, False),
+ ofproto_v1_5.OFPT_PACKET_OUT: (False, True),
+ ofproto_v1_5.OFPT_FLOW_MOD: (True, True),
+ ofproto_v1_5.OFPT_GROUP_MOD: (True, True),
+ ofproto_v1_5.OFPT_PORT_MOD: (False, True),
+ ofproto_v1_5.OFPT_METER_MOD: (True, True),
+ ofproto_v1_5.OFPT_TABLE_MOD: (False, True),
+ ofproto_v1_5.OFPT_MULTIPART_REQUEST: (False, True),
+ ofproto_v1_5.OFPT_MULTIPART_REPLY: (True, False),
+ ofproto_v1_5.OFPT_BARRIER_REQUEST: (False, True),
+ ofproto_v1_5.OFPT_ROLE_REQUEST: (False, True),
+ ofproto_v1_5.OFPT_ROLE_REPLY: (True, False),
+ ofproto_v1_5.OFPT_GET_ASYNC_REQUEST: (False, True),
+ ofproto_v1_5.OFPT_GET_ASYNC_REPLY: (True, False),
+ ofproto_v1_5.OFPT_SET_ASYNC: (False, True),
+ ofproto_v1_5.OFPT_ROLE_STATUS: (True, False),
+ ofproto_v1_5.OFPT_TABLE_STATUS: (True, False),
+ ofproto_v1_5.OFPT_REQUESTFORWARD: (True, True),
+ ofproto_v1_5.OFPT_BUNDLE_CONTROL: (True, True),
+ ofproto_v1_5.OFPT_BUNDLE_ADD_MESSAGE: (False, True),
+ ofproto_v1_5.OFPT_CONTROLLER_STATUS: (True, False),
+ },
+}
+
+
+class Test_Parser(unittest.TestCase):
+ """ Test case for ryu.ofproto, especially json representation
+ """
+
+ def __init__(self, methodName):
+ print('init %s' % methodName)
+ super(Test_Parser, self).__init__(methodName)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ @staticmethod
+ def _msg_to_jsondict(msg):
+ return msg.to_jsondict()
+
+ @staticmethod
+ def _jsondict_to_msg(dp, jsondict):
+ return ofproto_parser.ofp_msg_from_jsondict(dp, jsondict)
+
+ def _test_msg(self, name, wire_msg, json_str):
+ def bytes_eq(buf1, buf2):
+ if buf1 != buf2:
+ msg = 'EOF in either data'
+ for i in range(0, min(len(buf1), len(buf2))):
+ c1 = six.indexbytes(six.binary_type(buf1), i)
+ c2 = six.indexbytes(six.binary_type(buf2), i)
+ if c1 != c2:
+ msg = 'differs at chr %d, %d != %d' % (i, c1, c2)
+ break
+ assert buf1 == buf2, "%r != %r, %s" % (buf1, buf2, msg)
+
+ json_dict = json.loads(json_str)
+ # on-wire -> OFPxxx -> json
+ (version, msg_type, msg_len, xid) = ofproto_parser.header(wire_msg)
+ try:
+ has_parser, has_serializer = implemented[version][msg_type]
+ except KeyError:
+ has_parser = True
+ has_serializer = True
+
+ dp = ofproto_protocol.ProtocolDesc(version=version)
+ if has_parser:
+ try:
+ msg = ofproto_parser.msg(dp, version, msg_type, msg_len, xid,
+ wire_msg)
+ json_dict2 = self._msg_to_jsondict(msg)
+ except exception.OFPTruncatedMessage as e:
+ json_dict2 = {'OFPTruncatedMessage':
+ self._msg_to_jsondict(e.ofpmsg)}
+ # XXXdebug code
+ open(('/tmp/%s.json' % name), 'w').write(json.dumps(json_dict2))
+ eq_(json_dict, json_dict2)
+ if 'OFPTruncatedMessage' in json_dict2:
+ return
+
+ # json -> OFPxxx -> json
+ xid = json_dict[list(json_dict.keys())[0]].pop('xid', None)
+ msg2 = self._jsondict_to_msg(dp, json_dict)
+ msg2.set_xid(xid)
+ if has_serializer:
+ msg2.serialize()
+ eq_(self._msg_to_jsondict(msg2), json_dict)
+ bytes_eq(wire_msg, msg2.buf)
+
+ # check if "len" "length" fields can be omitted
+
+ def _remove(d, names):
+ f = lambda x: _remove(x, names)
+ if isinstance(d, list):
+ return list(map(f, d))
+ if isinstance(d, dict):
+ d2 = {}
+ for k, v in d.items():
+ if k in names:
+ continue
+ d2[k] = f(v)
+ return d2
+ return d
+
+ json_dict3 = _remove(json_dict, ['len', 'length'])
+ msg3 = self._jsondict_to_msg(dp, json_dict3)
+ msg3.set_xid(xid)
+ msg3.serialize()
+ bytes_eq(wire_msg, msg3.buf)
+
+ msg2.serialize()
+ bytes_eq(wire_msg, msg2.buf)
+
+
+def _add_tests():
+ import os
+ import os.path
+ import functools
+
+ this_dir = os.path.dirname(sys.modules[__name__].__file__)
+ packet_data_dir = os.path.join(this_dir, '../../packet_data')
+ json_dir = os.path.join(this_dir, 'json')
+ ofvers = [
+ 'of10',
+ 'of12',
+ 'of13',
+ 'of14',
+ 'of15',
+ ]
+ cases = set()
+ for ver in ofvers:
+ pdir = packet_data_dir + '/' + ver
+ jdir = json_dir + '/' + ver
+ n_added = 0
+ for file in os.listdir(pdir):
+ if file.endswith('.packet'):
+ truncated = None
+ elif '.truncated' in file:
+ # contents of .truncated files aren't relevant
+ s1, s2 = file.split('.truncated')
+ try:
+ truncated = int(s2)
+ except ValueError:
+ continue
+ file = s1 + '.packet'
+ else:
+ continue
+ wire_msg = open(pdir + '/' + file, 'rb').read()
+ if not truncated:
+ json_str = open(jdir + '/' + file + '.json', 'r').read()
+ else:
+ json_str = open(jdir + '/' + file +
+ '.truncated%d.json' % truncated, 'r').read()
+ wire_msg = wire_msg[:truncated]
+ method_name = ('test_' + file).replace('-', '_').replace('.', '_')
+ if truncated:
+ method_name += '_truncated%d' % truncated
+
+ def _run(self, name, wire_msg, json_str):
+ print('processing %s ...' % name)
+ if six.PY3:
+ self._test_msg(self, name, wire_msg, json_str)
+ else:
+ self._test_msg(name, wire_msg, json_str)
+ print('adding %s ...' % method_name)
+ f = functools.partial(_run, name=method_name, wire_msg=wire_msg,
+ json_str=json_str)
+ test_lib.add_method(Test_Parser, method_name, f)
+ cases.add(method_name)
+ n_added += 1
+ assert n_added > 0
+ assert (cases ==
+ set(unittest.defaultTestLoader.getTestCaseNames(Test_Parser)))
+
+_add_tests()
diff --git a/tests/unit/ofproto/test_parser_compat.py b/tests/unit/ofproto/test_parser_compat.py
new file mode 100644
index 00000000..8b98e27c
--- /dev/null
+++ b/tests/unit/ofproto/test_parser_compat.py
@@ -0,0 +1,159 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+from struct import unpack
+import unittest
+
+import six
+from nose.tools import eq_
+
+from ryu.lib import addrconv
+from ryu.ofproto import ofproto_v1_2
+from ryu.ofproto import ofproto_v1_3
+from ryu.ofproto import ofproto_v1_2_parser
+from ryu.ofproto import ofproto_v1_3_parser
+
+from tests import test_lib
+
+
+class Test_Parser_Compat(unittest.TestCase):
+ def __init__(self, methodName):
+ print('init %s' % methodName)
+ super(Test_Parser_Compat, self).__init__(methodName)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def _test(self, name, ofpp):
+ ofp = {
+ ofproto_v1_2_parser: ofproto_v1_2,
+ ofproto_v1_3_parser: ofproto_v1_3,
+ }[ofpp]
+
+ in_port = 987654321
+ eth_src = 'aa:bb:cc:dd:ee:ff'
+ ipv4_src = '192.0.2.9'
+ ipv6_src = 'fe80::f00b:a4ff:feef:5d8f'
+
+ old_in_port = in_port
+ old_eth_src = addrconv.mac.text_to_bin(eth_src)
+ old_ipv4_src = unpack('!I', addrconv.ipv4.text_to_bin(ipv4_src))[0]
+ old_ipv6_src = list(unpack('!8H',
+ addrconv.ipv6.text_to_bin(ipv6_src)))
+
+ def check(o):
+ check_old(o)
+ check_new(o)
+
+ def check_old(o):
+ # old api
+ def get_field(m, t):
+ for f in m.fields:
+ if isinstance(f, t):
+ return f
+ get_value = lambda m, t: get_field(m, t).value
+
+ eq_(get_value(o, ofpp.MTInPort), old_in_port)
+ eq_(get_value(o, ofpp.MTEthSrc), old_eth_src)
+ eq_(get_value(o, ofpp.MTIPV4Src), old_ipv4_src)
+ eq_(get_value(o, ofpp.MTIPv6Src), old_ipv6_src)
+
+ def check_new(o):
+ # new api
+ eq_(o['in_port'], in_port)
+ eq_(o['eth_src'], eth_src)
+ eq_(o['ipv4_src'], ipv4_src)
+ eq_(o['ipv6_src'], ipv6_src)
+
+ # ensure that old and new api produces the same thing
+
+ # old api
+ old = ofpp.OFPMatch()
+ old.set_in_port(old_in_port)
+ old.set_dl_src(old_eth_src)
+ old.set_ipv4_src(old_ipv4_src)
+ old.set_ipv6_src(old_ipv6_src)
+
+ old_buf = bytearray()
+ old.serialize(old_buf, 0)
+
+ # note: you can't inspect an object composed with the old set_XXX api
+ # before serialize().
+ check_old(old)
+
+ # another variant of old api; originally it was intended to be
+ # internal but actually used in the field. eg. LINC l2_switch_v1_3.py
+ old2 = ofpp.OFPMatch()
+ old2.append_field(ofp.OXM_OF_IN_PORT, old_in_port)
+ old2.append_field(ofp.OXM_OF_ETH_SRC, old_eth_src)
+ old2.append_field(ofp.OXM_OF_IPV4_SRC, old_ipv4_src)
+ old2.append_field(ofp.OXM_OF_IPV6_SRC, old_ipv6_src)
+ check_old(old2)
+
+ old2_buf = bytearray()
+ old2.serialize(old2_buf, 0)
+
+ # new api
+ new = ofpp.OFPMatch(in_port=in_port, eth_src=eth_src,
+ ipv4_src=ipv4_src, ipv6_src=ipv6_src)
+ check_new(new)
+
+ new_buf = bytearray()
+ new.serialize(new_buf, 0)
+ eq_(new_buf, old_buf)
+ eq_(new_buf, old2_buf)
+
+ old_jsondict = old.to_jsondict()
+ old2_jsondict = old2.to_jsondict()
+ new_jsondict = new.to_jsondict()
+ eq_(new_jsondict, old_jsondict)
+ eq_(new_jsondict, old2_jsondict)
+
+ eq_(str(new), str(old))
+ eq_(str(new), str(old2))
+
+ # a parsed object can be inspected by old and new api
+
+ check(ofpp.OFPMatch.parser(six.binary_type(new_buf), 0))
+ check(ofpp.OFPMatch.from_jsondict(list(new_jsondict.values())[0]))
+
+
+def _add_tests():
+ import functools
+ import itertools
+
+ ofpps = [ofproto_v1_2_parser, ofproto_v1_3_parser]
+ for ofpp in ofpps:
+ mod = ofpp.__name__.split('.')[-1]
+ method_name = 'test_' + mod + '_ofpmatch_compat'
+
+ def _run(self, name, ofpp):
+ print('processing %s ...' % name)
+ if six.PY3:
+ self._test(self, name, ofpp)
+ else:
+ self._test(name, ofpp)
+ print('adding %s ...' % method_name)
+ f = functools.partial(_run, name=method_name,
+ ofpp=ofpp)
+ test_lib.add_method(Test_Parser_Compat, method_name, f)
+
+_add_tests()
diff --git a/tests/unit/ofproto/test_parser_ofpmatch.py b/tests/unit/ofproto/test_parser_ofpmatch.py
new file mode 100644
index 00000000..91da3d3d
--- /dev/null
+++ b/tests/unit/ofproto/test_parser_ofpmatch.py
@@ -0,0 +1,292 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+try:
+ # Python 3
+ from functools import reduce
+except ImportError:
+ # Python 2
+ pass
+
+import unittest
+
+import six
+from nose.tools import eq_
+from nose.tools import ok_
+
+from ryu.ofproto import ofproto_v1_2
+from ryu.ofproto import ofproto_v1_3
+from ryu.ofproto import ofproto_v1_4
+from ryu.ofproto import ofproto_v1_5
+from ryu.ofproto import ofproto_v1_2_parser
+from ryu.ofproto import ofproto_v1_3_parser
+from ryu.ofproto import ofproto_v1_4_parser
+from ryu.ofproto import ofproto_v1_5_parser
+
+from tests import test_lib
+
+
+class Test_Parser_OFPMatch(unittest.TestCase):
+ _ofp = {ofproto_v1_2_parser: ofproto_v1_2,
+ ofproto_v1_3_parser: ofproto_v1_3,
+ ofproto_v1_4_parser: ofproto_v1_4,
+ ofproto_v1_5_parser: ofproto_v1_5}
+
+ def __init__(self, methodName):
+ print('init %s' % methodName)
+ super(Test_Parser_OFPMatch, self).__init__(methodName)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def _test(self, name, ofpp, d, domask):
+ if domask:
+ d = dict(self._ofp[ofpp].oxm_normalize_user(k, uv)
+ for (k, uv)
+ in d.items())
+ match = ofpp.OFPMatch(**d)
+ b = bytearray()
+ match.serialize(b, 0)
+ match2 = match.parser(six.binary_type(b), 0)
+ for k, v in d.items():
+ ok_(k in match)
+ ok_(k in match2)
+ eq_(match[k], v)
+ eq_(match2[k], v)
+ for k, v in match.iteritems():
+ ok_(k in d)
+ eq_(d[k], v)
+ for k, v in match2.iteritems():
+ ok_(k in d)
+ eq_(d[k], v)
+
+
+def _add_tests():
+ import functools
+ import itertools
+
+ class Field(object):
+ @classmethod
+ def generate_mask(cls):
+ return list(cls.generate())[1]
+
+ class Int1(Field):
+ @staticmethod
+ def generate():
+ yield 0
+ yield 0xff
+
+ class Int2(Field):
+ @staticmethod
+ def generate():
+ yield 0
+ yield 0x1234
+ yield 0xffff
+
+ class Int3(Field):
+ @staticmethod
+ def generate():
+ yield 0
+ yield 0x123456
+ yield 0xffffff
+
+ class Int4(Field):
+ @staticmethod
+ def generate():
+ yield 0
+ yield 0x12345678
+ yield 0xffffffff
+
+ class Int8(Field):
+ @staticmethod
+ def generate():
+ yield 0
+ yield 0x123456789abcdef0
+ yield 0xffffffffffffffff
+
+ class Mac(Field):
+ @staticmethod
+ def generate():
+ yield '00:00:00:00:00:00'
+ yield 'f2:0b:a4:7d:f8:ea'
+ yield 'ff:ff:ff:ff:ff:ff'
+
+ class IPv4(Field):
+ @staticmethod
+ def generate():
+ yield '0.0.0.0'
+ yield '192.0.2.1'
+ yield '255.255.255.255'
+
+ class IPv6(Field):
+ @staticmethod
+ def generate():
+ yield '::'
+ yield 'fe80::f00b:a4ff:fed0:3f70'
+ yield 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'
+
+ class B64(Field):
+ @staticmethod
+ def generate():
+ yield 'aG9nZWhvZ2U='
+ yield 'ZnVnYWZ1Z2E='
+
+ ofpps = [ofproto_v1_2_parser, ofproto_v1_3_parser,
+ ofproto_v1_4_parser, ofproto_v1_5_parser]
+ common = [
+ # OpenFlow Basic
+ ('in_port', Int4),
+ ('in_phy_port', Int4),
+ ('metadata', Int8),
+ ('eth_dst', Mac),
+ ('eth_src', Mac),
+ ('eth_type', Int2),
+ ('vlan_vid', Int2),
+ ('vlan_pcp', Int1),
+ ('ip_dscp', Int1),
+ ('ip_ecn', Int1),
+ ('ip_proto', Int1),
+ ('ipv4_src', IPv4),
+ ('ipv4_dst', IPv4),
+ ('tcp_src', Int2),
+ ('tcp_dst', Int2),
+ ('udp_src', Int2),
+ ('udp_dst', Int2),
+ ('sctp_src', Int2),
+ ('sctp_dst', Int2),
+ ('icmpv4_type', Int1),
+ ('icmpv4_code', Int1),
+ ('arp_op', Int2),
+ ('arp_spa', IPv4),
+ ('arp_tpa', IPv4),
+ ('arp_sha', Mac),
+ ('arp_tha', Mac),
+ ('ipv6_src', IPv6),
+ ('ipv6_dst', IPv6),
+ ('ipv6_flabel', Int4),
+ ('icmpv6_type', Int1),
+ ('icmpv6_code', Int1),
+ ('ipv6_nd_target', IPv6),
+ ('ipv6_nd_sll', Mac),
+ ('ipv6_nd_tll', Mac),
+ ('mpls_label', Int4),
+ ('mpls_tc', Int1),
+ # Old ONF Experimenter --> OpenFlow Basic (OF1.4+)
+ ('pbb_uca', Int1),
+ # ONF Experimenter --> OpenFlow Basic (OF1.5+)
+ ('tcp_flags', Int2),
+ ('actset_output', Int4),
+ # Nicira Experimenter
+ ('eth_dst_nxm', Mac),
+ ('eth_src_nxm', Mac),
+ ('tunnel_id_nxm', Int8),
+ ('tun_ipv4_src', IPv4),
+ ('tun_ipv4_dst', IPv4),
+ ('pkt_mark', Int4),
+ ('conj_id', Int4),
+ ('tun_ipv6_src', IPv6),
+ ('tun_ipv6_dst', IPv6),
+ ('_dp_hash', Int4),
+ ('reg0', Int4),
+ ('reg1', Int4),
+ ('reg2', Int4),
+ ('reg3', Int4),
+ ('reg4', Int4),
+ ('reg5', Int4),
+ ('reg6', Int4),
+ ('reg7', Int4),
+ # Common Experimenter
+ ('field_100', B64),
+ ]
+ L = {}
+ L[ofproto_v1_2_parser] = common + [
+ # OF1.2 doesn't have OXM_OF_PBB_ISID.
+ # OFPXMC_OPENFLOW_BASIC = 0x8000
+ # OXM_OF_PBB_ISID = 37
+ # (OFPXMC_OPENFLOW_BASIC << 7) + OXM_OF_PBB_ISID == 4194341
+ ('field_4194341', B64),
+ ]
+ L[ofproto_v1_3_parser] = common + [
+ # OpenFlow Basic (OF1.3+)
+ ('mpls_bos', Int1),
+ ('pbb_isid', Int3),
+ ('tunnel_id', Int8),
+ ('ipv6_exthdr', Int2),
+ ]
+ L[ofproto_v1_4_parser] = L[ofproto_v1_3_parser]
+ L[ofproto_v1_5_parser] = L[ofproto_v1_4_parser] + [
+ # OpenFlow Basic (OF1.5+)
+ ('packet_type', Int4),
+ ]
+
+ def flatten_one(l, i):
+ if isinstance(i, tuple):
+ return l + flatten(i)
+ else:
+ return l + [i]
+ flatten = lambda l: reduce(flatten_one, l, [])
+
+ for ofpp in ofpps:
+ for n in range(1, 3):
+ for C in itertools.combinations(L[ofpp], n):
+ l = [1]
+ keys = []
+ clss = []
+ for (k, cls) in C:
+ l = itertools.product(l, cls.generate())
+ keys.append(k)
+ clss.append(cls)
+ l = [flatten(x)[1:] for x in l]
+ for domask in [True, False]:
+ for values in l:
+ if domask:
+ values = [(value, cls.generate_mask())
+ for (cls, value)
+ in zip(clss, values)]
+ d = dict(zip(keys, values))
+ mod = ofpp.__name__.split('.')[-1]
+ method_name = 'test_' + mod
+ if domask:
+ method_name += '_mask'
+ for k in sorted(dict(d).keys()):
+ method_name += '_' + str(k)
+ method_name += '_' + str(d[k])
+ method_name = method_name.replace(':', '_')
+ method_name = method_name.replace('.', '_')
+ method_name = method_name.replace('(', '_')
+ method_name = method_name.replace(')', '_')
+ method_name = method_name.replace(',', '_')
+ method_name = method_name.replace("'", '_')
+ method_name = method_name.replace(' ', '_')
+
+ def _run(self, name, ofpp, d, domask):
+ print('processing %s ...' % name)
+ if six.PY3:
+ self._test(self, name, ofpp, d, domask)
+ else:
+ self._test(name, ofpp, d, domask)
+ print('adding %s ...' % method_name)
+ f = functools.partial(_run, name=method_name,
+ ofpp=ofpp, d=d, domask=domask)
+ test_lib.add_method(Test_Parser_OFPMatch,
+ method_name, f)
+
+_add_tests()
diff --git a/tests/unit/ofproto/test_parser_ofpstats.py b/tests/unit/ofproto/test_parser_ofpstats.py
new file mode 100644
index 00000000..3f413a42
--- /dev/null
+++ b/tests/unit/ofproto/test_parser_ofpstats.py
@@ -0,0 +1,208 @@
+# Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+try:
+ # Python 3
+ from functools import reduce
+except ImportError:
+ # Python 2
+ pass
+
+import unittest
+
+import six
+from nose.tools import eq_
+from nose.tools import ok_
+
+from ryu.ofproto import ofproto_v1_5
+from ryu.ofproto import ofproto_v1_5_parser
+
+from tests import test_lib
+
+
+class Test_Parser_OFPStats(unittest.TestCase):
+ _ofp = {ofproto_v1_5_parser: ofproto_v1_5}
+
+ def __init__(self, methodName):
+ print('init %s' % methodName)
+ super(Test_Parser_OFPStats, self).__init__(methodName)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def _test(self, name, ofpp, d):
+ stats = ofpp.OFPStats(**d)
+ b = bytearray()
+ stats.serialize(b, 0)
+ stats2 = stats.parser(six.binary_type(b), 0)
+ for k, v in d.items():
+ ok_(k in stats)
+ ok_(k in stats2)
+ eq_(stats[k], v)
+ eq_(stats2[k], v)
+ for k, v in stats.iteritems():
+ ok_(k in d)
+ eq_(d[k], v)
+ for k, v in stats2.iteritems():
+ ok_(k in d)
+ eq_(d[k], v)
+
+
+def _add_tests():
+ import functools
+ import itertools
+
+ class Field(object):
+ pass
+
+ class Int1(Field):
+ @staticmethod
+ def generate():
+ yield 0
+ yield 0xff
+
+ class Int2(Field):
+ @staticmethod
+ def generate():
+ yield 0
+ yield 0x1234
+ yield 0xffff
+
+ class Int3(Field):
+ @staticmethod
+ def generate():
+ yield 0
+ yield 0x123456
+ yield 0xffffff
+
+ class Int4(Field):
+ @staticmethod
+ def generate():
+ yield 0
+ yield 0x12345678
+ yield 0xffffffff
+
+ class Int4double(Field):
+ @staticmethod
+ def generate():
+ # Note: If yield value as a tuple, flatten_one() will reduce it
+ # into a single value. So the followings avoid this problem by
+ # using a list value.
+ yield [0, 1]
+ yield [0x12345678, 0x23456789]
+ yield [0xffffffff, 0xfffffffe]
+
+ class Int8(Field):
+ @staticmethod
+ def generate():
+ yield 0
+ yield 0x123456789abcdef0
+ yield 0xffffffffffffffff
+
+ class Mac(Field):
+ @staticmethod
+ def generate():
+ yield '00:00:00:00:00:00'
+ yield 'f2:0b:a4:7d:f8:ea'
+ yield 'ff:ff:ff:ff:ff:ff'
+
+ class IPv4(Field):
+ @staticmethod
+ def generate():
+ yield '0.0.0.0'
+ yield '192.0.2.1'
+ yield '255.255.255.255'
+
+ class IPv6(Field):
+ @staticmethod
+ def generate():
+ yield '::'
+ yield 'fe80::f00b:a4ff:fed0:3f70'
+ yield 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'
+
+ class B64(Field):
+ @staticmethod
+ def generate():
+ yield 'aG9nZWhvZ2U='
+ yield 'ZnVnYWZ1Z2E='
+
+ ofpps = [ofproto_v1_5_parser]
+ common = [
+ ('duration', Int4double),
+ ('idle_time', Int4double),
+ ('flow_count', Int4),
+ ('packet_count', Int8),
+ ('byte_count', Int8),
+ ('field_100', B64),
+ ]
+ L = {}
+ L[ofproto_v1_5_parser] = common
+
+ def flatten_one(l, i):
+ if isinstance(i, tuple):
+ return l + flatten(i)
+ else:
+ return l + [i]
+ flatten = lambda l: reduce(flatten_one, l, [])
+
+ for ofpp in ofpps:
+ for n in range(1, 3):
+ for C in itertools.combinations(L[ofpp], n):
+ l = [1]
+ keys = []
+ clss = []
+ for (k, cls) in C:
+ l = itertools.product(l, cls.generate())
+ keys.append(k)
+ clss.append(cls)
+ l = [flatten(x)[1:] for x in l]
+ for values in l:
+ d = dict(zip(keys, values))
+ for n, uv in d.items():
+ if isinstance(uv, list):
+ # XXX
+ # OFPStats returns value as tuple when field is
+ # 'duration' or 'idle_time'. Then convert list
+ # value into tuple here.
+ d[n] = tuple(uv)
+ mod = ofpp.__name__.split('.')[-1]
+ method_name = 'test_' + mod
+ for k in sorted(dict(d).keys()):
+ method_name += '_' + str(k)
+ method_name += '_' + str(d[k])
+ method_name = method_name.replace(':', '_')
+ method_name = method_name.replace('.', '_')
+ method_name = method_name.replace('(', '_')
+ method_name = method_name.replace(')', '_')
+ method_name = method_name.replace(',', '_')
+ method_name = method_name.replace("'", '_')
+ method_name = method_name.replace(' ', '_')
+
+ def _run(self, name, ofpp, d):
+ print('processing %s ...' % name)
+ if six.PY3:
+ self._test(self, name, ofpp, d)
+ else:
+ self._test(name, ofpp, d)
+ print('adding %s ...' % method_name)
+ f = functools.partial(_run, name=method_name,
+ ofpp=ofpp, d=d)
+ test_lib.add_method(Test_Parser_OFPStats,
+ method_name, f)
+
+_add_tests()
diff --git a/tests/unit/ofproto/test_parser_v10.py b/tests/unit/ofproto/test_parser_v10.py
new file mode 100644
index 00000000..eefb65f2
--- /dev/null
+++ b/tests/unit/ofproto/test_parser_v10.py
@@ -0,0 +1,5556 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import six
+from nose.tools import *
+from ryu.ofproto.ofproto_v1_0_parser import *
+from ryu.ofproto.nx_actions import *
+from ryu.ofproto import ofproto_v1_0_parser
+from ryu.lib import addrconv
+
+
+LOG = logging.getLogger('test_ofproto_v10')
+
+
+class TestOFPPhyPort(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPPhyPort
+ """
+
+ # OFP_PHY_PORT_PACK_STR
+ # '!H6s16sIIIIII'... port_no, hw_addr, name, config, state
+ # curr, advertised, supported, peer
+ port_no = {'buf': b'\xe7\x6b', 'val': 59243}
+ hw_addr = '52:54:54:10:20:99'
+ name = b'name'.ljust(16)
+ config = {'buf': b'\x84\xb6\x8c\x53', 'val': 2226555987}
+ state = {'buf': b'\x64\x07\xfb\xc9', 'val': 1678244809}
+ curr = {'buf': b'\xa9\xe8\x0a\x2b', 'val': 2850556459}
+ advertised = {'buf': b'\x78\xb9\x7b\x72', 'val': 2025421682}
+ supported = {'buf': b'\x7e\x65\x68\xad', 'val': 2120575149}
+ peer = {'buf': b'\xa4\x5b\x8b\xed', 'val': 2757463021}
+
+ buf = port_no['buf'] \
+ + addrconv.mac.text_to_bin(hw_addr) \
+ + name \
+ + config['buf'] \
+ + state['buf'] \
+ + curr['buf'] \
+ + advertised['buf'] \
+ + supported['buf'] \
+ + peer['buf']
+
+ c = OFPPhyPort(port_no['val'],
+ hw_addr,
+ name,
+ config['val'],
+ state['val'],
+ curr['val'],
+ advertised['val'],
+ supported['val'],
+ peer['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.port_no['val'], self.c.port_no)
+ eq_(self.hw_addr, self.c.hw_addr)
+ eq_(self.name, self.c.name)
+ eq_(self.config['val'], self.c.config)
+ eq_(self.state['val'], self.c.state)
+ eq_(self.curr['val'], self.c.curr)
+ eq_(self.advertised['val'], self.c.advertised)
+ eq_(self.supported['val'], self.c.supported)
+ eq_(self.peer['val'], self.c.peer)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(self.port_no['val'], res.port_no)
+ eq_(self.hw_addr, res.hw_addr)
+ eq_(self.name, res.name)
+ eq_(self.config['val'], res.config)
+ eq_(self.state['val'], res.state)
+ eq_(self.curr['val'], res.curr)
+ eq_(self.advertised['val'], res.advertised)
+ eq_(self.supported['val'], res.supported)
+ eq_(self.peer['val'], res.peer)
+
+
+class TestOFPMatch(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPMatch
+ """
+
+ # OFP_MATCH_PACK_STR
+ # '!IH6s6sHBxHBB2xIIHH'...wildcards, in_port, dl_src, dl_dst, dl_vlan,
+ # dl_vlan_pcp, dl_type, nw_tos, nw_proto,
+ # nw_src, nw_dst, tp_src, tp_dst
+ wildcards = {'buf': b'\x00\x02\x10\x00', 'val': 135168}
+ in_port = {'buf': b'\x37\x8b', 'val': 14219}
+ dl_src = {'buf': b'\x52\x54\x54\x10\x20\x99',
+ 'human': '52:54:54:10:20:99'}
+ dl_dst = {'buf': b'\x61\x31\x50\x6d\xc9\xe5',
+ 'human': '61:31:50:6d:c9:e5'}
+ dl_vlan = {'buf': b'\xc1\xf9', 'val': 49657}
+ dl_vlan_pcp = {'buf': b'\x79', 'val': 121}
+ zfill0 = b'\x00'
+ dl_type = {'buf': b'\xa6\x9e', 'val': 42654}
+ nw_tos = {'buf': b'\xde', 'val': 222}
+ nw_proto = {'buf': b'\xe5', 'val': 229}
+ zfil11 = b'\x00' * 2
+ nw_src = {'buf': b'\x1b\x6d\x8d\x4b', 'val': 460164427,
+ 'human': '27.109.141.75'}
+ nw_dst = {'buf': b'\xab\x25\xe1\x20', 'val': 2871386400,
+ 'human': '171.37.225.32'}
+ tp_src = {'buf': b'\xd5\xc3', 'val': 54723}
+ tp_dst = {'buf': b'\x78\xb9', 'val': 30905}
+
+ buf = wildcards['buf'] \
+ + in_port['buf'] \
+ + dl_src['buf'] \
+ + dl_dst['buf'] \
+ + dl_vlan['buf'] \
+ + dl_vlan_pcp['buf'] \
+ + zfill0 \
+ + dl_type['buf'] \
+ + nw_tos['buf'] \
+ + nw_proto['buf'] \
+ + zfil11 \
+ + nw_src['buf'] \
+ + nw_dst['buf'] \
+ + tp_src['buf'] \
+ + tp_dst['buf']
+
+ def _get_obj(self, dl_src, dl_dst):
+ c = OFPMatch(self.wildcards['val'],
+ self.in_port['val'],
+ dl_src,
+ dl_dst,
+ self.dl_vlan['val'],
+ self.dl_vlan_pcp['val'],
+ self.dl_type['val'],
+ self.nw_tos['val'],
+ self.nw_proto['val'],
+ self.nw_src['val'],
+ self.nw_dst['val'],
+ self.tp_src['val'],
+ self.tp_dst['val'])
+ return c
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ c = self._get_obj(self.dl_src['buf'], self.dl_dst['buf'])
+
+ eq_(self.wildcards['val'], c.wildcards)
+ eq_(self.in_port['val'], c.in_port)
+ eq_(self.dl_src['buf'], c.dl_src)
+ eq_(self.dl_dst['buf'], c.dl_dst)
+ eq_(self.dl_vlan['val'], c.dl_vlan)
+ eq_(self.dl_vlan_pcp['val'], c.dl_vlan_pcp)
+ eq_(self.dl_type['val'], c.dl_type)
+ eq_(self.nw_tos['val'], c.nw_tos)
+ eq_(self.nw_proto['val'], c.nw_proto)
+ eq_(self.nw_src['val'], c.nw_src)
+ eq_(self.nw_dst['val'], c.nw_dst)
+ eq_(self.tp_src['val'], c.tp_src)
+ eq_(self.tp_dst['val'], c.tp_dst)
+
+ def test_init_zero(self):
+ c = self._get_obj(0, 0)
+ eq_(mac.DONTCARE, c.dl_src)
+ eq_(mac.DONTCARE, c.dl_dst)
+
+ def test_parse(self):
+ c = self._get_obj(self.dl_src['buf'], self.dl_dst['buf'])
+ res = c.parse(self.buf, 0)
+
+ eq_(self.wildcards['val'], res.wildcards)
+ eq_(self.in_port['val'], res.in_port)
+ eq_(self.dl_src['buf'], res.dl_src)
+ eq_(self.dl_dst['buf'], res.dl_dst)
+ eq_(self.dl_vlan['val'], res.dl_vlan)
+ eq_(self.dl_vlan_pcp['val'], res.dl_vlan_pcp)
+ eq_(self.dl_type['val'], res.dl_type)
+ eq_(self.nw_tos['val'], res.nw_tos)
+ eq_(self.nw_proto['val'], res.nw_proto)
+ eq_(self.nw_src['val'], res.nw_src)
+ eq_(self.nw_dst['val'], res.nw_dst)
+ eq_(self.tp_src['val'], res.tp_src)
+ eq_(self.tp_dst['val'], res.tp_dst)
+
+ def test_serialize(self):
+ buf = bytearray()
+ c = self._get_obj(self.dl_src['buf'], self.dl_dst['buf'])
+
+ c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_MATCH_PACK_STR
+ res = struct.unpack_from(fmt, six.binary_type(buf))
+
+ eq_(self.wildcards['val'], res[0])
+ eq_(self.in_port['val'], res[1])
+ eq_(self.dl_src['buf'], res[2])
+ eq_(self.dl_dst['buf'], res[3])
+ eq_(self.dl_vlan['val'], res[4])
+ eq_(self.dl_vlan_pcp['val'], res[5])
+ eq_(self.dl_type['val'], res[6])
+ eq_(self.nw_tos['val'], res[7])
+ eq_(self.nw_proto['val'], res[8])
+ eq_(self.nw_src['val'], res[9])
+ eq_(self.nw_dst['val'], res[10])
+ eq_(self.tp_src['val'], res[11])
+ eq_(self.tp_dst['val'], res[12])
+
+ def test_getitem(self):
+ c = self._get_obj(self.dl_src['buf'], self.dl_dst['buf'])
+
+ eq_(self.wildcards['val'], c["wildcards"])
+ eq_(self.in_port['val'], c["in_port"])
+ eq_(self.dl_src['human'], c["dl_src"])
+ eq_(self.dl_dst['human'], c["dl_dst"])
+ eq_(self.dl_vlan['val'], c["dl_vlan"])
+ eq_(self.dl_vlan_pcp['val'], c["dl_vlan_pcp"])
+ eq_(self.dl_type['val'], c["dl_type"])
+ eq_(self.nw_tos['val'], c["nw_tos"])
+ eq_(self.nw_proto['val'], c["nw_proto"])
+ eq_(self.nw_src['human'], c["nw_src"])
+ eq_(self.nw_dst['human'], c["nw_dst"])
+ eq_(self.tp_src['val'], c["tp_src"])
+ eq_(self.tp_dst['val'], c["tp_dst"])
+
+
+class TestOFPActionHeader(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionHeader
+ """
+
+ # OFP_ACTION_HEADER_PACK_STR
+ # '!HH4x'...type, len, zfill
+ type = {'buf': b'\x00\x02', 'val': ofproto.OFPAT_SET_VLAN_PCP}
+ len = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_HEADER_SIZE}
+ zfill = b'\x00' * 4
+
+ buf = type['buf'] \
+ + len['buf'] \
+ + zfill
+
+ c = OFPActionHeader(type['val'], len['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.type['val'], self.c.type)
+ eq_(self.len['val'], self.c.len)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_HEADER_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type['val'], res[0])
+ eq_(self.len['val'], res[1])
+
+
+class TestOFPActionOutput(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionOutput
+ """
+
+ # OFP_ACTION_OUTPUT_PACK_STR
+ # '!HHHH'...type, len, port, max_len
+ type_ = {'buf': b'\x00\x00', 'val': ofproto.OFPAT_OUTPUT}
+ len_ = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_OUTPUT_SIZE}
+ port = {'buf': b'\x19\xce', 'val': 6606}
+ max_len = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_OUTPUT_SIZE}
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + port['buf'] \
+ + max_len['buf']
+
+ c = OFPActionOutput(port['val'], max_len['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.port['val'], self.c.port)
+ eq_(self.max_len['val'], self.c.max_len)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(self.port['val'], res.port)
+ eq_(self.max_len['val'], res.max_len)
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x01', 'val': 1}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.port['buf'] \
+ + self.max_len['buf']
+
+ self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x07', 'val': 7}
+
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.port['buf'] \
+ + self.max_len['buf']
+
+ self.c.parser(buf, 0)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_OUTPUT_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.port['val'], res[2])
+ eq_(self.max_len['val'], res[3])
+
+
+class TestOFPActionVlanVid(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionVlanVid
+ """
+
+ # OFP_ACTION_VLAN_VID_PACK_STR
+ # '!HHH2x'...type, len, vlan_vid, zfill
+ type_ = {'buf': b'\x00\x01', 'val': ofproto.OFPAT_SET_VLAN_VID}
+ len_ = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_VLAN_VID_SIZE}
+ vlan_vid = {'buf': b'\x3c\x0e', 'val': 15374}
+ zfill = b'\x00' * 2
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vlan_vid['buf'] \
+ + zfill
+
+ c = OFPActionVlanVid(vlan_vid['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.vlan_vid['val'], self.c.vlan_vid)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(self.vlan_vid['val'], res.vlan_vid)
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x02', 'val': 2}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.vlan_vid['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x07', 'val': 7}
+
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.vlan_vid['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_VLAN_VID_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vlan_vid['val'], res[2])
+
+
+class TestOFPActionVlanPcp(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionVlanPcp
+ """
+
+ # OFP_ACTION_VLAN_PCP_PACK_STR
+ # '!HHB3x'...type, len, vlan_pcp, zfill
+ type_ = {'buf': b'\x00\x02', 'val': ofproto.OFPAT_SET_VLAN_PCP}
+ len_ = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_VLAN_PCP_SIZE}
+ vlan_pcp = {'buf': b'\x1c', 'val': 28}
+ zfill = b'\x00' * 3
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vlan_pcp['buf'] \
+ + zfill
+
+ c = OFPActionVlanPcp(vlan_pcp['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.vlan_pcp['val'], self.c.vlan_pcp)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(self.vlan_pcp['val'], res.vlan_pcp)
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x01', 'val': 1}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.vlan_pcp['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x07', 'val': 7}
+
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.vlan_pcp['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_VLAN_PCP_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vlan_pcp['val'], res[2])
+
+
+class TestOFPActionStripVlan(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionStripVlan
+ """
+
+ # OFP_ACTION_HEADER_PACK_STR
+ # '!HH4x'...type, len, zfill
+ type_ = {'buf': b'\x00\x03', 'val': ofproto.OFPAT_STRIP_VLAN}
+ len_ = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_HEADER_SIZE}
+ zfill = b'\x00' * 4
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + zfill
+
+ c = OFPActionStripVlan()
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ ok_(self.c.parser(self.buf, 0))
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x01', 'val': 1}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x07', 'val': 7}
+
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+
+class TestOFPActionSetDlSrc(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionSetDlSrc
+ """
+
+ # OFP_ACTION_DL_ADDR_PACK_STR
+ # '!HH6s6x'...type, len, dl_addr, zfill
+ type_ = {'buf': b'\x00\x04', 'val': ofproto.OFPAT_SET_DL_SRC}
+ len_ = {'buf': b'\x00\x10', 'val': ofproto.OFP_ACTION_DL_ADDR_SIZE}
+ dl_addr = b'\x0e\xde\x27\xce\xc6\xcf'
+ zfill = b'\x00' * 6
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + dl_addr \
+ + zfill
+
+ c = OFPActionSetDlSrc(dl_addr)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.dl_addr, self.c.dl_addr)
+
+ def test_parser_type_src(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(self.dl_addr, res.dl_addr)
+
+ def test_parser_type_dst(self):
+ type_ = {'buf': b'\x00\x05', 'val': ofproto.OFPAT_SET_DL_DST}
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.dl_addr \
+ + self.zfill
+
+ res = self.c.parser(buf, 0)
+
+ eq_(self.dl_addr, res.dl_addr)
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x06', 'val': 6}
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.dl_addr \
+ + self.zfill
+
+ res = self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x07', 'val': 7}
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.dl_addr \
+ + self.zfill
+
+ res = self.c.parser(buf, 0)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_DL_ADDR_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.dl_addr, res[2])
+
+
+class TestOFPActionSetDlDst(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionSetDlDst
+ """
+
+ # OFP_ACTION_DL_ADDR_PACK_STR
+ # '!HH6s6x'...type, len, dl_addr, zfill
+ type_ = {'buf': b'\x00\x05', 'val': ofproto.OFPAT_SET_DL_DST}
+ len_ = {'buf': b'\x00\x10', 'val': ofproto.OFP_ACTION_DL_ADDR_SIZE}
+ dl_addr = b'\x37\x48\x38\x9a\xf4\x28'
+ zfill = b'\x00' * 6
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + dl_addr \
+ + zfill
+
+ c = OFPActionSetDlDst(dl_addr)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.dl_addr, self.c.dl_addr)
+
+ def test_parser_type_dst(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(self.dl_addr, res.dl_addr)
+
+ def test_parser_type_src(self):
+ type_ = {'buf': b'\x00\x04', 'val': ofproto.OFPAT_SET_DL_SRC}
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.dl_addr \
+ + self.zfill
+
+ res = self.c.parser(buf, 0)
+
+ eq_(self.dl_addr, res.dl_addr)
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x06', 'val': 6}
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.dl_addr \
+ + self.zfill
+
+ res = self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x07', 'val': 7}
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.dl_addr \
+ + self.zfill
+
+ res = self.c.parser(buf, 0)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_DL_ADDR_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.dl_addr, res[2])
+
+
+class TestOFPActionSetNwSrc(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionSetNwSrc
+ """
+
+ # OFP_ACTION_NW_ADDR_PACK_STR
+ # '!HHI'...type, len, nw_addr
+ type_ = {'buf': b'\x00\x06', 'val': ofproto.OFPAT_SET_NW_SRC}
+ len_ = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_NW_ADDR_SIZE}
+ nw_addr = {'buf': b'\xc0\xa8\x7a\x0a', 'val': 3232266762}
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + nw_addr['buf']
+
+ c = OFPActionSetNwSrc(nw_addr['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.nw_addr['val'], self.c.nw_addr)
+
+ def test_parser_src(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(self.nw_addr['val'], res.nw_addr)
+
+ def test_parser_dst(self):
+ type_ = {'buf': b'\x00\x07', 'val': ofproto.OFPAT_SET_NW_DST}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.nw_addr['buf']
+
+ res = self.c.parser(buf, 0)
+ eq_(self.nw_addr['val'], res.nw_addr)
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x05', 'val': 5}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.nw_addr['buf']
+
+ self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x10', 'val': 16}
+
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.nw_addr['buf']
+
+ self.c.parser(buf, 0)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_NW_ADDR_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.nw_addr['val'], res[2])
+
+
+class TestOFPActionSetNwDst(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionSetNwDst
+ """
+
+ # OFP_ACTION_NW_ADDR_PACK_STR
+ # '!HHI'...type, len, nw_addr
+ type_ = {'buf': b'\x00\x07', 'val': ofproto.OFPAT_SET_NW_DST}
+ len_ = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_NW_ADDR_SIZE}
+ nw_addr = {'buf': b'\xc0\xa8\x7a\x0a', 'val': 3232266762}
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + nw_addr['buf']
+
+ c = OFPActionSetNwDst(nw_addr['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.nw_addr['val'], self.c.nw_addr)
+
+ def test_parser_dst(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(self.nw_addr['val'], res.nw_addr)
+
+ def test_parser_src(self):
+ type_ = {'buf': b'\x00\x06', 'val': ofproto.OFPAT_SET_NW_SRC}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.nw_addr['buf']
+
+ res = self.c.parser(buf, 0)
+ eq_(self.nw_addr['val'], res.nw_addr)
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x05', 'val': 5}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.nw_addr['buf']
+
+ self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x10', 'val': 16}
+
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.nw_addr['buf']
+
+ self.c.parser(buf, 0)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_NW_ADDR_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.nw_addr['val'], res[2])
+
+
+class TestOFPActionSetNwTos(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionSetNwTos
+ """
+
+ # OFP_ACTION_NW_TOS_PACK_STR
+ # '!HHB3x'...type, len, tos, zfill
+ type_ = {'buf': b'\x00\x08', 'val': ofproto.OFPAT_SET_NW_TOS}
+ len_ = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_NW_TOS_SIZE}
+ tos = {'buf': b'\xb6', 'val': 182}
+ zfill = b'\x00' * 3
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + tos['buf'] \
+ + zfill
+
+ c = OFPActionSetNwTos(tos['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.tos['val'], self.c.tos)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(self.tos['val'], res.tos)
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x05', 'val': 5}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.tos['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x07', 'val': 7}
+
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.tos['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_NW_TOS_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.tos['val'], res[2])
+
+
+class TestOFPActionSetTpSrc(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionSetTpSrc
+ """
+
+ # OFP_ACTION_TP_PORT_PACK_STR
+ # '!HHH2x'...type, len, tp, zfill
+ type_ = {'buf': b'\x00\x09', 'val': ofproto.OFPAT_SET_TP_SRC}
+ len_ = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_TP_PORT_SIZE}
+ tp = {'buf': b'\x07\xf1', 'val': 2033}
+ zfill = b'\x00' * 2
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + tp['buf'] \
+ + zfill
+
+ c = OFPActionSetTpSrc(tp['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.tp['val'], self.c.tp)
+
+ def test_parser_src(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(self.tp['val'], res.tp)
+
+ def test_parser_dst(self):
+ type_ = {'buf': b'\x00\x0a', 'val': ofproto.OFPAT_SET_TP_DST}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.tp['buf'] \
+ + self.zfill
+
+ res = self.c.parser(self.buf, 0)
+ eq_(self.tp['val'], res.tp)
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x07', 'val': 7}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.tp['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x07', 'val': 7}
+
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.tp['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_TP_PORT_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.tp['val'], res[2])
+
+
+class TestOFPActionSetTpDst(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionSetTpDst
+ """
+
+ # OFP_ACTION_TP_PORT_PACK_STR
+ # '!HHH2x'...type, len, tp, zfill
+ type_ = {'buf': b'\x00\x0a', 'val': ofproto.OFPAT_SET_TP_DST}
+ len_ = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_TP_PORT_SIZE}
+ tp = {'buf': b'\x06\x6d', 'val': 1645}
+ zfill = b'\x00' * 2
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + tp['buf'] \
+ + zfill
+
+ c = OFPActionSetTpDst(tp['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.tp['val'], self.c.tp)
+
+ def test_parser_dst(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(self.tp['val'], res.tp)
+
+ def test_parser_src(self):
+ type_ = {'buf': b'\x00\x09', 'val': ofproto.OFPAT_SET_TP_SRC}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.tp['buf'] \
+ + self.zfill
+
+ res = self.c.parser(buf, 0)
+ eq_(self.tp['val'], res.tp)
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x10', 'val': 16}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.tp['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x07', 'val': 7}
+
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.tp['buf'] \
+ + self.zfill
+
+ self.c.parser(buf, 0)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_TP_PORT_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.tp['val'], res[2])
+
+
+class TestOFPActionEnqueue(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPActionEnqueue
+ """
+
+ # OFP_ACTION_ENQUEUE_PACK_STR
+ # '!HHH6xI'...type_, len_, port, zfill, queue_id
+ type_ = {'buf': b'\x00\x0b', 'val': ofproto.OFPAT_ENQUEUE}
+ len_ = {'buf': b'\x00\x10', 'val': ofproto.OFP_ACTION_ENQUEUE_SIZE}
+ port = {'buf': b'\x04\x55', 'val': 1109}
+ zfill = b'\x00' * 6
+ queue_id = {'buf': b'\x0a\x5b\x03\x5e', 'val': 173736798}
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + port['buf'] \
+ + zfill \
+ + queue_id['buf']
+
+ c = OFPActionEnqueue(port['val'], queue_id['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.port['val'], self.c.port)
+ eq_(self.queue_id['val'], self.c.queue_id)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(self.port['val'], res.port)
+ eq_(self.queue_id['val'], res.queue_id)
+
+ @raises(AssertionError)
+ def test_parser_check_type(self):
+ type_ = {'buf': b'\x00\x0a', 'val': 10}
+
+ buf = type_['buf'] \
+ + self.len_['buf'] \
+ + self.port['buf'] \
+ + self.zfill \
+ + self.queue_id['buf']
+
+ self.c.parser(buf, 0)
+
+ @raises(AssertionError)
+ def test_parser_check_len(self):
+ len_ = {'buf': b'\x00\x05', 'val': 5}
+
+ buf = self.type_['buf'] \
+ + len_['buf'] \
+ + self.port['buf'] \
+ + self.zfill \
+ + self.queue_id['buf']
+
+ self.c.parser(buf, 0)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_ENQUEUE_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.port['val'], res[2])
+ eq_(self.queue_id['val'], res[3])
+
+
+class TestNXActionResubmit(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionResubmit
+ """
+
+ # NX_ACTION_RESUBMIT_PACK_STR
+ # '!HHIHHB3x'...type, len, vendor, subtype, in_port, table, zfill
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x10', 'val': ofproto.NX_ACTION_RESUBMIT_SIZE}
+ vendor = {'buf': b'\x00\x00\x23\x20', 'val': 8992}
+ subtype = {'buf': b'\x00\x01', 'val': 1}
+ in_port = {'buf': b'\x0a\x4c', 'val': 2636}
+ table = {'buf': b'\x52', 'val': 82}
+ zfill = b'\x00' * 3
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + in_port['buf'] \
+ + table['buf'] \
+ + zfill
+
+ c = NXActionResubmit(in_port['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+ eq_(self.in_port['val'], self.c.in_port)
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.in_port['val'], res.in_port)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.NX_ACTION_RESUBMIT_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+ eq_(self.in_port['val'], res[4])
+
+
+class TestNXActionResubmitTable(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionResubmitTable
+ """
+
+ # NX_ACTION_RESUBMIT_PACK_STR
+ # '!HHIHHB3x'...type, len, vendor, subtype, in_port, table, zfill
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x10', 'val': ofproto.NX_ACTION_RESUBMIT_SIZE}
+ vendor = {'buf': b'\x00\x00\x23\x20', 'val': 8992}
+ subtype = {'buf': b'\x00\x0e', 'val': 14}
+ in_port = {'buf': b'\x0a\x4c', 'val': 2636}
+ table_id = {'buf': b'\x52', 'val': 82}
+ zfill = b'\x00' * 3
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + in_port['buf'] \
+ + table_id['buf'] \
+ + zfill
+
+ c = NXActionResubmitTable(in_port['val'], table_id['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+ eq_(self.in_port['val'], self.c.in_port)
+ eq_(self.table_id['val'], self.c.table_id)
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.in_port['val'], res.in_port)
+ eq_(self.table_id['val'], res.table_id)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.NX_ACTION_RESUBMIT_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+ eq_(self.in_port['val'], res[4])
+ eq_(self.table_id['val'], res[5])
+
+
+class TestNXActionSetTunnel(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionSetTunnel
+ """
+
+ # NX_ACTION_SET_TUNNEL_PACK_STR
+ # '!HHIH2xI'...type, len, vendor, subtype, zfill, tun_id
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x10', 'val': ofproto.NX_ACTION_SET_TUNNEL_SIZE}
+ vendor = {'buf': b'\x00\x00\x23\x20', 'val': 8992}
+ subtype = {'buf': b'\x00\x02', 'val': 2}
+ zfill = b'\x00' * 2
+ tun_id = {'buf': b'\x01\x6f\x01\xd0', 'val': 24052176}
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + zfill \
+ + tun_id['buf']
+
+ c = NXActionSetTunnel(tun_id['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+ eq_(self.tun_id['val'], self.c.tun_id)
+
+ def test_parse(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.tun_id['val'], res.tun_id)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.NX_ACTION_SET_TUNNEL_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+ eq_(self.tun_id['val'], res[4])
+
+
+class TestNXActionSetQueue(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionSetQueue
+ """
+
+ # NX_ACTION_SET_QUEUE_PACK_STR
+ # '!HHIH2xI'...type, len, vendor, subtype, zfill, queue_id
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x10', 'val': ofproto.NX_ACTION_SET_TUNNEL_SIZE}
+ vendor = {'buf': b'\x00\x00\x23\x20',
+ 'val': ofproto_common.NX_EXPERIMENTER_ID}
+ subtype = {'buf': b'\x00\x04', 'val': ofproto.NXAST_SET_QUEUE}
+ zfill = b'\x00' * 2
+ queue_id = {'buf': b'\xde\xbe\xc5\x18', 'val': 3737044248}
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + zfill \
+ + queue_id['buf']
+
+ c = NXActionSetQueue(queue_id['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+ eq_(self.queue_id['val'], self.c.queue_id)
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.queue_id['val'], res.queue_id)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.NX_ACTION_SET_QUEUE_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+ eq_(self.queue_id['val'], res[4])
+
+
+class TestNXActionPopQueue(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionPopQueue
+ """
+
+ # NX_ACTION_POP_QUEUE_PACK_STR
+ # '!HHIH6x'...type, len, vendor, subtype, zfill
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x10', 'val': ofproto.NX_ACTION_SET_TUNNEL_SIZE}
+ vendor = {'buf': b'\x00\x00\x23\x20',
+ 'val': ofproto_common.NX_EXPERIMENTER_ID}
+ subtype = {'buf': b'\x00\x05', 'val': ofproto.NXAST_POP_QUEUE}
+ zfill = b'\x00' * 6
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + zfill
+
+ c = NXActionPopQueue()
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.subtype['val'], res.subtype)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.NX_ACTION_POP_QUEUE_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+
+
+class TestNXActionRegMove(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionRegMove
+ """
+
+ # NX_ACTION_REG_MOVE_PACK_STR
+ # '!HHIHHHHII'...type_, len_, vendor, subtype, n_bits,
+ # src_ofs, dst_ofs, src, dst
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x18', 'val': ofproto.NX_ACTION_REG_MOVE_SIZE}
+ vendor = {'buf': b'\x00\x00\x23\x20',
+ 'val': ofproto_common.NX_EXPERIMENTER_ID}
+ subtype = {'buf': b'\x00\x06', 'val': ofproto.NXAST_REG_MOVE}
+ n_bits = {'buf': b'\x3d\x98', 'val': 15768}
+ src_ofs = {'buf': b'\xf3\xa3', 'val': 62371}
+ dst_ofs = {'buf': b'\xdc\x67', 'val': 56423}
+ src_field = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", "val2": 65540}
+ dst_field = {'buf': b'\x00\x01\x02\x04', 'val': "reg1", "val2": 66052}
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + n_bits['buf'] \
+ + src_ofs['buf'] \
+ + dst_ofs['buf'] \
+ + src_field['buf'] \
+ + dst_field['buf']
+
+ c = NXActionRegMove(src_field['val'],
+ dst_field['val'],
+ n_bits['val'],
+ src_ofs['val'],
+ dst_ofs['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+ eq_(self.src_field['val'], self.c.src_field)
+ eq_(self.dst_field['val'], self.c.dst_field)
+ eq_(self.n_bits['val'], self.c.n_bits)
+ eq_(self.src_field['val'], self.c.src_field)
+ eq_(self.dst_field['val'], self.c.dst_field)
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.subtype['val'], res.subtype)
+ eq_(self.src_ofs['val'], res.src_ofs)
+ eq_(self.dst_ofs['val'], res.dst_ofs)
+ eq_(self.n_bits['val'], res.n_bits)
+ eq_(self.src_field['val'], res.src_field)
+ eq_(self.dst_field['val'], res.dst_field)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.NX_ACTION_REG_MOVE_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+ eq_(self.n_bits['val'], res[4])
+ eq_(self.src_ofs['val'], res[5])
+ eq_(self.dst_ofs['val'], res[6])
+ eq_(self.src_field['val2'], res[7])
+ eq_(self.dst_field['val2'], res[8])
+
+
+class TestNXActionRegLoad(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionRegLoad
+ """
+
+ # NX_ACTION_REG_LOAD_PACK_STR
+ # '!HHIHHIQ'...type_, len_, vendor, subtype,
+ # ofs_nbits, dst, value
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x18', 'val': ofproto.NX_ACTION_REG_MOVE_SIZE}
+ vendor = {'buf': b'\x00\x00\x23\x20',
+ 'val': ofproto_common.NX_EXPERIMENTER_ID}
+ subtype = {'buf': b'\x00\x07', 'val': ofproto.NXAST_REG_LOAD}
+ ofs_nbits = {'buf': b'\x3d\x98', 'val': 15768}
+ dst = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", "val2": 65540}
+ value = {'buf': b'\x33\x51\xcd\x43\x25\x28\x18\x99',
+ 'val': 3697962457317775513}
+ start = 246
+ end = 270
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + ofs_nbits['buf'] \
+ + dst['buf'] \
+ + value['buf']
+
+ c = NXActionRegLoad(ofs_nbits['val'],
+ dst['val'],
+ value['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+ eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
+ eq_(self.dst['val'], self.c.dst)
+ eq_(self.value['val'], self.c.value)
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
+ eq_(self.dst['val'], res.dst)
+ eq_(self.value['val'], res.value)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.NX_ACTION_REG_LOAD_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+ eq_(self.ofs_nbits['val'], res[4])
+ eq_(self.dst['val2'], res[5])
+ eq_(self.value['val'], res[6])
+
+
+class TestNXActionSetTunnel64(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionSetTunnel64
+ """
+
+ # NX_ACTION_SET_TUNNEL64_PACK_STR
+ # '!HHIH6xQ'...type, len, vendor, subtype, zfill, tun_id
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x18', 'val': ofproto.NX_ACTION_SET_TUNNEL64_SIZE}
+ vendor = {'buf': b'\x00\x00\x23\x20',
+ 'val': ofproto_common.NX_EXPERIMENTER_ID}
+ subtype = {'buf': b'\x00\x09', 'val': ofproto.NXAST_SET_TUNNEL64}
+ zfill = b'\x00' * 6
+ tun_id = {'buf': b'\x6e\x01\xa6\xea\x7e\x36\x1d\xd9',
+ 'val': 7926800345218817497}
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + zfill \
+ + tun_id['buf']
+
+ c = NXActionSetTunnel64(tun_id['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+ eq_(self.tun_id['val'], self.c.tun_id)
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.subtype['val'], res.subtype)
+ eq_(self.tun_id['val'], res.tun_id)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.NX_ACTION_SET_TUNNEL64_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+ eq_(self.tun_id['val'], res[4])
+
+
+class TestNXActionMultipath(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionMultipath
+ """
+
+ # NX_ACTION_MULTIPATH_PACK_STR
+ # '!HHIHHH2xHHI2xHI'...type, len, vendor, subtype, fields, basis, zfill
+ # algorithm, max_link, arg, zfill, ofs_nbits, dst
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x20', 'val': ofproto.NX_ACTION_MULTIPATH_SIZE}
+ vendor = {'buf': b'\x00\x00\x23\x20',
+ 'val': ofproto_common.NX_EXPERIMENTER_ID}
+ subtype = {'buf': b'\x00\x0a', 'val': ofproto.NXAST_MULTIPATH}
+ fields = {'buf': b'\x6d\xf5', 'val': 28149}
+ basis = {'buf': b'\x7c\x0a', 'val': 31754}
+ zfill0 = b'\x00' * 2
+ algorithm = {'buf': b'\x82\x1d', 'val': 33309}
+ max_link = {'buf': b'\x06\x2b', 'val': 1579}
+ arg = {'buf': b'\x18\x79\x41\xc8', 'val': 410599880}
+ zfill1 = b'\x00' * 2
+ ofs_nbits = {'buf': b'\xa9\x9a', 'val': 43418}
+ dst = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", 'val2': 65540}
+ start = 678
+ end = 704
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + fields['buf'] \
+ + basis['buf'] \
+ + zfill0 \
+ + algorithm['buf'] \
+ + max_link['buf'] \
+ + arg['buf'] \
+ + zfill1 \
+ + ofs_nbits['buf'] \
+ + dst['buf']
+
+ c = NXActionMultipath(fields['val'],
+ basis['val'],
+ algorithm['val'],
+ max_link['val'],
+ arg['val'],
+ ofs_nbits['val'],
+ dst['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+ eq_(self.fields['val'], self.c.fields)
+ eq_(self.basis['val'], self.c.basis)
+ eq_(self.algorithm['val'], self.c.algorithm)
+ eq_(self.max_link['val'], self.c.max_link)
+ eq_(self.arg['val'], self.c.arg)
+ eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
+ eq_(self.dst['val'], self.c.dst)
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.subtype['val'], res.subtype)
+ eq_(self.fields['val'], res.fields)
+ eq_(self.basis['val'], res.basis)
+ eq_(self.algorithm['val'], res.algorithm)
+ eq_(self.max_link['val'], res.max_link)
+ eq_(self.arg['val'], res.arg)
+ eq_(self.ofs_nbits['val'], res.ofs_nbits)
+ eq_(self.dst['val'], res.dst)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.NX_ACTION_MULTIPATH_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+ eq_(self.fields['val'], res[4])
+ eq_(self.basis['val'], res[5])
+ eq_(self.algorithm['val'], res[6])
+ eq_(self.max_link['val'], res[7])
+ eq_(self.arg['val'], res[8])
+ eq_(self.ofs_nbits['val'], res[9])
+ eq_(self.dst['val2'], res[10])
+
+
+class TestNXActionBundle(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionBundle
+ """
+
+ # NX_ACTION_BUNDLE_PACK_STR
+ # '!HHIHHHHIHHI4x'...type, len, vendor, subtype, algorithm,
+ # fields, basis, slave_type, n_slaves,
+ # ofs_nbits, dst, zfill
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x28', 'val': (ofproto.NX_ACTION_BUNDLE_SIZE + 8)}
+ vendor = {'buf': b'\x00\x00\x23\x20',
+ 'val': ofproto_common.NX_EXPERIMENTER_ID}
+ subtype = {'buf': b'\x00\x0c', 'val': ofproto.NXAST_BUNDLE}
+ algorithm = {'buf': b'\x51\xa7', 'val': 20903}
+ fields = {'buf': b'\xf8\xef', 'val': 63727}
+ basis = {'buf': b'\xfd\x6f', 'val': 64879}
+ slave_type = {'buf': b'\x7c\x51\x0f\xe0', 'val': 2085687264}
+ n_slaves = {'buf': b'\x00\x02', 'val': 2}
+ ofs_nbits = {'buf': b'\x00\x00', 'val': 0}
+ dst = {'buf': b'\x00\x00\x00\x00', 'val': 0}
+ zfill = b'\x00' * 4
+
+ slaves_buf = (b'\x00\x01', b'\x00\x02')
+ slaves_val = (1, 2)
+
+ _len = len_['val'] + len(slaves_val) * 2
+ _len += (_len % 8)
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + algorithm['buf'] \
+ + fields['buf'] \
+ + basis['buf'] \
+ + slave_type['buf'] \
+ + n_slaves['buf'] \
+ + ofs_nbits['buf'] \
+ + dst['buf'] \
+ + zfill \
+ + slaves_buf[0] \
+ + slaves_buf[1]
+
+ c = NXActionBundle(algorithm['val'],
+ fields['val'],
+ basis['val'],
+ slave_type['val'],
+ n_slaves['val'],
+ ofs_nbits['val'],
+ dst['val'],
+ slaves_val)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+ eq_(self.algorithm['val'], self.c.algorithm)
+ eq_(self.fields['val'], self.c.fields)
+ eq_(self.basis['val'], self.c.basis)
+ eq_(self.slave_type['val'], self.c.slave_type)
+ eq_(self.n_slaves['val'], self.c.n_slaves)
+ eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
+ eq_(self.dst['val'], self.c.dst)
+
+ # slaves
+ slaves = self.c.slaves
+ eq_(self.slaves_val[0], slaves[0])
+ eq_(self.slaves_val[1], slaves[1])
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.subtype['val'], res.subtype)
+ eq_(self.algorithm['val'], res.algorithm)
+ eq_(self.fields['val'], res.fields)
+ eq_(self.basis['val'], res.basis)
+ eq_(self.slave_type['val'], res.slave_type)
+ eq_(self.n_slaves['val'], res.n_slaves)
+ eq_(self.ofs_nbits['val'], res.ofs_nbits)
+ eq_(self.dst['val'], res.dst)
+
+ # slaves
+ slaves = res.slaves
+ eq_(self.slaves_val[0], slaves[0])
+ eq_(self.slaves_val[1], slaves[1])
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = '!' \
+ + ofproto.NX_ACTION_BUNDLE_PACK_STR.replace('!', '') \
+ + 'HH4x'
+
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+ eq_(self.algorithm['val'], res[4])
+ eq_(self.fields['val'], res[5])
+ eq_(self.basis['val'], res[6])
+ eq_(self.slave_type['val'], res[7])
+ eq_(self.n_slaves['val'], res[8])
+ eq_(self.ofs_nbits['val'], res[9])
+ eq_(self.dst['val'], res[10])
+
+
+class TestNXActionBundleLoad(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionBundleLoad
+ """
+
+ # NX_ACTION_BUNDLE_PACK_STR
+ # '!HHIHHHHIHHI4x'...type, len, vendor, subtype, algorithm,
+ # fields, basis, slave_type, n_slaves,
+ # ofs_nbits, dst, zfill
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x28', 'val': (ofproto.NX_ACTION_BUNDLE_SIZE + 8)}
+ vendor = {'buf': b'\x00\x00\x23\x20',
+ 'val': ofproto_common.NX_EXPERIMENTER_ID}
+ subtype = {'buf': b'\x00\x0d', 'val': ofproto.NXAST_BUNDLE_LOAD}
+ algorithm = {'buf': b'\x83\x15', 'val': 33557}
+ fields = {'buf': b'\xc2\x7a', 'val': 49786}
+ basis = {'buf': b'\x86\x18', 'val': 34328}
+ slave_type = {'buf': b'\x18\x42\x0b\x55', 'val': 406981461}
+ n_slaves = {'buf': b'\x00\x02', 'val': 2}
+ ofs_nbits = {'buf': b'\xd2\x9d', 'val': 53917}
+ dst = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", 'val2': 65540}
+ zfill = b'\x00' * 4
+
+ slaves_buf = (b'\x00\x01', b'\x00\x02')
+ slaves_val = (1, 2)
+
+ _len = len_['val'] + len(slaves_val) * 2
+ _len += (_len % 8)
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + algorithm['buf'] \
+ + fields['buf'] \
+ + basis['buf'] \
+ + slave_type['buf'] \
+ + n_slaves['buf'] \
+ + ofs_nbits['buf'] \
+ + dst['buf'] \
+ + zfill \
+ + slaves_buf[0] \
+ + slaves_buf[1]
+
+ c = NXActionBundleLoad(algorithm['val'],
+ fields['val'],
+ basis['val'],
+ slave_type['val'],
+ n_slaves['val'],
+ ofs_nbits['val'],
+ dst['val'],
+ slaves_val)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+ eq_(self.algorithm['val'], self.c.algorithm)
+ eq_(self.fields['val'], self.c.fields)
+ eq_(self.basis['val'], self.c.basis)
+ eq_(self.slave_type['val'], self.c.slave_type)
+ eq_(self.n_slaves['val'], self.c.n_slaves)
+ eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
+ eq_(self.dst['val'], self.c.dst)
+
+ # slaves
+ slaves = self.c.slaves
+ eq_(self.slaves_val[0], slaves[0])
+ eq_(self.slaves_val[1], slaves[1])
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.subtype['val'], res.subtype)
+ eq_(self.algorithm['val'], res.algorithm)
+ eq_(self.fields['val'], res.fields)
+ eq_(self.basis['val'], res.basis)
+ eq_(self.slave_type['val'], res.slave_type)
+ eq_(self.n_slaves['val'], res.n_slaves)
+ eq_(self.ofs_nbits['val'], res.ofs_nbits)
+ eq_(self.dst['val'], res.dst)
+
+ # slaves
+ slaves = res.slaves
+ eq_(self.slaves_val[0], slaves[0])
+ eq_(self.slaves_val[1], slaves[1])
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = '!' \
+ + ofproto.NX_ACTION_BUNDLE_PACK_STR.replace('!', '') \
+ + 'HH4x'
+
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+ eq_(self.algorithm['val'], res[4])
+ eq_(self.fields['val'], res[5])
+ eq_(self.basis['val'], res[6])
+ eq_(self.slave_type['val'], res[7])
+ eq_(self.n_slaves['val'], res[8])
+ eq_(self.ofs_nbits['val'], res[9])
+ eq_(self.dst['val2'], res[10])
+
+
+class TestNXActionOutputReg(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionOutputReg
+ """
+
+ # NX_ACTION_OUTPUT_REG_PACK_STR
+ # '!HHIHHIH6x'...type, len, vendor, subtype, ofs_nbits,
+ # src, max_len, zfill
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x18', 'val': ofproto.NX_ACTION_OUTPUT_REG_SIZE}
+ vendor = {'buf': b'\x00\x00\x23\x20',
+ 'val': ofproto_common.NX_EXPERIMENTER_ID}
+ subtype = {'buf': b'\x00\x0f', 'val': ofproto.NXAST_OUTPUT_REG}
+ ofs_nbits = {'buf': b'\xfe\x78', 'val': 65144}
+ src = {'buf': b'\x00\x01\x00\x04', 'val': "reg0", 'val2': 65540}
+ max_len = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_OUTPUT_SIZE}
+ zfill = b'\x00' * 6
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + ofs_nbits['buf'] \
+ + src['buf'] \
+ + max_len['buf'] \
+ + zfill
+
+ c = NXActionOutputReg(ofs_nbits['val'],
+ src['val'],
+ max_len['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+ eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
+ eq_(self.src['val'], self.c.src)
+ eq_(self.max_len['val'], self.c.max_len)
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.subtype['val'], res.subtype)
+ eq_(self.ofs_nbits['val'], self.c.ofs_nbits)
+ eq_(self.src['val'], res.src)
+ eq_(self.max_len['val'], res.max_len)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.NX_ACTION_OUTPUT_REG_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+ eq_(self.ofs_nbits['val'], res[4])
+ eq_(self.src['val2'], res[5])
+ eq_(self.max_len['val'], res[6])
+
+
+class TestNXActionExit(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXActionExit
+ """
+
+ # NX_ACTION_HEADER_PACK_STR
+ # '!HHIH'...type, len, vendor, subtype
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+ len_ = {'buf': b'\x00\x10', 'val': ofproto.NX_ACTION_HEADER_SIZE}
+ vendor = {'buf': b'\x00\x00\x23\x20',
+ 'val': ofproto_common.NX_EXPERIMENTER_ID}
+ subtype = {'buf': b'\x00\x11', 'val': ofproto.NXAST_EXIT}
+ zfill = b'\x00' * 6
+
+ buf = type_['buf'] \
+ + len_['buf'] \
+ + vendor['buf'] \
+ + subtype['buf'] \
+ + zfill
+
+ c = NXActionExit()
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.subtype['val'], self.c.subtype)
+
+ def test_parser(self):
+ res = OFPActionVendor.parser(self.buf, 0)
+ eq_(self.type_['val'], res.type)
+ eq_(self.len_['val'], res.len)
+ eq_(self.subtype['val'], res.subtype)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ fmt = ofproto.NX_ACTION_HEADER_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(self.type_['val'], res[0])
+ eq_(self.len_['val'], res[1])
+ eq_(self.vendor['val'], res[2])
+ eq_(self.subtype['val'], res[3])
+
+
+class TestOFPDescStats(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPDescStats
+ """
+
+ # OFP_DESC_STATS_PACK_STR
+ # '!256s256s256s32s256s'...mfr_desc, hw_desc, sw_desc, serial_num, dp_desc
+ mfr_desc = b'mfr_desc'.ljust(256)
+ hw_desc = b'hw_desc'.ljust(256)
+ sw_desc = b'sw_desc'.ljust(256)
+ serial_num = b'serial_num'.ljust(32)
+ dp_desc = b'dp_desc'.ljust(256)
+
+ buf = mfr_desc \
+ + hw_desc \
+ + sw_desc \
+ + serial_num \
+ + dp_desc
+
+ c = OFPDescStats(mfr_desc, hw_desc, sw_desc, serial_num, dp_desc)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.mfr_desc, self.c.mfr_desc)
+ eq_(self.hw_desc, self.c.hw_desc)
+ eq_(self.sw_desc, self.c.sw_desc)
+ eq_(self.serial_num, self.c.serial_num)
+ eq_(self.dp_desc, self.c.dp_desc)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(self.mfr_desc, self.mfr_desc)
+ eq_(self.hw_desc, self.hw_desc)
+ eq_(self.sw_desc, self.sw_desc)
+ eq_(self.serial_num, self.serial_num)
+ eq_(self.dp_desc, self.dp_desc)
+
+
+class TestOFPFlowStats(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPFlowStats
+ """
+
+ # OFP_FLOW_STATS_0_PACK_STR
+ # '!HBx'...length, table_id, zfill
+ length = {'buf': b'\x00\x58', 'val': 88}
+ length_append_action = {'buf': b'\x00\x60', 'val': 96}
+ table_id = {'buf': b'\x51', 'val': 81}
+ zfill_0 = b'\x00'
+
+ # OFP_MATCH_PACK_STR
+ # '!IH6s6sHBxHBB2xIIHH'...
+ match = b'\x97\x7c\xa6\x1e' \
+ + b'\x5e\xa0' \
+ + b'\x7a\x3e\xed\x30\x4a\x90' \
+ + b'\x96\x8e\x67\xbe\x2f\xe2' \
+ + b'\xb1\x81' \
+ + b'\xbe' \
+ + b'\x00' \
+ + b'\x01\xab' \
+ + b'\x42' \
+ + b'\xfe' \
+ + b'\x00\x00' \
+ + b'\xa4\x5d\x5c\x42' \
+ + b'\xa2\x5c\x2e\x05' \
+ + b'\x5a\x94' \
+ + b'\x64\xd4'
+
+ # OFP_FLOW_STATS_1_PACK_STR
+ # '!IIHHH6xQQQ'...duration_sec, duration_nsec, priority,
+ # idle_timeout, hard_timeout, zfill,
+ # cookie, packet_count, byte_count
+ duration_sec = {'buf': b'\x94\x19\xb3\xd2', 'val': 2484712402}
+ duration_nsec = {'buf': b'\xee\x66\xcf\x7c', 'val': 3999715196}
+ priority = {'buf': b'\xe1\xc0', 'val': 57792}
+ idle_timeout = {'buf': b'\x8e\x10', 'val': 36368}
+ hard_timeout = {'buf': b'\xd4\x99', 'val': 54425}
+ zfill_1 = b'\x00\x00\x00\x00\x00\x00'
+ cookie = {'buf': b'\x0b\x01\xe8\xe5\xf0\x84\x8a\xe0',
+ 'val': 793171083674290912}
+ packet_count = {'buf': b'\x47\x5c\xc6\x05\x28\xff\x7c\xdb',
+ 'val': 5142202600015232219}
+ byte_count = {'buf': b'\x24\xe9\x4b\xee\xcb\x57\xd9\xc3',
+ 'val': 2659740543924820419}
+
+ # <action>_PACK_STR...type_, len_ [others...]
+ type = {'buf': b'\x00\x00', 'val': ofproto.OFPAT_OUTPUT}
+ len = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_OUTPUT_SIZE}
+ port = {'buf': b'\x59\x2a', 'val': 22826}
+ max_len = {'buf': b'\x00\x08', 'val': ofproto.OFP_ACTION_OUTPUT_SIZE}
+ action = (type, len, port, max_len)
+
+ ACTION_TYPE = 0
+ ACTION_LEN = 1
+ ACTION_PORT = 2
+ ACTION_MAX_LEN = 3
+
+ c = OFPFlowStats()
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def _parser(self, action=None):
+ buf = self.table_id['buf'] \
+ + self.zfill_0 \
+ + self.match \
+ + self.duration_sec['buf'] \
+ + self.duration_nsec['buf'] \
+ + self.priority['buf'] \
+ + self.idle_timeout['buf'] \
+ + self.hard_timeout['buf'] \
+ + self.zfill_1 \
+ + self.cookie['buf'] \
+ + self.packet_count['buf'] \
+ + self.byte_count['buf']
+
+ if not action:
+ buf = self.length['buf'] + buf
+ else:
+ buf = self.length_append_action['buf'] + buf
+
+ for a in self.action:
+ buf = buf + a['buf']
+
+ return self.c.parser(buf, 0)
+
+ def test_parser(self):
+ res = self._parser()
+
+ eq_(self.length['val'], res.length)
+ eq_(self.table_id['val'], res.table_id)
+ eq_(self.duration_sec['val'], res.duration_sec)
+ eq_(self.duration_nsec['val'], res.duration_nsec)
+ eq_(self.priority['val'], res.priority)
+ eq_(self.idle_timeout['val'], res.idle_timeout)
+ eq_(self.hard_timeout['val'], res.hard_timeout)
+ eq_(self.cookie['val'], res.cookie)
+ eq_(self.packet_count['val'], res.packet_count)
+ eq_(self.byte_count['val'], res.byte_count)
+
+ def test_parser_append_actions(self):
+ res = self._parser(True).actions[0]
+
+ eq_(self.action[self.ACTION_TYPE]['val'], res.type)
+ eq_(self.action[self.ACTION_LEN]['val'], res.len)
+ eq_(self.action[self.ACTION_PORT]['val'], res.port)
+ eq_(self.action[self.ACTION_MAX_LEN]['val'], res.max_len)
+
+
+class TestOFPAggregateStats(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPAggregateStats
+ """
+
+ # OFP_AGGREGATE_STATS_REPLY_PACK_STR
+ # '!QQI4x'...packet_count, byte_count, flow_count, zfill
+ packet_count = {'buf': b'\x43\x95\x1b\xfb\x0f\xf6\xa7\xdd',
+ 'val': 4869829337189623773}
+ byte_count = {'buf': b'\x36\xda\x2d\x80\x2a\x95\x35\xdd',
+ 'val': 3952521651464517085}
+ flow_count = {'buf': b'\xc3\x0d\xc3\xed', 'val': 3272459245}
+ zfill = b'\x00' * 4
+
+ buf = packet_count['buf'] \
+ + byte_count['buf'] \
+ + flow_count['buf'] \
+ + zfill
+
+ c = OFPAggregateStats(packet_count['val'],
+ byte_count['val'],
+ flow_count['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.packet_count['val'], self.c.packet_count)
+ eq_(self.byte_count['val'], self.c.byte_count)
+ eq_(self.flow_count['val'], self.c.flow_count)
+
+ def test_parser(self):
+
+ res = self.c.parser(self.buf, 0)
+
+ eq_(self.packet_count['val'], res.packet_count)
+ eq_(self.byte_count['val'], res.byte_count)
+ eq_(self.flow_count['val'], res.flow_count)
+
+
+class TestOFPTableStats(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPTableStats
+ """
+
+ # OFP_TABLE_STATS_PACK_STR
+ # '!B3x32sIIIQQ'...table_id, zfill, name, wildcards, max_entries,
+ # active_count, lookup_count, matched_count
+ table_id = {'buf': b'\x5b', 'val': 91}
+ zfill = b'\x00' * 3
+ name = b'name'.ljust(32)
+ wildcards = {'buf': b'\xc5\xaf\x6e\x12', 'val': 3316608530}
+ max_entries = {'buf': b'\x95\x6c\x78\x4d', 'val': 2506913869}
+ active_count = {'buf': b'\x78\xac\xa8\x1e', 'val': 2024581150}
+ lookup_count = {'buf': b'\x40\x1d\x9c\x39\x19\xec\xd4\x1c',
+ 'val': 4620020561814017052}
+ matched_count = {'buf': b'\x27\x35\x02\xb6\xc5\x5e\x17\x65',
+ 'val': 2825167325263435621}
+
+ buf = table_id['buf'] \
+ + zfill \
+ + name \
+ + wildcards['buf'] \
+ + max_entries['buf'] \
+ + active_count['buf'] \
+ + lookup_count['buf'] \
+ + matched_count['buf']
+
+ c = OFPTableStats(table_id['val'],
+ name,
+ wildcards['val'],
+ max_entries['val'],
+ active_count['val'],
+ lookup_count['val'],
+ matched_count['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.table_id['val'], self.c.table_id)
+ eq_(self.name, self.c.name)
+ eq_(self.wildcards['val'], self.c.wildcards)
+ eq_(self.max_entries['val'], self.c.max_entries)
+ eq_(self.active_count['val'], self.c.active_count)
+ eq_(self.lookup_count['val'], self.c.lookup_count)
+ eq_(self.matched_count['val'], self.c.matched_count)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(self.table_id['val'], res.table_id)
+ eq_(self.name, res.name)
+ eq_(self.wildcards['val'], res.wildcards)
+ eq_(self.max_entries['val'], res.max_entries)
+ eq_(self.active_count['val'], res.active_count)
+ eq_(self.lookup_count['val'], res.lookup_count)
+ eq_(self.matched_count['val'], res.matched_count)
+
+
+class TestOFPPortStats(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPPortStats
+ """
+
+ # OFP_PORT_STATS_PACK_STR
+ # '!H6xQQQQQQQQQQQQ'... port_no, zfill, rx_packets, tx_packets,
+ # rx_bytes, tx_bytes, rx_dropped, tx_dropped,
+ # rx_errors, tx_errors, rx_frame_err,
+ # rx_over_err, rx_crc_err, collisions
+ port_no = {'buf': b'\xe7\x6b', 'val': 59243}
+ zfill = b'\x00' * 6
+ rx_packets = {'buf': b'\x53\x44\x36\x61\xc4\x86\xc0\x37',
+ 'val': 5999980397101236279}
+ tx_packets = {'buf': b'\x27\xa4\x41\xd7\xd4\x53\x9e\x42',
+ 'val': 2856480458895760962}
+ rx_bytes = {'buf': b'\x55\xa1\x38\x60\x43\x97\x0d\x89',
+ 'val': 6170274950576278921}
+ tx_bytes = {'buf': b'\x77\xe1\xd5\x63\x18\xae\x63\xaa',
+ 'val': 8638420181865882538}
+ rx_dropped = {'buf': b'\x60\xe6\x20\x01\x24\xda\x4e\x5a',
+ 'val': 6982303461569875546}
+ tx_dropped = {'buf': b'\x09\x2d\x5d\x71\x71\xb6\x8e\xc7',
+ 'val': 661287462113808071}
+ rx_errors = {'buf': b'\x2f\x7e\x35\xb3\x66\x3c\x19\x0d',
+ 'val': 3422231811478788365}
+ tx_errors = {'buf': b'\x57\x32\x08\x2f\x88\x32\x40\x6b',
+ 'val': 6283093430376743019}
+ rx_frame_err = {'buf': b'\x0c\x28\x6f\xad\xce\x66\x6e\x8b',
+ 'val': 876072919806406283}
+ rx_over_err = {'buf': b'\x5a\x90\x8f\x9b\xfc\x82\x2e\xa0',
+ 'val': 6525873760178941600}
+ rx_crc_err = {'buf': b'\x73\x3a\x71\x17\xd6\x74\x69\x47',
+ 'val': 8303073210207070535}
+ collisions = {'buf': b'\x2f\x52\x0c\x79\x96\x03\x6e\x79',
+ 'val': 3409801584220270201}
+
+ buf = port_no['buf'] \
+ + zfill \
+ + rx_packets['buf'] \
+ + tx_packets['buf'] \
+ + rx_bytes['buf'] \
+ + tx_bytes['buf'] \
+ + rx_dropped['buf'] \
+ + tx_dropped['buf'] \
+ + rx_errors['buf'] \
+ + tx_errors['buf'] \
+ + rx_frame_err['buf'] \
+ + rx_over_err['buf'] \
+ + rx_crc_err['buf'] \
+ + collisions['buf']
+
+ c = OFPPortStats(port_no['val'],
+ rx_packets['val'],
+ tx_packets['val'],
+ rx_bytes['val'],
+ tx_bytes['val'],
+ rx_dropped['val'],
+ tx_dropped['val'],
+ rx_errors['val'],
+ tx_errors['val'],
+ rx_frame_err['val'],
+ rx_over_err['val'],
+ rx_crc_err['val'],
+ collisions['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.port_no['val'], self.c.port_no)
+ eq_(self.rx_packets['val'], self.c.rx_packets)
+ eq_(self.tx_packets['val'], self.c.tx_packets)
+ eq_(self.rx_bytes['val'], self.c.rx_bytes)
+ eq_(self.tx_bytes['val'], self.c.tx_bytes)
+ eq_(self.rx_dropped['val'], self.c.rx_dropped)
+ eq_(self.tx_dropped['val'], self.c.tx_dropped)
+ eq_(self.rx_errors['val'], self.c.rx_errors)
+ eq_(self.tx_errors['val'], self.c.tx_errors)
+ eq_(self.rx_frame_err['val'], self.c.rx_frame_err)
+ eq_(self.rx_over_err['val'], self.c.rx_over_err)
+ eq_(self.rx_crc_err['val'], self.c.rx_crc_err)
+ eq_(self.collisions['val'], self.c.collisions)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(self.port_no['val'], res.port_no)
+ eq_(self.rx_packets['val'], res.rx_packets)
+ eq_(self.tx_packets['val'], res.tx_packets)
+ eq_(self.rx_bytes['val'], res.rx_bytes)
+ eq_(self.tx_bytes['val'], res.tx_bytes)
+ eq_(self.rx_dropped['val'], res.rx_dropped)
+ eq_(self.tx_dropped['val'], res.tx_dropped)
+ eq_(self.rx_errors['val'], res.rx_errors)
+ eq_(self.tx_errors['val'], res.tx_errors)
+ eq_(self.rx_frame_err['val'], res.rx_frame_err)
+ eq_(self.rx_over_err['val'], res.rx_over_err)
+ eq_(self.rx_crc_err['val'], res.rx_crc_err)
+ eq_(self.collisions['val'], res.collisions)
+
+
+class TestOFPQueueStats(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPQueueStats
+ """
+
+ # OFP_QUEUE_STATS_PACK_STR
+ # '!H2xIQQQ...port_no, queue_id, tx_bytes, tx_packets, tx_errors
+ port_no = {'buf': b'\xe7\x6b', 'val': 59243}
+ zfill = b'\x00' * 2
+ queue_id = {'buf': b'\x2a\xa8\x7f\x32', 'val': 715685682}
+ tx_bytes = {'buf': b'\x77\xe1\xd5\x63\x18\xae\x63\xaa',
+ 'val': 8638420181865882538}
+ tx_packets = {'buf': b'\x27\xa4\x41\xd7\xd4\x53\x9e\x42',
+ 'val': 2856480458895760962}
+ tx_errors = {'buf': b'\x57\x32\x08\x2f\x88\x32\x40\x6b',
+ 'val': 6283093430376743019}
+
+ c = OFPQueueStats(port_no['val'],
+ queue_id['val'],
+ tx_bytes['val'],
+ tx_packets['val'],
+ tx_errors['val'])
+
+ buf = port_no['buf'] \
+ + zfill \
+ + queue_id['buf'] \
+ + tx_bytes['buf'] \
+ + tx_packets['buf'] \
+ + tx_errors['buf']
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.port_no['val'], self.c.port_no)
+ eq_(self.queue_id['val'], self.c.queue_id)
+ eq_(self.tx_bytes['val'], self.c.tx_bytes)
+ eq_(self.tx_packets['val'], self.c.tx_packets)
+ eq_(self.tx_errors['val'], self.c.tx_errors)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(self.port_no['val'], res.port_no)
+ eq_(self.queue_id['val'], res.queue_id)
+ eq_(self.tx_bytes['val'], res.tx_bytes)
+ eq_(self.tx_packets['val'], res.tx_packets)
+ eq_(self.tx_errors['val'], res.tx_errors)
+
+
+class TestOFPVendorStats(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPVendorStats
+ """
+
+ specific_data = 'specific_data'
+ specific_data_after = 'data'
+ offset = specific_data.find(specific_data_after)
+
+ c = OFPVendorStats(specific_data)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.specific_data, self.c.specific_data)
+
+ def test_parser(self):
+ res = self.c.parser(self.specific_data, self.offset)
+ eq_(self.specific_data_after, res.specific_data)
+
+
+class TestOFPQueuePropNone(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPQueuePropNone
+ """
+
+ # OFP_QUEUE_PROP_HEADER_PACK_STR
+ # '!HH4x'...property_, len_
+ property = {'buf': b'\x00\x00', 'val': ofproto.OFPQT_NONE}
+ len = {'buf': b'\x00\x08', 'val': ofproto.OFP_QUEUE_PROP_HEADER_SIZE}
+ zfill = b'\x00' * 4
+
+ c = OFPQueuePropNone()
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ cls = OFPQueuePropHeader._QUEUE_PROPERTIES[self.c.cls_prop_type]
+
+ eq_(self.property['val'], self.c.cls_prop_type)
+ eq_(self.property['val'], self.c.property)
+ eq_(self.property['val'], cls.cls_prop_type)
+
+ eq_(self.len['val'], self.c.cls_prop_len)
+ eq_(self.len['val'], self.c.len)
+ eq_(self.len['val'], cls.cls_prop_len)
+
+ def test_parser(self):
+ buf = self.property['buf'] \
+ + self.len['buf'] \
+ + self.zfill
+
+ ok_(self.c.parser(buf, 0))
+
+
+class TestOFPQueuePropMinRate(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPQueuePropMinRate
+ """
+
+ # OFP_QUEUE_PROP_MIN_RATE_PACK_STR
+ # '!H6x'...rate
+ rate = {'buf': b'\x00\x01', 'val': ofproto.OFPQT_MIN_RATE}
+ len = {'buf': b'\x00\x10', 'val': ofproto.OFP_QUEUE_PROP_MIN_RATE_SIZE}
+ zfill = b'\x00' * 6
+
+ buf = rate['buf'] \
+ + zfill
+
+ c = OFPQueuePropMinRate(rate['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ cls = OFPQueuePropHeader._QUEUE_PROPERTIES[self.c.cls_prop_type]
+
+ eq_(self.rate['val'], self.c.cls_prop_type)
+ eq_(self.rate['val'], self.c.rate)
+ eq_(self.rate['val'], cls.cls_prop_type)
+
+ eq_(self.len['val'], self.c.cls_prop_len)
+ eq_(self.len['val'], cls.cls_prop_len)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(self.rate['val'], res.rate)
+
+
+class TestOFPPacketQueue(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPPacketQueue
+ """
+
+ # OFP_PACKET_QUEUE_PQCK_STR
+ # '!IH2x'...queue_id, len_, zfill
+ queue_id = {'buf': b'\x4d\x4b\x3a\xd1', 'val': 1296775889}
+ len_ = {'buf': b'\x00\x08',
+ 'val': ofproto.OFP_QUEUE_PROP_HEADER_SIZE}
+ zfill = b'\x00' * 2
+
+ buf = queue_id['buf'] \
+ + len_['buf'] \
+ + zfill
+
+ c = OFPPacketQueue(queue_id['val'],
+ len_['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.queue_id['val'], self.c.queue_id)
+ eq_(self.len_['val'], self.c.len)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(self.queue_id['val'], res.queue_id)
+ eq_(self.len_['val'], res.len)
+
+ def test_parser_append_prop(self):
+ # OFP_QUEUE_PROP_HEADER_PACK_STR + OFP_QUEUE_PROP_MIN_RATE_PACK_STR
+ # '!HH4xH6x'...type, len, zfill, rate, zfill
+ len_ = {'buf': b'\x00\x10',
+ 'val': ofproto.OFP_QUEUE_PROP_MIN_RATE_SIZE}
+ a_type = {'buf': b'\x00\x01', 'val': ofproto.OFPQT_MIN_RATE}
+ a_len = {'buf': b'\x00\x10',
+ 'val': ofproto.OFP_QUEUE_PROP_MIN_RATE_SIZE}
+ a_zfill0 = b'\x00' * 4
+ a_rate = {'buf': b'\x00\x01', 'val': ofproto.OFPQT_MIN_RATE}
+ a_zfill1 = b'\x00' * 6
+
+ buf = self.queue_id['buf'] \
+ + len_['buf'] \
+ + self.zfill \
+ + a_type['buf'] \
+ + a_len['buf'] \
+ + a_zfill0 \
+ + a_rate['buf'] \
+ + a_zfill1
+
+ res = self.c.parser(buf, 0)
+
+ eq_(self.queue_id['val'], res.queue_id)
+ eq_(len_['val'], res.len)
+
+ append_cls = res.properties[0]
+
+ eq_(a_type['val'], append_cls.property)
+ eq_(a_len['val'], append_cls.len)
+ eq_(a_rate['val'], append_cls.rate)
+
+
+class TestOFPHello(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPHello
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_HELLO
+ msg_len = ofproto.OFP_HEADER_SIZE
+ xid = 2183948390
+ data = b'\x00\x01\x02\x03'
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = struct.pack(fmt, version, msg_type, msg_len, xid) \
+ + data
+
+ res = OFPHello.parser(object, version, msg_type, msg_len, xid,
+ bytearray(buf))
+
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(six.binary_type(buf), six.binary_type(res.buf))
+
+ def test_serialize(self):
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPHello(Datapath)
+ c.serialize()
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_HELLO, c.msg_type)
+ eq_(0, c.xid)
+
+
+class TestOFPErrorMsg(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPErrorMsg
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x01', 'val': ofproto.OFPT_ERROR}
+ msg_len = {'buf': b'\x00\x0c',
+ 'val': ofproto.OFP_ERROR_MSG_SIZE}
+ xid = {'buf': b'\x87\x8b\x26\x7c', 'val': 2274043516}
+ type = {'buf': b'\xab\x3e', 'val': 43838}
+ code = {'buf': b'\x5d\x3c', 'val': 23868}
+ data = b'Error Message.'
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf'] \
+ + type['buf'] \
+ + code['buf'] \
+ + data
+
+ res = OFPErrorMsg.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(type['val'], res.type)
+ eq_(code['val'], res.code)
+ eq_(data, res.data)
+
+ def test_serialize(self):
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ type = 1306
+ code = 13774
+ data = b'Error Message.'
+
+ c = OFPErrorMsg(Datapath)
+ c.type = type
+ c.code = code
+ c.data = data
+
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_ERROR, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_ERROR_MSG_PACK_STR.replace('!', '') \
+ + str(len(data)) + 's'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_ERROR, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, res[3])
+ eq_(type, res[4])
+ eq_(code, res[5])
+ eq_(data, res[6])
+
+
+class TestOFPEchoRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPEchoRequest
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x02', 'val': ofproto.OFPT_ECHO_REQUEST}
+ msg_len = {'buf': b'\x00\x08',
+ 'val': ofproto.OFP_HEADER_SIZE}
+ xid = {'buf': b'\x84\x47\xef\x3f', 'val': 2219306815}
+ data = b'Request Message.'
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf'] \
+ + data
+
+ res = OFPEchoRequest.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(data, res.data)
+
+ def test_serialize(self):
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ data = b'Request Message.'
+
+ c = OFPEchoRequest(Datapath)
+ c.data = data
+
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_ECHO_REQUEST, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + str(len(data)) + 's'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_ECHO_REQUEST, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, res[3])
+ eq_(data, res[4])
+
+
+class TestOFPEchoReply(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPEchoReply
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x03', 'val': ofproto.OFPT_ECHO_REPLY}
+ msg_len = {'buf': b'\x00\x08',
+ 'val': ofproto.OFP_HEADER_SIZE}
+ xid = {'buf': b'\x6e\x21\x3e\x62', 'val': 1847672418}
+ data = b'Reply Message.'
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf'] \
+ + data
+
+ res = OFPEchoReply.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(data, res.data)
+
+ def test_serialize(self):
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ data = b'Reply Message.'
+
+ c = OFPEchoReply(Datapath)
+ c.data = data
+
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_ECHO_REPLY, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + str(len(data)) + 's'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_ECHO_REPLY, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, res[3])
+ eq_(data, res[4])
+
+
+class TestOFPVendor(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPVendor
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x04', 'val': ofproto.OFPT_VENDOR}
+ msg_len = {'buf': b'\x00\x0c',
+ 'val': ofproto.OFP_VENDOR_HEADER_SIZE}
+ xid = {'buf': b'\x05\x45\xdf\x18', 'val': 88465176}
+ vendor = {'buf': b'\x53\xea\x25\x3e', 'val': 1407853886}
+ data = b'Vendor Message.'
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf'] \
+ + vendor['buf'] \
+ + data
+
+ res = OFPVendor.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(vendor['val'], res.vendor)
+ eq_(data, res.data)
+
+ def test_serialize(self):
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ vendor = {'buf': b'\x38\x4b\xf9\x6c', 'val': 944503148}
+ data = b'Reply Message.'
+
+ c = OFPVendor(Datapath)
+ c.vendor = vendor['val']
+ c.data = data
+
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_VENDOR, c.msg_type)
+ eq_(0, c.xid)
+ eq_(vendor['val'], c.vendor)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_VENDOR_HEADER_PACK_STR.replace('!', '') \
+ + str(len(data)) + 's'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_VENDOR, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, res[3])
+ eq_(vendor['val'], res[4])
+ eq_(data, res[5])
+
+
+# class TestNXTRequest(unittest.TestCase):
+class TestNiciraHeader(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NiciraHeader
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ subtype = ofproto.NXT_FLOW_MOD_TABLE_ID
+
+ c = NiciraHeader(object, subtype)
+ eq_(subtype, c.subtype)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ data = b'Reply Message.'
+ subtype = ofproto.NXT_FLOW_MOD_TABLE_ID
+
+ c = NiciraHeader(Datapath, subtype)
+ c.data = data
+
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_VENDOR, c.msg_type)
+ eq_(0, c.xid)
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, c.vendor)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.NICIRA_HEADER_PACK_STR.replace('!', '') \
+ + str(len(data)) + 's'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_VENDOR, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, res[3])
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, res[4])
+ eq_(subtype, res[5])
+ eq_(data, res[6])
+
+
+class TestNXTSetFlowFormat(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXTSetFlowFormat
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ flow_format = {'buf': b'\xdc\x6b\xf5\x24', 'val': 3698062628}
+
+ c = NXTSetFlowFormat(object, flow_format['val'])
+ eq_(flow_format['val'], c.format)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ flow_format = {'buf': b'\x5a\x4e\x59\xad', 'val': 1515084205}
+
+ c = NXTSetFlowFormat(Datapath, flow_format['val'])
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_VENDOR, c.msg_type)
+ eq_(0, c.xid)
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, c.vendor)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.NICIRA_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.NX_SET_FLOW_FORMAT_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_VENDOR, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, res[3])
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, res[4])
+ eq_(ofproto.NXT_SET_FLOW_FORMAT, res[5])
+ eq_(flow_format['val'], res[6])
+
+
+class TestNXTFlowMod(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXTFlowMod
+ """
+
+ # NX_FLOW_MOD_PACK_STR
+ # '!Q4HI3H6x'...cokkie, command, idle_timeout, head_timeout,
+ # priority, buffer_id, out_port, flags, rule, zfill
+ cookie = {'buf': b'\x04\x56\x27\xad\xbd\x43\xd6\x83',
+ 'val': 312480851306993283}
+ command = {'buf': b'\x61\xaa', 'val': 25002}
+ idle_timeout = {'buf': b'\x4e\xff', 'val': 20223}
+ hard_timeout = {'buf': b'\x80\x16', 'val': 32790}
+ priority = {'buf': b'\x70\x5f', 'val': 28767}
+ buffer_id = {'buf': b'\x7b\x97\x3a\x09', 'val': 2073508361}
+ out_port = {'buf': b'\x11\x7d', 'val': 4477}
+ flags = {'buf': b'\x5c\xb9', 'val': 23737}
+ rule = nx_match.ClsRule()
+ zfill = b'\x00' * 6
+
+ port = {'buf': b'\x2a\xe0', 'val': 10976}
+ actions = [OFPActionOutput(port['val'])]
+
+ def _get_obj(self, append_action=False):
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ actions = None
+ if append_action:
+ actions = self.actions
+
+ c = NXTFlowMod(Datapath,
+ self.cookie['val'],
+ self.command['val'],
+ self.idle_timeout['val'],
+ self.hard_timeout['val'],
+ self.priority['val'],
+ self.buffer_id['val'],
+ self.out_port['val'],
+ self.flags['val'],
+ self.rule,
+ actions)
+
+ return c
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ c = self._get_obj()
+
+ eq_(self.cookie['val'], c.cookie)
+ eq_(self.command['val'], c.command)
+ eq_(self.idle_timeout['val'], c.idle_timeout)
+ eq_(self.hard_timeout['val'], c.hard_timeout)
+ eq_(self.priority['val'], c.priority)
+ eq_(self.buffer_id['val'], c.buffer_id)
+ eq_(self.out_port['val'], c.out_port)
+ eq_(self.flags['val'], c.flags)
+ eq_(self.rule.__hash__(), c.rule.__hash__())
+
+ def test_init_append_actions(self):
+ c = self._get_obj(True)
+
+ action = c.actions[0]
+ eq_(ofproto.OFPAT_OUTPUT, action.type)
+ eq_(ofproto.OFP_ACTION_OUTPUT_SIZE, action.len)
+ eq_(self.port['val'], action.port)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ c = self._get_obj()
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_VENDOR, c.msg_type)
+ eq_(0, c.xid)
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, c.vendor)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.NICIRA_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.NX_FLOW_MOD_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_VENDOR, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, res[3])
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, res[4])
+ eq_(ofproto.NXT_FLOW_MOD, res[5])
+ eq_(self.cookie['val'], res[6])
+ eq_(self.command['val'], res[7])
+ eq_(self.idle_timeout['val'], res[8])
+ eq_(self.hard_timeout['val'], res[9])
+ eq_(self.priority['val'], res[10])
+ eq_(self.buffer_id['val'], res[11])
+ eq_(self.out_port['val'], res[12])
+ eq_(self.flags['val'], res[13])
+
+ def test_serialize_append_actions(self):
+ c = self._get_obj(True)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_VENDOR, c.msg_type)
+ eq_(0, c.xid)
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, c.vendor)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.NICIRA_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.NX_FLOW_MOD_PACK_STR.replace('!', '') \
+ + ofproto.OFP_ACTION_OUTPUT_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_VENDOR, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, res[3])
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, res[4])
+ eq_(ofproto.NXT_FLOW_MOD, res[5])
+ eq_(self.cookie['val'], res[6])
+ eq_(self.command['val'], res[7])
+ eq_(self.idle_timeout['val'], res[8])
+ eq_(self.hard_timeout['val'], res[9])
+ eq_(self.priority['val'], res[10])
+ eq_(self.buffer_id['val'], res[11])
+ eq_(self.out_port['val'], res[12])
+ eq_(self.flags['val'], res[13])
+
+ # action
+ eq_(0, res[14])
+ eq_(ofproto.OFPAT_OUTPUT, res[15])
+ eq_(ofproto.OFP_ACTION_OUTPUT_SIZE, res[16])
+ eq_(self.port['val'], res[17])
+ eq_(0xffe5, res[18])
+
+
+class TestNXTRoleRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXTRoleRequest
+ """
+
+ # NX_ROLE_PACK_STR
+ # '!I'...role
+ role = {'buf': b'\x62\x81\x27\x61', 'val': 1652631393}
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = NXTRoleRequest(Datapath, role['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.role['val'], self.c.role)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_VENDOR, self.c.msg_type)
+ eq_(0, self.c.xid)
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, self.c.vendor)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.NICIRA_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.NX_ROLE_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_VENDOR, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, res[4])
+ eq_(ofproto.NXT_ROLE_REQUEST, res[5])
+ eq_(self.role['val'], res[6])
+
+
+class TestNXTFlowModTableId(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.NXTFlowModTableId
+ """
+
+ # NX_FLOW_MOD_TABLE_ID_PACK_STR
+ # '!B7x'...set_, zfill
+ set_ = {'buf': b'\x71', 'val': 113}
+ zfill = b'\x00' * 7
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = NXTFlowModTableId(Datapath, set_['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.set_['val'], self.c.set)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_VENDOR, self.c.msg_type)
+ eq_(0, self.c.xid)
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, self.c.vendor)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.NICIRA_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.NX_FLOW_MOD_TABLE_ID_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_VENDOR, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+ eq_(ofproto_common.NX_EXPERIMENTER_ID, res[4])
+ eq_(ofproto.NXT_FLOW_MOD_TABLE_ID, res[5])
+ eq_(self.set_['val'], res[6])
+
+
+class TestOFPSwitchFeatures(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPSwitchFeatures
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPSwitchFeatures(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x06', 'val': ofproto.OFPT_FEATURES_REPLY}
+ msg_len_val = ofproto.OFP_SWITCH_FEATURES_SIZE \
+ + ofproto.OFP_PHY_PORT_SIZE
+ msg_len = {'buf': b'\x00\x4c', 'val': msg_len_val}
+ xid = {'buf': b'\xcc\x0a\x41\xd4', 'val': 3423224276}
+
+ # OFP_SWITCH_FEATURES_PACK_STR
+ # '!QIB3xII'...datapath_id, n_buffers, n_tables,
+ # zfill, capabilities, actions
+ datapath_id = {'buf': b'\x11\xa3\x72\x63\x61\xde\x39\x81',
+ 'val': 1270985291017894273}
+ n_buffers = {'buf': b'\x80\x14\xd7\xf6', 'val': 2148849654}
+ n_tables = {'buf': b'\xe4', 'val': 228}
+ zfill = b'\x00' * 3
+ capabilities = {'buf': b'\x69\x4f\xe4\xc2', 'val': 1766843586}
+ actions = {'buf': b'\x78\x06\xd9\x0c', 'val': 2013714700}
+
+ # OFP_PHY_PORT_PACK_STR
+ # '!H6s16sIIIIII'... port_no, hw_addr, name, config, state
+ # curr, advertised, supported, peer
+ port_no = {'buf': b'\xe7\x6b', 'val': 59243}
+ hw_addr = '3c:d1:2b:8d:3f:d6'
+ name = b'name'.ljust(16)
+ config = {'buf': b'\x84\xb6\x8c\x53', 'val': 2226555987}
+ state = {'buf': b'\x64\x07\xfb\xc9', 'val': 1678244809}
+ curr = {'buf': b'\xa9\xe8\x0a\x2b', 'val': 2850556459}
+ advertised = {'buf': b'\x78\xb9\x7b\x72', 'val': 2025421682}
+ supported = {'buf': b'\x7e\x65\x68\xad', 'val': 2120575149}
+ peer = {'buf': b'\xa4\x5b\x8b\xed', 'val': 2757463021}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf'] \
+ + datapath_id['buf'] \
+ + n_buffers['buf'] \
+ + n_tables['buf'] \
+ + zfill \
+ + capabilities['buf'] \
+ + actions['buf'] \
+ + port_no['buf'] \
+ + addrconv.mac.text_to_bin(hw_addr) \
+ + name \
+ + config['buf'] \
+ + state['buf'] \
+ + curr['buf'] \
+ + advertised['buf'] \
+ + supported['buf'] \
+ + peer['buf']
+
+ res = OFPSwitchFeatures.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(datapath_id['val'], res.datapath_id)
+ eq_(n_buffers['val'], res.n_buffers)
+ eq_(n_tables['val'], res.n_tables)
+ eq_(capabilities['val'], res.capabilities)
+ eq_(actions['val'], res.actions)
+
+ # port
+ port = res.ports[port_no['val']]
+ eq_(port_no['val'], port.port_no)
+ eq_(hw_addr, hw_addr)
+ eq_(name, port.name)
+ eq_(config['val'], port.config)
+ eq_(state['val'], port.state)
+ eq_(curr['val'], port.curr)
+ eq_(advertised['val'], port.advertised)
+ eq_(supported['val'], port.supported)
+ eq_(peer['val'], port.peer)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPPortStatus(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPPortStatus
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPPortStatus(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x0c', 'val': ofproto.OFPT_PORT_STATUS}
+ msg_len = {'buf': b'\x00\x40',
+ 'val': ofproto.OFP_PORT_STATUS_SIZE}
+ xid = {'buf': b'\x06\x27\x8b\x7b', 'val': 103254907}
+
+ # OFP_PORT_STATUS_PACK_STR
+ # '!B7xH6s16sIIIIII'...reason, zfill, port_no, hw_addr,
+ # name, config, state, curr,
+ # advertised, supported, peer
+ reason = {'buf': b'\x71', 'val': 113}
+ zfill = b'\x00' * 7
+ port_no = {'buf': b'\x48\xd8', 'val': 18648}
+ hw_addr = '41:f7:a3:52:8f:6b'
+ name = b'name'.ljust(16)
+ config = {'buf': b'\xae\x73\x90\xec', 'val': 2926809324}
+ state = {'buf': b'\x41\x37\x32\x1d', 'val': 1094136349}
+ curr = {'buf': b'\xa9\x47\x13\x2c', 'val': 2840007468}
+ advertised = {'buf': b'\xce\x6b\x4a\x87', 'val': 3463137927}
+ supported = {'buf': b'\xb8\x06\x65\xa1', 'val': 3087426977}
+ peer = {'buf': b'\x6a\x11\x52\x39', 'val': 1779520057}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf'] \
+ + reason['buf'] \
+ + zfill \
+ + port_no['buf'] \
+ + addrconv.mac.text_to_bin(hw_addr) \
+ + name \
+ + config['buf'] \
+ + state['buf'] \
+ + curr['buf'] \
+ + advertised['buf'] \
+ + supported['buf'] \
+ + peer['buf']
+
+ res = OFPPortStatus.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(reason['val'], res.reason)
+
+ # desc
+ desc = res.desc
+ eq_(port_no['val'], desc.port_no)
+ eq_(hw_addr, desc.hw_addr)
+ eq_(name, desc.name)
+ eq_(config['val'], desc.config)
+ eq_(state['val'], desc.state)
+ eq_(curr['val'], desc.curr)
+ eq_(advertised['val'], desc.advertised)
+ eq_(supported['val'], desc.supported)
+ eq_(peer['val'], desc.peer)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPPacketIn(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPPacketIn
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPPacketIn(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def _test_parser(self, padding=False):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x0a', 'val': ofproto.OFPT_PACKET_IN}
+ msg_len = {'buf': b'\x00\x14',
+ 'val': ofproto.OFP_PACKET_IN_SIZE}
+ xid = {'buf': b'\xd0\x23\x8c\x34', 'val': 3491990580}
+
+ # OFP_PACKET_IN_PACK_STR
+ # '!IHHBx2x'...buffer_id, total_len,
+ # in_port, reason, zfill, data
+ buffer_id = {'buf': b'\xae\x73\x90\xec', 'val': 2926809324}
+ total_len = {'buf': b'\x00\x10', 'val': 16}
+ in_port = {'buf': b'\x08\x42', 'val': 2114}
+ reason = {'buf': b'\x43', 'val': 67}
+ zfill = b'\x00' * 1
+ if padding:
+ data = b'PACKET IN'.ljust(20)
+ else:
+ data = b'PACKET IN'.ljust(16)
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf'] \
+ + buffer_id['buf'] \
+ + total_len['buf'] \
+ + in_port['buf'] \
+ + reason['buf'] \
+ + zfill \
+ + data
+
+ res = OFPPacketIn.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(buffer_id['val'], res.buffer_id)
+ eq_(total_len['val'], res.total_len)
+ eq_(in_port['val'], res.in_port)
+ eq_(reason['val'], res.reason)
+ eq_(data[0:16], res.data)
+
+ return True
+
+ def test_parser(self):
+ ok_(self._test_parser())
+
+ def test_parser_padding(self):
+ ok_(self._test_parser(True))
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPGetConfigReply(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPGetConfigReply
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPGetConfigReply(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x0a', 'val': ofproto.OFPT_GET_CONFIG_REPLY}
+ msg_len = {'buf': b'\x00\x14',
+ 'val': ofproto.OFP_SWITCH_CONFIG_SIZE}
+ xid = {'buf': b'\x94\xc4\xd2\xcd', 'val': 2495926989}
+
+ # OFP_SWITCH_CONFIG_PACK_STR
+ # '!HH'...flags, miss_send_len
+ flags = {'buf': b'\xa0\xe2', 'val': 41186}
+ miss_send_len = {'buf': b'\x36\x0e', 'val': 13838}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf'] \
+ + flags['buf'] \
+ + miss_send_len['buf']
+
+ res = OFPGetConfigReply.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(flags['val'], res.flags)
+ eq_(miss_send_len['val'], res.miss_send_len)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPBarrierReply(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPBarrierReply
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPBarrierReply(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x13', 'val': ofproto.OFPT_BARRIER_REPLY}
+ msg_len = {'buf': b'\x00\x08',
+ 'val': ofproto.OFP_HEADER_SIZE}
+ xid = {'buf': b'\x66\xc4\xc3\xac', 'val': 1724171180}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf']
+
+ res = OFPBarrierReply.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPFlowRemoved(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPFlowRemoved
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPFlowRemoved(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x0a', 'val': ofproto.OFPT_FLOW_REMOVED}
+ msg_len = {'buf': b'\x00\x14',
+ 'val': ofproto.OFP_FLOW_REMOVED_SIZE}
+ xid = {'buf': b'\x94\xc4\xd2\xcd', 'val': 2495926989}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf']
+
+ # OFP_MATCH_PACK_STR
+ # '!IH6s6sHBxHBB2xIIHH'...wildcards, in_port, dl_src, dl_dst, dl_vlan,
+ # dl_vlan_pcp, dl_type, nw_tos, nw_proto,
+ # nw_src, nw_dst, tp_src, tp_dst
+ wildcards = {'buf': b'\xd2\x71\x25\x23', 'val': 3530630435}
+ in_port = {'buf': b'\x37\x8b', 'val': 14219}
+ dl_src = b'\x7f\x85\xc4\x70\x12\xda'
+ dl_dst = b'\x0a\x51\x17\x58\xb0\xbb'
+ dl_vlan = {'buf': b'\xc1\xf9', 'val': 49657}
+ dl_vlan_pcp = {'buf': b'\x79', 'val': 121}
+ zfill0 = b'\x00'
+ dl_type = {'buf': b'\xa6\x9e', 'val': 42654}
+ nw_tos = {'buf': b'\xde', 'val': 222}
+ nw_proto = {'buf': b'\xe5', 'val': 229}
+ zfil11 = b'\x00' * 2
+ nw_src = {'buf': b'\x1b\x6d\x8d\x4b', 'val': 460164427}
+ nw_dst = {'buf': b'\xab\x25\xe1\x20', 'val': 2871386400}
+ tp_src = {'buf': b'\xd5\xc3', 'val': 54723}
+ tp_dst = {'buf': b'\x78\xb9', 'val': 30905}
+
+ buf += wildcards['buf'] \
+ + in_port['buf'] \
+ + dl_src \
+ + dl_dst \
+ + dl_vlan['buf'] \
+ + dl_vlan_pcp['buf'] \
+ + zfill0 \
+ + dl_type['buf'] \
+ + nw_tos['buf'] \
+ + nw_proto['buf'] \
+ + zfil11 \
+ + nw_src['buf'] \
+ + nw_dst['buf'] \
+ + tp_src['buf'] \
+ + tp_dst['buf']
+
+ # OFP_FLOW_REMOVED_PACK_STR0
+ # '!QHBxIIH2xQQ'...cookie, priority, reason, zfill,
+ # duration_sec, duration_nsec, idle_timeout,
+ # zfill, packet_count, byte_count
+ cookie = {'buf': b'\x02\x79\xba\x00\xef\xab\xee\x44',
+ 'val': 178378173441633860}
+ priority = {'buf': b'\x02\xce', 'val': 718}
+ reason = {'buf': b'\xa9', 'val': 169}
+ zfill0 = b'\x00' * 1
+ duration_sec = {'buf': b'\x86\x24\xa3\xba', 'val': 2250548154}
+ duration_nsec = {'buf': b'\x94\x94\xc2\x23', 'val': 2492776995}
+ idle_timeout = {'buf': b'\xeb\x7c', 'val': 60284}
+ zfill1 = b'\x00' * 2
+ packet_count = {'buf': b'\x5a\x0d\xf2\x03\x8e\x0a\xbb\x8d',
+ 'val': 6489108735192644493}
+ byte_count = {'buf': b'\x65\xc8\xd3\x72\x51\xb5\xbb\x7c',
+ 'val': 7334344481123449724}
+
+ buf += cookie['buf'] \
+ + priority['buf'] \
+ + reason['buf'] \
+ + zfill0 \
+ + duration_sec['buf'] \
+ + duration_nsec['buf'] \
+ + idle_timeout['buf'] \
+ + zfill1 \
+ + packet_count['buf'] \
+ + byte_count['buf']
+
+ res = OFPFlowRemoved.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(cookie['val'], res.cookie)
+ eq_(priority['val'], res.priority)
+ eq_(reason['val'], res.reason)
+ eq_(duration_sec['val'], res.duration_sec)
+ eq_(duration_nsec['val'], res.duration_nsec)
+ eq_(idle_timeout['val'], res.idle_timeout)
+ eq_(packet_count['val'], res.packet_count)
+ eq_(byte_count['val'], res.byte_count)
+
+ # match
+ match = res.match
+ eq_(wildcards['val'], match.wildcards)
+ eq_(in_port['val'], match.in_port)
+ eq_(dl_src, match.dl_src)
+ eq_(dl_dst, match.dl_dst)
+ eq_(dl_vlan['val'], match.dl_vlan)
+ eq_(dl_vlan_pcp['val'], match.dl_vlan_pcp)
+ eq_(dl_type['val'], match.dl_type)
+ eq_(nw_tos['val'], match.nw_tos)
+ eq_(nw_proto['val'], match.nw_proto)
+ eq_(nw_src['val'], match.nw_src)
+ eq_(nw_dst['val'], match.nw_dst)
+ eq_(tp_src['val'], match.tp_src)
+ eq_(tp_dst['val'], match.tp_dst)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPQueueGetConfigReply(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPQueueGetConfigReply
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPQueueGetConfigReply(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x0a',
+ 'val': ofproto.OFPT_QUEUE_GET_CONFIG_REPLY}
+ msg_len_val = ofproto.OFP_QUEUE_GET_CONFIG_REPLY_SIZE \
+ + ofproto.OFP_PACKET_QUEUE_SIZE
+ msg_len = {'buf': b'\x00\x14', 'val': msg_len_val}
+ xid = {'buf': b'\x94\xc4\xd2\xcd', 'val': 2495926989}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf']
+
+ # OFP_QUEUE_GET_CONFIG_REPLY_PACK_STR
+ # '!H6x'...port, zfill
+ port = {'buf': b'\xfe\x66', 'val': 65126}
+ zfill = b'\x00' * 6
+
+ buf += port['buf'] \
+ + zfill
+
+ # OFP_PACKET_QUEUE_PQCK_STR
+ # '!IH2x'...queue_id, len_, zfill
+ queue_id = {'buf': b'\x4d\x4b\x3a\xd1', 'val': 1296775889}
+ len_ = {'buf': b'\x00\x08',
+ 'val': ofproto.OFP_QUEUE_PROP_HEADER_SIZE}
+ zfill = b'\x00' * 2
+
+ buf += queue_id['buf'] \
+ + len_['buf'] \
+ + zfill
+
+ res = OFPQueueGetConfigReply.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(port['val'], res.port)
+
+ # queue
+ queue = res.queues[0]
+ eq_(queue_id['val'], queue.queue_id)
+ eq_(len_['val'], queue.len)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPDescStatsReply(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPDescStatsReply
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPDescStatsReply(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x11', 'val': ofproto.OFPT_STATS_REPLY}
+ msg_len_val = ofproto.OFP_STATS_MSG_SIZE \
+ + ofproto.OFP_DESC_STATS_SIZE
+ msg_len = {'buf': b'\x04\x38', 'val': msg_len_val}
+ xid = {'buf': b'\x94\xc4\xd2\xcd', 'val': 2495926989}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf']
+
+ # OFP_STATS_MSG_PACK_STR
+ # '!HH'...type_, flags
+ type_ = {'buf': b'\x00\x00', 'val': ofproto.OFPST_DESC}
+ flags = {'buf': b'\x30\xd9', 'val': 12505}
+
+ buf += type_['buf'] \
+ + flags['buf']
+
+ # stats_type_cls = OFPDescStats
+ # OFP_DESC_STATS_PACK_STR
+ # '!256s256s256s32s256s'...mfr_desc, hw_desc, sw_desc,
+ # serial_num, dp_desc
+ mfr_desc = b'mfr_desc'.ljust(256)
+ hw_desc = b'hw_desc'.ljust(256)
+ sw_desc = b'sw_desc'.ljust(256)
+ serial_num = b'serial_num'.ljust(32)
+ dp_desc = b'dp_desc'.ljust(256)
+
+ buf += mfr_desc \
+ + hw_desc \
+ + sw_desc \
+ + serial_num \
+ + dp_desc
+
+ res = OFPDescStatsReply.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(type_['val'], res.type)
+ eq_(flags['val'], res.flags)
+
+ # body
+ body = res.body
+ eq_(mfr_desc, body.mfr_desc)
+ eq_(hw_desc, body.hw_desc)
+ eq_(sw_desc, body.sw_desc)
+ eq_(serial_num, body.serial_num)
+ eq_(dp_desc, body.dp_desc)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPFlowStatsReply(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPFlowStatsReply
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPFlowStatsReply(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x11', 'val': ofproto.OFPT_STATS_REPLY}
+ msg_len_val = ofproto.OFP_STATS_MSG_SIZE \
+ + ofproto.OFP_FLOW_STATS_SIZE
+ msg_len = {'buf': b'\x00\x64', 'val': msg_len_val}
+ xid = {'buf': b'\x94\xc4\xd2\xcd', 'val': 2495926989}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf']
+
+ # OFP_STATS_MSG_PACK_STR
+ # '!HH'...type_, flags
+ type_ = {'buf': b'\x00\x01', 'val': ofproto.OFPST_FLOW}
+ flags = {'buf': b'\x95\xf4', 'val': 38388}
+
+ buf += type_['buf'] \
+ + flags['buf']
+
+ # stats_type_cls = OFPFlowStats
+ # OFP_FLOW_STATS_0_PACK_STR
+ # '!HBx'...length, table_id, zfill
+ length = {'buf': b'\x00\x60', 'val': 96}
+ table_id = {'buf': b'\x51', 'val': 81}
+ zfill = b'\x00'
+
+ buf += length['buf'] \
+ + table_id['buf'] \
+ + zfill
+
+ # OFP_MATCH_PACK_STR
+ # '!IH6s6sHBxHBB2xIIHH'...
+ match = b'\x97\x7c\xa6\x1e' \
+ + b'\x5e\xa0' \
+ + b'\x70\x17\xdc\x80\x59\x9e' \
+ + b'\x79\xc6\x56\x87\x92\x28' \
+ + b'\xb1\x81' \
+ + b'\xbe' \
+ + b'\x00' \
+ + b'\x01\xab' \
+ + b'\x42' \
+ + b'\xfe' \
+ + b'\x00\x00' \
+ + b'\xa4\x5d\x5c\x42' \
+ + b'\xa2\x5c\x2e\x05' \
+ + b'\x5a\x94' \
+ + b'\x64\xd4'
+
+ buf += match
+
+ # OFP_FLOW_STATS_1_PACK_STR
+ # '!IIHHH6xQQQ'...duration_sec, duration_nsec, priority,
+ # idle_timeout, hard_timeout, zfill,
+ # cookie, packet_count, byte_count
+ duration_sec = {'buf': b'\x94\x19\xb3\xd2', 'val': 2484712402}
+ duration_nsec = {'buf': b'\xee\x66\xcf\x7c', 'val': 3999715196}
+ priority = {'buf': b'\xe1\xc0', 'val': 57792}
+ idle_timeout = {'buf': b'\x8e\x10', 'val': 36368}
+ hard_timeout = {'buf': b'\xd4\x99', 'val': 54425}
+ zfill = b'\x00' * 6
+ cookie = {'buf': b'\x0b\x01\xe8\xe5\xf0\x84\x8a\xe0',
+ 'val': 793171083674290912}
+ packet_count = {'buf': b'\x47\x5c\xc6\x05\x28\xff\x7c\xdb',
+ 'val': 5142202600015232219}
+ byte_count = {'buf': b'\x24\xe9\x4b\xee\xcb\x57\xd9\xc3',
+ 'val': 2659740543924820419}
+
+ buf += duration_sec['buf']
+ buf += duration_nsec['buf']
+ buf += priority['buf']
+ buf += idle_timeout['buf']
+ buf += hard_timeout['buf']
+ buf += zfill
+ buf += cookie['buf']
+ buf += packet_count['buf']
+ buf += byte_count['buf']
+
+ # <action>_PACK_STR...type_, len_ [others...]
+ type = {'buf': b'\x00\x00', 'val': ofproto.OFPAT_OUTPUT}
+ len = {'buf': b'\x00\x08',
+ 'val': ofproto.OFP_ACTION_OUTPUT_SIZE}
+ port = {'buf': b'\x59\x2a', 'val': 22826}
+ max_len = {'buf': b'\x00\x08',
+ 'val': ofproto.OFP_ACTION_OUTPUT_SIZE}
+
+ buf += type['buf'] \
+ + len['buf'] \
+ + port['buf'] \
+ + max_len['buf']
+
+ res = OFPFlowStatsReply.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(type_['val'], res.type)
+ eq_(flags['val'], res.flags)
+
+ # body
+ body = res.body[0]
+ eq_(length['val'], body.length)
+ eq_(table_id['val'], body.table_id)
+ eq_(duration_sec['val'], body.duration_sec)
+ eq_(duration_nsec['val'], body.duration_nsec)
+ eq_(priority['val'], body.priority)
+ eq_(idle_timeout['val'], body.idle_timeout)
+ eq_(hard_timeout['val'], body.hard_timeout)
+ eq_(cookie['val'], body.cookie)
+ eq_(packet_count['val'], body.packet_count)
+ eq_(byte_count['val'], body.byte_count)
+
+ # action
+ action = body.actions[0]
+ eq_(type['val'], action.type)
+ eq_(len['val'], action.len)
+ eq_(port['val'], action.port)
+ eq_(max_len['val'], action.max_len)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPAggregateStatsReply(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPAggregateStatsReply
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPAggregateStatsReply(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x11', 'val': ofproto.OFPT_STATS_REPLY}
+ msg_len_val = ofproto.OFP_STATS_MSG_SIZE \
+ + ofproto.OFP_AGGREGATE_STATS_REPLY_SIZE
+ msg_len = {'buf': b'\x00\x4c', 'val': msg_len_val}
+ xid = {'buf': b'\xc6\xd6\xce\x38', 'val': 3335966264}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf']
+
+ # OFP_STATS_MSG_PACK_STR
+ # '!HH'...type_, flags
+ type_ = {'buf': b'\x00\x02', 'val': ofproto.OFPST_AGGREGATE}
+ flags = {'buf': b'\x65\x66', 'val': 25958}
+
+ buf += type_['buf'] \
+ + flags['buf']
+
+ # stats_type_cls = OFPAggregateStats
+ # OFP_AGGREGATE_STATS_REPLY_PACK_STR
+ # '!QQI4x'...packet_count, byte_count, flow_count, zfill
+ packet_count = {'buf': b'\x43\x95\x1b\xfb\x0f\xf6\xa7\xdd',
+ 'val': 4869829337189623773}
+ byte_count = {'buf': b'\x36\xda\x2d\x80\x2a\x95\x35\xdd',
+ 'val': 3952521651464517085}
+ flow_count = {'buf': b'\xc3\x0d\xc3\xed', 'val': 3272459245}
+ zfill = b'\x00' * 4
+
+ buf += packet_count['buf'] \
+ + byte_count['buf'] \
+ + flow_count['buf'] \
+ + zfill
+
+ res = OFPAggregateStatsReply.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(type_['val'], res.type)
+ eq_(flags['val'], res.flags)
+
+ # body
+ body = res.body[0]
+ eq_(packet_count['val'], body.packet_count)
+ eq_(byte_count['val'], body.byte_count)
+ eq_(flow_count['val'], body.flow_count)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPTableStatsReply(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPTableStatsReply
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPTableStatsReply(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x11', 'val': ofproto.OFPT_STATS_REPLY}
+ msg_len_val = ofproto.OFP_STATS_MSG_SIZE \
+ + ofproto.OFP_TABLE_STATS_SIZE
+ msg_len = {'buf': b'\x00\x4c', 'val': msg_len_val}
+ xid = {'buf': b'\xd6\xb4\x8d\xe6', 'val': 3602157030}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf']
+
+ # OFP_STATS_MSG_PACK_STR
+ # '!HH'...type_, flags
+ type_ = {'buf': b'\x00\x03', 'val': ofproto.OFPST_TABLE}
+ flags = {'buf': b'\xb3\xf0', 'val': 46064}
+
+ buf += type_['buf'] \
+ + flags['buf']
+
+ # stats_type_cls = OFPTableStats
+ # OFP_TABLE_STATS_PACK_STR
+ # '!B3x32sIIIQQ'...table_id, zfill, name, wildcards, max_entries,
+ # active_count, lookup_count, matched_count
+ table_id = {'buf': b'\x5b', 'val': 91}
+ zfill = b'\x00' * 3
+ name = b'name'.ljust(32)
+ wildcards = {'buf': b'\xc5\xaf\x6e\x12', 'val': 3316608530}
+ max_entries = {'buf': b'\x95\x6c\x78\x4d', 'val': 2506913869}
+ active_count = {'buf': b'\x78\xac\xa8\x1e', 'val': 2024581150}
+ lookup_count = {'buf': b'\x40\x1d\x9c\x39\x19\xec\xd4\x1c',
+ 'val': 4620020561814017052}
+ matched_count = {'buf': b'\x27\x35\x02\xb6\xc5\x5e\x17\x65',
+ 'val': 2825167325263435621}
+
+ buf += table_id['buf'] \
+ + zfill \
+ + name \
+ + wildcards['buf'] \
+ + max_entries['buf'] \
+ + active_count['buf'] \
+ + lookup_count['buf'] \
+ + matched_count['buf']
+
+ res = OFPTableStatsReply.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(type_['val'], res.type)
+ eq_(flags['val'], res.flags)
+
+ # body
+ body = res.body[0]
+ eq_(table_id['val'], body.table_id)
+ eq_(name, body.name)
+ eq_(wildcards['val'], body.wildcards)
+ eq_(max_entries['val'], body.max_entries)
+ eq_(active_count['val'], body.active_count)
+ eq_(lookup_count['val'], body.lookup_count)
+ eq_(matched_count['val'], body.matched_count)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPPortStatsReply(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPPortStatsReply
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPPortStatsReply(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x11', 'val': ofproto.OFPT_STATS_REPLY}
+ msg_len_val = ofproto.OFP_STATS_MSG_SIZE \
+ + ofproto.OFP_PORT_STATS_SIZE
+ msg_len = {'buf': b'\x00\x74', 'val': msg_len_val}
+ xid = {'buf': b'\xc2\xaf\x3d\xff', 'val': 3266264575}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf']
+
+ # OFP_STATS_MSG_PACK_STR
+ # '!HH'...type_, flags
+ type_ = {'buf': b'\x00\x04', 'val': ofproto.OFPST_PORT}
+ flags = {'buf': b'\xda\xde', 'val': 56030}
+
+ buf += type_['buf'] \
+ + flags['buf']
+
+ # stats_type_cls = OFPPortStats
+ # OFP_PORT_STATS_PACK_STR
+ # '!H6xQQQQQQQQQQQQ'... port_no, zfill, rx_packets, tx_packets,
+ # rx_bytes, tx_bytes, rx_dropped, tx_dropped,
+ # rx_errors, tx_errors, rx_frame_err,
+ # rx_over_err, rx_crc_err, collisions
+ port_no = {'buf': b'\xe7\x6b', 'val': 59243}
+ zfill = b'\x00' * 6
+ rx_packets = {'buf': b'\x53\x44\x36\x61\xc4\x86\xc0\x37',
+ 'val': 5999980397101236279}
+ tx_packets = {'buf': b'\x27\xa4\x41\xd7\xd4\x53\x9e\x42',
+ 'val': 2856480458895760962}
+ rx_bytes = {'buf': b'\x55\xa1\x38\x60\x43\x97\x0d\x89',
+ 'val': 6170274950576278921}
+ tx_bytes = {'buf': b'\x77\xe1\xd5\x63\x18\xae\x63\xaa',
+ 'val': 8638420181865882538}
+ rx_dropped = {'buf': b'\x60\xe6\x20\x01\x24\xda\x4e\x5a',
+ 'val': 6982303461569875546}
+ tx_dropped = {'buf': b'\x09\x2d\x5d\x71\x71\xb6\x8e\xc7',
+ 'val': 661287462113808071}
+ rx_errors = {'buf': b'\x2f\x7e\x35\xb3\x66\x3c\x19\x0d',
+ 'val': 3422231811478788365}
+ tx_errors = {'buf': b'\x57\x32\x08\x2f\x88\x32\x40\x6b',
+ 'val': 6283093430376743019}
+ rx_frame_err = {'buf': b'\x0c\x28\x6f\xad\xce\x66\x6e\x8b',
+ 'val': 876072919806406283}
+ rx_over_err = {'buf': b'\x5a\x90\x8f\x9b\xfc\x82\x2e\xa0',
+ 'val': 6525873760178941600}
+ rx_crc_err = {'buf': b'\x73\x3a\x71\x17\xd6\x74\x69\x47',
+ 'val': 8303073210207070535}
+ collisions = {'buf': b'\x2f\x52\x0c\x79\x96\x03\x6e\x79',
+ 'val': 3409801584220270201}
+
+ buf += port_no['buf'] \
+ + zfill \
+ + rx_packets['buf'] \
+ + tx_packets['buf'] \
+ + rx_bytes['buf'] \
+ + tx_bytes['buf'] \
+ + rx_dropped['buf'] \
+ + tx_dropped['buf'] \
+ + rx_errors['buf'] \
+ + tx_errors['buf'] \
+ + rx_frame_err['buf'] \
+ + rx_over_err['buf'] \
+ + rx_crc_err['buf'] \
+ + collisions['buf']
+
+ res = OFPPortStatsReply.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(type_['val'], res.type)
+ eq_(flags['val'], res.flags)
+
+ # body
+ body = res.body[0]
+ eq_(port_no['val'], body.port_no)
+ eq_(rx_packets['val'], body.rx_packets)
+ eq_(tx_packets['val'], body.tx_packets)
+ eq_(rx_bytes['val'], body.rx_bytes)
+ eq_(tx_bytes['val'], body.tx_bytes)
+ eq_(rx_dropped['val'], body.rx_dropped)
+ eq_(tx_dropped['val'], body.tx_dropped)
+ eq_(rx_errors['val'], body.rx_errors)
+ eq_(tx_errors['val'], body.tx_errors)
+ eq_(rx_frame_err['val'], body.rx_frame_err)
+ eq_(rx_over_err['val'], body.rx_over_err)
+ eq_(rx_crc_err['val'], body.rx_crc_err)
+ eq_(collisions['val'], body.collisions)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPQueueStatsReply(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPQueueStatsReply
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPQueueStatsReply(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x11', 'val': ofproto.OFPT_STATS_REPLY}
+ msg_len_val = ofproto.OFP_STATS_MSG_SIZE \
+ + ofproto.OFP_QUEUE_STATS_SIZE
+ msg_len = {'buf': b'\x00\x2c', 'val': msg_len_val}
+ xid = {'buf': b'\x19\xfc\x28\x6c', 'val': 435955820}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf']
+
+ # OFP_STATS_MSG_PACK_STR
+ # '!HH'...type_, flags
+ type_ = {'buf': b'\x00\x05', 'val': ofproto.OFPST_QUEUE}
+ flags = {'buf': b'\x3b\x2b', 'val': 15147}
+
+ buf += type_['buf'] \
+ + flags['buf']
+
+ # stats_type_cls = OFPQueueStats
+ # OFP_QUEUE_STATS_PACK_STR
+ # '!H2xIQQQ...port_no, queue_id, tx_bytes, tx_packets, tx_errors
+ port_no = {'buf': b'\xe7\x6b', 'val': 59243}
+ zfill = b'\x00' * 2
+ queue_id = {'buf': b'\x2a\xa8\x7f\x32', 'val': 715685682}
+ tx_bytes = {'buf': b'\x77\xe1\xd5\x63\x18\xae\x63\xaa',
+ 'val': 8638420181865882538}
+ tx_packets = {'buf': b'\x27\xa4\x41\xd7\xd4\x53\x9e\x42',
+ 'val': 2856480458895760962}
+ tx_errors = {'buf': b'\x57\x32\x08\x2f\x88\x32\x40\x6b',
+ 'val': 6283093430376743019}
+
+ buf += port_no['buf'] \
+ + zfill \
+ + queue_id['buf'] \
+ + tx_bytes['buf'] \
+ + tx_packets['buf'] \
+ + tx_errors['buf']
+
+ res = OFPQueueStatsReply.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(type_['val'], res.type)
+ eq_(flags['val'], res.flags)
+
+ # body
+ body = res.body[0]
+ eq_(port_no['val'], body.port_no)
+ eq_(queue_id['val'], body.queue_id)
+ eq_(tx_bytes['val'], body.tx_bytes)
+ eq_(tx_packets['val'], body.tx_packets)
+ eq_(tx_errors['val'], body.tx_errors)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPVendorStatsReply(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPVendorStatsReply
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPVendorStatsReply(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ version = {'buf': b'\x01', 'val': ofproto.OFP_VERSION}
+ msg_type = {'buf': b'\x11', 'val': ofproto.OFPT_STATS_REPLY}
+ # ofproto.OFP_STATS_MSG_SIZE + len(specific_data)
+ msg_len = {'buf': b'\x00\x18',
+ 'val': ofproto.OFP_STATS_MSG_SIZE + 12}
+ xid = {'buf': b'\x94\xc4\xd2\xcd', 'val': 2495926989}
+
+ buf = version['buf'] \
+ + msg_type['buf'] \
+ + msg_len['buf'] \
+ + xid['buf']
+
+ # OFP_STATS_MSG_PACK_STR
+ # '!HH'...type_, flags
+ type_ = {'buf': b'\xff\xff', 'val': ofproto.OFPST_VENDOR}
+ flags = {'buf': b'\x30\xd9', 'val': 12505}
+
+ buf += type_['buf'] \
+ + flags['buf']
+
+ # stats_type_cls = OFPVendorStats
+ specific_data = b'specific_data'
+
+ buf += specific_data
+
+ res = OFPVendorStatsReply.parser(object,
+ version['val'],
+ msg_type['val'],
+ msg_len['val'],
+ xid['val'],
+ buf)
+
+ eq_(version['val'], res.version)
+ eq_(msg_type['val'], res.msg_type)
+ eq_(msg_len['val'], res.msg_len)
+ eq_(xid['val'], res.xid)
+ eq_(type_['val'], res.type)
+ eq_(flags['val'], res.flags)
+
+ # body
+ body = res.body[0]
+ eq_(specific_data, body)
+
+ def test_serialize(self):
+ # Not used.
+ pass
+
+
+class TestOFPFeaturesRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPFeaturesRequest
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPFeaturesRequest(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_FEATURES_REQUEST, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_FEATURES_REQUEST, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+
+
+class TestOFPGetConfigRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPGetConfigRequest
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPGetConfigRequest(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_GET_CONFIG_REQUEST, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_GET_CONFIG_REQUEST, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+
+
+class TestOFPSetConfig(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPSetConfig
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ # OFP_SWITCH_CONFIG_PACK_STR
+ # '!HH'...flags, miss_send_len
+ flags = {'buf': b'\xa0\xe2', 'val': 41186}
+ miss_send_len = {'buf': b'\x36\x0e', 'val': 13838}
+
+ c = OFPSetConfig(Datapath,
+ flags['val'],
+ miss_send_len['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.flags['val'], self.c.flags)
+ eq_(self.miss_send_len['val'], self.c.miss_send_len)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_SET_CONFIG, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_SWITCH_CONFIG_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_SET_CONFIG, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+ eq_(self.flags['val'], res[4])
+ eq_(self.miss_send_len['val'], res[5])
+
+
+class TestOFPPacketOut(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPPacketOut
+ """
+
+ port = 0x2ae0
+ actions = [OFPActionOutput(port, max_len=0)]
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def _get_obj(self, buffer_id, in_port, data=None):
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPPacketOut(Datapath,
+ buffer_id,
+ in_port,
+ self.actions,
+ data)
+ return c
+
+ def test_init(self):
+ buffer_id = 0xffffffff
+ in_port = 0x40455
+ data = 'Message'
+
+ c = self._get_obj(buffer_id, in_port, data)
+
+ eq_(buffer_id, c.buffer_id)
+ eq_(in_port, c.in_port)
+ eq_(data, c.data)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ buffer_id = 0xffffffff
+ in_port = 0x9e07
+ data = b'Message'
+
+ c = self._get_obj(buffer_id, in_port, data)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_PACKET_OUT, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_PACKET_OUT_PACK_STR.replace('!', '') \
+ + ofproto.OFP_ACTION_OUTPUT_PACK_STR.replace('!', '') \
+ + str(len(data)) + 's'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ # OFP_HEADER_PACK_STR
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_PACKET_OUT, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, res[3])
+
+ # OFP_PACKET_OUT_PACK_STR
+ eq_(buffer_id, res[4])
+ eq_(in_port, res[5])
+ eq_(ofproto.OFP_ACTION_OUTPUT_SIZE, res[6])
+
+ # OFP_ACTION_OUTPUT_PACK_STR
+ eq_(ofproto.OFPAT_OUTPUT, res[7])
+ eq_(ofproto.OFP_ACTION_OUTPUT_SIZE, res[8])
+ eq_(self.port, res[9])
+ eq_(0, res[10])
+
+ # data
+ eq_(data, res[11])
+
+ @raises(AssertionError)
+ def test_serialize_check_buffer_id(self):
+ buffer_id = 0xffffff00
+ in_port = 0xaa92
+ data = 'Message'
+
+ c = self._get_obj(buffer_id, in_port, data)
+ c.serialize()
+
+
+class TestOFPFlowMod(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPFlowMod
+ """
+
+ # OFP_FLOW_MOD_PACK_STR0
+ # '!QHHHHIHH'...cookie, command, idle_timeout, hard_timeout,
+ # priority, buffer_id, out_port, flags
+ cookie = {'buf': b'\x1d\x86\xce\x6e\x8d\xc0\xbe\xa8',
+ 'val': 2127614848199081640}
+ command = {'buf': b'\xe1\x55', 'val': 57685}
+ idle_timeout = {'buf': b'\xf3\x6d', 'val': 62317}
+ hard_timeout = {'buf': b'\x1c\xc5', 'val': 7365}
+ priority = {'buf': b'\x9c\xe3', 'val': 40163}
+ buffer_id = {'buf': b'\xf0\xa1\x80\x33', 'val': 4037115955}
+ out_port = {'buf': b'\xfe\x0d', 'val': 65037}
+ flags = {'buf': b'\x00\x87', 'val': 135}
+
+ # OFP_MATCH_PACK_STR
+ # '!IH6s6sHBxHBB2xIIHH'...wildcards, in_port, dl_src, dl_dst, dl_vlan,
+ # dl_vlan_pcp, dl_type, nw_tos, nw_proto,
+ # nw_src, nw_dst, tp_src, tp_dst
+ wildcards = {'buf': b'\xd2\x71\x25\x23', 'val': 3530630435}
+ in_port = {'buf': b'\x37\x8b', 'val': 14219}
+ dl_src = b'\xdf\xcf\xe1\x5d\xcf\xc0'
+ dl_dst = b'\x76\xb3\xfb\xc6\x21\x2f'
+ dl_vlan = {'buf': b'\xc1\xf9', 'val': 49657}
+ dl_vlan_pcp = {'buf': b'\x79', 'val': 121}
+ zfill0 = b'\x00'
+ dl_type = {'buf': b'\xa6\x9e', 'val': 42654}
+ nw_tos = {'buf': b'\xde', 'val': 222}
+ nw_proto = {'buf': b'\xe5', 'val': 229}
+ zfil11 = b'\x00' * 2
+ nw_src = {'buf': b'\x1b\x6d\x8d\x4b', 'val': 460164427}
+ nw_dst = {'buf': b'\xab\x25\xe1\x20', 'val': 2871386400}
+ tp_src = {'buf': b'\xd5\xc3', 'val': 54723}
+ tp_dst = {'buf': b'\x78\xb9', 'val': 30905}
+
+ match = OFPMatch(wildcards['val'],
+ in_port['val'],
+ dl_src,
+ dl_dst,
+ dl_vlan['val'],
+ dl_vlan_pcp['val'],
+ dl_type['val'],
+ nw_tos['val'],
+ nw_proto['val'],
+ nw_src['val'],
+ nw_dst['val'],
+ tp_src['val'],
+ tp_dst['val'])
+
+ port = 0x2ae0
+ actions = [OFPActionOutput(port, max_len=1000)]
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def _get_obj(self, actions=None):
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPFlowMod(Datapath,
+ self.match,
+ self.cookie['val'],
+ self.command['val'],
+ self.idle_timeout['val'],
+ self.hard_timeout['val'],
+ self.priority['val'],
+ self.buffer_id['val'],
+ self.out_port['val'],
+ self.flags['val'],
+ actions)
+
+ return c
+
+ def test_init(self):
+ c = self._get_obj()
+
+ eq_(self.cookie['val'], c.cookie)
+ eq_(self.command['val'], c.command)
+ eq_(self.idle_timeout['val'], c.idle_timeout)
+ eq_(self.hard_timeout['val'], c.hard_timeout)
+ eq_(self.priority['val'], c.priority)
+ eq_(self.buffer_id['val'], c.buffer_id)
+ eq_(self.out_port['val'], c.out_port)
+ eq_(self.flags['val'], c.flags)
+
+ def test_init_actions(self):
+ c = self._get_obj(self.actions)
+ action = c.actions[0]
+
+ eq_(self.port, action.port)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ c = self._get_obj(self.actions)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_FLOW_MOD, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_MATCH_PACK_STR.replace('!', '') \
+ + ofproto.OFP_FLOW_MOD_PACK_STR0.replace('!', '') \
+ + ofproto.OFP_ACTION_OUTPUT_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ # OFP_HEADER_PACK_STR
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_FLOW_MOD, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, res[3])
+
+ # OFP_MATCH_PACK_STR
+ eq_(self.wildcards['val'], res[4])
+ eq_(self.in_port['val'], res[5])
+ eq_(self.dl_src, res[6])
+ eq_(self.dl_dst, res[7])
+ eq_(self.dl_vlan['val'], res[8])
+ eq_(self.dl_vlan_pcp['val'], res[9])
+ eq_(self.dl_type['val'], res[10])
+ eq_(self.nw_tos['val'], res[11])
+ eq_(self.nw_proto['val'], res[12])
+ eq_(self.nw_src['val'], res[13])
+ eq_(self.nw_dst['val'], res[14])
+ eq_(self.tp_src['val'], res[15])
+ eq_(self.tp_dst['val'], res[16])
+
+ # OFP_FLOW_MOD_PACK_STR0
+ eq_(self.cookie['val'], res[17])
+ eq_(self.command['val'], res[18])
+ eq_(self.idle_timeout['val'], res[19])
+ eq_(self.hard_timeout['val'], res[20])
+ eq_(self.priority['val'], res[21])
+ eq_(self.buffer_id['val'], res[22])
+ eq_(self.out_port['val'], res[23])
+ eq_(self.flags['val'], res[24])
+
+ # OFP_ACTION_OUTPUT_PACK_STR
+ eq_(ofproto.OFPAT_OUTPUT, res[25])
+ eq_(ofproto.OFP_ACTION_OUTPUT_SIZE, res[26])
+ eq_(self.port, res[27])
+ eq_(1000, res[28])
+
+
+class TestOFPBarrierRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPBarrierRequest
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ c = OFPBarrierRequest(Datapath)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ pass
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_BARRIER_REQUEST, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_BARRIER_REQUEST, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+
+
+class TestOFPQueueGetConfigRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPQueueGetConfigRequest
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ # OFP_QUEUE_GET_CONFIG_REQUEST_PACK_STR
+ # '!H2x'...port, zfill
+ port = {'buf': b'\xa0\xe2', 'val': 41186}
+ zfill = b'\x00' * 2
+
+ c = OFPQueueGetConfigRequest(Datapath,
+ port['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.port['val'], self.c.port)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_QUEUE_GET_CONFIG_REQUEST, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ a = ofproto.OFP_HEADER_PACK_STR.replace('!', '')
+ b = ofproto.OFP_QUEUE_GET_CONFIG_REQUEST_PACK_STR.replace('!', '')
+ fmt = '!' + a + b
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_QUEUE_GET_CONFIG_REQUEST, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+ eq_(self.port['val'], res[4])
+
+
+class TestOFPDescStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPDescStatsRequest
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ flags = {'buf': b'\x00\x00', 'val': 0}
+
+ c = OFPDescStatsRequest(Datapath, flags['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(ofproto.OFPST_DESC, self.c.type)
+ eq_(self.flags['val'], self.c.flags)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_MSG_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+
+ # OFP_HEADER_PACK_STR
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_STATS_REQUEST, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+
+ # OFP_STATS_MSG_PACK_STR
+ eq_(ofproto.OFPST_DESC, res[4])
+ eq_(self.flags['val'], res[5])
+
+
+class TestOFPFlowStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPFlowStatsRequest
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ flags = {'buf': b'\x00\x00', 'val': 0}
+
+ # OFP_MATCH_PACK_STR
+ # '!IH6s6sHBxHBB2xIIHH'...wildcards, in_port, dl_src, dl_dst, dl_vlan,
+ # dl_vlan_pcp, dl_type, nw_tos, nw_proto,
+ # nw_src, nw_dst, tp_src, tp_dst
+ wildcards = {'buf': b'\xd2\x71\x25\x23', 'val': 3530630435}
+ in_port = {'buf': b'\x37\x8b', 'val': 14219}
+ dl_src = b'\x58\xd0\x8a\x69\xa4\xfc'
+ dl_dst = b'\xb6\xe2\xef\xb1\xa6\x2d'
+ dl_vlan = {'buf': b'\xc1\xf9', 'val': 49657}
+ dl_vlan_pcp = {'buf': b'\x79', 'val': 121}
+ zfill0 = b'\x00'
+ dl_type = {'buf': b'\xa6\x9e', 'val': 42654}
+ nw_tos = {'buf': b'\xde', 'val': 222}
+ nw_proto = {'buf': b'\xe5', 'val': 229}
+ zfil11 = b'\x00' * 2
+ nw_src = {'buf': b'\x1b\x6d\x8d\x4b', 'val': 460164427}
+ nw_dst = {'buf': b'\xab\x25\xe1\x20', 'val': 2871386400}
+ tp_src = {'buf': b'\xd5\xc3', 'val': 54723}
+ tp_dst = {'buf': b'\x78\xb9', 'val': 30905}
+
+ match = OFPMatch(wildcards['val'],
+ in_port['val'],
+ dl_src,
+ dl_dst,
+ dl_vlan['val'],
+ dl_vlan_pcp['val'],
+ dl_type['val'],
+ nw_tos['val'],
+ nw_proto['val'],
+ nw_src['val'],
+ nw_dst['val'],
+ tp_src['val'],
+ tp_dst['val'])
+
+ # OFP_FLOW_STATS_REQUEST_ID_PORT_STR
+ # '!BxH'...table_id, zfill, out_port
+ table_id = {'buf': b'\xd1', 'val': 209}
+ zfill = b'\x00' * 1
+ out_port = {'buf': b'\xe4\x9a', 'val': 58522}
+
+ c = OFPFlowStatsRequest(Datapath,
+ flags['val'],
+ match,
+ table_id['val'],
+ out_port['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(ofproto.OFPST_FLOW, self.c.type)
+ eq_(self.flags['val'], self.c.flags)
+ eq_(self.table_id['val'], self.c.table_id)
+ eq_(self.out_port['val'], self.c.out_port)
+
+ # match
+ match = self.c.match
+ eq_(self.match.__hash__(), match.__hash__())
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_MSG_PACK_STR.replace('!', '') \
+ + ofproto.OFP_MATCH_PACK_STR.replace('!', '') \
+ + ofproto.OFP_FLOW_STATS_REQUEST_ID_PORT_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+
+ # OFP_HEADER_PACK_STR
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_STATS_REQUEST, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+
+ # OFP_STATS_MSG_PACK_STR
+ eq_(ofproto.OFPST_FLOW, res[4])
+ eq_(self.flags['val'], res[5])
+
+ # OFP_MATCH_PACK_STR
+ eq_(self.wildcards['val'], res[6])
+ eq_(self.in_port['val'], res[7])
+ eq_(self.dl_src, res[8])
+ eq_(self.dl_dst, res[9])
+ eq_(self.dl_vlan['val'], res[10])
+ eq_(self.dl_vlan_pcp['val'], res[11])
+ eq_(self.dl_type['val'], res[12])
+ eq_(self.nw_tos['val'], res[13])
+ eq_(self.nw_proto['val'], res[14])
+ eq_(self.nw_src['val'], res[15])
+ eq_(self.nw_dst['val'], res[16])
+ eq_(self.tp_src['val'], res[17])
+ eq_(self.tp_dst['val'], res[18])
+
+ # OFP_FLOW_STATS_REQUEST_ID_PORT_STR
+ eq_(self.table_id['val'], res[19])
+ eq_(self.out_port['val'], res[20])
+
+
+class TestOFPAggregateStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPAggregateStatsRequest
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ flags = {'buf': b'\x00\x00', 'val': 0}
+
+ # OFP_MATCH_PACK_STR
+ # '!IH6s6sHBxHBB2xIIHH'...wildcards, in_port, dl_src, dl_dst, dl_vlan,
+ # dl_vlan_pcp, dl_type, nw_tos, nw_proto,
+ # nw_src, nw_dst, tp_src, tp_dst
+ wildcards = {'buf': b'\xea\x66\x4a\xd4', 'val': 3932572372}
+ in_port = {'buf': b'\x64\xac', 'val': 25772}
+ dl_src = b'\x90\x13\x60\x5e\x20\x4d'
+ dl_dst = b'\xb5\x5d\x14\x5e\xb9\x22'
+ dl_vlan = {'buf': b'\x8b\xeb', 'val': 35819}
+ dl_vlan_pcp = {'buf': b'\xe8', 'val': 232}
+ zfill0 = b'\x00'
+ dl_type = {'buf': b'\62\xc9', 'val': 25289}
+ nw_tos = {'buf': b'\xb5', 'val': 181}
+ nw_proto = {'buf': b'\xc4', 'val': 196}
+ zfil11 = b'\x00' * 2
+ nw_src = {'buf': b'\xb7\xd1\xb7\xef', 'val': 3083974639}
+ nw_dst = {'buf': b'\x7c\xc6\x18\x15', 'val': 2093357077}
+ tp_src = {'buf': b'\x26\x9a', 'val': 9882}
+ tp_dst = {'buf': b'\x7a\x89', 'val': 31369}
+
+ match = OFPMatch(wildcards['val'],
+ in_port['val'],
+ dl_src,
+ dl_dst,
+ dl_vlan['val'],
+ dl_vlan_pcp['val'],
+ dl_type['val'],
+ nw_tos['val'],
+ nw_proto['val'],
+ nw_src['val'],
+ nw_dst['val'],
+ tp_src['val'],
+ tp_dst['val'])
+
+ # OFP_FLOW_STATS_REQUEST_ID_PORT_STR
+ # '!BxH'...table_id, zfill, out_port
+ table_id = {'buf': b'\xd1', 'val': 209}
+ zfill = b'\x00' * 1
+ out_port = {'buf': b'\xb5\xe8', 'val': 46568}
+
+ c = OFPAggregateStatsRequest(Datapath,
+ flags['val'],
+ match,
+ table_id['val'],
+ out_port['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(ofproto.OFPST_AGGREGATE, self.c.type)
+ eq_(self.flags['val'], self.c.flags)
+ eq_(self.table_id['val'], self.c.table_id)
+ eq_(self.out_port['val'], self.c.out_port)
+
+ # match
+ match = self.c.match
+ eq_(self.match.__hash__(), match.__hash__())
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_MSG_PACK_STR.replace('!', '') \
+ + ofproto.OFP_MATCH_PACK_STR.replace('!', '') \
+ + ofproto.OFP_FLOW_STATS_REQUEST_ID_PORT_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+
+ # OFP_HEADER_PACK_STR
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_STATS_REQUEST, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+
+ # OFP_STATS_MSG_PACK_STR
+ eq_(ofproto.OFPST_AGGREGATE, res[4])
+ eq_(self.flags['val'], res[5])
+
+ # OFP_MATCH_PACK_STR
+ eq_(self.wildcards['val'], res[6])
+ eq_(self.in_port['val'], res[7])
+ eq_(self.dl_src, res[8])
+ eq_(self.dl_dst, res[9])
+ eq_(self.dl_vlan['val'], res[10])
+ eq_(self.dl_vlan_pcp['val'], res[11])
+ eq_(self.dl_type['val'], res[12])
+ eq_(self.nw_tos['val'], res[13])
+ eq_(self.nw_proto['val'], res[14])
+ eq_(self.nw_src['val'], res[15])
+ eq_(self.nw_dst['val'], res[16])
+ eq_(self.tp_src['val'], res[17])
+ eq_(self.tp_dst['val'], res[18])
+
+ # OFP_FLOW_STATS_REQUEST_ID_PORT_STR
+ eq_(self.table_id['val'], res[19])
+ eq_(self.out_port['val'], res[20])
+
+
+class TestOFPTableStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPTableStatsRequest
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ flags = {'buf': b'\x00\x00', 'val': 0}
+
+ c = OFPTableStatsRequest(Datapath, flags['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(ofproto.OFPST_TABLE, self.c.type)
+ eq_(self.flags['val'], self.c.flags)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_MSG_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+
+ # OFP_HEADER_PACK_STR
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_STATS_REQUEST, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+
+ # OFP_STATS_MSG_PACK_STR
+ eq_(ofproto.OFPST_TABLE, res[4])
+ eq_(self.flags['val'], res[5])
+
+
+class TestOFPPortStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPPortStatsRequest
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ flags = {'buf': b'\x00\x00', 'val': 0}
+
+ # OFP_PORT_STATS_REQUEST_PACK_STR
+ # '!H6x'...port_no, zfill
+ port_no = {'buf': b'\x6d\x27', 'val': 27943}
+
+ c = OFPPortStatsRequest(Datapath,
+ flags['val'],
+ port_no['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(ofproto.OFPST_PORT, self.c.type)
+ eq_(self.flags['val'], self.c.flags)
+ eq_(self.port_no['val'], self.c.port_no)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_MSG_PACK_STR.replace('!', '') \
+ + ofproto.OFP_PORT_STATS_REQUEST_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+
+ # OFP_HEADER_PACK_STR
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_STATS_REQUEST, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+
+ # OFP_STATS_MSG_PACK_STR
+ eq_(ofproto.OFPST_PORT, res[4])
+ eq_(self.flags['val'], res[5])
+
+ # OFP_PORT_STATS_REQUEST_PACK_STR
+ eq_(self.port_no['val'], res[6])
+
+
+class TestOFPQueueStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPQueueStatsRequest
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ flags = {'buf': b'\x00\x00', 'val': 0}
+
+ # OFP_QUEUE_STATS_REQUEST_PACK_STR
+ # '!HxxI'...port_no, zfill, zfill, queue_id
+ port_no = {'buf': b'\x0c\x2d', 'val': 3117}
+ queue_id = {'buf': b'\x1b\xe6\xba\x36', 'val': 468105782}
+
+ c = OFPQueueStatsRequest(Datapath,
+ flags['val'],
+ port_no['val'],
+ queue_id['val'])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(ofproto.OFPST_QUEUE, self.c.type)
+ eq_(self.flags['val'], self.c.flags)
+ eq_(self.port_no['val'], self.c.port_no)
+ eq_(self.queue_id['val'], self.c.queue_id)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_MSG_PACK_STR.replace('!', '') \
+ + ofproto.OFP_QUEUE_STATS_REQUEST_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+
+ # OFP_HEADER_PACK_STR
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_STATS_REQUEST, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+
+ # OFP_STATS_MSG_PACK_STR
+ eq_(ofproto.OFPST_QUEUE, res[4])
+ eq_(self.flags['val'], res[5])
+
+ # OFP_QUEUE_STATS_REQUEST_PACK_STR
+ eq_(self.port_no['val'], res[6])
+ eq_(self.queue_id['val'], res[7])
+
+
+class TestOFPVendorStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_0_parser.OFPVendorStatsRequest
+ """
+
+ class Datapath(object):
+ ofproto = ofproto # copy to class attribute
+ ofproto_parser = ofproto_v1_0_parser
+
+ flags = {'buf': b'\x00\x00', 'val': 0}
+
+ # OFP_VENDOR_STATS_MSG_PACK_STR
+ # '!I'...vendor
+ vendor = {'buf': b'\xff\xff\xff\xff', 'val': ofproto.OFPAT_VENDOR}
+
+ specific_data = b'specific_data'
+
+ c = OFPVendorStatsRequest(Datapath,
+ flags['val'],
+ vendor['val'],
+ specific_data)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(ofproto.OFPST_VENDOR, self.c.type)
+ eq_(self.flags['val'], self.c.flags)
+ eq_(self.vendor['val'], self.c.vendor)
+ eq_(self.specific_data, self.c.specific_data)
+
+ def test_parser(self):
+ # Not used.
+ pass
+
+ def test_serialize(self):
+ self.c.serialize()
+
+ eq_(ofproto.OFP_VERSION, self.c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, self.c.msg_type)
+ eq_(0, self.c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_MSG_PACK_STR.replace('!', '') \
+ + ofproto.OFP_VENDOR_STATS_MSG_PACK_STR.replace('!', '') \
+ + str(len(self.specific_data)) + 's'
+
+ res = struct.unpack(fmt, six.binary_type(self.c.buf))
+
+ # OFP_HEADER_PACK_STR
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_STATS_REQUEST, res[1])
+ eq_(len(self.c.buf), res[2])
+ eq_(0, res[3])
+
+ # OFP_STATS_MSG_PACK_STR
+ eq_(ofproto.OFPST_VENDOR, res[4])
+ eq_(self.flags['val'], res[5])
+
+ # OFP_VENDOR_STATS_MSG_PACK_STR
+ eq_(self.vendor['val'], res[6])
+
+ # specific_data
+ eq_(self.specific_data, res[7])
diff --git a/tests/unit/ofproto/test_parser_v12.py b/tests/unit/ofproto/test_parser_v12.py
new file mode 100644
index 00000000..cf04803d
--- /dev/null
+++ b/tests/unit/ofproto/test_parser_v12.py
@@ -0,0 +1,7560 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import six
+import socket
+from struct import *
+from nose.tools import *
+from ryu.ofproto.ofproto_v1_2_parser import *
+from ryu.ofproto import ofproto_v1_2_parser
+from ryu.ofproto import ofproto_v1_2
+from ryu.ofproto import ofproto_protocol
+from ryu.ofproto import ether
+from ryu.ofproto.ofproto_parser import MsgBase
+from ryu import utils
+from ryu.lib import addrconv
+from ryu.lib import pack_utils
+
+LOG = logging.getLogger('test_ofproto_v12')
+
+
+_Datapath = ofproto_protocol.ProtocolDesc(version=ofproto_v1_2.OFP_VERSION)
+
+
+class TestRegisterParser(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser._register_parser
+ """
+
+ class _OFPDummy(MsgBase):
+ def __init__(self, datapath):
+ self.dummy = 'dummy'
+
+ def parser(self):
+ return self.dummy
+
+ def test_cls_msg_type(self):
+ msg_type = 0xff
+ cls = self._OFPDummy(_Datapath)
+ cls.cls_msg_type = msg_type
+
+ res = ofproto_v1_2_parser._register_parser(cls)
+ res_parser = ofproto_v1_2_parser._MSG_PARSERS[msg_type]
+ del ofproto_v1_2_parser._MSG_PARSERS[msg_type]
+
+ eq_(res.cls_msg_type, msg_type)
+ ok_(res.dummy)
+ eq_(res_parser(), 'dummy')
+
+ @raises(AssertionError)
+ def test_cls_msg_type_none(self):
+ cls = OFPHello(_Datapath)
+ cls.cls_msg_type = None
+ ofproto_v1_2_parser._register_parser(cls)
+
+ @raises(AssertionError)
+ def test_cls_msg_type_already_registed(self):
+ cls = OFPHello(_Datapath)
+ ofproto_v1_2_parser._register_parser(cls)
+
+
+class TestMsgParser(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.msg_parser
+ """
+
+ def _test_msg_parser(self, xid, msg_len):
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_HELLO
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ c = msg_parser(_Datapath, version, msg_type, msg_len, xid, buf)
+
+ eq_(version, c.version)
+ eq_(msg_type, c.msg_type)
+ eq_(msg_len, c.msg_len)
+ eq_(xid, c.xid)
+
+ # buf
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ res = struct.unpack(fmt, c.buf)
+
+ eq_(version, res[0])
+ eq_(msg_type, res[1])
+ eq_(msg_len, res[2])
+ eq_(xid, res[3])
+
+ def test_parser_mid(self):
+ xid = 2147483648
+ msg_len = 8
+ self._test_msg_parser(xid, msg_len)
+
+ def test_parser_max(self):
+ xid = 4294967295
+ msg_len = 65535
+ self._test_msg_parser(xid, msg_len)
+
+ def test_parser_min(self):
+ xid = 0
+ msg_len = 0
+ self._test_msg_parser(xid, msg_len)
+
+
+class TestOFPHello(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPHello
+ """
+
+ def _test_parser(self, xid):
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_HELLO
+ msg_len = ofproto.OFP_HEADER_SIZE
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ res = OFPHello.parser(object, version, msg_type, msg_len, xid,
+ bytearray(buf))
+
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(six.binary_type(buf), six.binary_type(res.buf))
+
+ def test_parser_xid_min(self):
+ xid = 0
+ self._test_parser(xid)
+
+ def test_parser_xid_mid(self):
+ xid = 2183948390
+ self._test_parser(xid)
+
+ def test_parser_xid_max(self):
+ xid = 4294967295
+ self._test_parser(xid)
+
+ def test_serialize(self):
+ c = OFPHello(_Datapath)
+ c.serialize()
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_HELLO, c.msg_type)
+ eq_(0, c.xid)
+
+
+class TestOFPErrorMsg(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPErrorMsg
+ """
+
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_ERROR
+ msg_len = ofproto.OFP_ERROR_MSG_SIZE
+ xid = 2495926989
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ def test_init(self):
+ c = OFPErrorMsg(_Datapath)
+ eq_(c.code, None)
+ eq_(c.type, None)
+ eq_(c.data, None)
+
+ def _test_parser(self, type_, code, data=None):
+
+ # OFP_ERROR_MSG_PACK_STR = '!HH'
+ fmt = ofproto.OFP_ERROR_MSG_PACK_STR
+ buf = self.buf + pack(fmt, type_, code)
+
+ if data is not None:
+ buf += data
+
+ res = OFPErrorMsg.parser(object, self.version, self.msg_type,
+ self.msg_len, self.xid, buf)
+
+ eq_(res.version, self.version)
+ eq_(res.msg_type, self.msg_type)
+ eq_(res.msg_len, self.msg_len)
+ eq_(res.xid, self.xid)
+ eq_(res.type, type_)
+ eq_(res.code, code)
+
+ if data is not None:
+ eq_(res.data, data)
+
+ def test_parser_mid(self):
+ type_ = 32768
+ code = 32768
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_max(self):
+ type_ = 65534
+ code = 65535
+ data = b'Error Message.'.ljust(65523)
+ self._test_parser(type_, code, data)
+
+ def test_parser_min(self):
+ type_ = 0
+ code = 0
+ data = None
+ self._test_parser(type_, code, data)
+
+ def test_parser_p0_1(self):
+ type_ = ofproto.OFPET_HELLO_FAILED
+ code = ofproto.OFPHFC_EPERM
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_0(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_BAD_VERSION
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_1(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_BAD_TYPE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_2(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_BAD_STAT
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_3(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_BAD_EXPERIMENTER
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_4(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_BAD_EXP_TYPE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_5(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_EPERM
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_6(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_BAD_LEN
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_7(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_BUFFER_EMPTY
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_8(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_BUFFER_UNKNOWN
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_9(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_BAD_TABLE_ID
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_10(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_IS_SLAVE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_11(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_BAD_PORT
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p1_12(self):
+ type_ = ofproto.OFPET_BAD_REQUEST
+ code = ofproto.OFPBRC_BAD_PACKET
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_0(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_TYPE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_1(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_LEN
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_2(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_EXPERIMENTER
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_3(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_EXP_TYPE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_4(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_OUT_PORT
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_5(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_ARGUMENT
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_6(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_EPERM
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_7(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_TOO_MANY
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_8(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_QUEUE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_9(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_OUT_GROUP
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_10(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_MATCH_INCONSISTENT
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_11(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_UNSUPPORTED_ORDER
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_12(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_TAG
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_13(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_SET_TYPE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_14(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_SET_LEN
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p2_15(self):
+ type_ = ofproto.OFPET_BAD_ACTION
+ code = ofproto.OFPBAC_BAD_SET_ARGUMENT
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p3_0(self):
+ type_ = ofproto.OFPET_BAD_INSTRUCTION
+ code = ofproto.OFPBIC_UNKNOWN_INST
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p3_1(self):
+ type_ = ofproto.OFPET_BAD_INSTRUCTION
+ code = ofproto.OFPBIC_UNSUP_INST
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p3_2(self):
+ type_ = ofproto.OFPET_BAD_INSTRUCTION
+ code = ofproto.OFPBIC_BAD_TABLE_ID
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p3_3(self):
+ type_ = ofproto.OFPET_BAD_INSTRUCTION
+ code = ofproto.OFPBIC_UNSUP_METADATA
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p3_4(self):
+ type_ = ofproto.OFPET_BAD_INSTRUCTION
+ code = ofproto.OFPBIC_UNSUP_METADATA_MASK
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p3_5(self):
+ type_ = ofproto.OFPET_BAD_INSTRUCTION
+ code = ofproto.OFPBIC_BAD_EXPERIMENTER
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p3_6(self):
+ type_ = ofproto.OFPET_BAD_INSTRUCTION
+ code = ofproto.OFPBIC_BAD_EXP_TYPE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p3_7(self):
+ type_ = ofproto.OFPET_BAD_INSTRUCTION
+ code = ofproto.OFPBIC_BAD_LEN
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p3_8(self):
+ type_ = ofproto.OFPET_BAD_INSTRUCTION
+ code = ofproto.OFPBIC_EPERM
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_0(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_BAD_TYPE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_1(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_BAD_LEN
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_2(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_BAD_TAG
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_3(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_BAD_DL_ADDR_MASK
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_4(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_BAD_NW_ADDR_MASK
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_5(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_BAD_WILDCARDS
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_6(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_BAD_FIELD
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_7(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_BAD_VALUE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_8(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_BAD_MASK
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_9(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_BAD_PREREQ
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_10(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_DUP_FIELD
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p4_11(self):
+ type_ = ofproto.OFPET_BAD_MATCH
+ code = ofproto.OFPBMC_EPERM
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p5_0(self):
+ type_ = ofproto.OFPET_FLOW_MOD_FAILED
+ code = ofproto.OFPFMFC_UNKNOWN
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p5_1(self):
+ type_ = ofproto.OFPET_FLOW_MOD_FAILED
+ code = ofproto.OFPFMFC_TABLE_FULL
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p5_2(self):
+ type_ = ofproto.OFPET_FLOW_MOD_FAILED
+ code = ofproto.OFPFMFC_BAD_TABLE_ID
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p5_3(self):
+ type_ = ofproto.OFPET_FLOW_MOD_FAILED
+ code = ofproto.OFPFMFC_OVERLAP
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p5_4(self):
+ type_ = ofproto.OFPET_FLOW_MOD_FAILED
+ code = ofproto.OFPFMFC_EPERM
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p5_5(self):
+ type_ = ofproto.OFPET_FLOW_MOD_FAILED
+ code = ofproto.OFPFMFC_BAD_TIMEOUT
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p5_6(self):
+ type_ = ofproto.OFPET_FLOW_MOD_FAILED
+ code = ofproto.OFPFMFC_BAD_COMMAND
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p5_7(self):
+ type_ = ofproto.OFPET_FLOW_MOD_FAILED
+ code = ofproto.OFPFMFC_BAD_FLAGS
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_0(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_GROUP_EXISTS
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_1(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_INVALID_GROUP
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_2(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_WEIGHT_UNSUPPORTED
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_3(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_OUT_OF_GROUPS
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_4(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_OUT_OF_BUCKETS
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_5(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_CHAINING_UNSUPPORTED
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_6(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_WATCH_UNSUPPORTED
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_7(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_LOOP
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_8(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_UNKNOWN_GROUP
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_9(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_CHAINED_GROUP
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_10(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_BAD_TYPE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_11(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_BAD_COMMAND
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_12(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_BAD_BUCKET
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_13(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_BAD_WATCH
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p6_14(self):
+ type_ = ofproto.OFPET_GROUP_MOD_FAILED
+ code = ofproto.OFPGMFC_EPERM
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p7_0(self):
+ type_ = ofproto.OFPET_PORT_MOD_FAILED
+ code = ofproto.OFPPMFC_BAD_PORT
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p7_1(self):
+ type_ = ofproto.OFPET_PORT_MOD_FAILED
+ code = ofproto.OFPPMFC_BAD_HW_ADDR
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p7_2(self):
+ type_ = ofproto.OFPET_PORT_MOD_FAILED
+ code = ofproto.OFPPMFC_BAD_CONFIG
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p7_3(self):
+ type_ = ofproto.OFPET_PORT_MOD_FAILED
+ code = ofproto.OFPPMFC_BAD_ADVERTISE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p7_4(self):
+ type_ = ofproto.OFPET_PORT_MOD_FAILED
+ code = ofproto.OFPPMFC_EPERM
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p8_0(self):
+ type_ = ofproto.OFPET_TABLE_MOD_FAILED
+ code = ofproto.OFPTMFC_BAD_TABLE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p8_1(self):
+ type_ = ofproto.OFPET_TABLE_MOD_FAILED
+ code = ofproto.OFPTMFC_BAD_CONFIG
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p8_2(self):
+ type_ = ofproto.OFPET_TABLE_MOD_FAILED
+ code = ofproto.OFPTMFC_EPERM
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p9_0(self):
+ type_ = ofproto.OFPET_QUEUE_OP_FAILED
+ code = ofproto.OFPQOFC_BAD_PORT
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p9_1(self):
+ type_ = ofproto.OFPET_QUEUE_OP_FAILED
+ code = ofproto.OFPQOFC_BAD_QUEUE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p9_2(self):
+ type_ = ofproto.OFPET_QUEUE_OP_FAILED
+ code = ofproto.OFPQOFC_EPERM
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p10_0(self):
+ type_ = ofproto.OFPET_SWITCH_CONFIG_FAILED
+ code = ofproto.OFPSCFC_BAD_FLAGS
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p10_1(self):
+ type_ = ofproto.OFPET_SWITCH_CONFIG_FAILED
+ code = ofproto.OFPSCFC_BAD_LEN
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p10_2(self):
+ type_ = ofproto.OFPET_SWITCH_CONFIG_FAILED
+ code = ofproto.OFPSCFC_EPERM
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p11_0(self):
+ type_ = ofproto.OFPET_ROLE_REQUEST_FAILED
+ code = ofproto.OFPRRFC_STALE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p11_1(self):
+ type_ = ofproto.OFPET_ROLE_REQUEST_FAILED
+ code = ofproto.OFPRRFC_UNSUP
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_p11_2(self):
+ type_ = ofproto.OFPET_ROLE_REQUEST_FAILED
+ code = ofproto.OFPRRFC_BAD_ROLE
+ data = b'Error Message.'
+ self._test_parser(type_, code, data)
+
+ def test_parser_experimenter(self):
+ type_ = 0xffff
+ exp_type = 1
+ experimenter = 1
+ data = b'Error Experimenter Message.'
+
+ # OFP_ERROR_EXPERIMENTER_MSG_PACK_STR = '!HHI'
+ fmt = ofproto.OFP_ERROR_EXPERIMENTER_MSG_PACK_STR
+ buf = self.buf + pack(fmt, type_, exp_type, experimenter) \
+ + data
+
+ res = OFPErrorMsg.parser(object, self.version, self.msg_type,
+ self.msg_len, self.xid, buf)
+
+ eq_(res.version, self.version)
+ eq_(res.msg_type, self.msg_type)
+ eq_(res.msg_len, self.msg_len)
+ eq_(res.xid, self.xid)
+ eq_(res.type, type_)
+ eq_(res.exp_type, exp_type)
+ eq_(res.experimenter, experimenter)
+ eq_(res.data, data)
+
+ def _test_serialize(self, type_, code, data):
+ # OFP_ERROR_MSG_PACK_STR = '!HH'
+ fmt = ofproto.OFP_ERROR_MSG_PACK_STR
+ buf = self.buf + pack(fmt, type_, code) + data
+
+ # initialization
+ c = OFPErrorMsg(_Datapath)
+ c.type = type_
+ c.code = code
+ c.data = data
+
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_ERROR, c.msg_type)
+ eq_(0, c.xid)
+ eq_(len(buf), c.msg_len)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_ERROR_MSG_PACK_STR.replace('!', '') \
+ + str(len(c.data)) + 's'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_ERROR)
+ eq_(res[2], len(buf))
+ eq_(res[3], 0)
+ eq_(res[4], type_)
+ eq_(res[5], code)
+ eq_(res[6], data)
+
+ def test_serialize_mid(self):
+ type_ = 32768
+ code = 32768
+ data = b'Error Message.'
+ self._test_serialize(type_, code, data)
+
+ def test_serialize_max(self):
+ type_ = 65535
+ code = 65535
+ data = b'Error Message.'.ljust(65523)
+ self._test_serialize(type_, code, data)
+
+ def test_serialize_min_except_data(self):
+ type_ = ofproto.OFPET_HELLO_FAILED
+ code = ofproto.OFPHFC_INCOMPATIBLE
+ data = b'Error Message.'
+ self._test_serialize(type_, code, data)
+
+ @raises(AssertionError)
+ def test_serialize_check_data(self):
+ c = OFPErrorMsg(_Datapath)
+ c.serialize()
+
+ def _test_serialize_p(self, type_, code):
+ self._test_serialize(type_, code, b'Error Message.')
+
+ def test_serialize_p0_1(self):
+ self._test_serialize_p(ofproto.OFPET_HELLO_FAILED,
+ ofproto.OFPHFC_EPERM)
+
+ def test_serialize_p1_0(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_BAD_VERSION)
+
+ def test_serialize_p1_1(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_BAD_TYPE)
+
+ def test_serialize_p1_2(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_BAD_STAT)
+
+ def test_serialize_p1_3(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_BAD_EXPERIMENTER)
+
+ def test_serialize_p1_4(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_BAD_EXP_TYPE)
+
+ def test_serialize_p1_5(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_EPERM)
+
+ def test_serialize_p1_6(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_BAD_LEN)
+
+ def test_serialize_p1_7(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_BUFFER_EMPTY)
+
+ def test_serialize_p1_8(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_BUFFER_UNKNOWN)
+
+ def test_serialize_p1_9(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_BAD_TABLE_ID)
+
+ def test_serialize_p1_10(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_IS_SLAVE)
+
+ def test_serialize_p1_11(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_BAD_PORT)
+
+ def test_serialize_p1_12(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_REQUEST,
+ ofproto.OFPBRC_BAD_PACKET)
+
+ def test_serialize_p2_0(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_TYPE)
+
+ def test_serialize_p2_1(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_LEN)
+
+ def test_serialize_p2_2(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_EXPERIMENTER)
+
+ def test_serialize_p2_3(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_EXP_TYPE)
+
+ def test_serialize_p2_4(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_OUT_PORT)
+
+ def test_serialize_p2_5(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_ARGUMENT)
+
+ def test_serialize_p2_6(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_EPERM)
+
+ def test_serialize_p2_7(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_TOO_MANY)
+
+ def test_serialize_p2_8(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_QUEUE)
+
+ def test_serialize_p2_9(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_OUT_GROUP)
+
+ def test_serialize_p2_10(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_MATCH_INCONSISTENT)
+
+ def test_serialize_p2_11(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_UNSUPPORTED_ORDER)
+
+ def test_serialize_p2_12(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_TAG)
+
+ def test_serialize_p2_13(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_SET_TYPE)
+
+ def test_serialize_p2_14(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_SET_LEN)
+
+ def test_serialize_p2_15(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_ACTION,
+ ofproto.OFPBAC_BAD_SET_ARGUMENT)
+
+ def test_serialize_p3_0(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_INSTRUCTION,
+ ofproto.OFPBIC_UNKNOWN_INST)
+
+ def test_serialize_p3_1(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_INSTRUCTION,
+ ofproto.OFPBIC_UNSUP_INST)
+
+ def test_serialize_p3_2(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_INSTRUCTION,
+ ofproto.OFPBIC_BAD_TABLE_ID)
+
+ def test_serialize_p3_3(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_INSTRUCTION,
+ ofproto.OFPBIC_UNSUP_METADATA)
+
+ def test_serialize_p3_4(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_INSTRUCTION,
+ ofproto.OFPBIC_UNSUP_METADATA_MASK)
+
+ def test_serialize_p3_5(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_INSTRUCTION,
+ ofproto.OFPBIC_BAD_EXPERIMENTER)
+
+ def test_serialize_p3_6(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_INSTRUCTION,
+ ofproto.OFPBIC_BAD_EXP_TYPE)
+
+ def test_serialize_p3_7(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_INSTRUCTION,
+ ofproto.OFPBIC_BAD_LEN)
+
+ def test_serialize_p3_8(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_INSTRUCTION,
+ ofproto.OFPBIC_EPERM)
+
+ def test_serialize_p4_0(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_BAD_TYPE)
+
+ def test_serialize_p4_1(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_BAD_LEN)
+
+ def test_serialize_p4_2(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_BAD_TAG)
+
+ def test_serialize_p4_3(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_BAD_DL_ADDR_MASK)
+
+ def test_serialize_p4_4(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_BAD_NW_ADDR_MASK)
+
+ def test_serialize_p4_5(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_BAD_WILDCARDS)
+
+ def test_serialize_p4_6(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_BAD_FIELD)
+
+ def test_serialize_p4_7(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_BAD_VALUE)
+
+ def test_serialize_p4_8(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_BAD_MASK)
+
+ def test_serialize_p4_9(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_BAD_PREREQ)
+
+ def test_serialize_p4_10(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_DUP_FIELD)
+
+ def test_serialize_p4_11(self):
+ self._test_serialize_p(ofproto.OFPET_BAD_MATCH,
+ ofproto.OFPBMC_EPERM)
+
+ def test_serialize_p5_0(self):
+ self._test_serialize_p(ofproto.OFPET_FLOW_MOD_FAILED,
+ ofproto.OFPFMFC_UNKNOWN)
+
+ def test_serialize_p5_1(self):
+ self._test_serialize_p(ofproto.OFPET_FLOW_MOD_FAILED,
+ ofproto.OFPFMFC_TABLE_FULL)
+
+ def test_serialize_p5_2(self):
+ self._test_serialize_p(ofproto.OFPET_FLOW_MOD_FAILED,
+ ofproto.OFPFMFC_BAD_TABLE_ID)
+
+ def test_serialize_p5_3(self):
+ self._test_serialize_p(ofproto.OFPET_FLOW_MOD_FAILED,
+ ofproto.OFPFMFC_OVERLAP)
+
+ def test_serialize_p5_4(self):
+ self._test_serialize_p(ofproto.OFPET_FLOW_MOD_FAILED,
+ ofproto.OFPFMFC_EPERM)
+
+ def test_serialize_p5_5(self):
+ self._test_serialize_p(ofproto.OFPET_FLOW_MOD_FAILED,
+ ofproto.OFPFMFC_BAD_TIMEOUT)
+
+ def test_serialize_p5_6(self):
+ self._test_serialize_p(ofproto.OFPET_FLOW_MOD_FAILED,
+ ofproto.OFPFMFC_BAD_COMMAND)
+
+ def test_serialize_p5_7(self):
+ self._test_serialize_p(ofproto.OFPET_FLOW_MOD_FAILED,
+ ofproto.OFPFMFC_BAD_FLAGS)
+
+ def test_serialize_p6_0(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_GROUP_EXISTS)
+
+ def test_serialize_p6_1(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_INVALID_GROUP)
+
+ def test_serialize_p6_2(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_WEIGHT_UNSUPPORTED)
+
+ def test_serialize_p6_3(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_OUT_OF_GROUPS)
+
+ def test_serialize_p6_4(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_OUT_OF_BUCKETS)
+
+ def test_serialize_p6_5(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_CHAINING_UNSUPPORTED)
+
+ def test_serialize_p6_6(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_WATCH_UNSUPPORTED)
+
+ def test_serialize_p6_7(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_LOOP)
+
+ def test_serialize_p6_8(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_UNKNOWN_GROUP)
+
+ def test_serialize_p6_9(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_CHAINED_GROUP)
+
+ def test_serialize_p6_10(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_BAD_TYPE)
+
+ def test_serialize_p6_11(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_BAD_COMMAND)
+
+ def test_serialize_p6_12(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_BAD_BUCKET)
+
+ def test_serialize_p6_13(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_BAD_WATCH)
+
+ def test_serialize_p6_14(self):
+ self._test_serialize_p(ofproto.OFPET_GROUP_MOD_FAILED,
+ ofproto.OFPGMFC_EPERM)
+
+ def test_serialize_p7_0(self):
+ self._test_serialize_p(ofproto.OFPET_PORT_MOD_FAILED,
+ ofproto.OFPPMFC_BAD_PORT)
+
+ def test_serialize_p7_1(self):
+ self._test_serialize_p(ofproto.OFPET_PORT_MOD_FAILED,
+ ofproto.OFPPMFC_BAD_HW_ADDR)
+
+ def test_serialize_p7_2(self):
+ self._test_serialize_p(ofproto.OFPET_PORT_MOD_FAILED,
+ ofproto.OFPPMFC_BAD_CONFIG)
+
+ def test_serialize_p7_3(self):
+ self._test_serialize_p(ofproto.OFPET_PORT_MOD_FAILED,
+ ofproto.OFPPMFC_BAD_ADVERTISE)
+
+ def test_serialize_p7_4(self):
+ self._test_serialize_p(ofproto.OFPET_PORT_MOD_FAILED,
+ ofproto.OFPPMFC_EPERM)
+
+ def test_serialize_p8_0(self):
+ self._test_serialize_p(ofproto.OFPET_TABLE_MOD_FAILED,
+ ofproto.OFPTMFC_BAD_TABLE)
+
+ def test_serialize_p8_1(self):
+ self._test_serialize_p(ofproto.OFPET_TABLE_MOD_FAILED,
+ ofproto.OFPTMFC_BAD_CONFIG)
+
+ def test_serialize_p8_2(self):
+ self._test_serialize_p(ofproto.OFPET_TABLE_MOD_FAILED,
+ ofproto.OFPTMFC_EPERM)
+
+ def test_serialize_p9_0(self):
+ self._test_serialize_p(ofproto.OFPET_QUEUE_OP_FAILED,
+ ofproto.OFPQOFC_BAD_PORT)
+
+ def test_serialize_p9_1(self):
+ self._test_serialize_p(ofproto.OFPET_QUEUE_OP_FAILED,
+ ofproto.OFPQOFC_BAD_QUEUE)
+
+ def test_serialize_p9_2(self):
+ self._test_serialize_p(ofproto.OFPET_QUEUE_OP_FAILED,
+ ofproto.OFPQOFC_EPERM)
+
+ def test_serialize_p10_0(self):
+ self._test_serialize_p(ofproto.OFPET_SWITCH_CONFIG_FAILED,
+ ofproto.OFPSCFC_BAD_FLAGS)
+
+ def test_serialize_p10_1(self):
+ self._test_serialize_p(ofproto.OFPET_SWITCH_CONFIG_FAILED,
+ ofproto.OFPSCFC_BAD_LEN)
+
+ def test_serialize_p10_2(self):
+ self._test_serialize_p(ofproto.OFPET_SWITCH_CONFIG_FAILED,
+ ofproto.OFPSCFC_EPERM)
+
+ def test_serialize_p11_0(self):
+ self._test_serialize_p(ofproto.OFPET_ROLE_REQUEST_FAILED,
+ ofproto.OFPRRFC_STALE)
+
+ def test_serialize_p11_1(self):
+ self._test_serialize_p(ofproto.OFPET_ROLE_REQUEST_FAILED,
+ ofproto.OFPRRFC_UNSUP)
+
+ def test_serialize_p11_2(self):
+ self._test_serialize_p(ofproto.OFPET_ROLE_REQUEST_FAILED,
+ ofproto.OFPRRFC_BAD_ROLE)
+
+
+class TestOFPErrorExperimenterMsg(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPErrorExperimenterMsg
+ """
+
+ def test_init(self):
+ c = OFPErrorExperimenterMsg(_Datapath)
+ eq_(c.type, 65535)
+ eq_(c.exp_type, None)
+ eq_(c.experimenter, None)
+ eq_(c.data, None)
+
+ def _test_parser(self, exp_type, experimenter, data=None):
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_ERROR
+ msg_len = ofproto.OFP_ERROR_MSG_SIZE
+ xid = 2495926989
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_ERROR_EXPERIMENTER_MSG_PACK_STR = '!HHI'
+ type_ = 0xffff
+ fmt = ofproto.OFP_ERROR_EXPERIMENTER_MSG_PACK_STR
+ buf += pack(fmt, type_, exp_type, experimenter)
+
+ if data is not None:
+ buf += data
+
+ res = OFPErrorExperimenterMsg.parser(
+ object, version, msg_type, msg_len, xid, buf)
+
+ eq_(res.version, version)
+ eq_(res.msg_type, msg_type)
+ eq_(res.msg_len, msg_len)
+ eq_(res.xid, xid)
+ eq_(res.type, type_)
+ eq_(res.exp_type, exp_type)
+ eq_(res.experimenter, experimenter)
+
+ if data is not None:
+ eq_(res.data, data)
+
+ def test_parser_mid(self):
+ exp_type = 32768
+ experimenter = 2147483648
+ data = b'Error Experimenter Message.'
+ self._test_parser(exp_type, experimenter, data)
+
+ def test_parser_max(self):
+ exp_type = 65535
+ experimenter = 4294967295
+ data = b'Error Experimenter Message.'.ljust(65519)
+ self._test_parser(exp_type, experimenter, data)
+
+ def test_parser_min(self):
+ exp_type = 0
+ experimenter = 0
+ self._test_parser(exp_type, experimenter)
+
+
+class TestOFPEchoRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPEchoRequest
+ """
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_ECHO_REQUEST
+ msg_len = ofproto.OFP_HEADER_SIZE
+ xid = 2495926989
+
+ def test_init(self):
+ c = OFPEchoRequest(_Datapath)
+ eq_(c.data, None)
+
+ def _test_parser(self, data=None):
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, self.version, self.msg_type,
+ self.msg_len, self.xid)
+
+ if data is not None:
+ buf += data
+
+ res = OFPEchoRequest.parser(object, self.version, self.msg_type,
+ self.msg_len, self.xid, buf)
+
+ eq_(res.version, self.version)
+ eq_(res.msg_type, self.msg_type)
+ eq_(res.msg_len, self.msg_len)
+ eq_(res.xid, self.xid)
+
+ if data is not None:
+ eq_(res.data, data)
+
+ def test_parser_mid(self):
+ data = b'Request Message.'
+ self._test_parser(data)
+
+ def test_parser_max(self):
+ data = b'Request Message.'.ljust(65527)
+ self._test_parser(data)
+
+ def test_parser_min(self):
+ data = None
+ self._test_parser(data)
+
+ def _test_serialize(self, data):
+ c = OFPEchoRequest(_Datapath)
+ c.data = data
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_ECHO_REQUEST, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+
+ if data is not None:
+ fmt += str(len(c.data)) + 's'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_ECHO_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+
+ if data is not None:
+ eq_(res[4], data)
+
+ def test_serialize_mid(self):
+ data = b'Request Message.'
+ self._test_serialize(data)
+
+ def test_serialize_max(self):
+ data = b'Request Message.'.ljust(65527)
+ self._test_serialize(data)
+
+ def test_serialize_min(self):
+ data = None
+ self._test_serialize(data)
+
+
+class TestOFPEchoReply(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPEchoReply
+ """
+
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_ECHO_REPLY
+ msg_len = ofproto.OFP_HEADER_SIZE
+ xid = 2495926989
+
+ def test_init(self):
+ c = OFPEchoReply(_Datapath)
+ eq_(c.data, None)
+
+ def _test_parser(self, data):
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, self.version, self.msg_type,
+ self.msg_len, self.xid)
+
+ if data is not None:
+ buf += data
+
+ res = OFPEchoReply.parser(object, self.version, self.msg_type,
+ self.msg_len, self.xid, buf)
+
+ eq_(res.version, self.version)
+ eq_(res.msg_type, self.msg_type)
+ eq_(res.msg_len, self.msg_len)
+ eq_(res.xid, self.xid)
+
+ if data is not None:
+ eq_(res.data, data)
+
+ def test_parser_mid(self):
+ data = b'Reply Message.'
+ self._test_parser(data)
+
+ def test_parser_max(self):
+ data = b'Reply Message.'.ljust(65527)
+ self._test_parser(data)
+
+ def test_parser_min(self):
+ data = None
+ self._test_parser(data)
+
+ def _test_serialize(self, data):
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, self.version, self.msg_type,
+ self.msg_len, self.xid) + data
+
+ c = OFPEchoReply(_Datapath)
+ c.data = data
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_ECHO_REPLY, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + str(len(c.data)) + 's'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_ECHO_REPLY)
+ eq_(res[2], len(buf))
+ eq_(res[3], 0)
+ eq_(res[4], data)
+
+ def test_serialize_mid(self):
+ data = b'Reply Message.'
+ self._test_serialize(data)
+
+ def test_serialize_max(self):
+ data = b'Reply Message.'.ljust(65527)
+ self._test_serialize(data)
+
+ @raises(AssertionError)
+ def test_serialize_check_data(self):
+ c = OFPEchoReply(_Datapath)
+ c.serialize()
+
+
+class TestOFPExperimenter(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPExperimenter
+ """
+
+ c = OFPExperimenter(_Datapath)
+
+ def _test_parser(self, xid, experimenter, exp_type):
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_EXPERIMENTER
+ msg_len = ofproto.OFP_EXPERIMENTER_HEADER_SIZE
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_EXPERIMENTER_HEADER_PACK_STR
+ # '!II'...experimenter, exp_type
+ fmt = ofproto.OFP_EXPERIMENTER_HEADER_PACK_STR
+ buf += pack(fmt, experimenter, exp_type)
+
+ res = OFPExperimenter.parser(object, version, msg_type,
+ msg_len, xid, buf)
+
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(experimenter, res.experimenter)
+ eq_(exp_type, res.exp_type)
+
+ def test_parser_mid(self):
+ xid = 2495926989
+ experimenter = 2147483648
+ exp_type = 1
+ self._test_parser(xid, experimenter, exp_type)
+
+ def test_parser_max(self):
+ xid = 4294967295
+ experimenter = 4294967295
+ exp_type = 65535
+ self._test_parser(xid, experimenter, exp_type)
+
+ def test_parser_min(self):
+ xid = 0
+ experimenter = 0
+ exp_type = 0
+ self._test_parser(xid, experimenter, exp_type)
+
+
+class TestOFPPort(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPPort
+ """
+
+ def test_init(self):
+ # OFP_PORT_PACK_STR
+ # '!I4x6s2x16sIIIIIIII'... port_no, pad(4), hw_addr, pad(2),
+ # name, config, state, curr, advertised,
+ # peer, curr_speed, max_speed
+ port_no = 1119692796
+ hw_addr = 'c0:26:53:c4:29:e2'
+ name = b'name'.ljust(16)
+ config = 2226555987
+ state = 1678244809
+ curr = 2850556459
+ advertised = 2025421682
+ supported = 2120575149
+ peer = 2757463021
+ curr_speed = 2641353507
+ max_speed = 1797291672
+
+ fmt = ofproto.OFP_PORT_PACK_STR
+
+ c = OFPPort(port_no, hw_addr, name, config, state, curr,
+ advertised, supported, peer, curr_speed, max_speed)
+
+ eq_(port_no, c.port_no)
+ eq_(hw_addr, c.hw_addr)
+ eq_(name, c.name)
+ eq_(config, c.config)
+ eq_(state, c.state)
+ eq_(curr, c.curr)
+ eq_(advertised, c.advertised)
+ eq_(supported, c.supported)
+ eq_(peer, c.peer)
+ eq_(curr_speed, c.curr_speed)
+ eq_(max_speed, c.max_speed)
+
+ def _test_parser(self, port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed):
+ name = b'name'.ljust(16)
+ fmt = ofproto.OFP_PORT_PACK_STR
+ buf = pack(fmt, port_no, addrconv.mac.text_to_bin(hw_addr), name,
+ config, state, curr,
+ advertised, supported, peer, curr_speed, max_speed)
+
+ res = OFPPort.parser(buf, 0)
+
+ eq_(port_no, res.port_no)
+ eq_(hw_addr, res.hw_addr)
+ eq_(name, res.name)
+ eq_(config, res.config)
+ eq_(state, res.state)
+ eq_(curr, res.curr)
+ eq_(advertised, res.advertised)
+ eq_(supported, res.supported)
+ eq_(peer, res.peer)
+ eq_(curr_speed, res.curr_speed)
+ eq_(max_speed, res.max_speed)
+
+ def test_parser_mid(self):
+ port_no = 1119692796
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = 2226555987
+ state = 1678244809
+ curr = 2850556459
+ advertised = 2025421682
+ supported = 2120575149
+ peer = 2757463021
+ curr_speed = 2641353507
+ max_speed = 1797291672
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_max(self):
+ port_no = ofproto.OFPP_ANY
+ hw_addr = 'ff:ff:ff:ff:ff:ff'
+ config = 4294967295
+ state = 4294967295
+ curr = 4294967295
+ advertised = 4294967295
+ supported = 4294967295
+ peer = 4294967295
+ curr_speed = 4294967295
+ max_speed = 4294967295
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_min(self):
+ port_no = 0
+ hw_addr = '00:00:00:00:00:00'
+ config = 0
+ state = 0
+ curr = 0
+ advertised = 0
+ supported = 0
+ peer = 0
+ curr_speed = 0
+ max_speed = 0
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p1(self):
+ port_no = ofproto.OFPP_MAX
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_PORT_DOWN
+ state = ofproto.OFPPS_LINK_DOWN
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_10MB_HD
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p2(self):
+ port_no = ofproto.OFPP_IN_PORT
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_RECV
+ state = ofproto.OFPPS_BLOCKED
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_10MB_FD
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p3(self):
+ port_no = ofproto.OFPP_TABLE
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_FWD
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_100MB_HD
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p4(self):
+ port_no = ofproto.OFPP_NORMAL
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_100MB_FD
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p5(self):
+ port_no = ofproto.OFPP_FLOOD
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_1GB_HD
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p6(self):
+ port_no = ofproto.OFPP_ALL
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_1GB_FD
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p7(self):
+ port_no = ofproto.OFPP_CONTROLLER
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_10GB_FD
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p8(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_40GB_FD
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p9(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_100GB_FD
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p10(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_1TB_FD
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p11(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_OTHER
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p12(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_COPPER
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p13(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_FIBER
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p14(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_AUTONEG
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p15(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_PAUSE
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p16(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = 'c0:26:53:c4:29:e2'
+ config = ofproto.OFPPC_NO_PACKET_IN
+ state = ofproto.OFPPS_LIVE
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_PAUSE_ASYM
+ self._test_parser(port_no, hw_addr, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+
+class TestOFPFeaturesRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPFeaturesRequest
+ """
+
+ def test_serialize(self):
+ c = OFPFeaturesRequest(_Datapath)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_FEATURES_REQUEST, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_FEATURES_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+
+
+class TestOFPSwitchFeatures(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPSwitchFeatures
+ """
+
+ def _test_parser(self, xid, datapath_id, n_buffers,
+ n_tables, capabilities, reserved, port_cnt=0):
+
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_FEATURES_REPLY
+ msg_len = ofproto.OFP_SWITCH_FEATURES_SIZE \
+ + ofproto.OFP_PORT_SIZE * port_cnt
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_SWITCH_FEATURES_PACK_STR
+ # '!QIB3xII'...datapath_id, n_buffers, n_tables,
+ # pad(3), capabilities, reserved
+
+ fmt = ofproto.OFP_SWITCH_FEATURES_PACK_STR
+ buf += pack(fmt, datapath_id, n_buffers, n_tables,
+ capabilities, reserved)
+
+ for i in range(port_cnt):
+ # OFP_PORT_PACK_STR
+ # '!I4x6s2x16sIIIIIIII'... port_no, pad(4), hw_addr, pad(2),
+ # name, config, state, curr, advertised,
+ # peer, curr_speed, max_speed
+ port_no = i
+
+ fmt = ofproto.OFP_PORT_PACK_STR
+ buf += pack(fmt, port_no, b'\x00' * 6, b'\x00' * 16, 0, 0, 0,
+ 0, 0, 0, 0, 0)
+
+ res = OFPSwitchFeatures.parser(object, version, msg_type,
+ msg_len, xid, buf)
+
+ eq_(res.version, version)
+ eq_(res.msg_type, msg_type)
+ eq_(res.msg_len, msg_len)
+ eq_(res.xid, xid)
+
+ eq_(res.datapath_id, datapath_id)
+ eq_(res.n_buffers, n_buffers)
+ eq_(res.n_tables, n_tables)
+ eq_(res.capabilities, capabilities)
+ eq_(res._reserved, reserved)
+
+ for i in range(port_cnt):
+ eq_(res.ports[i].port_no, i)
+
+ def test_parser_mid(self):
+ xid = 2495926989
+ datapath_id = 1270985291017894273
+ n_buffers = 2148849654
+ n_tables = 228
+ capabilities = 1766843586
+ reserved = 2013714700
+ port_cnt = 1
+
+ self._test_parser(xid, datapath_id, n_buffers, n_tables,
+ capabilities, reserved, port_cnt)
+
+ def test_parser_max(self):
+ xid = 4294967295
+ datapath_id = 18446744073709551615
+ n_buffers = 4294967295
+ n_tables = 255
+ capabilities = 4294967295
+ reserved = 4294967295
+ port_cnt = 1023
+
+ self._test_parser(xid, datapath_id, n_buffers, n_tables,
+ capabilities, reserved, port_cnt)
+
+ def test_parser_min(self):
+ xid = 0
+ datapath_id = 0
+ n_buffers = 0
+ n_tables = 0
+ capabilities = 0
+ reserved = 0
+ port_cnt = 0
+
+ self._test_parser(xid, datapath_id, n_buffers, n_tables,
+ capabilities, reserved, port_cnt)
+
+
+class TestOFPGetConfigRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPGetConfigRequest
+ """
+
+ def test_serialize(self):
+ c = OFPGetConfigRequest(_Datapath)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_GET_CONFIG_REQUEST, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_GET_CONFIG_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+
+
+class TestOFPGetConfigReply(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPGetConfigReply
+ """
+
+ def _test_parser(self, xid, flags, miss_send_len):
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_GET_CONFIG_REPLY
+ msg_len = ofproto.OFP_SWITCH_CONFIG_SIZE
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_SWITCH_CONFIG_PACK_STR
+ # '!HH'...flags, miss_send_len
+ fmt = ofproto.OFP_SWITCH_CONFIG_PACK_STR
+ buf += pack(fmt, flags, miss_send_len)
+
+ res = OFPGetConfigReply.parser(object, version, msg_type,
+ msg_len, xid, buf)
+
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(flags, res.flags)
+ eq_(miss_send_len, res.miss_send_len)
+
+ def test_parser_mid(self):
+ xid = 3423224276
+ flags = 41186
+ miss_send_len = 13838
+ self._test_parser(xid, flags, miss_send_len)
+
+ def test_parser_max(self):
+ xid = 4294967295
+ flags = 65535
+ miss_send_len = 65535
+ self._test_parser(xid, flags, miss_send_len)
+
+ def test_parser_min(self):
+ xid = 0
+ flags = ofproto.OFPC_FRAG_NORMAL
+ miss_send_len = 0
+ self._test_parser(xid, flags, miss_send_len)
+
+ def test_parser_p1(self):
+ xid = 3423224276
+ flags = ofproto.OFPC_FRAG_DROP
+ miss_send_len = 13838
+ self._test_parser(xid, flags, miss_send_len)
+
+ def test_parser_p2(self):
+ xid = 3423224276
+ flags = ofproto.OFPC_FRAG_REASM
+ miss_send_len = 13838
+ self._test_parser(xid, flags, miss_send_len)
+
+ def test_parser_p3(self):
+ xid = 3423224276
+ flags = ofproto.OFPC_FRAG_MASK
+ miss_send_len = 13838
+ self._test_parser(xid, flags, miss_send_len)
+
+ def test_parser_p4(self):
+ xid = 3423224276
+ flags = ofproto.OFPC_INVALID_TTL_TO_CONTROLLER
+ miss_send_len = 13838
+ self._test_parser(xid, flags, miss_send_len)
+
+
+class TestOFPSetConfig(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPSetConfig
+ """
+
+ def test_init(self):
+ # OFP_SWITCH_CONFIG_PACK_STR
+ # '!HH'...flags, miss_send_len
+ flags = 41186
+ miss_send_len = 13838
+
+ c = OFPSetConfig(_Datapath, flags, miss_send_len)
+
+ eq_(flags, c.flags)
+ eq_(miss_send_len, c.miss_send_len)
+
+ def _test_serialize(self, flags, miss_send_len):
+ c = OFPSetConfig(_Datapath, flags, miss_send_len)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_SET_CONFIG, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_SWITCH_CONFIG_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_SET_CONFIG)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], flags)
+ eq_(res[5], miss_send_len)
+
+ def test_serialize_mid(self):
+ flags = 41186
+ miss_send_len = 13838
+ self._test_serialize(flags, miss_send_len)
+
+ def test_serialize_max(self):
+ flags = 65535
+ miss_send_len = 65535
+ self._test_serialize(flags, miss_send_len)
+
+ def test_serialize_min(self):
+ flags = ofproto.OFPC_FRAG_NORMAL
+ miss_send_len = 0
+ self._test_serialize(flags, miss_send_len)
+
+ def test_serialize_p1(self):
+ flags = ofproto.OFPC_FRAG_DROP
+ miss_send_len = 13838
+ self._test_serialize(flags, miss_send_len)
+
+ def test_serialize_p2(self):
+ flags = ofproto.OFPC_FRAG_REASM
+ miss_send_len = 13838
+ self._test_serialize(flags, miss_send_len)
+
+ def test_serialize_p3(self):
+ flags = ofproto.OFPC_FRAG_MASK
+ miss_send_len = 13838
+ self._test_serialize(flags, miss_send_len)
+
+ def test_serialize_p4(self):
+ flags = ofproto.OFPC_INVALID_TTL_TO_CONTROLLER
+ miss_send_len = 13838
+ self._test_serialize(flags, miss_send_len)
+
+ @raises(AssertionError)
+ def test_serialize_check_flags(self):
+ flags = None
+ miss_send_len = 13838
+ c = OFPSetConfig(_Datapath, flags, miss_send_len)
+ c.serialize()
+
+ @raises(AssertionError)
+ def test_serialize_check_miss_send_len(self):
+ flags = 41186
+ miss_send_len = None
+ c = OFPSetConfig(_Datapath, flags, miss_send_len)
+ c.serialize()
+
+
+class TestOFPPacketIn(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPPacketIn
+ """
+
+ def _test_parser(self, xid, buffer_id, total_len=0,
+ reason=0, table_id=0, data=None):
+ if data is None:
+ data = b''
+
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_PACKET_IN
+ msg_len = ofproto.OFP_PACKET_IN_SIZE + len(data)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_PACKET_IN_PACK_STR
+ fmt = ofproto.OFP_PACKET_IN_PACK_STR
+ buf += pack(fmt, buffer_id, total_len, reason, table_id)
+
+ # match
+ buf_match = bytearray()
+ match = OFPMatch()
+ match.serialize(buf_match, 0)
+ buf += six.binary_type(buf_match)
+
+ # data
+ buf += b'\x00' * 2
+ buf += data
+
+ res = OFPPacketIn.parser(object, version, msg_type, msg_len,
+ xid, buf)
+
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(buffer_id, res.buffer_id)
+ eq_(total_len, res.total_len)
+ eq_(reason, res.reason)
+ eq_(table_id, res.table_id)
+ ok_(hasattr(res, 'match'))
+ eq_(ofproto.OFPMT_OXM, res.match.type)
+
+ if data:
+ eq_(data[:total_len], res.data)
+
+ def test_data_is_total_len(self):
+ xid = 3423224276
+ buffer_id = 2926809324
+ reason = 128
+ table_id = 3
+ data = b'PacketIn'
+ total_len = len(data)
+ self._test_parser(xid, buffer_id, total_len, reason, table_id, data)
+
+ def test_data_is_not_total_len(self):
+ xid = 3423224276
+ buffer_id = 2926809324
+ reason = 128
+ table_id = 3
+ data = b'PacketIn'
+ total_len = len(data) - 1
+ self._test_parser(xid, buffer_id, total_len, reason, table_id, data)
+
+ def test_parser_max(self):
+ # 65535(!H max) - 24(without data) = 65511
+ xid = 4294967295
+ buffer_id = 4294967295
+ reason = 255
+ table_id = 255
+ data = b'data'.ljust(65511)
+ total_len = len(data)
+ self._test_parser(xid, buffer_id, total_len, reason, table_id, data)
+
+ def test_parser_min(self):
+ xid = 0
+ buffer_id = 0
+ reason = ofproto.OFPR_NO_MATCH
+ table_id = 0
+ total_len = 0
+ self._test_parser(xid, buffer_id, total_len, reason, table_id)
+
+ def test_parser_p1(self):
+ data = b'data'.ljust(8)
+ xid = 3423224276
+ buffer_id = 2926809324
+ total_len = len(data)
+ reason = ofproto.OFPR_ACTION
+ table_id = 3
+ self._test_parser(xid, buffer_id, total_len, reason, table_id, data)
+
+ def test_parser_p2(self):
+ data = b'data'.ljust(8)
+ xid = 3423224276
+ buffer_id = 2926809324
+ total_len = len(data)
+ reason = ofproto.OFPR_INVALID_TTL
+ table_id = 3
+ self._test_parser(xid, buffer_id, total_len, reason, table_id, data)
+
+
+class TestOFPFlowRemoved(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPFlowRemoved
+ """
+
+ def _test_parser(self, xid, cookie, priority,
+ reason, table_id, duration_sec,
+ duration_nsec, idle_timeout, hard_timeout,
+ packet_count, byte_count):
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_FLOW_REMOVED
+ msg_len = ofproto.OFP_FLOW_REMOVED_SIZE
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_FLOW_REMOVED_PACK_STR0
+ # '!QHBBIIHHQQ' ...cookie, priority, reason, table_id,
+ # duration_sec, duration_nsec, idle_timeout,
+ # hard_timeout, packet_count, byte_count
+
+ fmt = ofproto.OFP_FLOW_REMOVED_PACK_STR0
+ buf += pack(fmt, cookie, priority, reason, table_id,
+ duration_sec, duration_nsec, idle_timeout,
+ hard_timeout, packet_count, byte_count)
+
+ # OFP_MATCH_PACK_STR
+ match = OFPMatch()
+ buf_match = bytearray()
+ match.serialize(buf_match, 0)
+
+ buf += six.binary_type(buf_match)
+
+ res = OFPFlowRemoved.parser(object, version, msg_type,
+ msg_len, xid, buf)
+
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(cookie, res.cookie)
+ eq_(priority, res.priority)
+ eq_(reason, res.reason)
+ eq_(table_id, res.table_id)
+ eq_(duration_sec, res.duration_sec)
+ eq_(duration_nsec, res.duration_nsec)
+ eq_(idle_timeout, res.idle_timeout)
+ eq_(hard_timeout, res.hard_timeout)
+ eq_(packet_count, res.packet_count)
+ eq_(byte_count, res.byte_count)
+ ok_(hasattr(res, 'match'))
+ eq_(ofproto.OFPMT_OXM, res.match.type)
+
+ def test_parser_mid(self):
+ xid = 3423224276
+ cookie = 178378173441633860
+ priority = 718
+ reason = 128
+ table_id = 169
+ duration_sec = 2250548154
+ duration_nsec = 2492776995
+ idle_timeout = 60284
+ hard_timeout = 60285
+ packet_count = 6489108735192644493
+ byte_count = 7334344481123449724
+ self._test_parser(xid, cookie, priority,
+ reason, table_id, duration_sec,
+ duration_nsec, idle_timeout, hard_timeout,
+ packet_count, byte_count)
+
+ def test_parser_max(self):
+ xid = 4294967295
+ cookie = 18446744073709551615
+ priority = 65535
+ reason = 255
+ table_id = 255
+ duration_sec = 4294967295
+ duration_nsec = 4294967295
+ idle_timeout = 65535
+ hard_timeout = 65535
+ packet_count = 18446744073709551615
+ byte_count = 18446744073709551615
+ self._test_parser(xid, cookie, priority,
+ reason, table_id, duration_sec,
+ duration_nsec, idle_timeout, hard_timeout,
+ packet_count, byte_count)
+
+ def test_parser_min(self):
+ xid = 0
+ cookie = 0
+ priority = 0
+ reason = ofproto.OFPRR_IDLE_TIMEOUT
+ table_id = 0
+ duration_sec = 0
+ duration_nsec = 0
+ idle_timeout = 0
+ hard_timeout = 0
+ packet_count = 0
+ byte_count = 0
+ self._test_parser(xid, cookie, priority,
+ reason, table_id, duration_sec,
+ duration_nsec, idle_timeout, hard_timeout,
+ packet_count, byte_count)
+
+ def test_parser_p1(self):
+ xid = 3423224276
+ cookie = 178378173441633860
+ priority = 718
+ reason = ofproto.OFPRR_HARD_TIMEOUT
+ table_id = 169
+ duration_sec = 2250548154
+ duration_nsec = 2492776995
+ idle_timeout = 60284
+ hard_timeout = 60285
+ packet_count = 6489108735192644493
+ byte_count = 7334344481123449724
+ self._test_parser(xid, cookie, priority,
+ reason, table_id, duration_sec,
+ duration_nsec, idle_timeout, hard_timeout,
+ packet_count, byte_count)
+
+ def test_parser_p2(self):
+ xid = 3423224276
+ cookie = 178378173441633860
+ priority = 718
+ reason = ofproto.OFPRR_DELETE
+ table_id = 169
+ duration_sec = 2250548154
+ duration_nsec = 2492776995
+ idle_timeout = 60284
+ hard_timeout = 60285
+ packet_count = 6489108735192644493
+ byte_count = 7334344481123449724
+ self._test_parser(xid, cookie, priority,
+ reason, table_id, duration_sec,
+ duration_nsec, idle_timeout, hard_timeout,
+ packet_count, byte_count)
+
+ def test_parser_p3(self):
+ xid = 3423224276
+ cookie = 178378173441633860
+ priority = 718
+ reason = ofproto.OFPRR_GROUP_DELETE
+ table_id = 169
+ duration_sec = 2250548154
+ duration_nsec = 2492776995
+ idle_timeout = 60284
+ hard_timeout = 60285
+ packet_count = 6489108735192644493
+ byte_count = 7334344481123449724
+ self._test_parser(xid, cookie, priority,
+ reason, table_id, duration_sec,
+ duration_nsec, idle_timeout, hard_timeout,
+ packet_count, byte_count)
+
+
+class TestOFPPortStatus(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPPortStatus
+ """
+
+ def _test_parser(self, xid, reason,
+ port_no, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed):
+
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_PORT_STATUS
+ msg_len = ofproto.OFP_PORT_STATUS_SIZE
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_PORT_STATUS_PACK_STR = '!B7x' + _OFP_PORT_PACK_STR
+ # '!B7x'...reason, pad(7)
+ # OFP_PORT_PACK_STR
+ # '!I4x6s2x16sIIIIIIII'... port_no, pad(4), hw_addr, pad(2),
+ # name, config, state, curr, advertised,
+ # peer, curr_speed, max_speed
+ hw_addr = '80:ff:9a:e3:72:85'
+ name = b'name'.ljust(16)
+
+ fmt = ofproto.OFP_PORT_STATUS_PACK_STR
+ buf += pack(fmt, reason, port_no, addrconv.mac.text_to_bin(hw_addr),
+ name, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ res = OFPPortStatus.parser(object, version, msg_type, msg_len,
+ xid, buf)
+
+ eq_(reason, res.reason)
+ eq_(port_no, res.desc.port_no)
+ eq_(hw_addr, res.desc.hw_addr)
+ eq_(name, res.desc.name)
+ eq_(config, res.desc.config)
+ eq_(state, res.desc.state)
+ eq_(curr, res.desc.curr)
+ eq_(advertised, res.desc.advertised)
+ eq_(supported, res.desc.supported)
+ eq_(peer, res.desc.peer)
+ eq_(curr_speed, res.desc.curr_speed)
+ eq_(max_speed, res.desc.max_speed)
+
+ def test_parser_mid(self):
+ xid = 3423224276
+ reason = 128
+ port_no = 1119692796
+ config = 2226555987
+ state = 1678244809
+ curr = 2850556459
+ advertised = 2025421682
+ supported = 2120575149
+ peer = 2757463021
+ curr_speed = 2641353507
+ max_speed = 1797291672
+ self._test_parser(xid, reason,
+ port_no, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_max(self):
+ xid = 4294967295
+ reason = 255
+ port_no = ofproto.OFPP_ANY
+ config = 4294967295
+ state = 4294967295
+ curr = 4294967295
+ advertised = 4294967295
+ supported = 4294967295
+ peer = 4294967295
+ curr_speed = 4294967295
+ max_speed = 4294967295
+ self._test_parser(xid, reason,
+ port_no, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_min(self):
+ xid = 0
+ reason = 0
+ port_no = 0
+ config = 0
+ state = 0
+ curr = 0
+ advertised = 0
+ supported = 0
+ peer = 0
+ curr_speed = 0
+ max_speed = 0
+ self._test_parser(xid, reason,
+ port_no, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p1(self):
+ xid = 3423224276
+ reason = ofproto.OFPPR_DELETE
+ port_no = ofproto.OFPP_MAX
+ config = ofproto.OFPPC_PORT_DOWN
+ state = ofproto.OFPPS_LINK_DOWN
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_10MB_HD
+ self._test_parser(xid, reason,
+ port_no, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+ def test_parser_p2(self):
+ xid = 3423224276
+ reason = ofproto.OFPPR_MODIFY
+ port_no = ofproto.OFPP_MAX
+ config = ofproto.OFPPC_PORT_DOWN
+ state = ofproto.OFPPS_LINK_DOWN
+ curr = advertised = supported \
+ = peer = curr_speed = max_speed \
+ = ofproto.OFPPF_10MB_HD
+ self._test_parser(xid, reason,
+ port_no, config, state, curr, advertised,
+ supported, peer, curr_speed, max_speed)
+
+
+class TestOFPPacketOut(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPPacketOut
+ """
+
+ def _test_init(self, in_port):
+ buffer_id = 0xffffffff
+ data = b'Message'
+ out_port = 0x00002ae0
+ actions = [OFPActionOutput(out_port, 0)]
+
+ c = OFPPacketOut(_Datapath, buffer_id, in_port, actions, data)
+
+ eq_(buffer_id, c.buffer_id)
+ eq_(in_port, c.in_port)
+ eq_(0, c.actions_len)
+ eq_(data, c.data)
+ eq_(actions, c.actions)
+
+ def test_init(self):
+ in_port = 0x00040455
+ self._test_init(in_port)
+
+ @raises(AssertionError)
+ def test_init_check_in_port(self):
+ in_port = None
+ self._test_init(in_port)
+
+ def _test_serialize(self, buffer_id, in_port, action_cnt=0, data=None):
+ actions = []
+ for i in range(action_cnt):
+ actions.append(ofproto_v1_2_parser.OFPActionOutput(i, 0))
+
+ c = OFPPacketOut(_Datapath, buffer_id, in_port, actions, data)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_PACKET_OUT, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR \
+ + ofproto.OFP_PACKET_OUT_PACK_STR[1:] \
+ + ofproto.OFP_ACTION_OUTPUT_PACK_STR[1:] * action_cnt
+
+ if data is not None:
+ fmt += str(len(data)) + 's'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_PACKET_OUT)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], buffer_id)
+ eq_(res[5], in_port)
+ eq_(res[6], ofproto.OFP_ACTION_OUTPUT_SIZE * action_cnt)
+
+ for i in range(action_cnt):
+ index = 7 + i * 4
+ eq_(res[index], ofproto.OFPAT_OUTPUT)
+ eq_(res[index + 1], ofproto.OFP_ACTION_OUTPUT_SIZE)
+ eq_(res[index + 2], i)
+ eq_(res[index + 3], 0)
+
+ if data:
+ eq_(res[-1], data)
+
+ def test_serialize_true(self):
+ buffer_id = 0xffffffff
+ in_port = 0x00040455
+ action_cnt = 2
+ data = b'Message'
+ self._test_serialize(buffer_id, in_port, action_cnt, data)
+
+ def test_serialize_none(self):
+ buffer_id = 0xffffffff
+ in_port = 0x00040455
+ self._test_serialize(buffer_id, in_port)
+
+ def test_serialize_max(self):
+ buffer_id = 0xffffffff
+ in_port = 4294967295
+ action_cnt = 1
+ data = b'Message'.ljust(65495)
+ self._test_serialize(buffer_id, in_port, action_cnt, data)
+
+ def test_serialize_min(self):
+ buffer_id = 0
+ in_port = 0
+ self._test_serialize(buffer_id, in_port)
+
+ def test_serialize_p1(self):
+ buffer_id = 2147483648
+ in_port = ofproto.OFPP_CONTROLLER
+ self._test_serialize(buffer_id, in_port)
+
+ @raises(AssertionError)
+ def test_serialize_check_buffer_id(self):
+ buffer_id = 2147483648
+ in_port = 1
+ action_cnt = 0
+ data = b'DATA'
+ self._test_serialize(buffer_id, in_port, action_cnt, data)
+
+
+class TestOFPFlowMod(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPFlowMod
+ """
+
+ def test_init(self):
+ # OFP_FLOW_MOD_PACK_STR0
+ # '!QQBBHHHIIIH2x'...cookie, cookie_mask, table_id, command,
+ # idle_timeout, hard_timeout, priority, buffer_id,
+ # out_port, out_group, flags
+ cookie = 2127614848199081640
+ cookie_mask = 2127614848199081641
+ table_id = 3
+ command = 0
+ idle_timeout = 62317
+ hard_timeout = 7365
+ priority = 40163
+ buffer_id = 4037115955
+ out_port = 65037
+ out_group = 6606
+ flags = 135
+ instructions = [OFPInstructionGotoTable(table_id)]
+
+ in_port = 1
+ match = OFPMatch()
+ match.set_in_port(in_port)
+
+ c = OFPFlowMod(_Datapath, cookie, cookie_mask, table_id, command,
+ idle_timeout, hard_timeout, priority, buffer_id,
+ out_port, out_group, flags, match, instructions)
+
+ eq_(cookie, c.cookie)
+ eq_(cookie_mask, c.cookie_mask)
+ eq_(table_id, c.table_id)
+ eq_(command, c.command)
+ eq_(idle_timeout, c.idle_timeout)
+ eq_(hard_timeout, c.hard_timeout)
+ eq_(priority, c.priority)
+ eq_(buffer_id, c.buffer_id)
+ eq_(out_port, c.out_port)
+ eq_(out_group, c.out_group)
+ eq_(flags, c.flags)
+ eq_(in_port, c.match._flow.in_port)
+ eq_(instructions[0], c.instructions[0])
+
+ def _test_serialize(self, cookie, cookie_mask, table_id,
+ command, idle_timeout, hard_timeout,
+ priority, buffer_id, out_port,
+ out_group, flags, inst_cnt=0):
+ dl_type = 0x0800
+ match = OFPMatch()
+ match.set_dl_type(dl_type)
+
+ insts = []
+ for i in range(inst_cnt):
+ insts.append(OFPInstructionGotoTable(i))
+
+ c = OFPFlowMod(_Datapath, cookie, cookie_mask, table_id, command,
+ idle_timeout, hard_timeout, priority, buffer_id,
+ out_port, out_group, flags, match, insts)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_FLOW_MOD, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR \
+ + ofproto.OFP_FLOW_MOD_PACK_STR0[1:] \
+ + 'HHHBB' \
+ + MTEthType.pack_str[1:] + '6x' \
+ + ofproto.OFP_INSTRUCTION_GOTO_TABLE_PACK_STR[1:] * inst_cnt
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_FLOW_MOD)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], cookie)
+ eq_(res[5], cookie_mask)
+ eq_(res[6], table_id)
+ eq_(res[7], command)
+ eq_(res[8], idle_timeout)
+ eq_(res[9], hard_timeout)
+ eq_(res[10], priority)
+ eq_(res[11], buffer_id)
+ eq_(res[12], out_port)
+ eq_(res[13], out_group)
+ eq_(res[14], flags)
+
+ # OFP_MATCH (type, length, class, [field, hashmask], n_byte, ip_proto)
+ eq_(res[15], ofproto.OFPMT_OXM)
+ eq_(res[16], 10) # OFP_MATCH_STR + MTEthType.pack_str
+ eq_(res[17], ofproto.OFPXMC_OPENFLOW_BASIC)
+ eq_(res[18] >> 1, ofproto.OFPXMT_OFB_ETH_TYPE)
+ eq_(res[18] & 0b0001, 0)
+ eq_(res[19], calcsize(MTEthType.pack_str))
+ eq_(res[20], dl_type)
+
+ # insts (type, length, table_id)
+ for i in range(inst_cnt):
+ index = 21 + 3 * i
+ eq_(res[index], ofproto.OFPIT_GOTO_TABLE)
+ eq_(res[index + 1], ofproto.OFP_INSTRUCTION_GOTO_TABLE_SIZE)
+ eq_(res[index + 2], i)
+
+ def test_serialize_mid(self):
+ cookie = 2127614848199081640
+ cookie_mask = 2127614848199081641
+ table_id = 3
+ command = 128
+ idle_timeout = 62317
+ hard_timeout = 7365
+ priority = 40163
+ buffer_id = 4037115955
+ out_port = 65037
+ out_group = 6606
+ flags = 135
+ inst_cnt = 1
+ self._test_serialize(cookie, cookie_mask, table_id,
+ command, idle_timeout, hard_timeout,
+ priority, buffer_id, out_port,
+ out_group, flags, inst_cnt)
+
+ def test_serialize_max(self):
+ cookie = 18446744073709551615
+ cookie_mask = 18446744073709551615
+ table_id = 255
+ command = 255
+ idle_timeout = 65535
+ hard_timeout = 65535
+ priority = 65535
+ buffer_id = 0xffffffff
+ out_port = 0xffffffff
+ out_group = 0xffffffff
+ flags = 65535
+ inst_cnt = 0xff
+ self._test_serialize(cookie, cookie_mask, table_id,
+ command, idle_timeout, hard_timeout,
+ priority, buffer_id, out_port,
+ out_group, flags, inst_cnt)
+
+ def test_serialize_min(self):
+ cookie = 0
+ cookie_mask = 0
+ table_id = 0
+ command = ofproto.OFPFC_ADD
+ idle_timeout = 0
+ hard_timeout = 0
+ priority = 0
+ buffer_id = 0
+ out_port = 0
+ out_group = 0
+ flags = 0
+ self._test_serialize(cookie, cookie_mask, table_id,
+ command, idle_timeout, hard_timeout,
+ priority, buffer_id, out_port,
+ out_group, flags)
+
+ def test_serialize_p1(self):
+ cookie = 2127614848199081640
+ cookie_mask = 2127614848199081641
+ table_id = 3
+ command = 1
+ idle_timeout = 62317
+ hard_timeout = 7365
+ priority = 40163
+ buffer_id = 4037115955
+ out_port = 65037
+ out_group = 6606
+ flags = 1 << 0
+ self._test_serialize(cookie, cookie_mask, table_id,
+ command, idle_timeout, hard_timeout,
+ priority, buffer_id, out_port,
+ out_group, flags)
+
+ def test_serialize_p2(self):
+ cookie = 2127614848199081640
+ cookie_mask = 2127614848199081641
+ table_id = 3
+ command = 2
+ idle_timeout = 62317
+ hard_timeout = 7365
+ priority = 40163
+ buffer_id = 4037115955
+ out_port = 65037
+ out_group = 6606
+ flags = 1 << 0
+ self._test_serialize(cookie, cookie_mask, table_id,
+ command, idle_timeout, hard_timeout,
+ priority, buffer_id, out_port,
+ out_group, flags)
+
+ def test_serialize_p3(self):
+ cookie = 2127614848199081640
+ cookie_mask = 2127614848199081641
+ table_id = 3
+ command = 3
+ idle_timeout = 62317
+ hard_timeout = 7365
+ priority = 40163
+ buffer_id = 4037115955
+ out_port = 65037
+ out_group = 6606
+ flags = 1 << 1
+ self._test_serialize(cookie, cookie_mask, table_id,
+ command, idle_timeout, hard_timeout,
+ priority, buffer_id, out_port,
+ out_group, flags)
+
+ def test_serialize_p4(self):
+ cookie = 2127614848199081640
+ cookie_mask = 2127614848199081641
+ table_id = 3
+ command = 4
+ idle_timeout = 62317
+ hard_timeout = 7365
+ priority = 40163
+ buffer_id = 4037115955
+ out_port = 65037
+ out_group = 6606
+ flags = 1 << 2
+ self._test_serialize(cookie, cookie_mask, table_id,
+ command, idle_timeout, hard_timeout,
+ priority, buffer_id, out_port,
+ out_group, flags)
+
+
+class TestOFPInstructionGotoTable(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPInstructionGotoTable
+ """
+
+ # OFP_INSTRUCTION_GOTO_TABLE_PACK_STR
+ # '!HHB3x'...type, len, table_id, pad(3)
+ type_ = ofproto.OFPIT_GOTO_TABLE
+ len_ = ofproto.OFP_INSTRUCTION_GOTO_TABLE_SIZE
+
+ fmt = ofproto.OFP_INSTRUCTION_GOTO_TABLE_PACK_STR
+
+ def test_init(self):
+ table_id = 3
+ c = OFPInstructionGotoTable(table_id)
+
+ eq_(self.type_, c.type)
+ eq_(self.len_, c.len)
+ eq_(table_id, c.table_id)
+
+ def _test_parser(self, table_id):
+ buf = pack(self.fmt, self.type_, self.len_, table_id)
+ res = OFPInstructionGotoTable.parser(buf, 0)
+
+ eq_(res.len, self.len_)
+ eq_(res.type, self.type_)
+ eq_(res.table_id, table_id)
+
+ def test_parser_mid(self):
+ self._test_parser(3)
+
+ def test_parser_max(self):
+ self._test_parser(255)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+ def _test_serialize(self, table_id):
+ c = OFPInstructionGotoTable(table_id)
+
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], table_id)
+
+ def test_serialize_mid(self):
+ self._test_serialize(3)
+
+ def test_serialize_max(self):
+ self._test_serialize(255)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+
+class TestOFPInstructionWriteMetadata(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPInstructionWriteMetadata
+ """
+
+ # OFP_INSTRUCTION_WRITE_METADATA_PACK_STR
+ # '!HH4xQQ'...type, len, pad(4), metadata, metadata_mask
+ type_ = ofproto.OFPIT_WRITE_METADATA
+ len_ = ofproto.OFP_INSTRUCTION_WRITE_METADATA_SIZE
+ metadata = 0x1212121212121212
+ metadata_mask = 0xff00ff00ff00ff00
+
+ fmt = ofproto.OFP_INSTRUCTION_WRITE_METADATA_PACK_STR
+
+ def test_init(self):
+ c = OFPInstructionWriteMetadata(self.metadata,
+ self.metadata_mask)
+
+ eq_(self.type_, c.type)
+ eq_(self.len_, c.len)
+ eq_(self.metadata, c.metadata)
+ eq_(self.metadata_mask, c.metadata_mask)
+
+ def _test_parser(self, metadata, metadata_mask):
+ buf = pack(self.fmt, self.type_, self.len_,
+ metadata, metadata_mask)
+
+ res = OFPInstructionWriteMetadata.parser(buf, 0)
+ eq_(res.len, self.len_)
+ eq_(res.type, self.type_)
+ eq_(res.metadata, metadata)
+ eq_(res.metadata_mask, metadata_mask)
+
+ def test_parser_metadata_mid(self):
+ self._test_parser(self.metadata, self.metadata_mask)
+
+ def test_parser_metadata_max(self):
+ metadata = 0xffffffffffffffff
+ self._test_parser(metadata, self.metadata_mask)
+
+ def test_parser_metadata_min(self):
+ metadata = 0
+ self._test_parser(metadata, self.metadata_mask)
+
+ def test_parser_metadata_mask_max(self):
+ metadata_mask = 0xffffffffffffffff
+ self._test_parser(self.metadata, metadata_mask)
+
+ def test_parser_metadata_mask_min(self):
+ metadata_mask = 0
+ self._test_parser(self.metadata, metadata_mask)
+
+ def _test_serialize(self, metadata, metadata_mask):
+ c = OFPInstructionWriteMetadata(metadata,
+ metadata_mask)
+
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], metadata)
+ eq_(res[3], metadata_mask)
+
+ def test_serialize_metadata_mid(self):
+ self._test_serialize(self.metadata, self.metadata_mask)
+
+ def test_serialize_metadata_max(self):
+ metadata = 0xffffffffffffffff
+ self._test_serialize(metadata, self.metadata_mask)
+
+ def test_serialize_metadata_min(self):
+ metadata = 0
+ self._test_serialize(metadata, self.metadata_mask)
+
+ def test_serialize_metadata_mask_max(self):
+ metadata_mask = 0xffffffffffffffff
+ self._test_serialize(self.metadata, metadata_mask)
+
+ def test_serialize_metadata_mask_min(self):
+ metadata_mask = 0
+ self._test_serialize(self.metadata, metadata_mask)
+
+
+class TestOFPInstructionActions(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPInstructionActions
+ """
+ # OFP_INSTRUCTION_ACTIONS_PACK_STR
+ # '!HH4x'...type, len, pad(4)
+ type_ = ofproto.OFPIT_WRITE_ACTIONS
+ len_ = ofproto.OFP_INSTRUCTION_ACTIONS_SIZE \
+ + ofproto.OFP_ACTION_OUTPUT_SIZE
+
+ fmt = ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR
+ buf = pack(fmt, type_, len_)
+
+ # OFP_ACTION (OFP_ACTION_OUTPUT)
+ port = 0x00002ae0
+ max_len = ofproto.OFP_ACTION_OUTPUT_SIZE
+ actions = [OFPActionOutput(port, max_len)]
+ buf_actions = bytearray()
+ actions[0].serialize(buf_actions, 0)
+
+ buf += six.binary_type(buf_actions)
+
+ def test_init(self):
+ c = OFPInstructionActions(self.type_, self.actions)
+
+ eq_(self.type_, c.type)
+ eq_(self.actions, c.actions)
+
+ def _test_parser(self, action_cnt):
+ # OFP_INSTRUCTION_ACTIONS_PACK_STR
+ # '!HH4x'...type, len, pad(4)
+ len_ = ofproto.OFP_INSTRUCTION_ACTIONS_SIZE \
+ + (ofproto.OFP_ACTION_OUTPUT_SIZE * action_cnt)
+
+ fmt = ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR
+ buf = pack(fmt, self.type_, len_)
+
+ actions = []
+ for a in range(action_cnt):
+ # OFP_ACTION (OFP_ACTION_OUTPUT)
+ port = a
+ action = OFPActionOutput(port, self.max_len)
+ actions.append(action)
+ buf_actions = bytearray()
+ actions[a].serialize(buf_actions, 0)
+ buf += six.binary_type(buf_actions)
+
+ res = OFPInstructionActions.parser(buf, 0)
+
+ # 8
+ eq_(res.len, len_)
+ eq_(res.type, self.type_)
+
+ # 8 + 16 * action_cnt < 65535 byte
+ # action_cnt <= 4095
+ for a in range(action_cnt):
+ eq_(res.actions[a].type, actions[a].type)
+ eq_(res.actions[a].len, actions[a].len)
+ eq_(res.actions[a].port, actions[a].port)
+ eq_(res.actions[a].max_len, actions[a].max_len)
+
+ def test_parser_mid(self):
+ self._test_parser(2047)
+
+ def test_parser_max(self):
+ self._test_parser(4095)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+ def _test_serialize(self, action_cnt):
+ # OFP_INSTRUCTION_ACTIONS_PACK_STR
+ # '!HH4x'...type, len, pad(4)
+ len_ = ofproto.OFP_INSTRUCTION_ACTIONS_SIZE \
+ + (ofproto.OFP_ACTION_OUTPUT_SIZE * action_cnt)
+
+ actions = []
+ for a in range(action_cnt):
+ # OFP_ACTION (OFP_ACTION_OUTPUT)
+ port = a
+ action = OFPActionOutput(port, self.max_len)
+ actions.append(action)
+
+ c = OFPInstructionActions(self.type_, actions)
+
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ fmt = '!' \
+ + ofproto.OFP_INSTRUCTION_ACTIONS_PACK_STR.replace('!', '')
+
+ for a in range(action_cnt):
+ fmt += ofproto.OFP_ACTION_OUTPUT_PACK_STR.replace('!', '')
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(res[0], self.type_)
+ eq_(res[1], len_)
+
+ for a in range(action_cnt):
+ d = 2 + a * 4
+ eq_(res[d], actions[a].type)
+ eq_(res[d + 1], actions[a].len)
+ eq_(res[d + 2], actions[a].port)
+ eq_(res[d + 3], actions[a].max_len)
+
+ def test_serialize_mid(self):
+ self._test_serialize(2047)
+
+ def test_serialize_max(self):
+ self._test_serialize(4095)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+
+class TestOFPActionHeader(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionHeader
+ """
+
+ def test_init(self):
+ # OFP_ACTION_HEADER_PACK_STR
+ # '!HH4x'...type, len, pad(4)
+ type_ = ofproto.OFPAT_OUTPUT
+ len_ = ofproto.OFP_ACTION_HEADER_SIZE
+
+ fmt = ofproto.OFP_ACTION_HEADER_PACK_STR
+ buf = pack(fmt, type_, len_)
+
+ c = OFPActionHeader(type_, len_)
+
+ eq_(type_, c.type)
+ eq_(len_, c.len)
+
+ def _test_serialize(self, type_, len_):
+ # OFP_ACTION_HEADER_PACK_STR
+ # '!HH4x'...type, len, pad(4)
+
+ fmt = ofproto.OFP_ACTION_HEADER_PACK_STR
+ buf = pack(fmt, type_, len_)
+
+ c = OFPActionHeader(type_, len_)
+
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_HEADER_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(res[0], type_)
+ eq_(res[1], len_)
+
+ def test_serialize_mid(self):
+ type_ = 11
+ len_ = 8
+ self._test_serialize(type_, len_)
+
+ def test_serialize_max(self):
+ type_ = 0xffff
+ len_ = 0xffff
+ self._test_serialize(type_, len_)
+
+ def test_serialize_min(self):
+ type_ = 0
+ len_ = 0
+ self._test_serialize(type_, len_)
+
+
+class TestOFPActionOutput(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionOutput
+ """
+
+ # OFP_ACTION_OUTPUT_PACK_STR
+ # '!HHIH6x'...type, len, port, max_len, pad(6)
+ type_ = ofproto.OFPAT_OUTPUT
+ len_ = ofproto.OFP_ACTION_OUTPUT_SIZE
+
+ def test_init(self):
+ port = 6606
+ max_len = 1500
+ fmt = ofproto.OFP_ACTION_OUTPUT_PACK_STR
+ c = OFPActionOutput(port, max_len)
+ eq_(port, c.port)
+ eq_(max_len, c.max_len)
+
+ def _test_parser(self, port, max_len):
+ fmt = ofproto.OFP_ACTION_OUTPUT_PACK_STR
+ buf = pack(fmt, self.type_, self.len_, port, max_len)
+
+ c = OFPActionOutput(port, max_len)
+
+ res = c.parser(buf, 0)
+
+ eq_(res.len, self.len_)
+ eq_(res.type, self.type_)
+ eq_(res.port, port)
+ eq_(res.max_len, max_len)
+
+ def test_parser_mid(self):
+ port = 6606
+ max_len = 16
+ self._test_parser(port, max_len)
+
+ def test_parser_max(self):
+ port = 4294967295
+ max_len = 0xffff
+ self._test_parser(port, max_len)
+
+ def test_parser_min(self):
+ port = 0
+ max_len = 0
+ self._test_parser(port, max_len)
+
+ def test_parser_p1(self):
+ port = 6606
+ max_len = 0xffe5
+ self._test_parser(port, max_len)
+
+ def _test_serialize(self, port, max_len):
+ c = OFPActionOutput(port, max_len)
+
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_ACTION_OUTPUT_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], port)
+ eq_(res[3], max_len)
+
+ def test_serialize_mid(self):
+ port = 6606
+ max_len = 16
+ self._test_serialize(port, max_len)
+
+ def test_serialize_max(self):
+ port = 4294967295
+ max_len = 0xffff
+ self._test_serialize(port, max_len)
+
+ def test_serialize_min(self):
+ port = 0
+ max_len = 0
+ self._test_serialize(port, max_len)
+
+ def test_serialize_p1(self):
+ port = 6606
+ max_len = 0xffe5
+ self._test_serialize(port, max_len)
+
+
+class TestOFPActionGroup(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionGroup
+ """
+
+ # OFP_ACTION_GROUP_PACK_STR
+ # '!HHI'...type, len, group_id
+ type_ = ofproto.OFPAT_GROUP
+ len_ = ofproto.OFP_ACTION_GROUP_SIZE
+ group_id = 6606
+
+ fmt = ofproto.OFP_ACTION_GROUP_PACK_STR
+
+ def test_init(self):
+ c = OFPActionGroup(self.group_id)
+ eq_(self.group_id, c.group_id)
+
+ def _test_parser(self, group_id):
+ buf = pack(self.fmt, self.type_, self.len_, group_id)
+
+ res = OFPActionGroup.parser(buf, 0)
+ eq_(res.len, self.len_)
+ eq_(res.type, self.type_)
+ eq_(res.group_id, group_id)
+
+ def test_parser_mid(self):
+ self._test_parser(self.group_id)
+
+ def test_parser_max(self):
+ self._test_parser(4294967295)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+ def _test_serialize(self, group_id):
+ c = OFPActionGroup(group_id)
+
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], group_id)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.group_id)
+
+ def test_serialize_max(self):
+ self._test_serialize(4294967295)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+
+class TestOFPActionSetQueue(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionSetQueue
+ """
+
+ # OFP_ACTION_SET_QUEUE_PACK_STR
+ # '!HHI'...type, len, queue_id
+ type_ = ofproto.OFPAT_SET_QUEUE
+ len_ = ofproto.OFP_ACTION_SET_QUEUE_SIZE
+ queue_id = 6606
+
+ fmt = ofproto.OFP_ACTION_SET_QUEUE_PACK_STR
+
+ def test_init(self):
+ c = OFPActionSetQueue(self.queue_id)
+ eq_(self.queue_id, c.queue_id)
+
+ def _test_parser(self, queue_id):
+ buf = pack(self.fmt, self.type_, self.len_, queue_id)
+
+ res = OFPActionSetQueue.parser(buf, 0)
+ eq_(res.len, self.len_)
+ eq_(res.type, self.type_)
+ eq_(res.queue_id, queue_id)
+
+ def test_parser_mid(self):
+ self._test_parser(self.queue_id)
+
+ def test_parser_max(self):
+ self._test_parser(4294967295)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+ def _test_serialize(self, queue_id):
+ c = OFPActionSetQueue(queue_id)
+
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], queue_id)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.queue_id)
+
+ def test_serialize_max(self):
+ self._test_serialize(4294967295)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+
+class TestOFPActionSetMplsTtl(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionSetMplsTtl
+ """
+
+ # OFP_ACTION_MPLS_TTL_PACK_STR
+ # '!HHB3x'...type, len, mpls_ttl, pad(3)
+ type_ = ofproto.OFPAT_SET_MPLS_TTL
+ len_ = ofproto.OFP_ACTION_MPLS_TTL_SIZE
+ mpls_ttl = 254
+
+ fmt = ofproto.OFP_ACTION_MPLS_TTL_PACK_STR
+
+ def test_init(self):
+ c = OFPActionSetMplsTtl(self.mpls_ttl)
+ eq_(self.mpls_ttl, c.mpls_ttl)
+
+ def _test_parser(self, mpls_ttl):
+ buf = pack(self.fmt, self.type_, self.len_, mpls_ttl)
+
+ res = OFPActionSetMplsTtl.parser(buf, 0)
+ eq_(res.len, self.len_)
+ eq_(res.type, self.type_)
+ eq_(res.mpls_ttl, mpls_ttl)
+
+ def test_parser_mid(self):
+ self._test_parser(self.mpls_ttl)
+
+ def test_parser_max(self):
+ self._test_parser(255)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+ def _test_serialize(self, mpls_ttl):
+ c = OFPActionSetMplsTtl(mpls_ttl)
+
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], mpls_ttl)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.mpls_ttl)
+
+ def test_serialize_max(self):
+ self._test_serialize(255)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+
+class TestOFPActionDecMplsTtl(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionDecMplsTtl
+ """
+
+ type_ = ofproto.OFPAT_DEC_MPLS_TTL
+ len_ = ofproto.OFP_ACTION_MPLS_TTL_SIZE
+ fmt = ofproto.OFP_ACTION_HEADER_PACK_STR
+ buf = pack(fmt, type_, len_)
+ c = OFPActionDecMplsTtl()
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(res.len, self.len_)
+ eq_(res.type, self.type_)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+
+
+class TestOFPActionSetNwTtl(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionSetNwTtl
+ """
+
+ # OFP_ACTION_NW_TTL_PACK_STR
+ # '!HHB3x'...type, len, nw_ttl, pad(3)
+ type_ = ofproto.OFPAT_SET_NW_TTL
+ len_ = ofproto.OFP_ACTION_NW_TTL_SIZE
+ nw_ttl = 240
+
+ fmt = ofproto.OFP_ACTION_NW_TTL_PACK_STR
+
+ def test_init(self):
+ c = OFPActionSetNwTtl(self.nw_ttl)
+ eq_(self.nw_ttl, c.nw_ttl)
+
+ def _test_parser(self, nw_ttl):
+ buf = pack(self.fmt, self.type_, self.len_, nw_ttl)
+
+ res = OFPActionSetNwTtl.parser(buf, 0)
+ eq_(res.type, self.type_)
+ eq_(res.len, self.len_)
+ eq_(res.nw_ttl, nw_ttl)
+
+ def test_parser_mid(self):
+ self._test_parser(self.nw_ttl)
+
+ def test_parser_max(self):
+ self._test_parser(255)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+ def _test_serialize(self, nw_ttl):
+ c = OFPActionSetNwTtl(nw_ttl)
+
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], nw_ttl)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.nw_ttl)
+
+ def test_serialize_max(self):
+ self._test_serialize(255)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+
+class TestOFPActionDecNwTtl(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionDecNwTtl
+ """
+
+ type_ = ofproto.OFPAT_DEC_NW_TTL
+ len_ = ofproto.OFP_ACTION_NW_TTL_SIZE
+ fmt = ofproto.OFP_ACTION_HEADER_PACK_STR
+ buf = pack(fmt, type_, len_)
+ c = OFPActionDecNwTtl()
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(res.len, self.len_)
+ eq_(res.type, self.type_)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+
+
+class TestOFPActionCopyTtlOut(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionCopyTtlOut
+ """
+
+ type_ = ofproto.OFPAT_COPY_TTL_OUT
+ len_ = ofproto.OFP_ACTION_HEADER_SIZE
+ fmt = ofproto.OFP_ACTION_HEADER_PACK_STR
+ buf = pack(fmt, type_, len_)
+ c = OFPActionCopyTtlOut()
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(res.len, self.len_)
+ eq_(res.type, self.type_)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+
+
+class TestOFPActionCopyTtlIn(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionCopyTtlIn
+ """
+
+ # OFP_ACTION_HEADER_PACK_STR
+ # '!HH'...type, len
+ type_ = ofproto.OFPAT_COPY_TTL_IN
+ len_ = ofproto.OFP_ACTION_HEADER_SIZE
+ fmt = ofproto.OFP_ACTION_HEADER_PACK_STR
+ buf = pack(fmt, type_, len_)
+ c = OFPActionCopyTtlIn()
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(res.len, self.len_)
+ eq_(res.type, self.type_)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+
+
+class TestOFPActionPushVlan(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionPushVlan
+ """
+
+ # OFP_ACTION_PUSH_PACK_STR
+ # '!HHH2x'...type, len, ethertype, pad(2)
+ type_ = ofproto.OFPAT_PUSH_VLAN
+ len_ = ofproto.OFP_ACTION_PUSH_SIZE
+ fmt = ofproto.OFP_ACTION_PUSH_PACK_STR
+
+ def test_init(self):
+ ethertype = 0x8100
+ c = OFPActionPushVlan(ethertype)
+ eq_(ethertype, c.ethertype)
+
+ def _test_parser(self, ethertype):
+ buf = pack(self.fmt, self.type_, self.len_, ethertype)
+
+ res = OFPActionPushVlan.parser(buf, 0)
+ eq_(res.type, self.type_)
+ eq_(res.len, self.len_)
+ eq_(res.ethertype, ethertype)
+
+ def test_parser_mid(self):
+ self._test_parser(0x8100)
+
+ def test_parser_max(self):
+ self._test_parser(0xffff)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+ def _test_serialize(self, ethertype):
+ c = OFPActionPushVlan(ethertype)
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], ethertype)
+
+ def test_serialize_mid(self):
+ self._test_serialize(0x8100)
+
+ def test_serialize_max(self):
+ self._test_serialize(0xffff)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+
+class TestOFPActionPushMpls(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionPushMpls
+ """
+
+ # OFP_ACTION_PUSH_PACK_STR
+ # '!HHH2x'...type, len, ethertype, pad(2)
+ type_ = ofproto.OFPAT_PUSH_MPLS
+ len_ = ofproto.OFP_ACTION_PUSH_SIZE
+ fmt = ofproto.OFP_ACTION_PUSH_PACK_STR
+
+ def test_init(self):
+ ethertype = 0x8100
+ c = OFPActionPushMpls(ethertype)
+ eq_(ethertype, c.ethertype)
+
+ def _test_parser(self, ethertype):
+ buf = pack(self.fmt, self.type_, self.len_, ethertype)
+
+ res = OFPActionPushMpls.parser(buf, 0)
+ eq_(res.type, self.type_)
+ eq_(res.len, self.len_)
+ eq_(res.ethertype, ethertype)
+
+ def test_parser_mid(self):
+ self._test_parser(0x8100)
+
+ def test_parser_max(self):
+ self._test_parser(0xffff)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+ def _test_serialize(self, ethertype):
+ c = OFPActionPushMpls(ethertype)
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], ethertype)
+
+ def test_serialize_mid(self):
+ self._test_serialize(0x8100)
+
+ def test_serialize_max(self):
+ self._test_serialize(0xffff)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+
+class TestOFPActionPopVlan(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionPopVlan
+ """
+
+ # OFP_ACTION_HEADER_PACK_STR
+ # '!HH'...type, len
+ type_ = ofproto.OFPAT_POP_VLAN
+ len_ = ofproto.OFP_ACTION_HEADER_SIZE
+ fmt = ofproto.OFP_ACTION_HEADER_PACK_STR
+ buf = pack(fmt, type_, len_)
+ c = OFPActionPopVlan()
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+ eq_(self.type_, res.type)
+ eq_(self.len_, res.len)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+
+
+class TestOFPActionPopMpls(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionPopMpls
+ """
+
+ # OFP_ACTION_POP_MPLS_PACK_STR
+ # '!HHH2x'...type, len, ethertype, pad(2)
+ type_ = ofproto.OFPAT_POP_MPLS
+ len_ = ofproto.OFP_ACTION_POP_MPLS_SIZE
+ fmt = ofproto.OFP_ACTION_POP_MPLS_PACK_STR
+
+ def test_init(self):
+ ethertype = 0x8100
+ c = OFPActionPopMpls(ethertype)
+ eq_(ethertype, c.ethertype)
+
+ def _test_parser(self, ethertype):
+ buf = pack(self.fmt, self.type_, self.len_, ethertype)
+
+ res = OFPActionPopMpls.parser(buf, 0)
+ eq_(res.type, self.type_)
+ eq_(res.len, self.len_)
+ eq_(res.ethertype, ethertype)
+
+ def test_parser_mid(self):
+ self._test_parser(0x8100)
+
+ def test_parser_max(self):
+ self._test_parser(0xffff)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+ def _test_serialize(self, ethertype):
+ c = OFPActionPopMpls(ethertype)
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], ethertype)
+
+ def test_serialize_mid(self):
+ self._test_serialize(0x8100)
+
+ def test_serialize_max(self):
+ self._test_serialize(0xffff)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+
+class TestOFPActionSetField(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionSetField
+ """
+
+ type_ = ofproto.OFPAT_SET_FIELD
+ header = ofproto.OXM_OF_IN_PORT
+ in_port = 6606
+
+ field = MTInPort(header, in_port)
+ length = ofproto.OFP_ACTION_SET_FIELD_SIZE + field.oxm_len()
+ len_ = utils.round_up(length, 8)
+
+ fmt = '!HHII4x'
+ buf = pack(fmt, type_, len_, header, in_port)
+
+ c = OFPActionSetField(field)
+
+ def test_init(self):
+ eq_(self.field, self.c.field)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(res.type, self.type_)
+ eq_(res.len, self.len_)
+ eq_(res.field.header, self.header)
+ eq_(res.field.value, self.in_port)
+
+ def test_serialize(self):
+ buf = bytearray()
+ self.c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], self.header)
+ eq_(res[3], self.in_port)
+
+
+class TestOFPActionExperimenter(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPActionExperimenter
+ """
+
+ # OFP_ACTION_EXPERIMENTER_HEADER_PACK_STR v1.2
+ # '!HHI'...type, len, experimenter
+ type_ = ofproto.OFPAT_EXPERIMENTER
+ len_ = ofproto.OFP_ACTION_EXPERIMENTER_HEADER_SIZE
+ fmt = ofproto.OFP_ACTION_EXPERIMENTER_HEADER_PACK_STR
+
+ def test_init(self):
+ experimenter = 4294967295
+ c = OFPActionExperimenter(experimenter)
+ eq_(experimenter, c.experimenter)
+
+ def _test_parser(self, experimenter):
+ buf = pack(self.fmt, self.type_, self.len_, experimenter)
+
+ res = OFPActionExperimenter.parser(buf, 0)
+ eq_(res.type, self.type_)
+ eq_(res.len, self.len_)
+ eq_(res.experimenter, experimenter)
+
+ def test_parser_mid(self):
+ experimenter = 2147483648
+ self._test_parser(experimenter)
+
+ def test_parser_max(self):
+ experimenter = 4294967295
+ self._test_parser(experimenter)
+
+ def test_parser_min(self):
+ experimenter = 0
+ self._test_parser(experimenter)
+
+ def _test_serialize(self, experimenter):
+ c = OFPActionExperimenter(experimenter)
+
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ res = struct.unpack(self.fmt, six.binary_type(buf))
+ eq_(res[0], self.type_)
+ eq_(res[1], self.len_)
+ eq_(res[2], experimenter)
+
+ def test_serialize_mid(self):
+ experimenter = 2147483648
+ self._test_serialize(experimenter)
+
+ def test_serialize_max(self):
+ experimenter = 4294967295
+ self._test_serialize(experimenter)
+
+ def test_serialize_min(self):
+ experimenter = 0
+ self._test_serialize(experimenter)
+
+
+class TestOFPBucket(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPBucket
+ """
+
+ def test_init(self):
+ # OFP_BUCKET_PACK_STR
+ # '!HHII4x'...len, weight, watch_port, watch_group, pad(4)
+ weight = 4386
+ watch_port = 6606
+ watch_group = 3
+
+ # OFP_ACTION (OFP_ACTION_OUTPUT)
+ port = 3
+ max_len = 1500
+ actions = [OFPActionOutput(port, max_len)]
+
+ c = OFPBucket(weight, watch_port, watch_group, actions)
+ eq_(weight, c.weight)
+ eq_(watch_port, c.watch_port)
+ eq_(watch_group, c.watch_group)
+ eq_(1, len(c.actions))
+ eq_(port, c.actions[0].port)
+ eq_(max_len, c.actions[0].max_len)
+
+ def _test_parser(self, weight, watch_port, watch_group, action_cnt):
+ # OFP_BUCKET_PACK_STR
+ # '!HHII4x'...len, weight, watch_port, watch_group, pad(4)
+ len_ = ofproto.OFP_BUCKET_SIZE \
+ + (ofproto.OFP_ACTION_OUTPUT_SIZE * action_cnt)
+
+ fmt = ofproto.OFP_BUCKET_PACK_STR
+ buf = pack(fmt, len_, weight, watch_port, watch_group)
+
+ actions = []
+ for a in range(action_cnt):
+ # OFP_ACTION (OFP_ACTION_OUTPUT)
+ port = a
+ max_len = ofproto.OFP_ACTION_OUTPUT_SIZE
+ action = OFPActionOutput(port, max_len)
+ actions.append(action)
+ buf_actions = bytearray()
+ actions[a].serialize(buf_actions, 0)
+ buf += six.binary_type(buf_actions)
+
+ res = OFPBucket.parser(buf, 0)
+
+ # 16
+ eq_(weight, res.weight)
+ eq_(watch_port, res.watch_port)
+ eq_(watch_group, res.watch_group)
+
+ # 16 + 16 * action_cnt < 65535 byte
+ # action_cnt <= 4094
+ for a in range(action_cnt):
+ eq_(actions[a].type, res.actions[a].type)
+ eq_(actions[a].len, res.actions[a].len)
+ eq_(actions[a].port, res.actions[a].port)
+ eq_(actions[a].max_len, res.actions[a].max_len)
+
+ def test_parser_mid(self):
+ weight = 4386
+ watch_port = 6606
+ watch_group = 3
+ action_cnt = 2047
+ self._test_parser(weight, watch_port,
+ watch_group, action_cnt)
+
+ def test_parser_max(self):
+ weight = 65535
+ watch_port = 4294967295
+ watch_group = 4294967295
+ action_cnt = 4094
+ self._test_parser(weight, watch_port,
+ watch_group, action_cnt)
+
+ def test_parser_min(self):
+ weight = 0
+ watch_port = 0
+ watch_group = 0
+ action_cnt = 0
+ self._test_parser(weight, watch_port,
+ watch_group, action_cnt)
+
+ def _test_serialize(self, weight, watch_port, watch_group,
+ action_cnt):
+ # OFP_BUCKET_PACK_STR
+ # '!HHII4x'...len, weight, watch_port, watch_group, pad(4)
+ len_ = ofproto.OFP_BUCKET_SIZE \
+ + (ofproto.OFP_ACTION_OUTPUT_SIZE * action_cnt)
+
+ actions = []
+ for a in range(action_cnt):
+ # OFP_ACTION (OFP_ACTION_OUTPUT)
+ port = a
+ max_len = ofproto.OFP_ACTION_OUTPUT_SIZE
+ action = OFPActionOutput(port, max_len)
+ actions.append(action)
+
+ c = OFPBucket(weight, watch_port, watch_group, actions)
+
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_BUCKET_PACK_STR
+ for a in range(action_cnt):
+ fmt += ofproto.OFP_ACTION_OUTPUT_PACK_STR[1:]
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(res[0], len_)
+ eq_(res[1], weight)
+ eq_(res[2], watch_port)
+ eq_(res[3], watch_group)
+
+ for a in range(action_cnt):
+ d = 4 + a * 4
+ eq_(res[d], actions[a].type)
+ eq_(res[d + 1], actions[a].len)
+ eq_(res[d + 2], actions[a].port)
+ eq_(res[d + 3], actions[a].max_len)
+
+ def test_serialize_mid(self):
+ weight = 4386
+ watch_port = 6606
+ watch_group = 3
+ action_cnt = 2047
+ self._test_serialize(weight, watch_port,
+ watch_group, action_cnt)
+
+ def test_serialize_max(self):
+ weight = 65535
+ watch_port = 4294967295
+ watch_group = 4294967295
+ action_cnt = 4094
+ self._test_serialize(weight, watch_port,
+ watch_group, action_cnt)
+
+ def test_serialize_min(self):
+ weight = 0
+ watch_port = 0
+ watch_group = 0
+ action_cnt = 0
+ self._test_serialize(weight, watch_port,
+ watch_group, action_cnt)
+
+
+class TestOFPGroupMod(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPGroupMod
+ """
+
+ def test_init(self):
+ # OFP_GROUP_MOD_PACK_STR
+ # '!HBBI'...command, type, pad, group_id
+ command = ofproto.OFPFC_ADD
+ type_ = ofproto.OFPGT_SELECT
+ group_id = 6606
+
+ # OFP_BUCKET
+ weight = 4386
+ watch_port = 8006
+ watch_group = 3
+
+ # OFP_ACTION (OFP_ACTION_OUTPUT)
+ port = 10
+ max_len = 2000
+ actions = [OFPActionOutput(port, max_len)]
+
+ buckets = [OFPBucket(weight, watch_port, watch_group, actions)]
+
+ c = OFPGroupMod(_Datapath, command, type_, group_id, buckets)
+ eq_(command, c.command)
+ eq_(type_, c.type)
+ eq_(group_id, c.group_id)
+ eq_(1, len(c.buckets))
+ eq_(1, len(c.buckets[0].actions))
+ eq_(port, c.buckets[0].actions[0].port)
+ eq_(max_len, c.buckets[0].actions[0].max_len)
+
+ def _test_serialize(self, command, type_, group_id, bucket_cnt):
+ len_ = ofproto.OFP_BUCKET_SIZE \
+ + ofproto.OFP_ACTION_OUTPUT_SIZE
+
+ buckets = []
+ for b in range(bucket_cnt):
+ # OFP_BUCKET
+ weight = watch_port = watch_group = port = b
+ actions = [OFPActionOutput(port, 0)]
+ bucket = OFPBucket(weight, watch_port, watch_group, actions)
+ buckets.append(bucket)
+
+ c = OFPGroupMod(_Datapath, command, type_, group_id, buckets)
+
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_GROUP_MOD, c.msg_type)
+ eq_(0, c.xid)
+ eq_(len(c.buf), c.msg_len)
+
+ # 16 byte
+ fmt = ofproto.OFP_HEADER_PACK_STR \
+ + ofproto.OFP_GROUP_MOD_PACK_STR[1:]
+
+ # 16 + (16 + 16) * bucket_cnt < 65535 byte
+ # bucket_cnt <= 2047
+ for b in range(bucket_cnt):
+ fmt += ofproto.OFP_BUCKET_PACK_STR[1:] \
+ + ofproto.OFP_ACTION_OUTPUT_PACK_STR[1:]
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ msg_len = ofproto.OFP_GROUP_MOD_SIZE \
+ + (len_ * bucket_cnt)
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_GROUP_MOD)
+ eq_(res[2], msg_len)
+ eq_(res[3], 0)
+ eq_(res[4], command)
+ eq_(res[5], type_)
+ eq_(res[6], group_id)
+
+ for d in range(bucket_cnt):
+ e = 7 + d * 8
+ eq_(res[e + 1], buckets[d].weight)
+ eq_(res[e + 2], buckets[d].watch_port)
+ eq_(res[e + 3], buckets[d].watch_group)
+ eq_(res[e + 4], buckets[d].actions[0].type)
+ eq_(res[e + 5], buckets[d].actions[0].len)
+ eq_(res[e + 6], buckets[d].actions[0].port)
+ eq_(res[e + 7], buckets[d].actions[0].max_len)
+
+ def test_serialize_mid(self):
+ command = 32768
+ type_ = 128
+ group_id = 6606
+ bucket_cnt = 1023
+ self._test_serialize(command, type_, group_id, bucket_cnt)
+
+ def test_serialize_max(self):
+ command = 65535
+ type_ = 255
+ group_id = 4294967295
+ bucket_cnt = 2047
+ self._test_serialize(command, type_, group_id, bucket_cnt)
+
+ def test_serialize_min(self):
+ command = 0
+ type_ = 0
+ group_id = 0
+ bucket_cnt = 0
+ self._test_serialize(command, type_, group_id, bucket_cnt)
+
+ def test_serialize_p1(self):
+ command = 1
+ type_ = 1
+ group_id = 6606
+ bucket_cnt = 1023
+ self._test_serialize(command, type_, group_id, bucket_cnt)
+
+ def test_serialize_p2(self):
+ command = 1
+ type_ = 2
+ group_id = 6606
+ bucket_cnt = 1023
+ self._test_serialize(command, type_, group_id, bucket_cnt)
+
+ def test_serialize_p3(self):
+ command = 2
+ type_ = 3
+ group_id = 6606
+ bucket_cnt = 1023
+ self._test_serialize(command, type_, group_id, bucket_cnt)
+
+
+class TestOFPPortMod(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPPortMod
+ """
+
+ # OFP_PORT_MOD_PACK_STR v1.2
+ # '!I4xs2xIII4x'...port_no, pad(4), hw_addr, pad(2),
+ # config, mask, advertise, pad(4)
+ port_no = 1119692796
+ hw_addr = 'e8:fe:5e:a9:68:6c'
+ config = 2226555987
+ mask = 1678244809
+ advertise = 2025421682
+
+ def test_init(self):
+ c = OFPPortMod(_Datapath, self.port_no, self.hw_addr,
+ self.config, self.mask, self.advertise)
+ eq_(self.port_no, c.port_no)
+ eq_(self.hw_addr, c.hw_addr)
+ eq_(self.config, c.config)
+ eq_(self.mask, c.mask)
+ eq_(self.advertise, c.advertise)
+
+ def _test_serialize(self, port_no, hw_addr, config, mask, advertise):
+ c = OFPPortMod(_Datapath, port_no, hw_addr, config,
+ mask, advertise)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_PORT_MOD, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_PORT_MOD_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_PORT_MOD)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], port_no)
+ eq_(res[5], addrconv.mac.text_to_bin(hw_addr))
+ eq_(res[6], config)
+ eq_(res[7], mask)
+ eq_(res[8], advertise)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.port_no, self.hw_addr,
+ self.config, self.mask, self.advertise)
+
+ def test_serialize_max(self):
+ port_no = ofproto.OFPP_ANY
+ hw_addr = 'ff:ff:ff:ff:ff:ff'
+ config = 0xffffffff
+ mask = 0xffffffff
+ advertise = 0xffffffff
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_min(self):
+ port_no = 0
+ hw_addr = '00:00:00:00:00:00'
+ config = 0
+ mask = 0
+ advertise = 0
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p1(self):
+ port_no = ofproto.OFPP_MAX
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_PORT_DOWN
+ mask = ofproto.OFPPC_PORT_DOWN
+ advertise = ofproto.OFPPF_10MB_HD
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p2(self):
+ port_no = ofproto.OFPP_IN_PORT
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_RECV
+ mask = ofproto.OFPPC_NO_RECV
+ advertise = ofproto.OFPPF_10MB_FD
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p3(self):
+ port_no = ofproto.OFPP_TABLE
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_FWD
+ mask = ofproto.OFPPC_NO_FWD
+ advertise = ofproto.OFPPF_100MB_HD
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p4(self):
+ port_no = ofproto.OFPP_NORMAL
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_100MB_FD
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p5(self):
+ port_no = ofproto.OFPP_FLOOD
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_1GB_HD
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p6(self):
+ port_no = ofproto.OFPP_ALL
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_1GB_FD
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p7(self):
+ port_no = ofproto.OFPP_CONTROLLER
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_10GB_FD
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p8(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_40GB_FD
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p9(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_100GB_FD
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p10(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_1TB_FD
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p11(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_OTHER
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p12(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_COPPER
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p13(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_FIBER
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p14(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_AUTONEG
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p15(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_PAUSE
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+ def test_serialize_p16(self):
+ port_no = ofproto.OFPP_LOCAL
+ hw_addr = self.hw_addr
+ config = ofproto.OFPPC_NO_PACKET_IN
+ mask = ofproto.OFPPC_NO_PACKET_IN
+ advertise = ofproto.OFPPF_PAUSE_ASYM
+ self._test_serialize(port_no, hw_addr, config, mask, advertise)
+
+
+class TestOFPTableMod(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPTableMod
+ """
+
+ # OFP_PORT_TABLE_PACK_STR v1.2
+ # '!B3xI'...table_id, pad(3), config
+ table_id = 3
+ config = 2226555987
+
+ def test_init(self):
+ c = OFPTableMod(_Datapath, self.table_id, self.config)
+ eq_(self.table_id, c.table_id)
+ eq_(self.config, c.config)
+
+ def _test_serialize(self, table_id, config):
+ c = OFPTableMod(_Datapath, table_id, config)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_TABLE_MOD, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_TABLE_MOD_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_TABLE_MOD)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], table_id)
+ eq_(res[5], config)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.table_id, self.config)
+
+ def test_serialize_max(self):
+ table_id = ofproto.OFPTT_ALL
+ config = 0xffffffff
+ self._test_serialize(table_id, config)
+
+ def test_serialize_min(self):
+ table_id = 0
+ config = 0
+ self._test_serialize(table_id, config)
+
+ def test_serialize_p1(self):
+ table_id = ofproto.OFPTT_MAX
+ config = ofproto.OFPTC_TABLE_MISS_CONTINUE
+ self._test_serialize(table_id, config)
+
+ def test_serialize_p2(self):
+ table_id = ofproto.OFPTT_MAX
+ config = ofproto.OFPTC_TABLE_MISS_DROP
+ self._test_serialize(table_id, config)
+
+ def test_serialize_p3(self):
+ table_id = ofproto.OFPTT_MAX
+ config = ofproto.OFPTC_TABLE_MISS_MASK
+ self._test_serialize(table_id, config)
+
+
+class TestOFPStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPStatsRequest
+ """
+
+ type_ = ofproto.OFPST_DESC
+ c = OFPStatsRequest(_Datapath, type_)
+
+ def test_init(self):
+ eq_(self.type_, self.c.type)
+ eq_(0, self.c.flags)
+
+ def test_serialize_body(self):
+ len_ = ofproto.OFP_HEADER_SIZE \
+ + ofproto.OFP_STATS_REQUEST_SIZE
+ self.c.buf = bytearray(len_)
+ self.c._serialize_body()
+
+ fmt = ofproto.OFP_STATS_REQUEST_PACK_STR
+ res = struct.unpack_from(fmt, six.binary_type(self.c.buf),
+ ofproto.OFP_HEADER_SIZE)
+
+ eq_(res[0], self.type_)
+ eq_(res[1], 0)
+
+
+class TestOFPStatsReply(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPStatsReply
+ """
+
+ c = OFPStatsReply(_Datapath)
+
+ def test_parser_single_struct_true(self):
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_STATS_REPLY
+ msg_len = ofproto.OFP_STATS_REPLY_SIZE \
+ + ofproto.OFP_AGGREGATE_STATS_REPLY_SIZE
+ xid = 2495926989
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_STATS_REPLY_PACK_STR
+ # '!HH4x'...type, flags, pad(4)
+ type_ = ofproto.OFPST_AGGREGATE
+ flags = 41802
+
+ fmt = ofproto.OFP_STATS_REPLY_PACK_STR
+ buf += pack(fmt, type_, flags)
+
+ # OFP_AGGREGATE_STATS_REPLY_PACK_STR
+ packet_count = 5142202600015232219
+ byte_count = 2659740543924820419
+ flow_count = 1344694860
+ body = OFPAggregateStatsReply(packet_count, byte_count, flow_count)
+
+ fmt = ofproto.OFP_AGGREGATE_STATS_REPLY_PACK_STR
+ buf += pack(fmt, packet_count, byte_count, flow_count)
+
+ res = self.c.parser(object, version, msg_type, msg_len, xid, buf)
+
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(type_, res.type)
+ eq_(flags, res.flags)
+ eq_(packet_count, res.body.packet_count)
+ eq_(byte_count, res.body.byte_count)
+ eq_(flow_count, res.body.flow_count)
+
+ def test_parser_single_struct_flase(self):
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_STATS_REPLY
+ msg_len = ofproto.OFP_STATS_REPLY_SIZE \
+ + ofproto.OFP_QUEUE_STATS_SIZE
+ xid = 2495926989
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_STATS_REPLY_PACK_STR
+ # '!HH4x'...type, flags, pad(4)
+ type_ = ofproto.OFPST_QUEUE
+ flags = 11884
+
+ fmt = ofproto.OFP_STATS_REPLY_PACK_STR
+ buf += pack(fmt, type_, flags)
+
+ # OFP_QUEUE_STATS_PACK_STR
+ port_no = 41186
+ queue_id = 6606
+ tx_bytes = 8638420181865882538
+ tx_packets = 2856480458895760962
+ tx_errors = 6283093430376743019
+ body = [OFPQueueStats(port_no, queue_id, tx_bytes, tx_packets,
+ tx_errors)]
+
+ fmt = ofproto.OFP_QUEUE_STATS_PACK_STR
+ buf += pack(fmt, port_no, queue_id, tx_bytes, tx_packets, tx_errors)
+
+ res = self.c.parser(object, version, msg_type, msg_len, xid, buf)
+
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(type_, res.type)
+ eq_(flags, res.flags)
+ eq_(port_no, res.body[0].port_no)
+ eq_(queue_id, res.body[0].queue_id)
+ eq_(tx_bytes, res.body[0].tx_bytes)
+ eq_(tx_packets, res.body[0].tx_packets)
+ eq_(tx_errors, res.body[0].tx_errors)
+
+ def test_parser_max(self):
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_STATS_REPLY
+ msg_len = ofproto.OFP_STATS_REPLY_SIZE
+ xid = 0xffffffff
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_STATS_REPLY_PACK_STR
+ # '!HH4x'...type, flags, pad(4)
+ type_ = ofproto.OFPST_QUEUE
+ flags = 0xffff
+
+ fmt = ofproto.OFP_STATS_REPLY_PACK_STR
+ buf += pack(fmt, type_, flags)
+ res = self.c.parser(object, version, msg_type, msg_len, xid, buf)
+
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(type_, res.type)
+ eq_(flags, res.flags)
+
+ def test_parser_min(self):
+ # OFP_HEADER_PACK_STR
+ # '!BBHI'...version, msg_type, msg_len, xid
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_STATS_REPLY
+ msg_len = ofproto.OFP_STATS_REPLY_SIZE
+ xid = 0
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_STATS_REPLY_PACK_STR
+ # '!HH4x'...type, flags, pad(4)
+ type_ = ofproto.OFPST_QUEUE
+ flags = 0
+
+ fmt = ofproto.OFP_STATS_REPLY_PACK_STR
+ buf += pack(fmt, type_, flags)
+ res = self.c.parser(object, version, msg_type, msg_len, xid, buf)
+
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(type_, res.type)
+ eq_(flags, res.flags)
+
+
+class TestOFPDescStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPDescStatsRequest
+ """
+
+ def test_serialize(self):
+ c = OFPDescStatsRequest(_Datapath)
+ c.serialize()
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_REQUEST_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_STATS_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], ofproto.OFPST_DESC)
+ eq_(res[5], 0)
+
+
+class TestOFPDescStats(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPDescStats
+ """
+
+ # OFP_DESC_STATS_PACK_STR
+ # '!256s256s256s32s256s'...mfr_desc, hw_desc, sw_desc, serial_num, dp_desc
+ mfr_desc = b'mfr_desc'.ljust(256)
+ hw_desc = b'hw_desc'.ljust(256)
+ sw_desc = b'sw_desc'.ljust(256)
+ serial_num = b'serial_num'.ljust(32)
+ dp_desc = b'dp_desc'.ljust(256)
+
+ buf = mfr_desc \
+ + hw_desc \
+ + sw_desc \
+ + serial_num \
+ + dp_desc
+
+ c = OFPDescStats(mfr_desc, hw_desc, sw_desc, serial_num, dp_desc)
+
+ def test_init(self):
+ eq_(self.mfr_desc, self.c.mfr_desc)
+ eq_(self.hw_desc, self.c.hw_desc)
+ eq_(self.sw_desc, self.c.sw_desc)
+ eq_(self.serial_num, self.c.serial_num)
+ eq_(self.dp_desc, self.c.dp_desc)
+
+ def test_parser(self):
+ res = self.c.parser(self.buf, 0)
+
+ eq_(self.mfr_desc, res.mfr_desc)
+ eq_(self.hw_desc, res.hw_desc)
+ eq_(self.sw_desc, res.sw_desc)
+ eq_(self.serial_num, res.serial_num)
+ eq_(self.dp_desc, res.dp_desc)
+
+
+class TestOFPFlowStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPFlowStatsRequest
+ """
+
+ # OFP_FLOW_STATS_REQUEST_PACK_STR
+ # '!B3xII4xQQ'...table_id, pad(3), out_port, out_group, pad(4),
+ # cookie, cookie_mask
+ table_id = 3
+ out_port = 65037
+ out_group = 6606
+ cookie = 2127614848199081640
+ cookie_mask = 2127614848199081641
+
+ def test_init(self):
+ match = OFPMatch()
+ in_port = 3
+ match.set_in_port(in_port)
+
+ c = OFPFlowStatsRequest(_Datapath, self.table_id, self.out_port,
+ self.out_group, self.cookie, self.cookie_mask,
+ match)
+
+ eq_(self.table_id, c.table_id)
+ eq_(self.out_port, c.out_port)
+ eq_(self.out_group, c.out_group)
+ eq_(self.cookie, c.cookie)
+ eq_(self.cookie_mask, c.cookie_mask)
+ eq_(in_port, c.match._flow.in_port)
+
+ def _test_serialize(self, table_id, out_port, out_group,
+ cookie, cookie_mask):
+ match = OFPMatch()
+ dl_type = 0x800
+ match.set_dl_type(dl_type)
+
+ c = OFPFlowStatsRequest(_Datapath, table_id, out_port,
+ out_group, cookie, cookie_mask, match)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR \
+ + ofproto.OFP_STATS_REQUEST_PACK_STR[1:] \
+ + ofproto.OFP_FLOW_STATS_REQUEST_PACK_STR[1:] \
+ + 'HHHBB' \
+ + MTEthType.pack_str[1:] + '6x'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_STATS_REQUEST)
+ size = ofproto.OFP_STATS_REPLY_SIZE \
+ + ofproto.OFP_FLOW_STATS_REQUEST_SIZE \
+ + calcsize(MTEthType.pack_str + '6x')
+ eq_(res[2], size)
+ eq_(res[3], 0)
+ eq_(res[4], ofproto.OFPST_FLOW)
+ eq_(res[5], 0)
+ eq_(res[6], table_id)
+ eq_(res[7], out_port)
+ eq_(res[8], out_group)
+ eq_(res[9], cookie)
+ eq_(res[10], cookie_mask)
+ # match
+ eq_(res[11], ofproto.OFPMT_OXM)
+ eq_(res[12], 10)
+ eq_(res[13], ofproto.OFPXMC_OPENFLOW_BASIC)
+ eq_(res[14] >> 1, ofproto.OFPXMT_OFB_ETH_TYPE)
+ eq_(res[14] & 0b0001, 0)
+ eq_(res[15], calcsize(MTEthType.pack_str))
+ eq_(res[16], dl_type)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.table_id, self.out_port, self.out_group,
+ self.cookie, self.cookie_mask)
+
+ def test_serialize_max(self):
+ table_id = 0xff
+ out_port = 0xffff
+ out_group = 0xffff
+ cookie = 0xffffffff
+ cookie_mask = 0xffffffff
+ self._test_serialize(table_id, out_port, out_group,
+ cookie, cookie_mask)
+
+ def test_serialize_min(self):
+ table_id = 0
+ out_port = 0
+ out_group = 0
+ cookie = 0
+ cookie_mask = 0
+ self._test_serialize(table_id, out_port, out_group,
+ cookie, cookie_mask)
+
+ def test_serialize_p1(self):
+ table_id = ofproto.OFPTT_MAX
+ self._test_serialize(table_id, self.out_port, self.out_group,
+ self.cookie, self.cookie_mask)
+
+
+class TestOFPFlowStats(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPFlowStats
+ """
+
+ def test_init(self):
+ length = ofproto.OFP_FLOW_STATS_SIZE
+ table_id = 81
+ duration_sec = 2484712402
+ duration_nsec = 3999715196
+ priority = 57792
+ idle_timeout = 36368
+ hard_timeout = 54425
+ cookie = 793171083674290912
+ packet_count = 5142202600015232219
+ byte_count = 2659740543924820419
+
+ match = OFPMatch()
+ in_port = 2
+ match.set_in_port(in_port)
+
+ goto_table = 3
+ instructions = [OFPInstructionGotoTable(goto_table)]
+ c = OFPFlowStats(table_id, duration_sec, duration_nsec,
+ priority, idle_timeout, hard_timeout, cookie,
+ packet_count, byte_count, match, instructions)
+
+ eq_(table_id, c.table_id)
+ eq_(duration_sec, c.duration_sec)
+ eq_(duration_nsec, c.duration_nsec)
+ eq_(priority, c.priority)
+ eq_(idle_timeout, c.idle_timeout)
+ eq_(hard_timeout, c.hard_timeout)
+ eq_(cookie, c.cookie)
+ eq_(packet_count, c.packet_count)
+ eq_(byte_count, c.byte_count)
+ eq_(in_port, c.match._flow.in_port)
+ eq_(goto_table, c.instructions[0].table_id)
+
+ def _test_parser(self, table_id, duration_sec, duration_nsec,
+ priority, idle_timeout, hard_timeout, cookie,
+ packet_count, byte_count, inst_cnt=0):
+
+ length = ofproto.OFP_FLOW_STATS_SIZE \
+ + calcsize(MTEthType.pack_str[1:] + '6x') \
+ + ofproto.OFP_INSTRUCTION_GOTO_TABLE_SIZE * inst_cnt
+
+ # OFP_FLOW_STATS_PACK_STR
+ buf = pack(ofproto.OFP_FLOW_STATS_PACK_STR,
+ length, table_id, duration_sec, duration_nsec,
+ priority, idle_timeout, hard_timeout, cookie,
+ packet_count, byte_count)
+
+ # match
+ match = OFPMatch()
+ dl_type = 0x0800
+ match.set_dl_type(dl_type)
+ match_buf = bytearray()
+ match.serialize(match_buf, 0)
+ buf += six.binary_type(match_buf)
+
+ # instructions
+ # 56 + 8 + 8 * inst_cnt <= 65535
+ # inst_cnt <= 8183
+ for i in range(inst_cnt):
+ inst = OFPInstructionGotoTable(1)
+ inst_buf = bytearray()
+ inst.serialize(inst_buf, 0)
+ buf += six.binary_type(inst_buf)
+
+ # parse
+ res = OFPFlowStats.parser(buf, 0)
+ eq_(length, res.length)
+ eq_(table_id, res.table_id)
+ eq_(duration_sec, res.duration_sec)
+ eq_(duration_nsec, res.duration_nsec)
+ eq_(priority, res.priority)
+ eq_(idle_timeout, res.idle_timeout)
+ eq_(hard_timeout, res.hard_timeout)
+ eq_(cookie, res.cookie)
+ eq_(packet_count, res.packet_count)
+ eq_(byte_count, res.byte_count)
+ eq_(dl_type, res.match.fields[0].value)
+ for i in range(inst_cnt):
+ eq_(1, res.instructions[i].table_id)
+
+ def test_parser_mid(self):
+ table_id = 81
+ duration_sec = 2484712402
+ duration_nsec = 3999715196
+ priority = 57792
+ idle_timeout = 36368
+ hard_timeout = 54425
+ cookie = 793171083674290912
+ packet_count = 5142202600015232219
+ byte_count = 2659740543924820419
+ inst_cnt = 2
+
+ self._test_parser(table_id, duration_sec, duration_nsec,
+ priority, idle_timeout, hard_timeout, cookie,
+ packet_count, byte_count, inst_cnt)
+
+ def test_parser_max(self):
+ table_id = 0xff
+ duration_sec = 0xffff
+ duration_nsec = 0xffff
+ priority = 0xffff
+ idle_timeout = 0xff
+ hard_timeout = 0xff
+ cookie = 0xffffffffffffffff
+ packet_count = 0xffffffffffffffff
+ byte_count = 0xffffffffffffffff
+ inst_cnt = 8183
+
+ self._test_parser(table_id, duration_sec, duration_nsec,
+ priority, idle_timeout, hard_timeout, cookie,
+ packet_count, byte_count, inst_cnt)
+
+ def test_parser_min(self):
+ self._test_parser(0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+
+class TestOFPAggregateStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPAggregateStatsRequest
+ """
+
+ # OFP_AGGREGATE_STATS_REQUEST_PACK_STR
+ # '!B3xII4xQQ'...table_id, pad(3), out_port, out_group, pad(4),
+ # cookie, cookie_mask
+ table_id = 3
+ out_port = 65037
+ out_group = 6606
+ cookie = 2127614848199081640
+ cookie_mask = 2127614848199081641
+
+ def test_init(self):
+ match = OFPMatch()
+ dl_type = 0x800
+ match.set_dl_type(dl_type)
+ c = OFPAggregateStatsRequest(_Datapath, self.table_id,
+ self.out_port, self.out_group,
+ self.cookie, self.cookie_mask,
+ match)
+
+ eq_(self.table_id, c.table_id)
+ eq_(self.out_port, c.out_port)
+ eq_(self.out_group, c.out_group)
+ eq_(self.cookie, c.cookie)
+ eq_(self.cookie_mask, c.cookie_mask)
+ eq_(dl_type, c.match._flow.dl_type)
+
+ def _test_serialize(self, table_id, out_port, out_group,
+ cookie, cookie_mask):
+ match = OFPMatch()
+ dl_type = 0x800
+ match.set_dl_type(dl_type)
+ c = OFPAggregateStatsRequest(_Datapath, table_id,
+ out_port, out_group, cookie,
+ cookie_mask, match)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR \
+ + ofproto.OFP_STATS_REQUEST_PACK_STR[1:] \
+ + ofproto.OFP_AGGREGATE_STATS_REQUEST_PACK_STR[1:] \
+ + 'HHHBB' \
+ + MTEthType.pack_str[1:] + '6x'
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_STATS_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], ofproto.OFPST_AGGREGATE)
+ eq_(res[5], 0)
+ eq_(res[6], table_id)
+ eq_(res[7], out_port)
+ eq_(res[8], out_group)
+ eq_(res[9], cookie)
+ eq_(res[10], cookie_mask)
+ # match
+ eq_(res[11], ofproto.OFPMT_OXM)
+ eq_(res[12], 10)
+ eq_(res[13], ofproto.OFPXMC_OPENFLOW_BASIC)
+ eq_(res[14] >> 1, ofproto.OFPXMT_OFB_ETH_TYPE)
+ eq_(res[14] & 0b0001, 0)
+ eq_(res[15], calcsize(MTEthType.pack_str))
+ eq_(res[16], dl_type)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.table_id, self.out_port, self.out_group,
+ self.cookie, self.cookie_mask)
+
+ def test_serialize_max(self):
+ table_id = 0xff
+ out_port = 0xffffffff
+ out_group = 0xffffffff
+ cookie = 0xffffffff
+ cookie_mask = 0xffffffff
+ self._test_serialize(table_id, out_port, out_group,
+ cookie, cookie_mask)
+
+ def test_serialize_min(self):
+ table_id = 0
+ out_port = 0
+ out_group = 0
+ cookie = 0
+ cookie_mask = 0
+ self._test_serialize(table_id, out_port, out_group,
+ cookie, cookie_mask)
+
+ def test_serialize_p1(self):
+ table_id = ofproto.OFPTT_MAX
+ self._test_serialize(table_id, self.out_port, self.out_group,
+ self.cookie, self.cookie_mask)
+
+
+class TestOFPAggregateStatsReply(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPAggregateStatsReply
+ """
+
+ # OFP_AGGREGATE_STATS_REPLY_PACK_STR
+ # '!QQI4x'...packet_count, byte_count, flow_count, pad(4)
+ packet_count = 5142202600015232219
+ byte_count = 2659740543924820419
+ flow_count = 1344694860
+
+ def test_init(self):
+ c = OFPAggregateStatsReply(self.packet_count, self.byte_count,
+ self.flow_count)
+
+ eq_(c.packet_count, self.packet_count)
+ eq_(c.byte_count, self.byte_count)
+ eq_(c.flow_count, self.flow_count)
+
+ def _test_parser(self, packet_count, byte_count, flow_count):
+ fmt = ofproto.OFP_AGGREGATE_STATS_REPLY_PACK_STR
+ buf = pack(fmt, packet_count, byte_count, flow_count)
+
+ res = OFPAggregateStatsReply.parser(buf, 0)
+ eq_(packet_count, res.packet_count)
+ eq_(byte_count, res.byte_count)
+ eq_(flow_count, res.flow_count)
+
+ def test_parser_mid(self):
+ self._test_parser(self.packet_count, self.byte_count,
+ self.flow_count)
+
+ def test_parser_max(self):
+ packet_count = 18446744073709551615
+ byte_count = 18446744073709551615
+ flow_count = 4294967295
+ self._test_parser(packet_count, byte_count,
+ flow_count)
+
+ def test_parser_min(self):
+ packet_count = 0
+ byte_count = 0
+ flow_count = 0
+ self._test_parser(packet_count, byte_count,
+ flow_count)
+
+
+class TestOFPTableStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPTableStatsRequest
+ """
+
+ def test_serialize(self):
+ c = OFPTableStatsRequest(_Datapath)
+ c.serialize()
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_REQUEST_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_STATS_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], ofproto.OFPST_TABLE)
+ eq_(res[5], 0)
+
+
+class TestOFPTableStats(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPTableStats
+ """
+
+ def test_init(self):
+ table_id = 91
+ name = 'name'
+ match = 1270985291017894273
+ wildcards = 3316608530
+ write_actions = 2484712402
+ apply_actions = 3999715196
+ write_setfields = 5142202600015232219
+ apply_setfields = 2659740543924820419
+ metadata_match = 2127614848199081640
+ metadata_write = 2127614848199081641
+ instructions = 1119692796
+ config = 2226555987
+ max_entries = 2506913869
+ active_count = 2024581150
+ lookup_count = 4620020561814017052
+ matched_count = 2825167325263435621
+
+ res = OFPTableStats(table_id, name, match, wildcards, write_actions,
+ apply_actions, write_setfields, apply_setfields,
+ metadata_match, metadata_write, instructions,
+ config, max_entries, active_count, lookup_count,
+ matched_count)
+
+ eq_(table_id, res.table_id)
+ eq_(name, res.name)
+ eq_(match, res.match)
+ eq_(wildcards, res.wildcards)
+ eq_(write_actions, res.write_actions)
+ eq_(apply_actions, res.apply_actions)
+ eq_(write_setfields, res.write_setfields)
+ eq_(apply_setfields, res.apply_setfields)
+ eq_(metadata_match, res.metadata_match)
+ eq_(metadata_write, res.metadata_write)
+ eq_(instructions, res.instructions)
+ eq_(config, res.config)
+ eq_(max_entries, res.max_entries)
+ eq_(active_count, res.active_count)
+ eq_(lookup_count, res.lookup_count)
+ eq_(matched_count, res.matched_count)
+
+ def _test_parser(self, table_id, name, match, wildcards, write_actions,
+ apply_actions, write_setfields, apply_setfields,
+ metadata_match, metadata_write, instructions, config,
+ max_entries, active_count, lookup_count, matched_count):
+ # OFP_TABLE_STATS_PACK_STR
+ # '!B7x32sQQIIQQQQIIIIQQ'
+ # ...table_id, name, match, wildcards, write_actions, apply_actions,
+ # write_setfields, apply_setfields', metadata_match, metadata_write,
+ # instructions, config, max_entries,
+ # active_count, lookup_count, matched_count
+ fmt = ofproto.OFP_TABLE_STATS_PACK_STR
+ buf = pack(fmt, table_id, name,
+ match, wildcards, write_actions,
+ apply_actions, write_setfields, apply_setfields,
+ metadata_match, metadata_write, instructions, config,
+ max_entries, active_count, lookup_count, matched_count)
+
+ res = OFPTableStats.parser(buf, 0)
+
+ eq_(table_id, res.table_id)
+ eq_(name, res.name.replace(b'\x00', b''))
+ eq_(match, res.match)
+ eq_(wildcards, res.wildcards)
+ eq_(write_actions, res.write_actions)
+ eq_(apply_actions, res.apply_actions)
+ eq_(write_setfields, res.write_setfields)
+ eq_(apply_setfields, res.apply_setfields)
+ eq_(metadata_match, res.metadata_match)
+ eq_(metadata_write, res.metadata_write)
+ eq_(instructions, res.instructions)
+ eq_(config, res.config)
+ eq_(max_entries, res.max_entries)
+ eq_(active_count, res.active_count)
+ eq_(lookup_count, res.lookup_count)
+ eq_(matched_count, res.matched_count)
+
+ def test_parser_mid(self):
+ table_id = 91
+ name = b'name'
+ match = 1270985291017894273
+ wildcards = 3316608530
+ write_actions = 2484712402
+ apply_actions = 3999715196
+ write_setfields = 5142202600015232219
+ apply_setfields = 2659740543924820419
+ metadata_match = 2127614848199081640
+ metadata_write = 2127614848199081641
+ instructions = 1119692796
+ config = 2226555987
+ max_entries = 2506913869
+ active_count = 2024581150
+ lookup_count = 4620020561814017052
+ matched_count = 2825167325263435621
+
+ self._test_parser(table_id, name, match, wildcards, write_actions,
+ apply_actions, write_setfields, apply_setfields,
+ metadata_match, metadata_write, instructions, config,
+ max_entries, active_count, lookup_count,
+ matched_count)
+
+ def test_parser_max(self):
+ # '!B7x32sQQIIQQQQIIIIQQ'
+ table_id = 0xff
+ name = b'a' * 32
+ match = 0xffffffffffffffff
+ wildcards = 0xffffffffffffffff
+ write_actions = 0xffffffff
+ apply_actions = 0xffffffff
+ write_setfields = 0xffffffffffffffff
+ apply_setfields = 0xffffffffffffffff
+ metadata_match = 0xffffffffffffffff
+ metadata_write = 0xffffffffffffffff
+ instructions = 0xffffffff
+ config = 0xffffffff
+ max_entries = 0xffffffff
+ active_count = 0xffffffff
+ lookup_count = 0xffffffffffffffff
+ matched_count = 0xffffffffffffffff
+
+ self._test_parser(table_id, name, match, wildcards, write_actions,
+ apply_actions, write_setfields, apply_setfields,
+ metadata_match, metadata_write, instructions, config,
+ max_entries, active_count, lookup_count,
+ matched_count)
+
+ def test_parser_min(self):
+ table_id = 0
+ name = b''
+ match = 0
+ wildcards = 0
+ write_actions = 0
+ apply_actions = 0
+ write_setfields = 0
+ apply_setfields = 0
+ metadata_match = 0
+ metadata_write = 0
+ instructions = 0
+ config = 0
+ max_entries = 0
+ active_count = 0
+ lookup_count = 0
+ matched_count = 0
+
+ self._test_parser(table_id, name, match, wildcards, write_actions,
+ apply_actions, write_setfields, apply_setfields,
+ metadata_match, metadata_write, instructions, config,
+ max_entries, active_count, lookup_count,
+ matched_count)
+
+ def _test_parser_p(self, ofpxmt, ofpit, ofptc):
+ table_id = 91
+ name = b'name'
+ match = ofpxmt
+ wildcards = ofpxmt
+ write_actions = 2484712402
+ apply_actions = 3999715196
+ write_setfields = ofpxmt
+ apply_setfields = ofpxmt
+ metadata_match = 2127614848199081640
+ metadata_write = 2127614848199081641
+ instructions = ofpit
+ config = ofptc
+ max_entries = 2506913869
+ active_count = 2024581150
+ lookup_count = 4620020561814017052
+ matched_count = 2825167325263435621
+
+ self._test_parser(table_id, name, match, wildcards, write_actions,
+ apply_actions, write_setfields, apply_setfields,
+ metadata_match, metadata_write, instructions, config,
+ max_entries, active_count, lookup_count,
+ matched_count)
+
+ def test_parser_p1(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IN_PORT,
+ ofproto.OFPIT_GOTO_TABLE,
+ ofproto.OFPTC_TABLE_MISS_CONTINUE)
+
+ def test_parser_p2(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IN_PHY_PORT,
+ ofproto.OFPIT_WRITE_METADATA,
+ ofproto.OFPTC_TABLE_MISS_DROP)
+
+ def test_parser_p3(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_METADATA,
+ ofproto.OFPIT_WRITE_ACTIONS,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p4(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ETH_DST,
+ ofproto.OFPIT_APPLY_ACTIONS,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p5(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ETH_SRC,
+ ofproto.OFPIT_CLEAR_ACTIONS,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p6(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ETH_TYPE,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p7(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_VLAN_VID,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p8(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_VLAN_PCP,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p9(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IP_DSCP,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p10(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IP_ECN,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p11(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IP_PROTO,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p12(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IPV4_SRC,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p13(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IPV4_DST,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p14(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_TCP_SRC,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p15(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_TCP_DST,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p16(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_UDP_SRC,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p17(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_UDP_DST,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p18(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_SCTP_SRC,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p19(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_SCTP_DST,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p20(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ICMPV4_TYPE,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p21(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ICMPV4_CODE,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p22(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ARP_OP,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p23(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ARP_SPA,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p24(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ARP_TPA,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p25(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ARP_SHA,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p26(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ARP_THA,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p27(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IPV6_SRC,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p28(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IPV6_DST,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p29(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IPV6_FLABEL,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p30(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ICMPV6_TYPE,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p31(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_ICMPV6_CODE,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p32(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IPV6_ND_TARGET,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p33(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IPV6_ND_SLL,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p34(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_IPV6_ND_TLL,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p35(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_MPLS_LABEL,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+ def test_parser_p36(self):
+ self._test_parser_p(ofproto.OFPXMT_OFB_MPLS_TC,
+ ofproto.OFPIT_EXPERIMENTER,
+ ofproto.OFPTC_TABLE_MISS_MASK)
+
+
+class TestOFPPortStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPPortStatsRequest
+ """
+
+ # OFP_PORT_STATS_REQUEST_PACK_STR
+ # '!I4x'...port_no, pad(4)
+ port_no = 41186
+
+ def test_init(self):
+ c = OFPPortStatsRequest(_Datapath, self.port_no)
+ eq_(self.port_no, c.port_no)
+
+ def _test_serialize(self, port_no):
+ c = OFPPortStatsRequest(_Datapath, port_no)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_REQUEST_PACK_STR.replace('!', '') \
+ + ofproto.OFP_PORT_STATS_REQUEST_PACK_STR.replace('!', '')
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_STATS_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], ofproto.OFPST_PORT)
+ eq_(res[5], 0)
+ eq_(res[6], port_no)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.port_no)
+
+ def test_serialize_max(self):
+ self._test_serialize(ofproto.OFPP_ANY)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+ def test_serialize_p1(self):
+ self._test_serialize(ofproto.OFPP_MAX)
+
+ def test_serialize_p2(self):
+ self._test_serialize(ofproto.OFPP_IN_PORT)
+
+ def test_serialize_p3(self):
+ self._test_serialize(ofproto.OFPP_TABLE)
+
+ def test_serialize_p4(self):
+ self._test_serialize(ofproto.OFPP_NORMAL)
+
+ def test_serialize_p5(self):
+ self._test_serialize(ofproto.OFPP_FLOOD)
+
+ def test_serialize_p6(self):
+ self._test_serialize(ofproto.OFPP_ALL)
+
+ def test_serialize_p7(self):
+ self._test_serialize(ofproto.OFPP_CONTROLLER)
+
+ def test_serialize_p8(self):
+ self._test_serialize(ofproto.OFPP_LOCAL)
+
+
+class TestOFPPortStats(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPPortStats
+ """
+
+ def test_init(self):
+ port_no = 6606
+ rx_packets = 5999980397101236279
+ tx_packets = 2856480458895760962
+ rx_bytes = 6170274950576278921
+ tx_bytes = 8638420181865882538
+ rx_dropped = 6982303461569875546
+ tx_dropped = 661287462113808071
+ rx_errors = 3422231811478788365
+ tx_errors = 6283093430376743019
+ rx_frame_err = 876072919806406283
+ rx_over_err = 6525873760178941600
+ rx_crc_err = 8303073210207070535
+ collisions = 3409801584220270201
+
+ res = OFPPortStats(port_no, rx_packets, tx_packets,
+ rx_bytes, tx_bytes, rx_dropped, tx_dropped,
+ rx_errors, tx_errors, rx_frame_err,
+ rx_over_err, rx_crc_err, collisions)
+
+ eq_(port_no, res.port_no)
+ eq_(rx_packets, res.rx_packets)
+ eq_(tx_packets, res.tx_packets)
+ eq_(rx_bytes, res.rx_bytes)
+ eq_(tx_bytes, res.tx_bytes)
+ eq_(rx_dropped, res.rx_dropped)
+ eq_(tx_dropped, res.tx_dropped)
+ eq_(rx_errors, res.rx_errors)
+ eq_(tx_errors, res.tx_errors)
+ eq_(rx_frame_err, res.rx_frame_err)
+ eq_(rx_over_err, res.rx_over_err)
+ eq_(rx_crc_err, res.rx_crc_err)
+ eq_(collisions, res.collisions)
+
+ def _test_parser(self, port_no, rx_packets, tx_packets,
+ rx_bytes, tx_bytes, rx_dropped, tx_dropped,
+ rx_errors, tx_errors, rx_frame_err,
+ rx_over_err, rx_crc_err, collisions):
+
+ # OFP_PORT_STATS_PACK_STR = '!H6xQQQQQQQQQQQQ'
+ fmt = ofproto.OFP_PORT_STATS_PACK_STR
+ buf = pack(fmt, port_no, rx_packets, tx_packets, rx_bytes, tx_bytes,
+ rx_dropped, tx_dropped, rx_errors, tx_errors, rx_frame_err,
+ rx_over_err, rx_crc_err, collisions)
+
+ res = OFPPortStats.parser(buf, 0)
+
+ eq_(port_no, res.port_no)
+ eq_(rx_packets, res.rx_packets)
+ eq_(tx_packets, res.tx_packets)
+ eq_(rx_bytes, res.rx_bytes)
+ eq_(tx_bytes, res.tx_bytes)
+ eq_(rx_dropped, res.rx_dropped)
+ eq_(tx_dropped, res.tx_dropped)
+ eq_(rx_errors, res.rx_errors)
+ eq_(tx_errors, res.tx_errors)
+ eq_(rx_frame_err, res.rx_frame_err)
+ eq_(rx_over_err, res.rx_over_err)
+ eq_(rx_crc_err, res.rx_crc_err)
+ eq_(collisions, res.collisions)
+
+ def test_parser_mid(self):
+ port_no = 6606
+ rx_packets = 5999980397101236279
+ tx_packets = 2856480458895760962
+ rx_bytes = 6170274950576278921
+ tx_bytes = 8638420181865882538
+ rx_dropped = 6982303461569875546
+ tx_dropped = 661287462113808071
+ rx_errors = 3422231811478788365
+ tx_errors = 6283093430376743019
+ rx_frame_err = 876072919806406283
+ rx_over_err = 6525873760178941600
+ rx_crc_err = 8303073210207070535
+ collisions = 3409801584220270201
+
+ self._test_parser(port_no, rx_packets, tx_packets, rx_bytes, tx_bytes,
+ rx_dropped, tx_dropped, rx_errors, tx_errors,
+ rx_frame_err, rx_over_err, rx_crc_err, collisions)
+
+ def test_parser_max(self):
+ port_no = 0xffffffff
+ rx_packets = 0xffffffffffffffff
+ tx_packets = 0xffffffffffffffff
+ rx_bytes = 0xffffffffffffffff
+ tx_bytes = 0xffffffffffffffff
+ rx_dropped = 0xffffffffffffffff
+ tx_dropped = 0xffffffffffffffff
+ rx_errors = 0xffffffffffffffff
+ tx_errors = 0xffffffffffffffff
+ rx_frame_err = 0xffffffffffffffff
+ rx_over_err = 0xffffffffffffffff
+ rx_crc_err = 0xffffffffffffffff
+ collisions = 0xffffffffffffffff
+
+ self._test_parser(port_no, rx_packets, tx_packets, rx_bytes, tx_bytes,
+ rx_dropped, tx_dropped, rx_errors, tx_errors,
+ rx_frame_err, rx_over_err, rx_crc_err, collisions)
+
+ def test_parser_min(self):
+ port_no = 0
+ rx_packets = 0
+ tx_packets = 0
+ rx_bytes = 0
+ tx_bytes = 0
+ rx_dropped = 0
+ tx_dropped = 0
+ rx_errors = 0
+ tx_errors = 0
+ rx_frame_err = 0
+ rx_over_err = 0
+ rx_crc_err = 0
+ collisions = 0
+
+ self._test_parser(port_no, rx_packets, tx_packets, rx_bytes, tx_bytes,
+ rx_dropped, tx_dropped, rx_errors, tx_errors,
+ rx_frame_err, rx_over_err, rx_crc_err, collisions)
+
+ def _test_parser_p(self, port_no):
+ port_no = port_no
+ rx_packets = 5999980397101236279
+ tx_packets = 2856480458895760962
+ rx_bytes = 6170274950576278921
+ tx_bytes = 8638420181865882538
+ rx_dropped = 6982303461569875546
+ tx_dropped = 661287462113808071
+ rx_errors = 3422231811478788365
+ tx_errors = 6283093430376743019
+ rx_frame_err = 876072919806406283
+ rx_over_err = 6525873760178941600
+ rx_crc_err = 8303073210207070535
+ collisions = 3409801584220270201
+
+ self._test_parser(port_no, rx_packets, tx_packets, rx_bytes, tx_bytes,
+ rx_dropped, tx_dropped, rx_errors, tx_errors,
+ rx_frame_err, rx_over_err, rx_crc_err, collisions)
+
+ def test_parser_p1(self):
+ self._test_parser_p(ofproto.OFPP_MAX)
+
+ def test_parser_p2(self):
+ self._test_parser_p(ofproto.OFPP_IN_PORT)
+
+ def test_parser_p3(self):
+ self._test_parser_p(ofproto.OFPP_TABLE)
+
+ def test_parser_p4(self):
+ self._test_parser_p(ofproto.OFPP_NORMAL)
+
+ def test_parser_p5(self):
+ self._test_parser_p(ofproto.OFPP_FLOOD)
+
+ def test_parser_p6(self):
+ self._test_parser_p(ofproto.OFPP_ALL)
+
+ def test_parser_p7(self):
+ self._test_parser_p(ofproto.OFPP_CONTROLLER)
+
+ def test_parser_p8(self):
+ self._test_parser_p(ofproto.OFPP_LOCAL)
+
+
+class TestOFPQueueStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPQueueStatsRequest
+ """
+
+ # OFP_QUEUE_STATS_REQUEST_PACK_STR
+ # '!II'...port_no, queue_id
+ port_no = 41186
+ queue_id = 6606
+
+ def test_init(self):
+ c = OFPQueueStatsRequest(_Datapath, self.port_no, self.queue_id)
+
+ eq_(self.port_no, c.port_no)
+ eq_(self.queue_id, c.queue_id)
+
+ def _test_serialize(self, port_no, queue_id):
+ c = OFPQueueStatsRequest(_Datapath, port_no, queue_id)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_REQUEST_PACK_STR.replace('!', '') \
+ + ofproto.OFP_QUEUE_STATS_REQUEST_PACK_STR.replace('!', '')
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_STATS_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], ofproto.OFPST_QUEUE)
+ eq_(res[5], 0)
+ eq_(res[6], port_no)
+ eq_(res[7], queue_id)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.port_no, self.queue_id)
+
+ def test_serialize_max(self):
+ self._test_serialize(0xffffffff, 0xffffffff)
+
+ def test_serialize_min(self):
+ self._test_serialize(0, 0)
+
+ def test_serialize_p1(self):
+ self._test_serialize(ofproto.OFPP_MAX, self.queue_id)
+
+ def test_serialize_p2(self):
+ self._test_serialize(ofproto.OFPP_IN_PORT, self.queue_id)
+
+ def test_serialize_p3(self):
+ self._test_serialize(ofproto.OFPP_NORMAL, self.queue_id)
+
+ def test_serialize_p4(self):
+ self._test_serialize(ofproto.OFPP_TABLE, self.queue_id)
+
+ def test_serialize_p5(self):
+ self._test_serialize(ofproto.OFPP_FLOOD, self.queue_id)
+
+ def test_serialize_p6(self):
+ self._test_serialize(ofproto.OFPP_ALL, self.queue_id)
+
+ def test_serialize_p7(self):
+ self._test_serialize(ofproto.OFPP_CONTROLLER, self.queue_id)
+
+ def test_serialize_p8(self):
+ self._test_serialize(ofproto.OFPP_LOCAL, self.queue_id)
+
+
+class TestOFPQueueStats(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPQueueStats
+ """
+
+ def test_init(self):
+ port_no = 41186
+ queue_id = 6606
+ tx_bytes = 8638420181865882538
+ tx_packets = 2856480458895760962
+ tx_errors = 6283093430376743019
+
+ res = OFPQueueStats(port_no, queue_id, tx_bytes,
+ tx_packets, tx_errors)
+
+ eq_(port_no, res.port_no)
+ eq_(queue_id, res.queue_id)
+ eq_(tx_bytes, res.tx_bytes)
+ eq_(tx_packets, res.tx_packets)
+ eq_(tx_errors, res.tx_errors)
+
+ def _test_parser(self, port_no, queue_id, tx_bytes,
+ tx_packets, tx_errors):
+
+ # OFP_QUEUE_STATS_PACK_STR = '!IIQQQ'
+ fmt = ofproto.OFP_QUEUE_STATS_PACK_STR
+ buf = pack(fmt, port_no, queue_id, tx_bytes, tx_packets, tx_errors)
+ res = OFPQueueStats.parser(buf, 0)
+
+ eq_(port_no, res.port_no)
+ eq_(queue_id, res.queue_id)
+ eq_(tx_bytes, res.tx_bytes)
+ eq_(tx_packets, res.tx_packets)
+ eq_(tx_errors, res.tx_errors)
+
+ def test_parser_mid(self):
+ port_no = 41186
+ queue_id = 6606
+ tx_bytes = 8638420181865882538
+ tx_packets = 2856480458895760962
+ tx_errors = 6283093430376743019
+
+ self._test_parser(port_no, queue_id, tx_bytes,
+ tx_packets, tx_errors)
+
+ def test_parser_max(self):
+ port_no = 0xffffffff
+ queue_id = 0xffffffff
+ tx_bytes = 0xffffffffffffffff
+ tx_packets = 0xffffffffffffffff
+ tx_errors = 0xffffffffffffffff
+
+ self._test_parser(port_no, queue_id, tx_bytes,
+ tx_packets, tx_errors)
+
+ def test_parser_min(self):
+ port_no = 0
+ queue_id = 0
+ tx_bytes = 0
+ tx_packets = 0
+ tx_errors = 0
+
+ self._test_parser(port_no, queue_id, tx_bytes,
+ tx_packets, tx_errors)
+
+ def _test_parser_p(self, port_no):
+ queue_id = 6606
+ tx_bytes = 8638420181865882538
+ tx_packets = 2856480458895760962
+ tx_errors = 6283093430376743019
+
+ self._test_parser(port_no, queue_id, tx_bytes,
+ tx_packets, tx_errors)
+
+ def test_parser_p1(self):
+ self._test_parser_p(ofproto.OFPP_MAX)
+
+ def test_parser_p2(self):
+ self._test_parser_p(ofproto.OFPP_IN_PORT)
+
+ def test_parser_p3(self):
+ self._test_parser_p(ofproto.OFPP_TABLE)
+
+ def test_parser_p4(self):
+ self._test_parser_p(ofproto.OFPP_NORMAL)
+
+ def test_parser_p5(self):
+ self._test_parser_p(ofproto.OFPP_FLOOD)
+
+ def test_parser_p6(self):
+ self._test_parser_p(ofproto.OFPP_ALL)
+
+ def test_parser_p7(self):
+ self._test_parser_p(ofproto.OFPP_CONTROLLER)
+
+ def test_parser_p8(self):
+ self._test_parser_p(ofproto.OFPP_LOCAL)
+
+
+class TestOFPBucketCounter(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPBucketCounter
+ """
+
+ # OFP_BUCKET_COUNTER_PACK_STR = '!QQ'
+ packet_count = 6489108735192644493
+ byte_count = 7334344481123449724
+
+ def test_init(self):
+ c = OFPBucketCounter(self.packet_count, self.byte_count)
+
+ eq_(self.packet_count, c.packet_count)
+ eq_(self.byte_count, c.byte_count)
+
+ def _test_parser(self, packet_count, byte_count):
+ fmt = ofproto.OFP_BUCKET_COUNTER_PACK_STR
+ buf = pack(fmt, packet_count, byte_count)
+
+ res = OFPBucketCounter.parser(buf, 0)
+ eq_(packet_count, res.packet_count)
+ eq_(byte_count, res.byte_count)
+
+ def test_parser_mid(self):
+ self._test_parser(self.packet_count, self.byte_count)
+
+ def test_parser_max(self):
+ packet_count = 18446744073709551615
+ byte_count = 18446744073709551615
+ self._test_parser(packet_count, byte_count)
+
+ def test_parser_min(self):
+ packet_count = 0
+ byte_count = 0
+ self._test_parser(packet_count, byte_count)
+
+
+class TestOFPGroupStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPGroupStatsRequest
+ """
+
+ # OFP_GROUP_STATS_REQUEST_PACK_STR
+ # '!I4x'...group_id, pad(4)
+ group_id = 6606
+
+ def test_init(self):
+ c = OFPGroupStatsRequest(_Datapath, self.group_id)
+ eq_(self.group_id, c.group_id)
+
+ def _test_serialize(self, group_id):
+ c = OFPGroupStatsRequest(_Datapath, group_id)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_STATS_REQUEST, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_REQUEST_PACK_STR.replace('!', '') \
+ + ofproto.OFP_GROUP_STATS_REQUEST_PACK_STR.replace('!', '')
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_STATS_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], ofproto.OFPST_GROUP)
+ eq_(res[5], 0)
+ eq_(res[6], group_id)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.group_id)
+
+ def test_serialize_max(self):
+ self._test_serialize(0xffffffff)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+ def test_serialize_p1(self):
+ self._test_serialize(ofproto.OFPG_MAX)
+
+ def test_serialize_p2(self):
+ self._test_serialize(ofproto.OFPG_ALL)
+
+
+class TestOFPGroupStats(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPGroupStats
+ """
+
+ # OFP_GROUP_STATS_PACK_STR = '!H2xII4xQQ'
+ length = ofproto.OFP_GROUP_STATS_SIZE \
+ + ofproto.OFP_BUCKET_COUNTER_SIZE
+ group_id = 6606
+ ref_count = 2102
+ packet_count = 6489108735192644493
+ byte_count = 7334344481123449724
+
+ # OFP_BUCKET_COUNTER_PACK_STR = '!QQ'
+ buck_packet_count = 3519264449364891087
+ buck_byte_count = 3123449724733434448
+ bucket_counters = [OFPBucketCounter(buck_packet_count, buck_byte_count)]
+ buf_bucket_counters = pack(ofproto.OFP_BUCKET_COUNTER_PACK_STR,
+ buck_packet_count, buck_byte_count)
+
+ fmt = ofproto.OFP_GROUP_STATS_PACK_STR
+ buf = pack(fmt, length, group_id, ref_count, packet_count, byte_count) \
+ + buf_bucket_counters
+
+ def test_init(self):
+ c = OFPGroupStats(self.group_id, self.ref_count,
+ self.packet_count, self.byte_count,
+ self.bucket_counters)
+
+ eq_(self.group_id, c.group_id)
+ eq_(self.ref_count, c.ref_count)
+ eq_(self.packet_count, c.packet_count)
+ eq_(self.byte_count, c.byte_count)
+ eq_(self.bucket_counters, c.bucket_counters)
+
+ def _test_parser(self, group_id, ref_count, packet_count,
+ byte_count, bucket_counter_cnt):
+ # OFP_GROUP_STATS_PACK_STR = '!H2xII4xQQ'
+ length = ofproto.OFP_GROUP_STATS_SIZE \
+ + (ofproto.OFP_BUCKET_COUNTER_SIZE * bucket_counter_cnt)
+ fmt = ofproto.OFP_GROUP_STATS_PACK_STR
+ buf = pack(fmt, length, group_id, ref_count,
+ packet_count, byte_count)
+
+ bucket_counters = []
+ for b in range(bucket_counter_cnt):
+ # OFP_BUCKET_COUNTER_PACK_STR = '!QQ'
+ buck_packet_count = b
+ buck_byte_count = b
+ bucket_counter = OFPBucketCounter(buck_packet_count,
+ buck_byte_count)
+ bucket_counters.append(bucket_counter)
+ buf_bucket_counters = \
+ pack(ofproto.OFP_BUCKET_COUNTER_PACK_STR,
+ buck_packet_count, buck_byte_count)
+ buf += buf_bucket_counters
+
+ res = OFPGroupStats.parser(buf, 0)
+
+ # 32
+ eq_(length, res.length)
+ eq_(group_id, res.group_id)
+ eq_(ref_count, res.ref_count)
+ eq_(packet_count, res.packet_count)
+ eq_(byte_count, res.byte_count)
+
+ # 32 + 16 * bucket_counter_cnt < 65535 byte
+ # bucket_counter_cnt <= 4093
+ for b in range(bucket_counter_cnt):
+ eq_(bucket_counters[b].packet_count,
+ res.bucket_counters[b].packet_count)
+ eq_(bucket_counters[b].byte_count,
+ res.bucket_counters[b].byte_count)
+
+ def test_parser_mid(self):
+ bucket_counter_cnt = 2046
+ self._test_parser(self.group_id, self.ref_count,
+ self.packet_count, self.byte_count,
+ bucket_counter_cnt)
+
+ def test_parser_max(self):
+ group_id = 4294967295
+ ref_count = 4294967295
+ packet_count = 18446744073709551615
+ byte_count = 18446744073709551615
+ bucket_counter_cnt = 4093
+ self._test_parser(group_id, ref_count,
+ packet_count, byte_count,
+ bucket_counter_cnt)
+
+ def test_parser_min(self):
+ group_id = 0
+ ref_count = 0
+ packet_count = 0
+ byte_count = 0
+ bucket_counter_cnt = 0
+ self._test_parser(group_id, ref_count,
+ packet_count, byte_count,
+ bucket_counter_cnt)
+
+
+class TestOFPGroupDescStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPGroupDescStatsRequest
+ """
+
+ def test_serialize(self):
+ c = OFPGroupDescStatsRequest(_Datapath)
+ c.serialize()
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_REQUEST_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_STATS_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], ofproto.OFPST_GROUP_DESC)
+ eq_(res[5], 0)
+
+
+class TestOFPGroupDescStats(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPGroupDescStats
+ """
+
+ # OFP_GROUP_DESC_STATS_PACK_STR = '!HBxI'
+ length = ofproto.OFP_GROUP_DESC_STATS_SIZE \
+ + ofproto.OFP_BUCKET_SIZE \
+ + ofproto.OFP_ACTION_OUTPUT_SIZE
+ type_ = 128
+ group_id = 6606
+
+ # OFP_ACTION (OFP_ACTION_OUTPUT)
+ port = 0x00002ae0
+ max_len = ofproto.OFP_ACTION_OUTPUT_SIZE
+ actions = [OFPActionOutput(port, max_len)]
+ buf_actions = bytearray()
+ actions[0].serialize(buf_actions, 0)
+
+ # OFP_BUCKET
+ weight = 4386
+ watch_port = 8006
+ watch_group = 3
+ buckets = [OFPBucket(weight, watch_port, watch_group, actions)]
+
+ bucket_cnt = 1024
+
+ def test_init(self):
+ c = OFPGroupDescStats(self.type_, self.group_id, self.buckets)
+
+ eq_(self.type_, c.type)
+ eq_(self.group_id, c.group_id)
+ eq_(self.buckets, c.buckets)
+
+ def _test_parser(self, type_, group_id, bucket_cnt):
+ # OFP_GROUP_DESC_STATS_PACK_STR = '!HBxI'
+ length = ofproto.OFP_GROUP_DESC_STATS_SIZE \
+ + (ofproto.OFP_BUCKET_SIZE
+ + ofproto.OFP_ACTION_OUTPUT_SIZE) * bucket_cnt
+
+ fmt = ofproto.OFP_GROUP_DESC_STATS_PACK_STR
+ buf = pack(fmt, length, type_, group_id)
+
+ buckets = []
+ for b in range(bucket_cnt):
+ # OFP_BUCKET
+ weight = watch_port = watch_group = b
+ bucket = OFPBucket(weight,
+ watch_port, watch_group,
+ self.actions)
+ buckets.append(bucket)
+ buf_buckets = bytearray()
+ buckets[b].serialize(buf_buckets, 0)
+ buf += six.binary_type(buf_buckets)
+
+ res = OFPGroupDescStats.parser(buf, 0)
+
+ # 8 byte
+ eq_(type_, res.type)
+ eq_(group_id, res.group_id)
+
+ # 8 + ( 16 + 16 ) * b < 65535 byte
+ # b <= 2047 byte
+ for b in range(bucket_cnt):
+ eq_(buckets[b].weight, res.buckets[b].weight)
+ eq_(buckets[b].watch_port, res.buckets[b].watch_port)
+ eq_(buckets[b].watch_group, res.buckets[b].watch_group)
+ eq_(buckets[b].actions[0].port,
+ res.buckets[b].actions[0].port)
+ eq_(buckets[b].actions[0].max_len,
+ res.buckets[b].actions[0].max_len)
+
+ def test_parser_mid(self):
+ self._test_parser(self.type_, self.group_id, self.bucket_cnt)
+
+ def test_parser_max(self):
+ group_id = 4294967295
+ type_ = 255
+ bucket_cnt = 2047
+ self._test_parser(type_, group_id, bucket_cnt)
+
+ def test_parser_min(self):
+ group_id = 0
+ type_ = ofproto.OFPGT_ALL
+ bucket_cnt = 0
+ self._test_parser(type_, group_id, bucket_cnt)
+
+ def test_parser_p1(self):
+ type_ = ofproto.OFPGT_SELECT
+ self._test_parser(type_, self.group_id, self.bucket_cnt)
+
+ def test_parser_p2(self):
+ type_ = ofproto.OFPGT_INDIRECT
+ self._test_parser(type_, self.group_id, self.bucket_cnt)
+
+ def test_parser_p3(self):
+ type_ = ofproto.OFPGT_FF
+ self._test_parser(type_, self.group_id, self.bucket_cnt)
+
+
+class TestOFPGroupFeaturesStatsRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPGroupFeaturesStatsRequest
+ """
+
+ def test_serialize(self):
+ c = OFPGroupFeaturesStatsRequest(_Datapath)
+ c.serialize()
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_STATS_REQUEST_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_STATS_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], ofproto.OFPST_GROUP_FEATURES)
+ eq_(res[5], 0)
+
+
+class TestOFPGroupFeaturesStats(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPGroupFeaturesStats
+ """
+
+ # OFP_GROUP_FEATURES_STATS_PACK_STR = '!II4I4I'
+ types = ofproto.OFPGT_ALL
+ capabilities = ofproto.OFPGFC_SELECT_WEIGHT
+ max_groups = [1, 2, 3, 4]
+ actions = [1 << ofproto.OFPAT_OUTPUT,
+ 1 << ofproto.OFPAT_COPY_TTL_OUT,
+ 1 << ofproto.OFPAT_SET_MPLS_TTL,
+ 1 << ofproto.OFPAT_PUSH_VLAN]
+
+ def test_init(self):
+ c = OFPGroupFeaturesStats(self.types, self.capabilities,
+ self.max_groups, self.actions)
+ eq_(self.types, c.types)
+ eq_(self.capabilities, c.capabilities)
+ eq_(self.max_groups, c.max_groups)
+ eq_(self.actions, c.actions)
+
+ def _test_parser(self, types, capabilities, max_groups, actions):
+
+ buf = pack('!I', types) \
+ + pack('!I', capabilities) \
+ + pack('!I', max_groups[0]) \
+ + pack('!I', max_groups[1]) \
+ + pack('!I', max_groups[2]) \
+ + pack('!I', max_groups[3]) \
+ + pack('!I', actions[0]) \
+ + pack('!I', actions[1]) \
+ + pack('!I', actions[2]) \
+ + pack('!I', actions[3])
+
+ res = OFPGroupFeaturesStats.parser(buf, 0)
+
+ # max_groups and actions after the parser is tuple
+ eq_(types, res.types)
+ eq_(capabilities, res.capabilities)
+ eq_(max_groups, res.max_groups)
+ eq_(actions, res.actions)
+
+ def test_parser_mid(self):
+ self._test_parser(self.types, self.capabilities,
+ self.max_groups, self.actions)
+
+ def test_parser_max(self):
+ types = 0b11111111111111111111111111111111
+ capabilities = 0b11111111111111111111111111111111
+ max_groups = [4294967295] * 4
+ actions = [0b11111111111111111111111111111111] * 4
+ self._test_parser(types, capabilities,
+ max_groups, actions)
+
+ def test_parser_min(self):
+ types = 0b00000000000000000000000000000000
+ capabilities = 0b00000000000000000000000000000000
+ max_groups = [0] * 4
+ actions = [0b00000000000000000000000000000000] * 4
+ self._test_parser(types, capabilities,
+ max_groups, actions)
+
+ def _test_parser_p(self, types, capabilities, actions):
+ self._test_parser(types, capabilities,
+ self.max_groups, actions)
+
+ def test_parser_p1(self):
+ actions = [1 << ofproto.OFPAT_COPY_TTL_IN,
+ 1 << ofproto.OFPAT_DEC_MPLS_TTL,
+ 1 << ofproto.OFPAT_POP_VLAN,
+ 1 << ofproto.OFPAT_PUSH_MPLS]
+ self._test_parser_p(1 << ofproto.OFPGT_ALL,
+ ofproto.OFPGFC_CHAINING,
+ actions)
+
+ def test_parser_p2(self):
+ actions = [1 << ofproto.OFPAT_POP_MPLS,
+ 1 << ofproto.OFPAT_SET_QUEUE,
+ 1 << ofproto.OFPAT_GROUP,
+ 1 << ofproto.OFPAT_SET_NW_TTL]
+ self._test_parser_p(1 << ofproto.OFPGT_SELECT,
+ ofproto.OFPGFC_SELECT_WEIGHT,
+ actions)
+
+ def test_parser_p3(self):
+ actions = [1 << ofproto.OFPAT_DEC_NW_TTL,
+ 1 << ofproto.OFPAT_SET_FIELD,
+ 1 << ofproto.OFPAT_GROUP,
+ 1 << ofproto.OFPAT_SET_NW_TTL]
+ self._test_parser_p(1 << ofproto.OFPGT_SELECT,
+ ofproto.OFPGFC_SELECT_LIVENESS,
+ actions)
+
+ def test_parser_p4(self):
+ self._test_parser_p(1 << ofproto.OFPGT_INDIRECT,
+ ofproto.OFPGFC_CHAINING,
+ self.actions)
+
+ def test_parser_p5(self):
+ self._test_parser_p(1 << ofproto.OFPGT_FF,
+ ofproto.OFPGFC_CHAINING_CHECKS,
+ self.actions)
+
+
+class TestOFPQueueGetConfigRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPQueueGetConfigRequest
+ """
+
+ # OFP_QUEUE_GET_CONFIG_REQUEST_PACK_STR v1.2
+ # '!I4x'...port, pad(4)
+ port = 41186
+
+ def test_init(self):
+ c = OFPQueueGetConfigRequest(_Datapath, self.port)
+ eq_(self.port, c.port)
+
+ def _test_serialize(self, port):
+ c = OFPQueueGetConfigRequest(_Datapath, port)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_QUEUE_GET_CONFIG_REQUEST, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR \
+ + ofproto.OFP_QUEUE_GET_CONFIG_REQUEST_PACK_STR[1:]
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+ eq_(res[0], ofproto.OFP_VERSION)
+ eq_(res[1], ofproto.OFPT_QUEUE_GET_CONFIG_REQUEST)
+ eq_(res[2], len(c.buf))
+ eq_(res[3], 0)
+ eq_(res[4], port)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.port)
+
+ def test_serialize_max(self):
+ self._test_serialize(0xffffffff)
+
+ def test_serialize_min(self):
+ self._test_serialize(0)
+
+ def test_serialize_p1(self):
+ self._test_serialize(ofproto.OFPP_MAX)
+
+
+class TestOFPQueuePropHeader(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPQueuePropHeader
+ """
+
+ # OFP_QUEUE_PROP_HEADER_PACK_STR = '!HH4x'
+ property_ = 1
+ len_ = 10
+
+ def test_init(self):
+ c = OFPQueuePropHeader(self.property_, self.len_)
+ eq_(self.property_, c.property)
+ eq_(self.len_, c.len)
+
+ def _test_serialize(self, property_, len_):
+ c = OFPQueuePropHeader(property_, len_)
+ buf = bytearray()
+ c.serialize(buf, 0)
+
+ fmt = ofproto.OFP_QUEUE_PROP_HEADER_PACK_STR
+ res = struct.unpack(fmt, six.binary_type(buf))
+
+ eq_(res[0], property_)
+ eq_(res[1], len_)
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.property_, self.len_)
+
+ def test_serialize_max(self):
+ self._test_serialize(0xffff, 0xffff)
+
+ def test_serialize_min(self):
+ self._test_serialize(0, 0)
+
+
+class TestOFPPacketQueue(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPPacketQueue
+ """
+
+ def test_init(self):
+ queue_id = 1
+ port = 2
+ len_ = 3
+ properties = [4, 5, 6]
+ c = OFPPacketQueue(queue_id, port, properties)
+
+ eq_(queue_id, c.queue_id)
+ eq_(port, c.port)
+ eq_(properties, c.properties)
+
+ def _test_parser(self, queue_id, port, prop_cnt):
+ # OFP_PACKET_QUEUE_PACK_STR = '!IIH6x'
+ fmt = ofproto.OFP_PACKET_QUEUE_PACK_STR
+ queue_len = ofproto.OFP_PACKET_QUEUE_SIZE \
+ + ofproto.OFP_QUEUE_PROP_MIN_RATE_SIZE * prop_cnt
+
+ buf = pack(fmt, queue_id, port, queue_len)
+
+ for rate in range(prop_cnt):
+ # OFP_QUEUE_PROP_HEADER_PACK_STR = '!HH4x'
+ fmt = ofproto.OFP_QUEUE_PROP_HEADER_PACK_STR
+ prop_type = ofproto.OFPQT_MIN_RATE
+ prop_len = ofproto.OFP_QUEUE_PROP_MIN_RATE_SIZE
+ buf += pack(fmt, prop_type, prop_len)
+
+ # OFP_QUEUE_PROP_MIN_RATE_PACK_STR = '!H6x'
+ fmt = ofproto.OFP_QUEUE_PROP_MIN_RATE_PACK_STR
+ prop_rate = rate
+ buf += pack(fmt, prop_rate)
+
+ res = OFPPacketQueue.parser(buf, 0)
+
+ eq_(queue_id, res.queue_id)
+ eq_(port, res.port)
+ eq_(queue_len, res.len)
+ eq_(prop_cnt, len(res.properties))
+
+ for rate, p in enumerate(res.properties):
+ eq_(prop_type, p.property)
+ eq_(prop_len, p.len)
+ eq_(rate, p.rate)
+
+ def test_parser_mid(self):
+ queue_id = 1
+ port = 2
+ prop_cnt = 2
+ self._test_parser(queue_id, port, prop_cnt)
+
+ def test_parser_max(self):
+ # queue_len format is 'H' < number 65535
+ #
+ # queue_len = OFP_PACKET_QUEUE_SIZE(16)
+ # + OFP_QUEUE_PROP_MIN_RATE_SIZE(16) * N
+ # max_prop_cnt = (65535 - 16) / 16 = 4094
+ queue_id = 0xffffffff
+ port = 0xffffffff
+ prop_cnt = 4094
+ self._test_parser(queue_id, port, prop_cnt)
+
+ def test_parser_min(self):
+ queue_id = 0
+ port = 0
+ prop_cnt = 0
+ self._test_parser(queue_id, port, prop_cnt)
+
+
+class TestOFPQueuePropMinRate(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPQueuePropMinRate
+ """
+
+ def _test_parser(self, rate):
+ # OFP_QUEUE_PROP_MIN_RATE_PACK_STR...H6x
+ buf = pack(ofproto.OFP_QUEUE_PROP_MIN_RATE_PACK_STR, rate)
+ res = OFPQueuePropMinRate.parser(buf, 0)
+ eq_(rate, res.rate)
+
+ def test_parser_mid(self):
+ self._test_parser(32768)
+
+ def test_parser_max(self):
+ self._test_parser(0xffff)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+
+class TestOFPQueuePropMaxRate(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPQueuePropMaxRate
+ """
+
+ rate = 100
+ buf = pack(ofproto.OFP_QUEUE_PROP_MAX_RATE_PACK_STR, rate)
+ c = OFPQueuePropMaxRate(rate)
+
+ def _test_parser(self, rate):
+ # OFP_QUEUE_PROP_MAX_RATE_PACK_STR...H6x
+ buf = pack(ofproto.OFP_QUEUE_PROP_MAX_RATE_PACK_STR, rate)
+ res = OFPQueuePropMaxRate.parser(buf, 0)
+ eq_(rate, res.rate)
+
+ def test_parser_mid(self):
+ self._test_parser(100)
+
+ def test_parser_max(self):
+ self._test_parser(0xffff)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+
+class TestOFPQueueGetConfigReply(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPQueueGetConfigReply
+ """
+
+ def _test_parser(self, xid, port, queue_cnt):
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_QUEUE_GET_CONFIG_REPLY
+
+ queues_len = 0
+ for q in range(queue_cnt):
+ queues_len += ofproto.OFP_PACKET_QUEUE_SIZE
+ queues_len += ofproto.OFP_QUEUE_PROP_MIN_RATE_SIZE
+
+ msg_len = ofproto.OFP_QUEUE_GET_CONFIG_REPLY_SIZE \
+ + queues_len
+
+ # OFP_HEADER_PACK_STR = '!BBHI'
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ # OFP_QUEUE_GET_CONFIG_REPLY_PACK_STR = '!I4x'
+ fmt = ofproto.OFP_QUEUE_GET_CONFIG_REPLY_PACK_STR
+ buf += pack(fmt, port)
+
+ queues = []
+ for q in range(1, queue_cnt + 1):
+ # OFP_PACKET_QUEUE_PACK_STR = '!IIH6x'
+ fmt = ofproto.OFP_PACKET_QUEUE_PACK_STR
+ queue_id = q * 100
+ queue_port = q
+ queue_len = ofproto.OFP_PACKET_QUEUE_SIZE \
+ + ofproto.OFP_QUEUE_PROP_MIN_RATE_SIZE
+ buf += pack(fmt, queue_id, queue_port, queue_len)
+
+ # OFP_QUEUE_PROP_HEADER_PACK_STR = '!HH4x'
+ fmt = ofproto.OFP_QUEUE_PROP_HEADER_PACK_STR
+ prop_type = ofproto.OFPQT_MIN_RATE
+ prop_len = ofproto.OFP_QUEUE_PROP_MIN_RATE_SIZE
+ buf += pack(fmt, prop_type, prop_len)
+
+ # OFP_QUEUE_PROP_MIN_RATE_PACK_STR = '!H6x'
+ fmt = ofproto.OFP_QUEUE_PROP_MIN_RATE_PACK_STR
+ prop_rate = q * 10
+ buf += pack(fmt, prop_rate)
+
+ queue = {'queue_id': queue_id, 'queue_port': queue_port,
+ 'queue_len': queue_len, 'prop_type': prop_type,
+ 'prop_len': prop_len, 'prop_rate': prop_rate}
+ queues.append(queue)
+
+ res = OFPQueueGetConfigReply.parser(object, version, msg_type,
+ msg_len, xid, buf)
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+ eq_(port, res.port)
+ eq_(queue_cnt, len(res.queues))
+
+ for i, val in enumerate(res.queues):
+ c = queues[i]
+ eq_(c['queue_id'], val.queue_id)
+ eq_(c['queue_port'], val.port)
+ eq_(c['queue_len'], val.len)
+ eq_(1, len(val.properties))
+
+ prop = val.properties[0]
+ eq_(c['prop_type'], prop.property)
+ eq_(c['prop_len'], prop.len)
+ eq_(c['prop_rate'], prop.rate)
+
+ def test_parser_mid(self):
+ self._test_parser(2495926989, 65037, 2)
+
+ def test_parser_max(self):
+ # total msg_len = 65520
+ self._test_parser(0xffffffff, 0xffffffff, 2047)
+
+ def test_parser_min(self):
+ self._test_parser(0, 0, 0)
+
+
+class TestOFPBarrierRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPBarrierRequest
+ """
+ def test_serialize(self):
+ c = OFPBarrierRequest(_Datapath)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_BARRIER_REQUEST, c.msg_type)
+ eq_(ofproto.OFP_HEADER_SIZE, c.msg_len)
+ eq_(0, c.xid)
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ res = unpack(fmt, six.binary_type(c.buf))
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_BARRIER_REQUEST, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, c.xid)
+
+
+class TestOFPBarrierReply(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPBarrierReply
+ """
+
+ def _test_parser(self, xid):
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_BARRIER_REPLY
+ msg_len = ofproto.OFP_HEADER_SIZE
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ res = OFPBarrierReply.parser(object, version, msg_type,
+ msg_len, xid, buf)
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+
+ def test_parser_mid(self):
+ self._test_parser(2147483648)
+
+ def test_parser_max(self):
+ self._test_parser(0xffffffff)
+
+ def test_parser_min(self):
+ self._test_parser(0)
+
+
+class TestOFPRoleRequest(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPRoleRequest
+ """
+
+ # OFP_ROLE_REQUEST_PACK_STR
+ # '!I4xQ'...role, pad(4), generation_id
+ role = 2147483648
+ generation_id = 1270985291017894273
+
+ def test_init(self):
+ c = OFPRoleRequest(_Datapath, self.role, self.generation_id)
+ eq_(self.role, c.role)
+ eq_(self.generation_id, c.generation_id)
+
+ def _test_serialize(self, role, generation_id):
+ c = OFPRoleRequest(_Datapath, role, generation_id)
+ c.serialize()
+
+ eq_(ofproto.OFP_VERSION, c.version)
+ eq_(ofproto.OFPT_ROLE_REQUEST, c.msg_type)
+ eq_(0, c.xid)
+
+ fmt = '!' \
+ + ofproto.OFP_HEADER_PACK_STR.replace('!', '') \
+ + ofproto.OFP_ROLE_REQUEST_PACK_STR.replace('!', '')
+
+ res = struct.unpack(fmt, six.binary_type(c.buf))
+
+ eq_(ofproto.OFP_VERSION, res[0])
+ eq_(ofproto.OFPT_ROLE_REQUEST, res[1])
+ eq_(len(c.buf), res[2])
+ eq_(0, res[3])
+ eq_(role, res[4])
+ eq_(generation_id, res[5])
+
+ def test_serialize_mid(self):
+ self._test_serialize(self.role, self.generation_id)
+
+ def test_serialize_max(self):
+ role = 0xffffffff
+ generation_id = 0xffffffffffffffff
+ self._test_serialize(role, generation_id)
+
+ def test_serialize_min(self):
+ role = 0
+ generation_id = 0
+ self._test_serialize(role, generation_id)
+
+ def test_serialize_p1(self):
+ role = ofproto.OFPCR_ROLE_EQUAL
+ self._test_serialize(role, self.generation_id)
+
+ def test_serialize_p2(self):
+ role = ofproto.OFPCR_ROLE_MASTER
+ self._test_serialize(role, self.generation_id)
+
+ def test_serialize_p3(self):
+ role = ofproto.OFPCR_ROLE_SLAVE
+ self._test_serialize(role, self.generation_id)
+
+
+class TestOFPRoleReply(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPRoleReply
+ """
+
+ # OFP_ROLE_REQUEST_PACK_STR
+ # '!I4xQ'...role, pad(4), generation_id
+ # role = ofproto.OFPCR_ROLE_NOCHANGE
+ role = 2147483648
+ generation_id = 1270985291017894273
+
+ def _test_parser(self, role, generation_id):
+ # OFP_HEADER_PACK_STR
+ version = ofproto.OFP_VERSION
+ msg_type = ofproto.OFPT_ROLE_REPLY
+ msg_len = ofproto.OFP_ROLE_REQUEST_SIZE
+ xid = 2495926989
+
+ fmt = ofproto.OFP_HEADER_PACK_STR
+ buf = pack(fmt, version, msg_type, msg_len, xid)
+
+ fmt = ofproto.OFP_ROLE_REQUEST_PACK_STR
+ buf += pack(fmt, role, generation_id)
+
+ res = OFPRoleReply.parser(object, version, msg_type, msg_len, xid, buf)
+
+ # OFP_HEADER_PACK_STR
+ eq_(version, res.version)
+ eq_(msg_type, res.msg_type)
+ eq_(msg_len, res.msg_len)
+ eq_(xid, res.xid)
+
+ # OFP_ROLE_REQUEST_PACK_STR
+ eq_(role, res.role)
+ eq_(generation_id, res.generation_id)
+
+ def test_parser_mid(self):
+ self._test_parser(self.role, self.generation_id)
+
+ def test_parser_max(self):
+ role = 0xffffffff
+ generation_id = 0xffffffffffffffff
+ self._test_parser(role, generation_id)
+
+ def test_parser_min(self):
+ role = ofproto.OFPCR_ROLE_NOCHANGE
+ generation_id = 0
+ self._test_parser(role, generation_id)
+
+ def test_parser_p1(self):
+ role = ofproto.OFPCR_ROLE_EQUAL
+ self._test_parser(role, self.generation_id)
+
+ def test_parser_p2(self):
+ role = ofproto.OFPCR_ROLE_MASTER
+ self._test_parser(role, self.generation_id)
+
+ def test_parser_p3(self):
+ role = ofproto.OFPCR_ROLE_SLAVE
+ self._test_parser(role, self.generation_id)
+
+
+class TestOFPMatch(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPMatch
+ """
+
+ def test_init(self):
+ res = OFPMatch()
+
+ # wc check
+ eq_(res._wc.metadata_mask, 0)
+ eq_(res._wc.dl_dst_mask, 0)
+ eq_(res._wc.dl_src_mask, 0)
+ eq_(res._wc.vlan_vid_mask, 0)
+ eq_(res._wc.ipv4_src_mask, 0)
+ eq_(res._wc.ipv4_dst_mask, 0)
+ eq_(res._wc.arp_spa_mask, 0)
+ eq_(res._wc.arp_tpa_mask, 0)
+ eq_(res._wc.arp_sha_mask, 0)
+ eq_(res._wc.arp_tha_mask, 0)
+ eq_(res._wc.ipv6_src_mask, [])
+ eq_(res._wc.ipv6_dst_mask, [])
+ eq_(res._wc.ipv6_flabel_mask, 0)
+ eq_(res._wc.wildcards, (1 << 64) - 1)
+
+ # flow check
+ eq_(res._flow.in_port, 0)
+ eq_(res._flow.in_phy_port, 0)
+ eq_(res._flow.metadata, 0)
+ eq_(res._flow.dl_dst, mac.DONTCARE)
+ eq_(res._flow.dl_src, mac.DONTCARE)
+ eq_(res._flow.dl_type, 0)
+ eq_(res._flow.vlan_vid, 0)
+ eq_(res._flow.vlan_pcp, 0)
+ eq_(res._flow.ip_dscp, 0)
+ eq_(res._flow.ip_ecn, 0)
+ eq_(res._flow.ip_proto, 0)
+ eq_(res._flow.ipv4_src, 0)
+ eq_(res._flow.ipv4_dst, 0)
+ eq_(res._flow.tcp_src, 0)
+ eq_(res._flow.tcp_dst, 0)
+ eq_(res._flow.udp_src, 0)
+ eq_(res._flow.udp_dst, 0)
+ eq_(res._flow.sctp_src, 0)
+ eq_(res._flow.sctp_dst, 0)
+ eq_(res._flow.icmpv4_type, 0)
+ eq_(res._flow.icmpv4_code, 0)
+ eq_(res._flow.arp_op, 0)
+ eq_(res._flow.arp_spa, 0)
+ eq_(res._flow.arp_tpa, 0)
+ eq_(res._flow.arp_sha, 0)
+ eq_(res._flow.arp_tha, 0)
+ eq_(res._flow.ipv6_src, [])
+ eq_(res._flow.ipv6_dst, [])
+ eq_(res._flow.ipv6_flabel, 0)
+ eq_(res._flow.icmpv6_type, 0)
+ eq_(res._flow.icmpv6_code, 0)
+ eq_(res._flow.ipv6_nd_target, [])
+ eq_(res._flow.ipv6_nd_sll, 0)
+ eq_(res._flow.ipv6_nd_tll, 0)
+ eq_(res._flow.mpls_label, 0)
+ eq_(res._flow.mpls_tc, 0)
+
+ # flow check
+ eq_(res.fields, [])
+
+ def _test_serialize_and_parser(self, match, header, value, mask=None):
+ cls_ = OFPMatchField._FIELDS_HEADERS.get(header)
+ pack_str = cls_.pack_str.replace('!', '')
+ fmt = '!HHI' + pack_str
+
+ # serialize
+ buf = bytearray()
+ length = match.serialize(buf, 0)
+ eq_(length, len(buf))
+ if mask and len(buf) > calcsize(fmt):
+ fmt += pack_str
+
+ res = list(unpack_from(fmt, six.binary_type(buf), 0)[3:])
+ if type(value) is list:
+ res_value = res[:calcsize(pack_str) // 2]
+ eq_(res_value, value)
+ if mask:
+ res_mask = res[calcsize(pack_str) // 2:]
+ eq_(res_mask, mask)
+ else:
+ res_value = res.pop(0)
+ if cls_.__name__ == 'MTVlanVid':
+ eq_(res_value, value | ofproto.OFPVID_PRESENT)
+ else:
+ eq_(res_value, value)
+ if mask and res and res[0]:
+ res_mask = res[0]
+ eq_(res_mask, mask)
+
+ # parser
+ res = match.parser(six.binary_type(buf), 0)
+ eq_(res.type, ofproto.OFPMT_OXM)
+ eq_(res.fields[0].header, header)
+ eq_(res.fields[0].value, value)
+ if mask and res.fields[0].mask is not None:
+ eq_(res.fields[0].mask, mask)
+
+ # to_jsondict
+ jsondict = match.to_jsondict()
+
+ # from_jsondict
+ match2 = match.from_jsondict(jsondict["OFPMatch"])
+ buf2 = bytearray()
+ match2.serialize(buf2, 0)
+ eq_(str(match), str(match2))
+ eq_(buf, buf2)
+
+ def test_parse_unknown_field(self):
+ buf = bytearray()
+ pack_utils.msg_pack_into('!HH', buf, 0, ofproto.OFPMT_OXM, 4 + 6)
+ header = ofproto.oxm_tlv_header(36, 2)
+ pack_utils.msg_pack_into('!IH', buf, 4, header, 1)
+ header = ofproto.OXM_OF_ETH_TYPE
+ pack_utils.msg_pack_into('!IH', buf, 10, header, 1)
+
+ match = OFPMatch()
+ res = match.parser(six.binary_type(buf), 0)
+
+ # set_in_port
+ def _test_set_in_port(self, in_port):
+ header = ofproto.OXM_OF_IN_PORT
+ match = OFPMatch()
+ match.set_in_port(in_port)
+ self._test_serialize_and_parser(match, header, in_port)
+
+ def test_set_in_port_mid(self):
+ self._test_set_in_port(0xff8)
+
+ def test_set_in_port_max(self):
+ self._test_set_in_port(0xffffffff)
+
+ def test_set_in_port_min(self):
+ self._test_set_in_port(0)
+
+ # set_in_phy_port
+ def _test_set_in_phy_port(self, phy_port):
+ header = ofproto.OXM_OF_IN_PHY_PORT
+ match = OFPMatch()
+ match.set_in_phy_port(phy_port)
+ self._test_serialize_and_parser(match, header, phy_port)
+
+ def test_set_in_phy_port_mid(self):
+ self._test_set_in_phy_port(1)
+
+ def test_set_in_phy_port_max(self):
+ self._test_set_in_phy_port(0xffffffff)
+
+ def test_set_in_phy_port_min(self):
+ self._test_set_in_phy_port(0)
+
+ # set_metadata
+ def _test_set_metadata(self, metadata, mask=None):
+ header = ofproto.OXM_OF_METADATA
+ match = OFPMatch()
+ if mask is None:
+ match.set_metadata(metadata)
+ else:
+ if (mask + 1) >> 64 != 1:
+ header = ofproto.OXM_OF_METADATA_W
+ match.set_metadata_masked(metadata, mask)
+ metadata &= mask
+ self._test_serialize_and_parser(match, header, metadata, mask)
+
+ def test_set_metadata_mid(self):
+ self._test_set_metadata(0x1212121212121212)
+
+ def test_set_metadata_max(self):
+ self._test_set_metadata(0xffffffffffffffff)
+
+ def test_set_metadata_min(self):
+ self._test_set_metadata(0)
+
+ def test_set_metadata_masked_mid(self):
+ self._test_set_metadata(0x1212121212121212, 0xff00ff00ff00ff00)
+
+ def test_set_metadata_masked_max(self):
+ self._test_set_metadata(0x1212121212121212, 0xffffffffffffffff)
+
+ def test_set_metadata_masked_min(self):
+ self._test_set_metadata(0x1212121212121212, 0)
+
+ # set_dl_dst
+ def _test_set_dl_dst(self, dl_dst, mask=None):
+ header = ofproto.OXM_OF_ETH_DST
+ match = OFPMatch()
+ dl_dst = mac.haddr_to_bin(dl_dst)
+ if mask is None:
+ match.set_dl_dst(dl_dst)
+ else:
+ header = ofproto.OXM_OF_ETH_DST_W
+ mask = mac.haddr_to_bin(mask)
+ match.set_dl_dst_masked(dl_dst, mask)
+ dl_dst = mac.haddr_bitand(dl_dst, mask)
+ self._test_serialize_and_parser(match, header, dl_dst, mask)
+
+ def test_set_dl_dst_mid(self):
+ self._test_set_dl_dst('e2:7a:09:79:0b:0f')
+
+ def test_set_dl_dst_max(self):
+ self._test_set_dl_dst('ff:ff:ff:ff:ff:ff')
+
+ def test_set_dl_dst_min(self):
+ self._test_set_dl_dst('00:00:00:00:00:00')
+
+ def test_set_dl_dst_masked_mid(self):
+ self._test_set_dl_dst('e2:7a:09:79:0b:0f', 'ff:00:ff:00:ff:00')
+
+ def test_set_dl_dst_masked_max(self):
+ self._test_set_dl_dst('e2:7a:09:79:0b:0f', 'ff:ff:ff:ff:ff:ff')
+
+ def test_set_dl_dst_masked_min(self):
+ self._test_set_dl_dst('e2:7a:09:79:0b:0f', '00:00:00:00:00:00')
+
+ # set_dl_src
+ def _test_set_dl_src(self, dl_src, mask=None):
+ header = ofproto.OXM_OF_ETH_SRC
+ match = OFPMatch()
+ dl_src = mac.haddr_to_bin(dl_src)
+ if mask is None:
+ match.set_dl_src(dl_src)
+ else:
+ header = ofproto.OXM_OF_ETH_SRC_W
+ mask = mac.haddr_to_bin(mask)
+ match.set_dl_src_masked(dl_src, mask)
+ dl_src = mac.haddr_bitand(dl_src, mask)
+ self._test_serialize_and_parser(match, header, dl_src, mask)
+
+ def test_set_dl_src_mid(self):
+ self._test_set_dl_src('d0:98:79:b4:75:b5')
+
+ def test_set_dl_src_max(self):
+ self._test_set_dl_src('ff:ff:ff:ff:ff:ff')
+
+ def test_set_dl_src_min(self):
+ self._test_set_dl_src('00:00:00:00:00:00')
+
+ def test_set_dl_src_masked_mid(self):
+ self._test_set_dl_src('d0:98:79:b4:75:b5', 'f0:f0:f0:f0:f0:f0')
+
+ def test_set_dl_src_masked_max(self):
+ self._test_set_dl_src('d0:98:79:b4:75:b5', 'ff:ff:ff:ff:ff:ff')
+
+ def test_set_dl_src_masked_min(self):
+ self._test_set_dl_src('d0:98:79:b4:75:b5', '00:00:00:00:00:00')
+
+ # set_dl_type
+ def _test_set_dl_type(self, value):
+ header = ofproto.OXM_OF_ETH_TYPE
+ match = OFPMatch()
+ match.set_dl_type(value)
+ self._test_serialize_and_parser(match, header, value)
+
+ def test_set_dl_type_mid(self):
+ self._test_set_dl_type(0x7fb6)
+
+ def test_set_dl_type_max(self):
+ self._test_set_dl_type(0xffff)
+
+ def test_set_dl_type_min(self):
+ self._test_set_dl_type(0)
+
+ def test_set_dl_type_ip(self):
+ value = ether.ETH_TYPE_IP
+ self._test_set_dl_type(value)
+
+ def test_set_dl_type_arp(self):
+ value = ether.ETH_TYPE_ARP
+ self._test_set_dl_type(value)
+
+ def test_set_dl_type_ipv6(self):
+ value = ether.ETH_TYPE_IPV6
+ self._test_set_dl_type(value)
+
+ def test_set_dl_type_slow(self):
+ value = ether.ETH_TYPE_SLOW
+ self._test_set_dl_type(value)
+
+ # set_vlan_vid
+ def _test_set_vlan_vid(self, vid, mask=None):
+ header = ofproto.OXM_OF_VLAN_VID
+ match = OFPMatch()
+ if mask is None:
+ match.set_vlan_vid(vid)
+ else:
+ header = ofproto.OXM_OF_VLAN_VID_W
+ match.set_vlan_vid_masked(vid, mask)
+ self._test_serialize_and_parser(match, header, vid, mask)
+
+ def _test_set_vlan_vid_none(self):
+ header = ofproto.OXM_OF_VLAN_VID
+ match = OFPMatch()
+ match.set_vlan_vid_none()
+ value = ofproto.OFPVID_NONE
+ cls_ = OFPMatchField._FIELDS_HEADERS.get(header)
+ pack_str = cls_.pack_str.replace('!', '')
+ fmt = '!HHI' + pack_str
+
+ # serialize
+ buf = bytearray()
+ length = match.serialize(buf, 0)
+ eq_(length, len(buf))
+
+ res = list(unpack_from(fmt, six.binary_type(buf), 0)[3:])
+ res_value = res.pop(0)
+ eq_(res_value, value)
+
+ # parser
+ res = match.parser(six.binary_type(buf), 0)
+ eq_(res.type, ofproto.OFPMT_OXM)
+ eq_(res.fields[0].header, header)
+ eq_(res.fields[0].value, value)
+
+ # to_jsondict
+ jsondict = match.to_jsondict()
+
+ # from_jsondict
+ match2 = match.from_jsondict(jsondict["OFPMatch"])
+ buf2 = bytearray()
+ match2.serialize(buf2, 0)
+ eq_(str(match), str(match2))
+ eq_(buf, buf2)
+
+ def test_set_vlan_vid_mid(self):
+ self._test_set_vlan_vid(2047)
+
+ def test_set_vlan_vid_max(self):
+ self._test_set_vlan_vid(0xfff)
+
+ def test_set_vlan_vid_min(self):
+ self._test_set_vlan_vid(0)
+
+ def test_set_vlan_vid_masked_mid(self):
+ self._test_set_vlan_vid(2047, 0xf0f)
+
+ def test_set_vlan_vid_masked_max(self):
+ self._test_set_vlan_vid(2047, 0xfff)
+
+ def test_set_vlan_vid_masked_min(self):
+ self._test_set_vlan_vid(2047, 0)
+
+ def test_set_vlan_vid_none(self):
+ self._test_set_vlan_vid_none()
+
+ # set_vlan_pcp
+ def _test_set_vlan_pcp(self, pcp):
+ header = ofproto.OXM_OF_VLAN_PCP
+ match = OFPMatch()
+ match.set_vlan_pcp(pcp)
+ self._test_serialize_and_parser(match, header, pcp)
+
+ def test_set_vlan_pcp_mid(self):
+ self._test_set_vlan_pcp(5)
+
+ def test_set_vlan_pcp_max(self):
+ self._test_set_vlan_pcp(7)
+
+ def test_set_vlan_pcp_min(self):
+ self._test_set_vlan_pcp(0)
+
+ # set_ip_dscp
+ def _test_set_ip_dscp(self, ip_dscp):
+ header = ofproto.OXM_OF_IP_DSCP
+ match = OFPMatch()
+ match.set_ip_dscp(ip_dscp)
+ self._test_serialize_and_parser(match, header, ip_dscp)
+
+ def test_set_ip_dscp_mid(self):
+ self._test_set_ip_dscp(36)
+
+ def test_set_ip_dscp_max(self):
+ self._test_set_ip_dscp(63)
+
+ def test_set_ip_dscp_min(self):
+ self._test_set_ip_dscp(0)
+
+ # set_ip_ecn
+ def _test_set_ip_ecn(self, ip_ecn):
+ header = ofproto.OXM_OF_IP_ECN
+ match = OFPMatch()
+ match.set_ip_ecn(ip_ecn)
+ self._test_serialize_and_parser(match, header, ip_ecn)
+
+ def test_set_ip_ecn_mid(self):
+ self._test_set_ip_ecn(1)
+
+ def test_set_ip_ecn_max(self):
+ self._test_set_ip_ecn(3)
+
+ def test_set_ip_ecn_min(self):
+ self._test_set_ip_ecn(0)
+
+ # set_ip_proto
+ def _test_set_ip_proto(self, ip_proto):
+ header = ofproto.OXM_OF_IP_PROTO
+ match = OFPMatch()
+ match.set_ip_proto(ip_proto)
+ self._test_serialize_and_parser(match, header, ip_proto)
+
+ def test_set_ip_proto_mid(self):
+ self._test_set_ip_proto(6)
+
+ def test_set_ip_proto_max(self):
+ self._test_set_ip_proto(0xff)
+
+ def test_set_ip_proto_min(self):
+ self._test_set_ip_proto(0)
+
+ # set_ipv4_src
+ def _test_set_ipv4_src(self, ip, mask=None):
+ header = ofproto.OXM_OF_IPV4_SRC
+ match = OFPMatch()
+ ip = unpack('!I', socket.inet_aton(ip))[0]
+ if mask is None:
+ match.set_ipv4_src(ip)
+ else:
+ mask = unpack('!I', socket.inet_aton(mask))[0]
+ if (mask + 1) >> 32 != 1:
+ header = ofproto.OXM_OF_IPV4_SRC_W
+ match.set_ipv4_src_masked(ip, mask)
+ self._test_serialize_and_parser(match, header, ip, mask)
+
+ def test_set_ipv4_src_mid(self):
+ self._test_set_ipv4_src('192.168.196.250')
+
+ def test_set_ipv4_src_max(self):
+ self._test_set_ipv4_src('255.255.255.255')
+
+ def test_set_ipv4_src_min(self):
+ self._test_set_ipv4_src('0.0.0.0')
+
+ def test_set_ipv4_src_masked_mid(self):
+ self._test_set_ipv4_src('192.168.196.250', '255.255.0.0')
+
+ def test_set_ipv4_src_masked_max(self):
+ self._test_set_ipv4_src('192.168.196.250', '255.255.255.255')
+
+ def test_set_ipv4_src_masked_min(self):
+ self._test_set_ipv4_src('192.168.196.250', '0.0.0.0')
+
+ # set_ipv4_dst
+ def _test_set_ipv4_dst(self, ip, mask=None):
+ header = ofproto.OXM_OF_IPV4_DST
+ match = OFPMatch()
+ ip = unpack('!I', socket.inet_aton(ip))[0]
+ if mask is None:
+ match.set_ipv4_dst(ip)
+ else:
+ mask = unpack('!I', socket.inet_aton(mask))[0]
+ if (mask + 1) >> 32 != 1:
+ header = ofproto.OXM_OF_IPV4_DST_W
+ match.set_ipv4_dst_masked(ip, mask)
+ self._test_serialize_and_parser(match, header, ip, mask)
+
+ def test_set_ipv4_dst_mid(self):
+ self._test_set_ipv4_dst('192.168.196.250')
+
+ def test_set_ipv4_dst_max(self):
+ self._test_set_ipv4_dst('255.255.255.255')
+
+ def test_set_ipv4_dst_min(self):
+ self._test_set_ipv4_dst('0.0.0.0')
+
+ def test_set_ipv4_dst_masked_mid(self):
+ self._test_set_ipv4_dst('192.168.196.250', '255.255.0.0')
+
+ def test_set_ipv4_dst_masked_max(self):
+ self._test_set_ipv4_dst('192.168.196.250', '255.255.255.255')
+
+ def test_set_ipv4_dst_masked_min(self):
+ self._test_set_ipv4_dst('192.168.196.250', '0.0.0.0')
+
+ # set_tcp_src
+ def _test_set_tcp_src(self, tcp_src):
+ header = ofproto.OXM_OF_TCP_SRC
+ match = OFPMatch()
+ match.set_tcp_src(tcp_src)
+ self._test_serialize_and_parser(match, header, tcp_src)
+
+ def test_set_tcp_src_mid(self):
+ self._test_set_tcp_src(1103)
+
+ def test_set_tcp_src_max(self):
+ self._test_set_tcp_src(0xffff)
+
+ def test_set_tcp_src_min(self):
+ self._test_set_tcp_src(0)
+
+ # set_tcp_dst
+ def _test_set_tcp_dst(self, tcp_dst):
+ header = ofproto.OXM_OF_TCP_DST
+ match = OFPMatch()
+ match.set_tcp_dst(tcp_dst)
+ self._test_serialize_and_parser(match, header, tcp_dst)
+
+ def test_set_tcp_dst_mid(self):
+ self._test_set_tcp_dst(236)
+
+ def test_set_tcp_dst_max(self):
+ self._test_set_tcp_dst(0xffff)
+
+ def test_set_tcp_dst_min(self):
+ self._test_set_tcp_dst(0)
+
+ # set_udp_src
+ def _test_set_udp_src(self, udp_src):
+ header = ofproto.OXM_OF_UDP_SRC
+ match = OFPMatch()
+ match.set_udp_src(udp_src)
+ self._test_serialize_and_parser(match, header, udp_src)
+
+ def test_set_udp_src_mid(self):
+ self._test_set_udp_src(56617)
+
+ def test_set_udp_src_max(self):
+ self._test_set_udp_src(0xffff)
+
+ def test_set_udp_src_min(self):
+ self._test_set_udp_src(0)
+
+ # set_udp_dst
+ def _test_set_udp_dst(self, udp_dst):
+ header = ofproto.OXM_OF_UDP_DST
+ match = OFPMatch()
+ match.set_udp_dst(udp_dst)
+ self._test_serialize_and_parser(match, header, udp_dst)
+
+ def test_set_udp_dst_mid(self):
+ self._test_set_udp_dst(61278)
+
+ def test_set_udp_dst_max(self):
+ self._test_set_udp_dst(0xffff)
+
+ def test_set_udp_dst_min(self):
+ self._test_set_udp_dst(0)
+
+ # set_sctp_src
+ def _test_set_sctp_src(self, sctp_src):
+ header = ofproto.OXM_OF_SCTP_SRC
+ match = OFPMatch()
+ match.set_sctp_src(sctp_src)
+ self._test_serialize_and_parser(match, header, sctp_src)
+
+ def test_set_sctp_src_mid(self):
+ self._test_set_sctp_src(9999)
+
+ def test_set_sctp_src_max(self):
+ self._test_set_sctp_src(0xffff)
+
+ def test_set_sctp_src_min(self):
+ self._test_set_sctp_src(0)
+
+ # set_sctp_dst
+ def _test_set_sctp_dst(self, sctp_dst):
+ header = ofproto.OXM_OF_SCTP_DST
+ match = OFPMatch()
+ match.set_sctp_dst(sctp_dst)
+ self._test_serialize_and_parser(match, header, sctp_dst)
+
+ def test_set_sctp_dst_mid(self):
+ self._test_set_sctp_dst(1234)
+
+ def test_set_sctp_dst_max(self):
+ self._test_set_sctp_dst(0xffff)
+
+ def test_set_sctp_dst_min(self):
+ self._test_set_sctp_dst(0)
+
+ # set_icmpv4_type
+ def _test_set_icmpv4_type(self, icmpv4_type):
+ header = ofproto.OXM_OF_ICMPV4_TYPE
+ match = OFPMatch()
+ match.set_icmpv4_type(icmpv4_type)
+ self._test_serialize_and_parser(match, header, icmpv4_type)
+
+ def test_set_icmpv4_type_mid(self):
+ self._test_set_icmpv4_type(8)
+
+ def test_set_icmpv4_type_max(self):
+ self._test_set_icmpv4_type(0xff)
+
+ def test_set_icmpv4_type_min(self):
+ self._test_set_icmpv4_type(0)
+
+ # set_icmpv4_code
+ def _test_set_icmpv4_code(self, icmpv4_code):
+ header = ofproto.OXM_OF_ICMPV4_CODE
+ match = OFPMatch()
+ match.set_icmpv4_code(icmpv4_code)
+ self._test_serialize_and_parser(match, header, icmpv4_code)
+
+ def test_set_icmpv4_code_mid(self):
+ self._test_set_icmpv4_code(1)
+
+ def test_set_icmpv4_code_max(self):
+ self._test_set_icmpv4_code(0xff)
+
+ def test_set_icmpv4_code_min(self):
+ self._test_set_icmpv4_code(0)
+
+ # set_arp_opcode
+ def _test_set_arp_opcode(self, arp_op):
+ header = ofproto.OXM_OF_ARP_OP
+ match = OFPMatch()
+ match.set_arp_opcode(arp_op)
+ self._test_serialize_and_parser(match, header, arp_op)
+
+ def test_set_arp_opcode_mid(self):
+ self._test_set_arp_opcode(1)
+
+ def test_set_arp_opcode_max(self):
+ self._test_set_arp_opcode(0xffff)
+
+ def test_set_arp_opcode_min(self):
+ self._test_set_arp_opcode(0)
+
+ # set_arp_spa
+ def _test_set_arp_spa(self, ip, mask=None):
+ header = ofproto.OXM_OF_ARP_SPA
+ match = OFPMatch()
+ ip = unpack('!I', socket.inet_aton(ip))[0]
+ if mask is None:
+ match.set_arp_spa(ip)
+ else:
+ mask = unpack('!I', socket.inet_aton(mask))[0]
+ if (mask + 1) >> 32 != 1:
+ header = ofproto.OXM_OF_ARP_SPA_W
+ match.set_arp_spa_masked(ip, mask)
+ self._test_serialize_and_parser(match, header, ip, mask)
+
+ def test_set_arp_spa_mid(self):
+ self._test_set_arp_spa('192.168.227.57')
+
+ def test_set_arp_spa_max(self):
+ self._test_set_arp_spa('255.255.255.255')
+
+ def test_set_arp_spa_min(self):
+ self._test_set_arp_spa('0.0.0.0')
+
+ def test_set_arp_spa_masked_mid(self):
+ self._test_set_arp_spa('192.168.227.57', '255.255.0.0')
+
+ def test_set_arp_spa_masked_max(self):
+ self._test_set_arp_spa('192.168.227.57', '255.255.255.255')
+
+ def test_set_arp_spa_masked_min(self):
+ self._test_set_arp_spa('192.168.227.57', '0.0.0.0')
+
+ # set_arp_tpa
+ def _test_set_arp_tpa(self, ip, mask=None):
+ header = ofproto.OXM_OF_ARP_TPA
+ match = OFPMatch()
+ ip = unpack('!I', socket.inet_aton(ip))[0]
+ if mask is None:
+ match.set_arp_tpa(ip)
+ else:
+ mask = unpack('!I', socket.inet_aton(mask))[0]
+ if (mask + 1) >> 32 != 1:
+ header = ofproto.OXM_OF_ARP_TPA_W
+ match.set_arp_tpa_masked(ip, mask)
+ self._test_serialize_and_parser(match, header, ip, mask)
+
+ def test_set_arp_tpa_mid(self):
+ self._test_set_arp_tpa('192.168.227.57')
+
+ def test_set_arp_tpa_max(self):
+ self._test_set_arp_tpa('255.255.255.255')
+
+ def test_set_arp_tpa_min(self):
+ self._test_set_arp_tpa('0.0.0.0')
+
+ def test_set_arp_tpa_masked_mid(self):
+ self._test_set_arp_tpa('192.168.227.57', '255.255.0.0')
+
+ def test_set_arp_tpa_masked_max(self):
+ self._test_set_arp_tpa('192.168.227.57', '255.255.255.255')
+
+ def test_set_arp_tpa_masked_min(self):
+ self._test_set_arp_tpa('192.168.227.57', '0.0.0.0')
+
+ # set_arp_sha
+ def _test_set_arp_sha(self, arp_sha, mask=None):
+ header = ofproto.OXM_OF_ARP_SHA
+ match = OFPMatch()
+ arp_sha = mac.haddr_to_bin(arp_sha)
+ if mask is None:
+ match.set_arp_sha(arp_sha)
+ else:
+ header = ofproto.OXM_OF_ARP_SHA_W
+ mask = mac.haddr_to_bin(mask)
+ match.set_arp_sha_masked(arp_sha, mask)
+ arp_sha = mac.haddr_bitand(arp_sha, mask)
+ self._test_serialize_and_parser(match, header, arp_sha, mask)
+
+ def test_set_arp_sha_mid(self):
+ self._test_set_arp_sha('3e:ec:13:9b:f3:0b')
+
+ def test_set_arp_sha_max(self):
+ self._test_set_arp_sha('ff:ff:ff:ff:ff:ff')
+
+ def test_set_arp_sha_min(self):
+ self._test_set_arp_sha('00:00:00:00:00:00')
+
+ def test_set_arp_sha_masked_mid(self):
+ self._test_set_arp_sha('3e:ec:13:9b:f3:0b', 'ff:ff:ff:00:00:00')
+
+ def test_set_arp_sha_masked_max(self):
+ self._test_set_arp_sha('3e:ec:13:9b:f3:0b', 'ff:ff:ff:ff:ff:ff')
+
+ def test_set_arp_sha_masked_min(self):
+ self._test_set_arp_sha('3e:ec:13:9b:f3:0b', '00:00:00:00:00:00')
+
+ # set_arp_tha
+ def _test_set_arp_tha(self, arp_tha, mask=None):
+ header = ofproto.OXM_OF_ARP_THA
+ match = OFPMatch()
+ arp_tha = mac.haddr_to_bin(arp_tha)
+ if mask is None:
+ match.set_arp_tha(arp_tha)
+ else:
+ header = ofproto.OXM_OF_ARP_THA_W
+ mask = mac.haddr_to_bin(mask)
+ match.set_arp_tha_masked(arp_tha, mask)
+ arp_tha = mac.haddr_bitand(arp_tha, mask)
+ self._test_serialize_and_parser(match, header, arp_tha, mask)
+
+ def test_set_arp_tha_mid(self):
+ self._test_set_arp_tha('83:6c:21:52:49:68')
+
+ def test_set_arp_tha_max(self):
+ self._test_set_arp_tha('ff:ff:ff:ff:ff:ff')
+
+ def test_set_arp_tha_min(self):
+ self._test_set_arp_tha('00:00:00:00:00:00')
+
+ def test_set_arp_tha_masked_mid(self):
+ self._test_set_arp_tha('83:6c:21:52:49:68', 'ff:ff:ff:00:00:00')
+
+ def test_set_arp_tha_masked_max(self):
+ self._test_set_arp_tha('83:6c:21:52:49:68', 'ff:ff:ff:ff:ff:ff')
+
+ def test_set_arp_tha_masked_min(self):
+ self._test_set_arp_tha('83:6c:21:52:49:68', '00:00:00:00:00:00')
+
+ # set_ipv6_src
+ def _test_set_ipv6_src(self, ipv6, mask=None):
+ header = ofproto.OXM_OF_IPV6_SRC
+ match = OFPMatch()
+ ipv6 = [int(x, 16) for x in ipv6.split(":")]
+ if mask is None:
+ match.set_ipv6_src(ipv6)
+ else:
+ header = ofproto.OXM_OF_IPV6_SRC_W
+ mask = [int(x, 16) for x in mask.split(":")]
+ match.set_ipv6_src_masked(ipv6, mask)
+ ipv6 = [x & y for (x, y) in zip(ipv6, mask)]
+ self._test_serialize_and_parser(match, header, ipv6, mask)
+
+ def test_set_ipv6_src_mid(self):
+ ipv6 = '2001:db8:bd05:1d2:288a:1fc0:1:10ee'
+ self._test_set_ipv6_src(ipv6)
+
+ def test_set_ipv6_src_max(self):
+ ipv6 = 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'
+ self._test_set_ipv6_src(ipv6)
+
+ def test_set_ipv6_src_min(self):
+ ipv6 = '0:0:0:0:0:0:0:0'
+ self._test_set_ipv6_src(ipv6)
+
+ def test_set_ipv6_src_masked_mid(self):
+ ipv6 = '2001:db8:bd05:1d2:288a:1fc0:1:10ee'
+ mask = 'ffff:ffff:ffff:ffff:0:0:0:0'
+ self._test_set_ipv6_src(ipv6, mask)
+
+ def test_set_ipv6_src_masked_max(self):
+ ipv6 = '2001:db8:bd05:1d2:288a:1fc0:1:10ee'
+ mask = 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'
+ self._test_set_ipv6_src(ipv6, mask)
+
+ def test_set_ipv6_src_masked_min(self):
+ ipv6 = '2001:db8:bd05:1d2:288a:1fc0:1:10ee'
+ mask = '0:0:0:0:0:0:0:0'
+ self._test_set_ipv6_src(ipv6, mask)
+
+ # set_ipv6_dst
+ def _test_set_ipv6_dst(self, ipv6, mask=None):
+ header = ofproto.OXM_OF_IPV6_DST
+ match = OFPMatch()
+ ipv6 = [int(x, 16) for x in ipv6.split(":")]
+ if mask is None:
+ match.set_ipv6_dst(ipv6)
+ else:
+ header = ofproto.OXM_OF_IPV6_DST_W
+ mask = [int(x, 16) for x in mask.split(":")]
+ match.set_ipv6_dst_masked(ipv6, mask)
+ ipv6 = [x & y for (x, y) in zip(ipv6, mask)]
+ self._test_serialize_and_parser(match, header, ipv6, mask)
+
+ def test_set_ipv6_dst_mid(self):
+ ipv6 = 'e9e8:9ea5:7d67:82cc:ca54:1fc0:2d24:f038'
+ self._test_set_ipv6_dst(ipv6)
+
+ def test_set_ipv6_dst_max(self):
+ ipv6 = ':'.join(['ffff'] * 8)
+ self._test_set_ipv6_dst(ipv6)
+
+ def test_set_ipv6_dst_min(self):
+ ipv6 = ':'.join(['0'] * 8)
+ self._test_set_ipv6_dst(ipv6)
+
+ def test_set_ipv6_dst_mask_mid(self):
+ ipv6 = 'e9e8:9ea5:7d67:82cc:ca54:1fc0:2d24:f038'
+ mask = ':'.join(['ffff'] * 4 + ['0'] * 4)
+ self._test_set_ipv6_dst(ipv6, mask)
+
+ def test_set_ipv6_dst_mask_max(self):
+ ipv6 = 'e9e8:9ea5:7d67:82cc:ca54:1fc0:2d24:f038'
+ mask = ':'.join(['ffff'] * 8)
+ self._test_set_ipv6_dst(ipv6, mask)
+
+ def test_set_ipv6_dst_mask_min(self):
+ ipv6 = 'e9e8:9ea5:7d67:82cc:ca54:1fc0:2d24:f038'
+ mask = ':'.join(['0'] * 8)
+ self._test_set_ipv6_dst(ipv6, mask)
+
+ # set_ipv6_flabel
+ def _test_set_ipv6_flabel(self, flabel, mask=None):
+ header = ofproto.OXM_OF_IPV6_FLABEL
+ match = OFPMatch()
+ if mask is None:
+ match.set_ipv6_flabel(flabel)
+ else:
+ header = ofproto.OXM_OF_IPV6_FLABEL_W
+ match.set_ipv6_flabel_masked(flabel, mask)
+ self._test_serialize_and_parser(match, header, flabel, mask)
+
+ def test_set_ipv6_flabel_mid(self):
+ self._test_set_ipv6_flabel(0xc5384)
+
+ def test_set_ipv6_flabel_max(self):
+ self._test_set_ipv6_flabel(0xfffff)
+
+ def test_set_ipv6_flabel_min(self):
+ self._test_set_ipv6_flabel(0)
+
+ def test_set_ipv6_flabel_masked_mid(self):
+ self._test_set_ipv6_flabel(0xc5384, 0xfff00)
+
+ def test_set_ipv6_flabel_masked_max(self):
+ self._test_set_ipv6_flabel(0xc5384, 0xfffff)
+
+ def test_set_ipv6_flabel_masked_min(self):
+ self._test_set_ipv6_flabel(0xc5384, 0)
+
+ # set_icmpv6_type
+ def _test_set_icmpv6_type(self, icmpv6_type):
+ header = ofproto.OXM_OF_ICMPV6_TYPE
+ match = OFPMatch()
+ match.set_icmpv6_type(icmpv6_type)
+ self._test_serialize_and_parser(match, header, icmpv6_type)
+
+ def test_set_icmpv6_type_mid(self):
+ self._test_set_icmpv6_type(129)
+
+ def test_set_icmpv6_type_max(self):
+ self._test_set_icmpv6_type(0xff)
+
+ def test_set_icmpv6_type_min(self):
+ self._test_set_icmpv6_type(0)
+
+ # set_icmpv6_code
+ def _test_set_icmpv6_code(self, icmpv6_code):
+ header = ofproto.OXM_OF_ICMPV6_CODE
+ match = OFPMatch()
+ match.set_icmpv6_code(icmpv6_code)
+ self._test_serialize_and_parser(match, header, icmpv6_code)
+
+ def test_set_icmpv6_code_mid(self):
+ self._test_set_icmpv6_code(1)
+
+ def test_set_icmpv6_code_max(self):
+ self._test_set_icmpv6_code(0xff)
+
+ def test_set_icmpv6_code_min(self):
+ self._test_set_icmpv6_code(0)
+
+ # set_ipv6_nd_target
+ def _test_set_ipv6_nd_target(self, ipv6):
+ header = ofproto.OXM_OF_IPV6_ND_TARGET
+ match = OFPMatch()
+ ipv6 = [int(x, 16) for x in ipv6.split(":")]
+ match.set_ipv6_nd_target(ipv6)
+ self._test_serialize_and_parser(match, header, ipv6)
+
+ def test_set_ipv6_nd_target_mid(self):
+ ip = '5420:db3f:921b:3e33:2791:98f:dd7f:2e19'
+ self._test_set_ipv6_nd_target(ip)
+
+ def test_set_ipv6_nd_target_max(self):
+ ip = ':'.join(['ffff'] * 8)
+ self._test_set_ipv6_nd_target(ip)
+
+ def test_set_ipv6_nd_target_min(self):
+ ip = ':'.join(['0'] * 8)
+ self._test_set_ipv6_nd_target(ip)
+
+ # set_ipv6_nd_sll
+ def _test_set_ipv6_nd_sll(self, nd_sll):
+ header = ofproto.OXM_OF_IPV6_ND_SLL
+ match = OFPMatch()
+ nd_sll = mac.haddr_to_bin(nd_sll)
+ match.set_ipv6_nd_sll(nd_sll)
+ self._test_serialize_and_parser(match, header, nd_sll)
+
+ def test_set_ipv6_nd_sll_mid(self):
+ self._test_set_ipv6_nd_sll('93:6d:d0:d4:e8:36')
+
+ def test_set_ipv6_nd_sll_max(self):
+ self._test_set_ipv6_nd_sll('ff:ff:ff:ff:ff:ff')
+
+ def test_set_ipv6_nd_sll_min(self):
+ self._test_set_ipv6_nd_sll('00:00:00:00:00:00')
+
+ # set_ipv6_nd_tll
+ def _test_set_ipv6_nd_tll(self, nd_tll):
+ header = ofproto.OXM_OF_IPV6_ND_TLL
+ match = OFPMatch()
+ nd_tll = mac.haddr_to_bin(nd_tll)
+ match.set_ipv6_nd_tll(nd_tll)
+ self._test_serialize_and_parser(match, header, nd_tll)
+
+ def test_set_ipv6_nd_tll_mid(self):
+ self._test_set_ipv6_nd_tll('18:f6:66:b6:f1:b3')
+
+ def test_set_ipv6_nd_tll_max(self):
+ self._test_set_ipv6_nd_tll('ff:ff:ff:ff:ff:ff')
+
+ def test_set_ipv6_nd_tll_min(self):
+ self._test_set_ipv6_nd_tll('00:00:00:00:00:00')
+
+ # set_mpls_label
+ def _test_set_mpls_label(self, mpls_label):
+ header = ofproto.OXM_OF_MPLS_LABEL
+ match = OFPMatch()
+ match.set_mpls_label(mpls_label)
+ self._test_serialize_and_parser(match, header, mpls_label)
+
+ def test_set_mpls_label_mid(self):
+ self._test_set_mpls_label(2144)
+
+ def test_set_mpls_label_max(self):
+ self._test_set_mpls_label(0xfffff)
+
+ def test_set_mpls_label_min(self):
+ self._test_set_mpls_label(0)
+
+ # set_mpls_tc
+ def _test_set_mpls_tc(self, mpls_tc):
+ header = ofproto.OXM_OF_MPLS_TC
+ match = OFPMatch()
+ match.set_mpls_tc(mpls_tc)
+ self._test_serialize_and_parser(match, header, mpls_tc)
+
+ def test_set_mpls_tc_mid(self):
+ self._test_set_mpls_tc(3)
+
+ def test_set_mpls_tc_max(self):
+ self._test_set_mpls_tc(7)
+
+ def test_set_mpls_tc_min(self):
+ self._test_set_mpls_tc(0)
+
+
+class TestOFPMatchField(unittest.TestCase):
+ """ Test case for ofproto_v1_2_parser.OFPMatchField
+ """
+
+ def test_init_hasmask_true(self):
+ header = 0x0100
+
+ res = OFPMatchField(header)
+
+ eq_(res.header, header)
+ eq_(res.n_bytes, (header & 0xff) // 2)
+ eq_(res.length, 0)
+
+ def test_init_hasmask_false(self):
+ header = 0x0000
+
+ res = OFPMatchField(header)
+
+ eq_(res.header, header)
+ eq_(res.n_bytes, header & 0xff)
+ eq_(res.length, 0)
diff --git a/tests/unit/ofproto/test_parser_v13.py b/tests/unit/ofproto/test_parser_v13.py
new file mode 100644
index 00000000..265b28e4
--- /dev/null
+++ b/tests/unit/ofproto/test_parser_v13.py
@@ -0,0 +1,164 @@
+# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import six
+import socket
+from struct import *
+from nose.tools import *
+from ryu.ofproto.ofproto_v1_3_parser import *
+from ryu.ofproto import ofproto_v1_3_parser
+from ryu.ofproto import ofproto_v1_3
+from ryu.ofproto import ofproto_protocol
+from ryu.ofproto import ether
+from ryu.ofproto.ofproto_parser import MsgBase
+from ryu import utils
+from ryu.lib import addrconv
+
+LOG = logging.getLogger('test_ofproto_v13')
+
+
+_Datapath = ofproto_protocol.ProtocolDesc(version=ofproto_v1_3.OFP_VERSION)
+
+
+class TestOFPMatch(unittest.TestCase):
+
+ """ Test case for ofproto_v1_3_parser.OFPMatch
+ """
+
+ def test_init(self):
+ res = OFPMatch()
+
+ # wc check
+ eq_(res._wc.vlan_vid_mask, 0)
+
+ # flow check
+ eq_(res._flow.vlan_vid, 0)
+
+ def _test_serialize_and_parser(self, match, header, value, mask=None):
+ cls_ = OFPMatchField._FIELDS_HEADERS.get(header)
+ pack_str = cls_.pack_str.replace('!', '')
+ fmt = '!HHI' + pack_str
+
+ # serialize
+ buf = bytearray()
+ length = match.serialize(buf, 0)
+ eq_(length, len(buf))
+ if mask and len(buf) > calcsize(fmt):
+ fmt += pack_str
+
+ res = list(unpack_from(fmt, six.binary_type(buf), 0)[3:])
+ if type(value) is list:
+ res_value = res[:calcsize(pack_str) // 2]
+ eq_(res_value, value)
+ if mask:
+ res_mask = res[calcsize(pack_str) // 2:]
+ eq_(res_mask, mask)
+ else:
+ res_value = res.pop(0)
+ if cls_.__name__ == 'MTVlanVid':
+ eq_(res_value, value | ofproto.OFPVID_PRESENT)
+ else:
+ eq_(res_value, value)
+ if mask and res and res[0]:
+ res_mask = res[0]
+ eq_(res_mask, mask)
+
+ # parser
+ res = match.parser(six.binary_type(buf), 0)
+ eq_(res.type, ofproto.OFPMT_OXM)
+ eq_(res.fields[0].header, header)
+ eq_(res.fields[0].value, value)
+ if mask and res.fields[0].mask is not None:
+ eq_(res.fields[0].mask, mask)
+
+ # to_jsondict
+ jsondict = match.to_jsondict()
+
+ # from_jsondict
+ match2 = match.from_jsondict(jsondict["OFPMatch"])
+ buf2 = bytearray()
+ match2.serialize(buf2, 0)
+ eq_(str(match), str(match2))
+ eq_(buf, buf2)
+
+ # set_vlan_vid
+ def _test_set_vlan_vid(self, vid, mask=None):
+ header = ofproto.OXM_OF_VLAN_VID
+ match = OFPMatch()
+ if mask is None:
+ match.set_vlan_vid(vid)
+ else:
+ header = ofproto.OXM_OF_VLAN_VID_W
+ match.set_vlan_vid_masked(vid, mask)
+ self._test_serialize_and_parser(match, header, vid, mask)
+
+ def _test_set_vlan_vid_none(self):
+ header = ofproto.OXM_OF_VLAN_VID
+ match = OFPMatch()
+ match.set_vlan_vid_none()
+ value = ofproto.OFPVID_NONE
+ cls_ = OFPMatchField._FIELDS_HEADERS.get(header)
+ pack_str = cls_.pack_str.replace('!', '')
+ fmt = '!HHI' + pack_str
+
+ # serialize
+ buf = bytearray()
+ length = match.serialize(buf, 0)
+ eq_(length, len(buf))
+
+ res = list(unpack_from(fmt, six.binary_type(buf), 0)[3:])
+ res_value = res.pop(0)
+ eq_(res_value, value)
+
+ # parser
+ res = match.parser(six.binary_type(buf), 0)
+ eq_(res.type, ofproto.OFPMT_OXM)
+ eq_(res.fields[0].header, header)
+ eq_(res.fields[0].value, value)
+
+ # to_jsondict
+ jsondict = match.to_jsondict()
+
+ # from_jsondict
+ match2 = match.from_jsondict(jsondict["OFPMatch"])
+ buf2 = bytearray()
+ match2.serialize(buf2, 0)
+ eq_(str(match), str(match2))
+ eq_(buf, buf2)
+
+ def test_set_vlan_vid_mid(self):
+ self._test_set_vlan_vid(2047)
+
+ def test_set_vlan_vid_max(self):
+ self._test_set_vlan_vid(0xfff)
+
+ def test_set_vlan_vid_min(self):
+ self._test_set_vlan_vid(0)
+
+ def test_set_vlan_vid_masked_mid(self):
+ self._test_set_vlan_vid(2047, 0xf0f)
+
+ def test_set_vlan_vid_masked_max(self):
+ self._test_set_vlan_vid(2047, 0xfff)
+
+ def test_set_vlan_vid_masked_min(self):
+ self._test_set_vlan_vid(2047, 0)
+
+ def test_set_vlan_vid_none(self):
+ self._test_set_vlan_vid_none()
diff --git a/tests/unit/packet/__init__.py b/tests/unit/packet/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/packet/__init__.py
diff --git a/tests/unit/packet/test_arp.py b/tests/unit/packet/test_arp.py
new file mode 100644
index 00000000..40e28131
--- /dev/null
+++ b/tests/unit/packet/test_arp.py
@@ -0,0 +1,183 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import struct
+from struct import *
+from nose.tools import *
+from ryu.ofproto import ether
+from ryu.lib.packet.ethernet import ethernet
+from ryu.lib.packet.packet import Packet
+from ryu.lib.packet.arp import arp
+from ryu.lib.packet.vlan import vlan
+from ryu.lib import addrconv
+
+
+LOG = logging.getLogger('test_arp')
+
+
+class Test_arp(unittest.TestCase):
+ """ Test case for arp
+ """
+
+ hwtype = 1
+ proto = 0x0800
+ hlen = 6
+ plen = 4
+ opcode = 1
+ src_mac = '00:07:0d:af:f4:54'
+ src_ip = '24.166.172.1'
+ dst_mac = '00:00:00:00:00:00'
+ dst_ip = '24.166.173.159'
+
+ fmt = arp._PACK_STR
+ buf = pack(fmt, hwtype, proto, hlen, plen, opcode,
+ addrconv.mac.text_to_bin(src_mac),
+ addrconv.ipv4.text_to_bin(src_ip),
+ addrconv.mac.text_to_bin(dst_mac),
+ addrconv.ipv4.text_to_bin(dst_ip))
+
+ a = arp(hwtype, proto, hlen, plen, opcode, src_mac, src_ip, dst_mac,
+ dst_ip)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def find_protocol(self, pkt, name):
+ for p in pkt.protocols:
+ if p.protocol_name == name:
+ return p
+
+ def test_init(self):
+ eq_(self.hwtype, self.a.hwtype)
+ eq_(self.proto, self.a.proto)
+ eq_(self.hlen, self.a.hlen)
+ eq_(self.plen, self.a.plen)
+ eq_(self.opcode, self.a.opcode)
+ eq_(self.src_mac, self.a.src_mac)
+ eq_(self.src_ip, self.a.src_ip)
+ eq_(self.dst_mac, self.a.dst_mac)
+ eq_(self.dst_ip, self.a.dst_ip)
+
+ def test_parser(self):
+ _res = self.a.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+
+ eq_(res.hwtype, self.hwtype)
+ eq_(res.proto, self.proto)
+ eq_(res.hlen, self.hlen)
+ eq_(res.plen, self.plen)
+ eq_(res.opcode, self.opcode)
+ eq_(res.src_mac, self.src_mac)
+ eq_(res.src_ip, self.src_ip)
+ eq_(res.dst_mac, self.dst_mac)
+ eq_(res.dst_ip, self.dst_ip)
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.a.serialize(data, prev)
+
+ fmt = arp._PACK_STR
+ res = struct.unpack(fmt, buf)
+
+ eq_(res[0], self.hwtype)
+ eq_(res[1], self.proto)
+ eq_(res[2], self.hlen)
+ eq_(res[3], self.plen)
+ eq_(res[4], self.opcode)
+ eq_(res[5], addrconv.mac.text_to_bin(self.src_mac))
+ eq_(res[6], addrconv.ipv4.text_to_bin(self.src_ip))
+ eq_(res[7], addrconv.mac.text_to_bin(self.dst_mac))
+ eq_(res[8], addrconv.ipv4.text_to_bin(self.dst_ip))
+
+ def _build_arp(self, vlan_enabled):
+ if vlan_enabled is True:
+ ethertype = ether.ETH_TYPE_8021Q
+ v = vlan(1, 1, 3, ether.ETH_TYPE_ARP)
+ else:
+ ethertype = ether.ETH_TYPE_ARP
+ e = ethernet(self.dst_mac, self.src_mac, ethertype)
+ p = Packet()
+
+ p.add_protocol(e)
+ if vlan_enabled is True:
+ p.add_protocol(v)
+ p.add_protocol(self.a)
+ p.serialize()
+ return p
+
+ def test_build_arp_vlan(self):
+ p = self._build_arp(True)
+
+ e = self.find_protocol(p, "ethernet")
+ ok_(e)
+ eq_(e.ethertype, ether.ETH_TYPE_8021Q)
+
+ v = self.find_protocol(p, "vlan")
+ ok_(v)
+ eq_(v.ethertype, ether.ETH_TYPE_ARP)
+
+ a = self.find_protocol(p, "arp")
+ ok_(a)
+
+ eq_(a.hwtype, self.hwtype)
+ eq_(a.proto, self.proto)
+ eq_(a.hlen, self.hlen)
+ eq_(a.plen, self.plen)
+ eq_(a.opcode, self.opcode)
+ eq_(a.src_mac, self.src_mac)
+ eq_(a.src_ip, self.src_ip)
+ eq_(a.dst_mac, self.dst_mac)
+ eq_(a.dst_ip, self.dst_ip)
+
+ def test_build_arp_novlan(self):
+ p = self._build_arp(False)
+
+ e = self.find_protocol(p, "ethernet")
+ ok_(e)
+ eq_(e.ethertype, ether.ETH_TYPE_ARP)
+
+ a = self.find_protocol(p, "arp")
+ ok_(a)
+
+ eq_(a.hwtype, self.hwtype)
+ eq_(a.proto, self.proto)
+ eq_(a.hlen, self.hlen)
+ eq_(a.plen, self.plen)
+ eq_(a.opcode, self.opcode)
+ eq_(a.src_mac, self.src_mac)
+ eq_(a.src_ip, self.src_ip)
+ eq_(a.dst_mac, self.dst_mac)
+ eq_(a.dst_ip, self.dst_ip)
+
+ @raises(Exception)
+ def test_malformed_arp(self):
+ m_short_buf = self.buf[1:arp._MIN_LEN]
+ arp.parser(m_short_buf)
+
+ def test_json(self):
+ jsondict = self.a.to_jsondict()
+ a = arp.from_jsondict(jsondict['arp'])
+ eq_(str(self.a), str(a))
diff --git a/tests/unit/packet/test_bfd.py b/tests/unit/packet/test_bfd.py
new file mode 100644
index 00000000..d33949cc
--- /dev/null
+++ b/tests/unit/packet/test_bfd.py
@@ -0,0 +1,320 @@
+# Copyright (C) 2014 Xinguard, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+import logging
+import struct
+import inspect
+from nose.tools import ok_, eq_, nottest
+
+from ryu.ofproto import ether
+from ryu.ofproto import inet
+from ryu.lib.packet import packet
+from ryu.lib.packet import ethernet
+from ryu.lib.packet import ipv4
+from ryu.lib.packet import udp
+from ryu.lib.packet import bfd
+from ryu.lib import addrconv
+
+LOG = logging.getLogger(__name__)
+
+
+class TestBFD(unittest.TestCase):
+ def setUp(self):
+ # BFD packet without authentication.
+ self.data = b'\xb0\xa8\x6e\x18\xb8\x08\x64\x87' \
+ + b'\x88\xe9\xcb\xc8\x08\x00\x45\xc0' \
+ + b'\x00\x34\x68\x49\x00\x00\xff\x11' \
+ + b'\xf4\x73\xac\x1c\x03\x01\xac\x1c' \
+ + b'\x03\x02\xc0\x00\x0e\xc8\x00\x20' \
+ + b'\xd9\x02\x21\xc0\x03\x18\x00\x00' \
+ + b'\x00\x06\x00\x00\x00\x07\x00\x00' \
+ + b'\xea\x60\x00\x00\xea\x60\x00\x00' \
+ + b'\x00\x00'
+
+ # BFD packet using simple password authentication.
+ self.data_auth_simple = b'\x08\x00\x27\xd1\x95\x7c\x08\x00' \
+ + b'\x27\xed\x54\x41\x08\x00\x45\xc0' \
+ + b'\x00\x3d\x0c\x90\x00\x00\xff\x11' \
+ + b'\xbb\x0b\xc0\xa8\x39\x02\xc0\xa8' \
+ + b'\x39\x01\xc0\x00\x0e\xc8\x00\x29' \
+ + b'\x46\x35\x20\x44\x03\x21\x00\x00' \
+ + b'\x00\x01\x00\x00\x00\x00\x00\x0f' \
+ + b'\x42\x40\x00\x0f\x42\x40\x00\x00' \
+ + b'\x00\x00\x01\x09\x02\x73\x65\x63' \
+ + b'\x72\x65\x74'
+
+ # BFD packet using md5 authentication.
+ self.data_auth_md5 = b'\x08\x00\x27\xd1\x95\x7c\x08\x00' \
+ + b'\x27\xed\x54\x41\x08\x00\x45\xc0' \
+ + b'\x00\x4c\x0c\x44\x00\x00\xff\x11' \
+ + b'\xbb\x48\xc0\xa8\x39\x02\xc0\xa8' \
+ + b'\x39\x01\xc0\x00\x0e\xc8\x00\x38' \
+ + b'\x51\xbc\x20\x44\x03\x30\x00\x00' \
+ + b'\x00\x01\x00\x00\x00\x00\x00\x0f' \
+ + b'\x42\x40\x00\x0f\x42\x40\x00\x00' \
+ + b'\x00\x00\x02\x18\x02\x00\x00\x00' \
+ + b'\x41\xdb\x66\xa8\xf9\x25\x5a\x8b' \
+ + b'\xcb\x7e\x4b\xec\x25\xa6\x2c\x23' \
+ + b'\xda\x0f'
+
+ # BFD packet using SHA1 authentication.
+ self.data_auth_sha1 = b'\x08\x00\x27\xd1\x95\x7c\x08\x00' \
+ + b'\x27\xed\x54\x41\x08\x00\x45\xc0' \
+ + b'\x00\x50\x0b\x90\x00\x00\xff\x11' \
+ + b'\xbb\xf8\xc0\xa8\x39\x02\xc0\xa8' \
+ + b'\x39\x01\xc0\x00\x0e\xc8\x00\x3c' \
+ + b'\xb9\x92\x20\x44\x03\x34\x00\x00' \
+ + b'\x00\x01\x00\x00\x00\x00\x00\x0f' \
+ + b'\x42\x40\x00\x0f\x42\x40\x00\x00' \
+ + b'\x00\x00\x04\x1c\x02\x00\x00\x00' \
+ + b'\x41\xb1\x46\x20\x10\x81\x03\xd7' \
+ + b'\xf4\xde\x87\x61\x4c\x24\x61\x1f' \
+ + b'\x3c\xc1\x6a\x00\x69\x23'
+
+ # BFD Key chain {auth_key_id: auth_key/password}
+ self.auth_keys = {2: b"secret"}
+
+ def tearDown(self):
+ pass
+
+ def test_parse(self):
+ buf = self.data
+ pkt = packet.Packet(buf)
+ i = iter(pkt)
+
+ eq_(type(next(i)), ethernet.ethernet)
+ eq_(type(next(i)), ipv4.ipv4)
+ eq_(type(next(i)), udp.udp)
+ eq_(type(bfd.bfd.parser(next(i))[0]), bfd.bfd)
+
+ def test_parse_with_auth_simple(self):
+ buf = self.data_auth_simple
+ pkt = packet.Packet(buf)
+ i = iter(pkt)
+
+ eq_(type(next(i)), ethernet.ethernet)
+ eq_(type(next(i)), ipv4.ipv4)
+ eq_(type(next(i)), udp.udp)
+
+ bfd_obj = bfd.bfd.parser(next(i))[0]
+ eq_(type(bfd_obj), bfd.bfd)
+ eq_(type(bfd_obj.auth_cls), bfd.SimplePassword)
+ ok_(bfd_obj.authenticate(self.auth_keys))
+
+ def test_parse_with_auth_md5(self):
+ buf = self.data_auth_md5
+ pkt = packet.Packet(buf)
+ i = iter(pkt)
+
+ eq_(type(next(i)), ethernet.ethernet)
+ eq_(type(next(i)), ipv4.ipv4)
+ eq_(type(next(i)), udp.udp)
+
+ bfd_obj = bfd.bfd.parser(next(i))[0]
+ eq_(type(bfd_obj), bfd.bfd)
+ eq_(type(bfd_obj.auth_cls), bfd.KeyedMD5)
+ ok_(bfd_obj.authenticate(self.auth_keys))
+
+ def test_parse_with_auth_sha1(self):
+ buf = self.data_auth_sha1
+ pkt = packet.Packet(buf)
+ i = iter(pkt)
+
+ eq_(type(next(i)), ethernet.ethernet)
+ eq_(type(next(i)), ipv4.ipv4)
+ eq_(type(next(i)), udp.udp)
+
+ bfd_obj = bfd.bfd.parser(next(i))[0]
+ eq_(type(bfd_obj), bfd.bfd)
+ eq_(type(bfd_obj.auth_cls), bfd.KeyedSHA1)
+ ok_(bfd_obj.authenticate(self.auth_keys))
+
+ def test_serialize(self):
+ pkt = packet.Packet()
+
+ eth_pkt = ethernet.ethernet('b0:a8:6e:18:b8:08', '64:87:88:e9:cb:c8')
+ pkt.add_protocol(eth_pkt)
+
+ ip_pkt = ipv4.ipv4(src='172.28.3.1', dst='172.28.3.2', tos=192,
+ identification=26697, proto=inet.IPPROTO_UDP)
+ pkt.add_protocol(ip_pkt)
+
+ udp_pkt = udp.udp(49152, 3784)
+ pkt.add_protocol(udp_pkt)
+
+ bfd_pkt = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_CTRL_DETECT_TIME_EXPIRED,
+ state=bfd.BFD_STATE_UP, detect_mult=3, my_discr=6,
+ your_discr=7, desired_min_tx_interval=60000,
+ required_min_rx_interval=60000,
+ required_min_echo_rx_interval=0)
+ pkt.add_protocol(bfd_pkt)
+
+ eq_(len(pkt.protocols), 4)
+
+ pkt.serialize()
+ eq_(pkt.data, self.data)
+
+ def test_serialize_with_auth_simple(self):
+ pkt = packet.Packet()
+
+ eth_pkt = ethernet.ethernet('08:00:27:d1:95:7c', '08:00:27:ed:54:41')
+ pkt.add_protocol(eth_pkt)
+
+ ip_pkt = ipv4.ipv4(src='192.168.57.2', dst='192.168.57.1', tos=192,
+ identification=3216, proto=inet.IPPROTO_UDP)
+ pkt.add_protocol(ip_pkt)
+
+ udp_pkt = udp.udp(49152, 3784)
+ pkt.add_protocol(udp_pkt)
+
+ auth_cls = bfd.SimplePassword(auth_key_id=2,
+ password=self.auth_keys[2])
+
+ bfd_pkt = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG,
+ flags=bfd.BFD_FLAG_AUTH_PRESENT,
+ state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1,
+ your_discr=0, desired_min_tx_interval=1000000,
+ required_min_rx_interval=1000000,
+ required_min_echo_rx_interval=0,
+ auth_cls=auth_cls)
+
+ pkt.add_protocol(bfd_pkt)
+
+ eq_(len(pkt.protocols), 4)
+
+ pkt.serialize()
+ eq_(pkt.data, self.data_auth_simple)
+
+ def test_serialize_with_auth_md5(self):
+ pkt = packet.Packet()
+
+ eth_pkt = ethernet.ethernet('08:00:27:d1:95:7c', '08:00:27:ed:54:41')
+ pkt.add_protocol(eth_pkt)
+
+ ip_pkt = ipv4.ipv4(src='192.168.57.2', dst='192.168.57.1', tos=192,
+ identification=3140, proto=inet.IPPROTO_UDP)
+ pkt.add_protocol(ip_pkt)
+
+ udp_pkt = udp.udp(49152, 3784)
+ pkt.add_protocol(udp_pkt)
+
+ auth_cls = bfd.KeyedMD5(auth_key_id=2, seq=16859,
+ auth_key=self.auth_keys[2])
+
+ bfd_pkt = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG,
+ flags=bfd.BFD_FLAG_AUTH_PRESENT,
+ state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1,
+ your_discr=0, desired_min_tx_interval=1000000,
+ required_min_rx_interval=1000000,
+ required_min_echo_rx_interval=0,
+ auth_cls=auth_cls)
+
+ pkt.add_protocol(bfd_pkt)
+
+ eq_(len(pkt.protocols), 4)
+
+ pkt.serialize()
+ eq_(pkt.data, self.data_auth_md5)
+
+ def test_serialize_with_auth_sha1(self):
+ pkt = packet.Packet()
+
+ eth_pkt = ethernet.ethernet('08:00:27:d1:95:7c', '08:00:27:ed:54:41')
+ pkt.add_protocol(eth_pkt)
+
+ ip_pkt = ipv4.ipv4(src='192.168.57.2', dst='192.168.57.1', tos=192,
+ identification=2960, proto=inet.IPPROTO_UDP)
+ pkt.add_protocol(ip_pkt)
+
+ udp_pkt = udp.udp(49152, 3784)
+ pkt.add_protocol(udp_pkt)
+
+ auth_cls = bfd.KeyedSHA1(auth_key_id=2, seq=16817,
+ auth_key=self.auth_keys[2])
+
+ bfd_pkt = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG,
+ flags=bfd.BFD_FLAG_AUTH_PRESENT,
+ state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1,
+ your_discr=0, desired_min_tx_interval=1000000,
+ required_min_rx_interval=1000000,
+ required_min_echo_rx_interval=0,
+ auth_cls=auth_cls)
+
+ pkt.add_protocol(bfd_pkt)
+
+ eq_(len(pkt.protocols), 4)
+
+ pkt.serialize()
+ eq_(pkt.data, self.data_auth_sha1)
+
+ def test_json(self):
+ bfd1 = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_CTRL_DETECT_TIME_EXPIRED,
+ state=bfd.BFD_STATE_UP, detect_mult=3, my_discr=6,
+ your_discr=7, desired_min_tx_interval=60000,
+ required_min_rx_interval=60000,
+ required_min_echo_rx_interval=0)
+
+ jsondict = bfd1.to_jsondict()
+ bfd2 = bfd.bfd.from_jsondict(jsondict['bfd'])
+ eq_(str(bfd1), str(bfd2))
+
+ def test_json_with_auth_simple(self):
+ auth_cls = bfd.SimplePassword(auth_key_id=2,
+ password=self.auth_keys[2])
+
+ bfd1 = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG,
+ flags=bfd.BFD_FLAG_AUTH_PRESENT,
+ state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1,
+ your_discr=0, desired_min_tx_interval=1000000,
+ required_min_rx_interval=1000000,
+ required_min_echo_rx_interval=0,
+ auth_cls=auth_cls)
+
+ jsondict = bfd1.to_jsondict()
+ bfd2 = bfd.bfd.from_jsondict(jsondict['bfd'])
+ eq_(str(bfd1), str(bfd2))
+
+ def test_json_with_auth_md5(self):
+ auth_cls = bfd.KeyedMD5(auth_key_id=2, seq=16859,
+ auth_key=self.auth_keys[2])
+
+ bfd1 = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG,
+ flags=bfd.BFD_FLAG_AUTH_PRESENT,
+ state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1,
+ your_discr=0, desired_min_tx_interval=1000000,
+ required_min_rx_interval=1000000,
+ required_min_echo_rx_interval=0,
+ auth_cls=auth_cls)
+
+ jsondict = bfd1.to_jsondict()
+ bfd2 = bfd.bfd.from_jsondict(jsondict['bfd'])
+ eq_(str(bfd1), str(bfd2))
+
+ def test_json_with_auth_sha1(self):
+ auth_cls = bfd.KeyedSHA1(auth_key_id=2, seq=16859,
+ auth_key=self.auth_keys[2])
+
+ bfd1 = bfd.bfd(ver=1, diag=bfd.BFD_DIAG_NO_DIAG,
+ flags=bfd.BFD_FLAG_AUTH_PRESENT,
+ state=bfd.BFD_STATE_DOWN, detect_mult=3, my_discr=1,
+ your_discr=0, desired_min_tx_interval=1000000,
+ required_min_rx_interval=1000000,
+ required_min_echo_rx_interval=0,
+ auth_cls=auth_cls)
+
+ jsondict = bfd1.to_jsondict()
+ bfd2 = bfd.bfd.from_jsondict(jsondict['bfd'])
+ eq_(str(bfd1), str(bfd2))
diff --git a/tests/unit/packet/test_bgp.py b/tests/unit/packet/test_bgp.py
new file mode 100644
index 00000000..2211fc4c
--- /dev/null
+++ b/tests/unit/packet/test_bgp.py
@@ -0,0 +1,813 @@
+# Copyright (C) 2013,2014 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013,2014 YAMAMOTO Takashi <yamamoto at valinux co jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import logging
+import os
+import sys
+
+import unittest
+from nose.tools import eq_
+from nose.tools import ok_
+
+from ryu.utils import binary_str
+from ryu.lib import pcaplib
+from ryu.lib.packet import packet
+from ryu.lib.packet import bgp
+from ryu.lib.packet import afi
+from ryu.lib.packet import safi
+
+
+LOG = logging.getLogger(__name__)
+
+BGP4_PACKET_DATA_DIR = os.path.join(
+ os.path.dirname(sys.modules[__name__].__file__), '../../packet_data/bgp4/')
+
+PMSI_TYPE_NO_TUNNEL_INFORMATION_PRESENT = (
+ bgp.BGPPathAttributePmsiTunnel.TYPE_NO_TUNNEL_INFORMATION_PRESENT
+)
+PMSI_TYPE_INGRESS_REPLICATION = (
+ bgp.BGPPathAttributePmsiTunnel.TYPE_INGRESS_REPLICATION
+)
+
+RULES_BASE = [
+ # port='>=8000'
+ bgp.FlowSpecPort(
+ operator=(bgp.FlowSpecPort.GT | bgp.FlowSpecPort.EQ),
+ value=8000),
+ # port='&<=9000'
+ bgp.FlowSpecPort(
+ operator=(bgp.FlowSpecPort.AND | bgp.FlowSpecPort.LT |
+ bgp.FlowSpecPort.EQ),
+ value=9000),
+ # port='==80'
+ bgp.FlowSpecPort(operator=bgp.FlowSpecPort.EQ, value=80),
+ # dst_port=8080
+ bgp.FlowSpecDestPort(operator=bgp.FlowSpecDestPort.EQ, value=8080),
+ # dst_port='>9000'
+ bgp.FlowSpecDestPort(operator=bgp.FlowSpecDestPort.GT, value=9000),
+ # dst_port='&<9050'
+ bgp.FlowSpecDestPort(
+ operator=(bgp.FlowSpecDestPort.AND | bgp.FlowSpecDestPort.LT),
+ value=9050),
+ # dst_port='<=1000'
+ bgp.FlowSpecDestPort(
+ operator=(bgp.FlowSpecDestPort.LT | bgp.FlowSpecDestPort.EQ),
+ value=1000),
+ # src_port='<=9090'
+ bgp.FlowSpecSrcPort(
+ operator=(bgp.FlowSpecSrcPort.LT | bgp.FlowSpecSrcPort.EQ),
+ value=9090),
+ # src_port='& >=9080'
+ bgp.FlowSpecSrcPort(
+ operator=(bgp.FlowSpecSrcPort.AND | bgp.FlowSpecSrcPort.GT |
+ bgp.FlowSpecSrcPort.EQ),
+ value=9080),
+ # src_port='<10100'
+ bgp.FlowSpecSrcPort(
+ operator=bgp.FlowSpecSrcPort.LT, value=10100),
+ # src_port='>10000'
+ bgp.FlowSpecSrcPort(
+ operator=(bgp.FlowSpecSrcPort.AND | bgp.FlowSpecSrcPort.GT),
+ value=10000),
+ # icmp_type=0
+ bgp.FlowSpecIcmpType(operator=bgp.FlowSpecIcmpType.EQ, value=0),
+ # icmp_code=6
+ bgp.FlowSpecIcmpCode(operator=bgp.FlowSpecIcmpCode.EQ, value=6),
+ # tcp_flags='ACK+FIN'
+ bgp.FlowSpecTCPFlags(
+ operator=0, # Partial match
+ value=(bgp.FlowSpecTCPFlags.SYN | bgp.FlowSpecTCPFlags.ACK)),
+ # tcp_flags='&!=URGENT'
+ bgp.FlowSpecTCPFlags(
+ operator=(bgp.FlowSpecTCPFlags.AND | bgp.FlowSpecTCPFlags.NOT),
+ value=bgp.FlowSpecTCPFlags.URGENT),
+ # packet_len=1000
+ bgp.FlowSpecPacketLen(
+ operator=bgp.FlowSpecPacketLen.EQ, value=1000),
+ # packet_len=1100
+ bgp.FlowSpecPacketLen(
+ operator=(bgp.FlowSpecTCPFlags.AND | bgp.FlowSpecPacketLen.EQ),
+ value=1100),
+ # dscp=22
+ bgp.FlowSpecDSCP(operator=bgp.FlowSpecDSCP.EQ, value=22),
+ # dscp=24
+ bgp.FlowSpecDSCP(operator=bgp.FlowSpecDSCP.EQ, value=24),
+]
+
+RULES_L2VPN_BASE = [
+ # ether_type=0x0800
+ bgp.FlowSpecEtherType(operator=bgp.FlowSpecEtherType.EQ, value=0x0800),
+ # source_mac='12:34:56:78:90:AB'
+ bgp.FlowSpecSourceMac(addr='12:34:56:78:90:AB', length=6),
+ # dest_mac='DE:EF:C0:FF:EE:DD'
+ bgp.FlowSpecDestinationMac(addr='BE:EF:C0:FF:EE:DD', length=6),
+ # llc_dsap=0x42
+ bgp.FlowSpecLLCDSAP(operator=bgp.FlowSpecLLCDSAP.EQ, value=0x42),
+ # llc_ssap=0x42
+ bgp.FlowSpecLLCSSAP(operator=bgp.FlowSpecLLCSSAP.EQ, value=0x42),
+ # llc_control=100
+ bgp.FlowSpecLLCControl(operator=bgp.FlowSpecLLCControl.EQ, value=100),
+ # snap=0x12345
+ bgp.FlowSpecSNAP(operator=bgp.FlowSpecSNAP.EQ, value=0x12345),
+ # vlan_id='>4000'
+ bgp.FlowSpecVLANID(operator=bgp.FlowSpecVLANID.GT, value=4000),
+ # vlan_cos='>=3'
+ bgp.FlowSpecVLANCoS(
+ operator=(bgp.FlowSpecVLANCoS.GT | bgp.FlowSpecVLANCoS.EQ), value=3),
+ # inner_vlan_id='<3000'
+ bgp.FlowSpecInnerVLANID(operator=bgp.FlowSpecInnerVLANID.LT, value=3000),
+ # inner_vlan_cos='<=5'
+ bgp.FlowSpecInnerVLANCoS(
+ operator=(bgp.FlowSpecInnerVLANCoS.LT | bgp.FlowSpecInnerVLANCoS.EQ),
+ value=5),
+]
+
+
+class Test_bgp(unittest.TestCase):
+ """ Test case for ryu.lib.packet.bgp
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_open1(self):
+ msg = bgp.BGPOpen(my_as=30000, bgp_identifier='192.0.2.1')
+ binmsg = msg.serialize()
+ msg2, _, rest = bgp.BGPMessage.parser(binmsg)
+ eq_(str(msg), str(msg2))
+ eq_(len(msg), 29)
+ eq_(rest, b'')
+
+ def test_open2(self):
+ opt_param = [bgp.BGPOptParamCapabilityUnknown(cap_code=200,
+ cap_value=b'hoge'),
+ bgp.BGPOptParamCapabilityGracefulRestart(flags=0,
+ time=120,
+ tuples=[]),
+ bgp.BGPOptParamCapabilityRouteRefresh(),
+ bgp.BGPOptParamCapabilityCiscoRouteRefresh(),
+ bgp.BGPOptParamCapabilityMultiprotocol(
+ afi=afi.IP, safi=safi.MPLS_VPN),
+ bgp.BGPOptParamCapabilityCarryingLabelInfo(),
+ bgp.BGPOptParamCapabilityFourOctetAsNumber(
+ as_number=1234567),
+ bgp.BGPOptParamUnknown(type_=99, value=b'fuga')]
+ msg = bgp.BGPOpen(my_as=30000, bgp_identifier='192.0.2.2',
+ opt_param=opt_param)
+ binmsg = msg.serialize()
+ msg2, _, rest = bgp.BGPMessage.parser(binmsg)
+ eq_(str(msg), str(msg2))
+ ok_(len(msg) > 29)
+ eq_(rest, b'')
+
+ def test_update1(self):
+ msg = bgp.BGPUpdate()
+ binmsg = msg.serialize()
+ msg2, _, rest = bgp.BGPMessage.parser(binmsg)
+ eq_(str(msg), str(msg2))
+ eq_(len(msg), 23)
+ eq_(rest, b'')
+
+ def test_update2(self):
+ withdrawn_routes = [bgp.BGPWithdrawnRoute(length=0,
+ addr='192.0.2.13'),
+ bgp.BGPWithdrawnRoute(length=1,
+ addr='192.0.2.13'),
+ bgp.BGPWithdrawnRoute(length=3,
+ addr='192.0.2.13'),
+ bgp.BGPWithdrawnRoute(length=7,
+ addr='192.0.2.13'),
+ bgp.BGPWithdrawnRoute(length=32,
+ addr='192.0.2.13')]
+ mp_nlri = [
+ bgp.LabelledVPNIPAddrPrefix(24, '192.0.9.0',
+ route_dist='100:100',
+ labels=[1, 2, 3]),
+ bgp.LabelledVPNIPAddrPrefix(26, '192.0.10.192',
+ route_dist='10.0.0.1:10000',
+ labels=[5, 6, 7, 8]),
+ ]
+ mp_nlri2 = [
+ bgp.LabelledIPAddrPrefix(24, '192.168.0.0', labels=[1, 2, 3])
+ ]
+ mp_nlri_v6 = [
+ bgp.LabelledVPNIP6AddrPrefix(64, '2001:db8:1111::',
+ route_dist='200:200',
+ labels=[1, 2, 3]),
+ bgp.LabelledVPNIP6AddrPrefix(64, '2001:db8:2222::',
+ route_dist='10.0.0.1:10000',
+ labels=[5, 6, 7, 8]),
+ ]
+ mp_nlri2_v6 = [
+ bgp.LabelledIP6AddrPrefix(64, '2001:db8:3333::', labels=[1, 2, 3])
+ ]
+ communities = [
+ bgp.BGP_COMMUNITY_NO_EXPORT,
+ bgp.BGP_COMMUNITY_NO_ADVERTISE,
+ ]
+ ecommunities = [
+ bgp.BGPTwoOctetAsSpecificExtendedCommunity(
+ subtype=1, as_number=65500, local_administrator=3908876543),
+ bgp.BGPFourOctetAsSpecificExtendedCommunity(
+ subtype=2, as_number=10000000, local_administrator=59876),
+ bgp.BGPIPv4AddressSpecificExtendedCommunity(
+ subtype=3, ipv4_address='192.0.2.1',
+ local_administrator=65432),
+ bgp.BGPOpaqueExtendedCommunity(subtype=13, opaque=b'abcdef'),
+ bgp.BGPEncapsulationExtendedCommunity(
+ subtype=0x0c, tunnel_type=10),
+ bgp.BGPEvpnMacMobilityExtendedCommunity(
+ subtype=0, flags=0xff, sequence_number=0x11223344),
+ bgp.BGPEvpnEsiLabelExtendedCommunity(
+ subtype=1, flags=0xff, label=b'\xFF\xFF\xFF'),
+ bgp.BGPEvpnEsiLabelExtendedCommunity(
+ subtype=1, flags=0xff, mpls_label=0xfffff),
+ bgp.BGPEvpnEsiLabelExtendedCommunity(
+ subtype=1, flags=0xff, vni=0xffffff),
+ bgp.BGPEvpnEsImportRTExtendedCommunity(
+ subtype=2, es_import="aa:bb:cc:dd:ee:ff"),
+ bgp.BGPUnknownExtendedCommunity(type_=99, value=b'abcdefg'),
+ ]
+ path_attributes = [
+ bgp.BGPPathAttributeOrigin(value=1),
+ bgp.BGPPathAttributeAsPath(value=[[1000], {1001, 1002},
+ [1003, 1004]]),
+ bgp.BGPPathAttributeNextHop(value='192.0.2.199'),
+ bgp.BGPPathAttributeMultiExitDisc(value=2000000000),
+ bgp.BGPPathAttributeLocalPref(value=1000000000),
+ bgp.BGPPathAttributeAtomicAggregate(),
+ bgp.BGPPathAttributeAggregator(as_number=40000,
+ addr='192.0.2.99'),
+ bgp.BGPPathAttributeCommunities(communities=communities),
+ bgp.BGPPathAttributeOriginatorId(value='10.1.1.1'),
+ bgp.BGPPathAttributeClusterList(value=['1.1.1.1', '2.2.2.2']),
+ bgp.BGPPathAttributeExtendedCommunities(communities=ecommunities),
+ bgp.BGPPathAttributePmsiTunnel(
+ pmsi_flags=1,
+ tunnel_type=PMSI_TYPE_NO_TUNNEL_INFORMATION_PRESENT,
+ label=b'\xFF\xFF\xFF'),
+ bgp.BGPPathAttributePmsiTunnel(
+ pmsi_flags=1,
+ tunnel_type=PMSI_TYPE_NO_TUNNEL_INFORMATION_PRESENT,
+ tunnel_id=None),
+ bgp.BGPPathAttributePmsiTunnel(
+ pmsi_flags=1,
+ tunnel_type=PMSI_TYPE_INGRESS_REPLICATION,
+ mpls_label=0xfffff,
+ tunnel_id=bgp.PmsiTunnelIdIngressReplication(
+ tunnel_endpoint_ip="1.1.1.1")),
+ bgp.BGPPathAttributePmsiTunnel(
+ pmsi_flags=1,
+ tunnel_type=PMSI_TYPE_INGRESS_REPLICATION,
+ vni=0xffffff,
+ tunnel_id=bgp.PmsiTunnelIdIngressReplication(
+ tunnel_endpoint_ip="aa:bb:cc::dd:ee:ff")),
+ bgp.BGPPathAttributePmsiTunnel(
+ pmsi_flags=1,
+ tunnel_type=2,
+ label=b'\xFF\xFF\xFF',
+ tunnel_id=bgp.PmsiTunnelIdUnknown(value=b'test')),
+ bgp.BGPPathAttributeAs4Path(value=[[1000000], {1000001, 1002},
+ [1003, 1000004]]),
+ bgp.BGPPathAttributeAs4Aggregator(as_number=100040000,
+ addr='192.0.2.99'),
+ bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP, safi=safi.MPLS_VPN,
+ next_hop='1.1.1.1',
+ nlri=mp_nlri),
+ bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP, safi=safi.MPLS_LABEL,
+ next_hop='1.1.1.1',
+ nlri=mp_nlri2),
+ bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP6, safi=safi.MPLS_VPN,
+ next_hop=['2001:db8::1'],
+ nlri=mp_nlri_v6),
+ bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP6, safi=safi.MPLS_LABEL,
+ next_hop=['2001:db8::1',
+ 'fe80::1'],
+ nlri=mp_nlri2_v6),
+ bgp.BGPPathAttributeMpUnreachNLRI(afi=afi.IP, safi=safi.MPLS_VPN,
+ withdrawn_routes=mp_nlri),
+ bgp.BGPPathAttributeUnknown(flags=0, type_=100, value=300 * b'bar')
+ ]
+ nlri = [
+ bgp.BGPNLRI(length=24, addr='203.0.113.1'),
+ bgp.BGPNLRI(length=16, addr='203.0.113.0')
+ ]
+ msg = bgp.BGPUpdate(withdrawn_routes=withdrawn_routes,
+ path_attributes=path_attributes,
+ nlri=nlri)
+ binmsg = msg.serialize()
+ msg2, _, rest = bgp.BGPMessage.parser(binmsg)
+ eq_(str(msg), str(msg2))
+ ok_(len(msg) > 23)
+ eq_(rest, b'')
+
+ def test_keepalive(self):
+ msg = bgp.BGPKeepAlive()
+ binmsg = msg.serialize()
+ msg2, _, rest = bgp.BGPMessage.parser(binmsg)
+ eq_(str(msg), str(msg2))
+ eq_(len(msg), 19)
+ eq_(rest, b'')
+
+ def test_notification(self):
+ data = b'hoge'
+ msg = bgp.BGPNotification(error_code=1, error_subcode=2, data=data)
+ binmsg = msg.serialize()
+ msg2, _, rest = bgp.BGPMessage.parser(binmsg)
+ eq_(str(msg), str(msg2))
+ eq_(len(msg), 21 + len(data))
+ eq_(rest, b'')
+
+ def test_route_refresh(self):
+ msg = bgp.BGPRouteRefresh(afi=afi.IP, safi=safi.MPLS_VPN)
+ binmsg = msg.serialize()
+ msg2, _, rest = bgp.BGPMessage.parser(binmsg)
+ eq_(str(msg), str(msg2))
+ eq_(len(msg), 23)
+ eq_(rest, b'')
+
+ def test_stream_parser(self):
+ msgs = [
+ bgp.BGPNotification(error_code=1, error_subcode=2, data=b'foo'),
+ bgp.BGPNotification(error_code=3, error_subcode=4, data=b'bar'),
+ bgp.BGPNotification(error_code=5, error_subcode=6, data=b'baz'),
+ ]
+ binmsgs = b''.join([bytes(msg.serialize()) for msg in msgs])
+ sp = bgp.StreamParser()
+ results = []
+ for b in binmsgs:
+ for m in sp.parse(b):
+ results.append(m)
+ eq_(str(results), str(msgs))
+
+ def test_parser(self):
+ files = [
+ 'bgp4-open',
+ 'bgp4-update',
+ 'bgp4-update_ipv6',
+ 'bgp4-update_vpnv6',
+ 'bgp4-keepalive',
+ 'evpn_esi_arbitrary',
+ 'evpn_esi_lacp',
+ 'evpn_esi_l2_bridge',
+ 'evpn_esi_mac_base',
+ 'evpn_esi_router_id',
+ 'evpn_esi_as_based',
+ 'evpn_nlri_eth_a-d',
+ 'evpn_nlri_mac_ip_ad',
+ 'evpn_nlri_inc_multi_eth_tag',
+ 'evpn_nlri_eth_seg',
+ 'evpn_nlri_ip_prefix',
+ 'flowspec_nlri_ipv4',
+ 'flowspec_nlri_vpn4',
+ 'flowspec_nlri_ipv6',
+ 'flowspec_nlri_vpn6',
+ 'flowspec_nlri_l2vpn',
+ 'flowspec_action_traffic_rate',
+ 'flowspec_action_traffic_action',
+ 'flowspec_action_redirect',
+ 'flowspec_action_traffic_marking',
+ ]
+
+ for f in files:
+ LOG.debug('*** testing %s ...', f)
+ for _, buf in pcaplib.Reader(
+ open(BGP4_PACKET_DATA_DIR + f + '.pcap', 'rb')):
+ # Checks if BGP message can be parsed as expected.
+ pkt = packet.Packet(buf)
+ ok_(isinstance(pkt.protocols[-1], bgp.BGPMessage),
+ 'Failed to parse BGP message: %s' % pkt)
+
+ # Checks if BGP message can be serialized as expected.
+ pkt.serialize()
+ eq_(buf, pkt.data,
+ "b'%s' != b'%s'" % (binary_str(buf), binary_str(pkt.data)))
+
+ def test_vlan_action_parser(self):
+ action = bgp.BGPFlowSpecVlanActionCommunity(
+ actions_1=(bgp.BGPFlowSpecVlanActionCommunity.POP |
+ bgp.BGPFlowSpecVlanActionCommunity.SWAP),
+ vlan_1=3000,
+ cos_1=3,
+ actions_2=bgp.BGPFlowSpecVlanActionCommunity.PUSH,
+ vlan_2=4000,
+ cos_2=2,
+ )
+ binmsg = action.serialize()
+ msg, rest = bgp.BGPFlowSpecVlanActionCommunity.parse(binmsg)
+ eq_(str(action), str(msg))
+ eq_(rest, b'')
+
+ def test_tpid_action_parser(self):
+ action = bgp.BGPFlowSpecTPIDActionCommunity(
+ actions=(bgp.BGPFlowSpecTPIDActionCommunity.TI |
+ bgp.BGPFlowSpecTPIDActionCommunity.TO),
+ tpid_1=5,
+ tpid_2=6,
+ )
+ binmsg = action.serialize()
+ msg, rest = bgp.BGPFlowSpecTPIDActionCommunity.parse(binmsg)
+ eq_(str(action), str(msg))
+ eq_(rest, b'')
+
+ def test_json1(self):
+ opt_param = [bgp.BGPOptParamCapabilityUnknown(cap_code=200,
+ cap_value=b'hoge'),
+ bgp.BGPOptParamCapabilityRouteRefresh(),
+ bgp.BGPOptParamCapabilityMultiprotocol(
+ afi=afi.IP, safi=safi.MPLS_VPN),
+ bgp.BGPOptParamCapabilityFourOctetAsNumber(
+ as_number=1234567),
+ bgp.BGPOptParamUnknown(type_=99, value=b'fuga')]
+ msg1 = bgp.BGPOpen(my_as=30000, bgp_identifier='192.0.2.2',
+ opt_param=opt_param)
+ jsondict = msg1.to_jsondict()
+ msg2 = bgp.BGPOpen.from_jsondict(jsondict['BGPOpen'])
+ eq_(str(msg1), str(msg2))
+
+ def test_json2(self):
+ withdrawn_routes = [bgp.BGPWithdrawnRoute(length=0,
+ addr='192.0.2.13'),
+ bgp.BGPWithdrawnRoute(length=1,
+ addr='192.0.2.13'),
+ bgp.BGPWithdrawnRoute(length=3,
+ addr='192.0.2.13'),
+ bgp.BGPWithdrawnRoute(length=7,
+ addr='192.0.2.13'),
+ bgp.BGPWithdrawnRoute(length=32,
+ addr='192.0.2.13')]
+ mp_nlri = [
+ bgp.LabelledVPNIPAddrPrefix(24, '192.0.9.0',
+ route_dist='100:100',
+ labels=[1, 2, 3]),
+ bgp.LabelledVPNIPAddrPrefix(26, '192.0.10.192',
+ route_dist='10.0.0.1:10000',
+ labels=[5, 6, 7, 8]),
+ ]
+ mp_nlri2 = [
+ bgp.LabelledIPAddrPrefix(24, '192.168.0.0', labels=[1, 2, 3])
+ ]
+ mp_nlri_v6 = [
+ bgp.LabelledVPNIP6AddrPrefix(64, '2001:db8:1111::',
+ route_dist='200:200',
+ labels=[1, 2, 3]),
+ bgp.LabelledVPNIP6AddrPrefix(64, '2001:db8:2222::',
+ route_dist='10.0.0.1:10000',
+ labels=[5, 6, 7, 8]),
+ ]
+ mp_nlri2_v6 = [
+ bgp.LabelledIP6AddrPrefix(64, '2001:db8:3333::', labels=[1, 2, 3])
+ ]
+ communities = [
+ bgp.BGP_COMMUNITY_NO_EXPORT,
+ bgp.BGP_COMMUNITY_NO_ADVERTISE,
+ ]
+ ecommunities = [
+ bgp.BGPTwoOctetAsSpecificExtendedCommunity(
+ subtype=1, as_number=65500, local_administrator=3908876543),
+ bgp.BGPFourOctetAsSpecificExtendedCommunity(
+ subtype=2, as_number=10000000, local_administrator=59876),
+ bgp.BGPIPv4AddressSpecificExtendedCommunity(
+ subtype=3, ipv4_address='192.0.2.1',
+ local_administrator=65432),
+ bgp.BGPOpaqueExtendedCommunity(subtype=13, opaque=b'abcdef'),
+ bgp.BGPEncapsulationExtendedCommunity(
+ subtype=0x0c, tunnel_type=10),
+ bgp.BGPEvpnMacMobilityExtendedCommunity(
+ subtype=0, flags=0xff, sequence_number=0x11223344),
+ bgp.BGPEvpnEsiLabelExtendedCommunity(
+ subtype=1, flags=0xff, label=b'\xFF\xFF\xFF'),
+ bgp.BGPEvpnEsiLabelExtendedCommunity(
+ subtype=1, flags=0xff, mpls_label=0xfffff),
+ bgp.BGPEvpnEsiLabelExtendedCommunity(
+ subtype=1, flags=0xff, vni=0xffffff),
+ bgp.BGPEvpnEsImportRTExtendedCommunity(
+ subtype=2, es_import="aa:bb:cc:dd:ee:ff"),
+ bgp.BGPUnknownExtendedCommunity(type_=99, value=b'abcdefg'),
+ ]
+ path_attributes = [
+ bgp.BGPPathAttributeOrigin(value=1),
+ bgp.BGPPathAttributeAsPath(value=[[1000], {1001, 1002},
+ [1003, 1004]]),
+ bgp.BGPPathAttributeNextHop(value='192.0.2.199'),
+ bgp.BGPPathAttributeMultiExitDisc(value=2000000000),
+ bgp.BGPPathAttributeLocalPref(value=1000000000),
+ bgp.BGPPathAttributeAtomicAggregate(),
+ bgp.BGPPathAttributeAggregator(as_number=40000,
+ addr='192.0.2.99'),
+ bgp.BGPPathAttributeCommunities(communities=communities),
+ bgp.BGPPathAttributeExtendedCommunities(communities=ecommunities),
+ bgp.BGPPathAttributePmsiTunnel(
+ pmsi_flags=1,
+ tunnel_type=PMSI_TYPE_NO_TUNNEL_INFORMATION_PRESENT,
+ label=b'\xFF\xFF\xFF'),
+ bgp.BGPPathAttributePmsiTunnel(
+ pmsi_flags=1,
+ tunnel_type=PMSI_TYPE_NO_TUNNEL_INFORMATION_PRESENT,
+ tunnel_id=None),
+ bgp.BGPPathAttributePmsiTunnel(
+ pmsi_flags=1,
+ tunnel_type=PMSI_TYPE_INGRESS_REPLICATION,
+ mpls_label=0xfffff,
+ tunnel_id=bgp.PmsiTunnelIdIngressReplication(
+ tunnel_endpoint_ip="1.1.1.1")),
+ bgp.BGPPathAttributePmsiTunnel(
+ pmsi_flags=1,
+ tunnel_type=PMSI_TYPE_INGRESS_REPLICATION,
+ vni=0xffffff,
+ tunnel_id=bgp.PmsiTunnelIdIngressReplication(
+ tunnel_endpoint_ip="aa:bb:cc::dd:ee:ff")),
+ bgp.BGPPathAttributePmsiTunnel(
+ pmsi_flags=1,
+ tunnel_type=2,
+ label=b'\xFF\xFF\xFF',
+ tunnel_id=bgp.PmsiTunnelIdUnknown(value=b'test')),
+ bgp.BGPPathAttributeAs4Path(value=[[1000000], {1000001, 1002},
+ [1003, 1000004]]),
+ bgp.BGPPathAttributeAs4Aggregator(as_number=100040000,
+ addr='192.0.2.99'),
+ bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP, safi=safi.MPLS_VPN,
+ next_hop='1.1.1.1',
+ nlri=mp_nlri),
+ bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP, safi=safi.MPLS_LABEL,
+ next_hop='1.1.1.1',
+ nlri=mp_nlri2),
+ bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP6, safi=safi.MPLS_VPN,
+ next_hop=['2001:db8::1'],
+ nlri=mp_nlri_v6),
+ bgp.BGPPathAttributeMpReachNLRI(afi=afi.IP6, safi=safi.MPLS_LABEL,
+ next_hop=['2001:db8::1',
+ 'fe80::1'],
+ nlri=mp_nlri2_v6),
+ bgp.BGPPathAttributeMpUnreachNLRI(afi=afi.IP, safi=safi.MPLS_VPN,
+ withdrawn_routes=mp_nlri),
+ bgp.BGPPathAttributeUnknown(flags=0, type_=100, value=300 * b'bar')
+ ]
+ nlri = [
+ bgp.BGPNLRI(length=24, addr='203.0.113.1'),
+ bgp.BGPNLRI(length=16, addr='203.0.113.0')
+ ]
+ msg1 = bgp.BGPUpdate(withdrawn_routes=withdrawn_routes,
+ path_attributes=path_attributes,
+ nlri=nlri)
+ jsondict = msg1.to_jsondict()
+ msg2 = bgp.BGPUpdate.from_jsondict(jsondict['BGPUpdate'])
+ eq_(str(msg1), str(msg2))
+
+ def test_flowspec_user_interface_ipv4(self):
+ rules = RULES_BASE + [
+ # dst_prefix='10.0.0.0/24
+ bgp.FlowSpecDestPrefix(addr='10.0.0.0', length=24),
+ # src_prefix='20.0.0.1/24'
+ bgp.FlowSpecSrcPrefix(addr='20.0.0.0', length=24),
+ # ip_proto='6'
+ bgp.FlowSpecIPProtocol(
+ operator=bgp.FlowSpecIPProtocol.EQ, value=6),
+ # fragment='LF'
+ bgp.FlowSpecFragment(
+ operator=0, # Partial match
+ value=bgp.FlowSpecFragment.LF),
+ # fragment='==FF'
+ bgp.FlowSpecFragment(
+ operator=bgp.FlowSpecFragment.MATCH,
+ value=bgp.FlowSpecFragment.FF),
+ # fragment='&==ISF'
+ bgp.FlowSpecFragment(
+ operator=(bgp.FlowSpecFragment.AND |
+ bgp.FlowSpecFragment.MATCH),
+ value=bgp.FlowSpecFragment.ISF),
+ # fragment='!=DF'
+ bgp.FlowSpecFragment(
+ operator=bgp.FlowSpecFragment.NOT,
+ value=bgp.FlowSpecFragment.DF)
+ ]
+
+ msg = bgp.FlowSpecIPv4NLRI.from_user(
+ dst_prefix='10.0.0.0/24',
+ src_prefix='20.0.0.0/24',
+ ip_proto='6',
+ port='>=8000 & <=9000 | ==80',
+ dst_port='8080 >9000&<9050 | <=1000',
+ src_port='<=9090 & >=9080 <10100 & >10000',
+ icmp_type=0,
+ icmp_code=6,
+ tcp_flags='SYN+ACK & !=URGENT',
+ packet_len='1000 & 1100',
+ dscp='22 24',
+ fragment='LF ==FF&==ISF | !=DF')
+ msg2 = bgp.FlowSpecIPv4NLRI(rules=rules)
+ binmsg = msg.serialize()
+ binmsg2 = msg2.serialize()
+ eq_(str(msg), str(msg2))
+ eq_(binary_str(binmsg), binary_str(binmsg2))
+ msg3, rest = bgp.FlowSpecIPv4NLRI.parser(binmsg)
+ eq_(str(msg), str(msg3))
+ eq_(rest, b'')
+
+ def test_flowspec_user_interface_vpv4(self):
+ rules = RULES_BASE + [
+ # dst_prefix='10.0.0.0/24
+ bgp.FlowSpecDestPrefix(addr='10.0.0.0', length=24),
+ # src_prefix='20.0.0.1/24'
+ bgp.FlowSpecSrcPrefix(addr='20.0.0.0', length=24),
+ # ip_proto='6'
+ bgp.FlowSpecIPProtocol(
+ operator=bgp.FlowSpecIPProtocol.EQ, value=6),
+ # fragment='LF'
+ bgp.FlowSpecFragment(
+ operator=0, # Partial match
+ value=bgp.FlowSpecFragment.LF),
+ # fragment='==FF'
+ bgp.FlowSpecFragment(
+ operator=bgp.FlowSpecFragment.MATCH,
+ value=bgp.FlowSpecFragment.FF),
+ # fragment='&==ISF'
+ bgp.FlowSpecFragment(
+ operator=(bgp.FlowSpecFragment.AND |
+ bgp.FlowSpecFragment.MATCH),
+ value=bgp.FlowSpecFragment.ISF),
+ # fragment='!=DF'
+ bgp.FlowSpecFragment(
+ operator=bgp.FlowSpecFragment.NOT,
+ value=bgp.FlowSpecFragment.DF)
+ ]
+ msg = bgp.FlowSpecVPNv4NLRI.from_user(
+ route_dist='65001:250',
+ dst_prefix='10.0.0.0/24',
+ src_prefix='20.0.0.0/24',
+ ip_proto='6',
+ port='>=8000 & <=9000 | ==80',
+ dst_port='8080 >9000&<9050 | <=1000',
+ src_port='<=9090 & >=9080 <10100 & >10000',
+ icmp_type=0,
+ icmp_code=6,
+ tcp_flags='SYN+ACK & !=URGENT',
+ packet_len='1000 & 1100',
+ dscp='22 24',
+ fragment='LF ==FF&==ISF | !=DF')
+ msg2 = bgp.FlowSpecVPNv4NLRI(route_dist='65001:250', rules=rules)
+ binmsg = msg.serialize()
+ binmsg2 = msg2.serialize()
+ eq_(str(msg), str(msg2))
+ eq_(binary_str(binmsg), binary_str(binmsg2))
+ msg3, rest = bgp.FlowSpecVPNv4NLRI.parser(binmsg)
+ eq_(str(msg), str(msg3))
+ eq_(rest, b'')
+
+ def test_flowspec_user_interface_ipv6(self):
+ rules = RULES_BASE + [
+ # dst_prefix='2001:2/128/32'
+ bgp.FlowSpecIPv6DestPrefix(
+ addr='2001::2', offset=32, length=128),
+ # src_prefix='3002::3/128'
+ bgp.FlowSpecIPv6SrcPrefix(
+ addr='3002::3', length=128),
+ # ip_proto='6'
+ bgp.FlowSpecNextHeader(
+ operator=bgp.FlowSpecNextHeader.EQ, value=6),
+ # fragment='LF'
+ bgp.FlowSpecIPv6Fragment(
+ operator=0, # Partial match
+ value=bgp.FlowSpecFragment.LF),
+ # fragment='==FF'
+ bgp.FlowSpecIPv6Fragment(
+ operator=bgp.FlowSpecFragment.MATCH,
+ value=bgp.FlowSpecFragment.FF),
+ # fragment='&==ISF'
+ bgp.FlowSpecIPv6Fragment(
+ operator=(bgp.FlowSpecFragment.AND |
+ bgp.FlowSpecFragment.MATCH),
+ value=bgp.FlowSpecFragment.ISF),
+ # fragment='!=LF'
+ bgp.FlowSpecIPv6Fragment(
+ operator=bgp.FlowSpecFragment.NOT,
+ value=bgp.FlowSpecFragment.LF),
+ # flowlabel='100'
+ bgp.FlowSpecIPv6FlowLabel(
+ operator=bgp.FlowSpecIPv6FlowLabel.EQ,
+ value=100),
+ ]
+ msg = bgp.FlowSpecIPv6NLRI.from_user(
+ dst_prefix='2001::2/128/32',
+ src_prefix='3002::3/128',
+ next_header='6',
+ port='>=8000 & <=9000 | ==80',
+ dst_port='8080 >9000&<9050 | <=1000',
+ src_port='<=9090 & >=9080 <10100 & >10000',
+ icmp_type=0,
+ icmp_code=6,
+ tcp_flags='SYN+ACK & !=URGENT',
+ packet_len='1000 & 1100',
+ dscp='22 24',
+ fragment='LF ==FF&==ISF | !=LF',
+ flow_label=100,
+ )
+ msg2 = bgp.FlowSpecIPv6NLRI(rules=rules)
+ binmsg = msg.serialize()
+ binmsg2 = msg2.serialize()
+ eq_(str(msg), str(msg2))
+ eq_(binary_str(binmsg), binary_str(binmsg2))
+ msg3, rest = bgp.FlowSpecIPv6NLRI.parser(binmsg)
+ eq_(str(msg), str(msg3))
+ eq_(rest, b'')
+
+ def test_flowspec_user_interface_vpnv6(self):
+ rules = RULES_BASE + [
+ # dst_prefix='2001:2/128/32'
+ bgp.FlowSpecIPv6DestPrefix(
+ addr='2001::2', offset=32, length=128),
+ # src_prefix='3002::3/128'
+ bgp.FlowSpecIPv6SrcPrefix(
+ addr='3002::3', length=128),
+ # ip_proto='6'
+ bgp.FlowSpecNextHeader(
+ operator=bgp.FlowSpecNextHeader.EQ, value=6),
+ # fragment='LF'
+ bgp.FlowSpecIPv6Fragment(
+ operator=0, # Partial match
+ value=bgp.FlowSpecFragment.LF),
+ # fragment='==FF'
+ bgp.FlowSpecIPv6Fragment(
+ operator=bgp.FlowSpecFragment.MATCH,
+ value=bgp.FlowSpecFragment.FF),
+ # fragment='&==ISF'
+ bgp.FlowSpecIPv6Fragment(
+ operator=(bgp.FlowSpecFragment.AND |
+ bgp.FlowSpecFragment.MATCH),
+ value=bgp.FlowSpecFragment.ISF),
+ # fragment='!=LF'
+ bgp.FlowSpecIPv6Fragment(
+ operator=bgp.FlowSpecFragment.NOT,
+ value=bgp.FlowSpecFragment.LF),
+ # flowlabel='100'
+ bgp.FlowSpecIPv6FlowLabel(
+ operator=bgp.FlowSpecIPv6FlowLabel.EQ,
+ value=100),
+ ]
+ msg = bgp.FlowSpecVPNv6NLRI.from_user(
+ route_dist='65001:250',
+ dst_prefix='2001::2/128/32',
+ src_prefix='3002::3/128',
+ next_header='6',
+ port='>=8000 & <=9000 | ==80',
+ dst_port='8080 >9000&<9050 | <=1000',
+ src_port='<=9090 & >=9080 <10100 & >10000',
+ icmp_type=0,
+ icmp_code=6,
+ tcp_flags='SYN+ACK & !=URGENT',
+ packet_len='1000 & 1100',
+ dscp='22 24',
+ fragment='LF ==FF&==ISF | !=LF',
+ flow_label=100,
+ )
+ msg2 = bgp.FlowSpecVPNv6NLRI(route_dist='65001:250', rules=rules)
+ binmsg = msg.serialize()
+ binmsg2 = msg2.serialize()
+ eq_(str(msg), str(msg2))
+ eq_(binary_str(binmsg), binary_str(binmsg2))
+ msg3, rest = bgp.FlowSpecVPNv6NLRI.parser(binmsg)
+ eq_(str(msg), str(msg3))
+ eq_(rest, b'')
+
+ def test_flowspec_user_interface_l2vpn(self):
+ rules = RULES_L2VPN_BASE
+ msg = bgp.FlowSpecL2VPNNLRI.from_user(
+ route_dist='65001:250',
+ ether_type=0x0800,
+ src_mac='12:34:56:78:90:AB',
+ dst_mac='BE:EF:C0:FF:EE:DD',
+ llc_dsap=0x42,
+ llc_ssap=0x42,
+ llc_control=100,
+ snap=0x12345,
+ vlan_id='>4000',
+ vlan_cos='>=3',
+ inner_vlan_id='<3000',
+ inner_vlan_cos='<=5',
+ )
+ msg2 = bgp.FlowSpecL2VPNNLRI(route_dist='65001:250', rules=rules)
+ binmsg = msg.serialize()
+ binmsg2 = msg2.serialize()
+ eq_(str(msg), str(msg2))
+ eq_(binary_str(binmsg), binary_str(binmsg2))
+ msg3, rest = bgp.FlowSpecL2VPNNLRI.parser(binmsg)
+ eq_(str(msg), str(msg3))
+ eq_(rest, b'')
diff --git a/tests/unit/packet/test_bmp.py b/tests/unit/packet/test_bmp.py
new file mode 100644
index 00000000..f93b8014
--- /dev/null
+++ b/tests/unit/packet/test_bmp.py
@@ -0,0 +1,136 @@
+# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+from nose.tools import eq_
+from nose.tools import ok_
+from time import time
+
+from ryu.lib.packet import bmp
+from ryu.lib.packet import bgp
+from ryu.lib.packet import afi
+from ryu.lib.packet import safi
+
+
+class Test_bmp(unittest.TestCase):
+ """ Test case for ryu.lib.packet.bmp
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def _time(self):
+ # time() can give sub-microsecond precision, which results
+ # in an assertion failure
+ return round(time(), 6)
+
+ def test_route_monitoring(self):
+ update = bgp.BGPUpdate()
+ msg = bmp.BMPRouteMonitoring(bgp_update=update,
+ peer_type=bmp.BMP_PEER_TYPE_GLOBAL,
+ is_post_policy=True,
+ peer_distinguisher=0,
+ peer_address='192.0.2.1',
+ peer_as=30000,
+ peer_bgp_id='192.0.2.1',
+ timestamp=self._time())
+ binmsg = msg.serialize()
+ msg2, rest = bmp.BMPMessage.parser(binmsg)
+ eq_(msg.to_jsondict(), msg2.to_jsondict())
+ eq_(rest, b'')
+
+ def test_statistics_report(self):
+ stats = [{'type': bmp.BMP_STAT_TYPE_REJECTED, 'value': 100},
+ {'type': bmp.BMP_STAT_TYPE_DUPLICATE_PREFIX, 'value': 200},
+ {'type': bmp.BMP_STAT_TYPE_DUPLICATE_WITHDRAW, 'value': 300},
+ {'type': bmp.BMP_STAT_TYPE_ADJ_RIB_IN, 'value': 100000},
+ {'type': bmp.BMP_STAT_TYPE_LOC_RIB, 'value': 500000}]
+ msg = bmp.BMPStatisticsReport(stats=stats,
+ peer_type=bmp.BMP_PEER_TYPE_GLOBAL,
+ is_post_policy=True,
+ peer_distinguisher=0,
+ peer_address='192.0.2.1',
+ peer_as=30000,
+ peer_bgp_id='192.0.2.1',
+ timestamp=self._time())
+ binmsg = msg.serialize()
+ msg2, rest = bmp.BMPMessage.parser(binmsg)
+ eq_(msg.to_jsondict(), msg2.to_jsondict())
+ eq_(rest, b'')
+
+ def test_peer_down_notification(self):
+ reason = bmp.BMP_PEER_DOWN_REASON_LOCAL_BGP_NOTIFICATION
+ data = b'hoge'
+ data = bgp.BGPNotification(error_code=1, error_subcode=2, data=data)
+ msg = bmp.BMPPeerDownNotification(reason=reason, data=data,
+ peer_type=bmp.BMP_PEER_TYPE_GLOBAL,
+ is_post_policy=True,
+ peer_distinguisher=0,
+ peer_address='192.0.2.1',
+ peer_as=30000,
+ peer_bgp_id='192.0.2.1',
+ timestamp=self._time())
+ binmsg = msg.serialize()
+ msg2, rest = bmp.BMPMessage.parser(binmsg)
+ eq_(msg.to_jsondict(), msg2.to_jsondict())
+ eq_(rest, b'')
+
+ def test_peer_up_notification(self):
+ opt_param = [bgp.BGPOptParamCapabilityUnknown(cap_code=200,
+ cap_value=b'hoge'),
+ bgp.BGPOptParamCapabilityRouteRefresh(),
+ bgp.BGPOptParamCapabilityMultiprotocol(
+ afi=afi.IP, safi=safi.MPLS_VPN)]
+ open_message = bgp.BGPOpen(my_as=40000, bgp_identifier='192.0.2.2',
+ opt_param=opt_param)
+ msg = bmp.BMPPeerUpNotification(local_address='192.0.2.2',
+ local_port=179,
+ remote_port=11089,
+ sent_open_message=open_message,
+ received_open_message=open_message,
+ peer_type=bmp.BMP_PEER_TYPE_GLOBAL,
+ is_post_policy=True,
+ peer_distinguisher=0,
+ peer_address='192.0.2.1',
+ peer_as=30000,
+ peer_bgp_id='192.0.2.1',
+ timestamp=self._time())
+ binmsg = msg.serialize()
+ msg2, rest = bmp.BMPMessage.parser(binmsg)
+ eq_(msg.to_jsondict(), msg2.to_jsondict())
+ eq_(rest, b'')
+
+ def test_initiation(self):
+ initiation_info = [{'type': bmp.BMP_INIT_TYPE_STRING,
+ 'value': u'This is Ryu BGP BMP message'}]
+ msg = bmp.BMPInitiation(info=initiation_info)
+ binmsg = msg.serialize()
+ msg2, rest = bmp.BMPMessage.parser(binmsg)
+ eq_(msg.to_jsondict(lambda v: v), msg2.to_jsondict(lambda v: v))
+ eq_(rest, b'')
+
+ def test_termination(self):
+ termination_info = [{'type': bmp.BMP_TERM_TYPE_STRING,
+ 'value': u'Session administatively closed'},
+ {'type': bmp.BMP_TERM_TYPE_REASON,
+ 'value': bmp.BMP_TERM_REASON_ADMIN}]
+ msg = bmp.BMPTermination(info=termination_info)
+ binmsg = msg.serialize()
+ msg2, rest = bmp.BMPMessage.parser(binmsg)
+ eq_(msg.to_jsondict(lambda v: v), msg2.to_jsondict(lambda v: v))
+ eq_(rest, b'')
diff --git a/tests/unit/packet/test_bpdu.py b/tests/unit/packet/test_bpdu.py
new file mode 100644
index 00000000..1ef8cf58
--- /dev/null
+++ b/tests/unit/packet/test_bpdu.py
@@ -0,0 +1,469 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import struct
+
+from nose.tools import eq_
+from ryu.lib.packet import bpdu
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_ConfigurationBPDUs(unittest.TestCase):
+ """ Test case for ConfigurationBPDUs
+ """
+
+ def setUp(self):
+ self.protocol_id = bpdu.PROTOCOL_IDENTIFIER
+ self.version_id = bpdu.ConfigurationBPDUs.VERSION_ID
+ self.bpdu_type = bpdu.ConfigurationBPDUs.BPDU_TYPE
+ self.flags = 0b00000001
+ self.root_priority = 4096
+ self.root_system_id_extension = 1
+ self.root_mac_address = '12:34:56:78:9a:bc'
+ self.root_path_cost = 2
+ self.bridge_priority = 8192
+ self.bridge_system_id_extension = 3
+ self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa'
+ self.port_priority = 16
+ self.port_number = 4
+ self.message_age = 5
+ self.max_age = 6
+ self.hello_time = 7
+ self.forward_delay = 8
+
+ self.msg = bpdu.ConfigurationBPDUs(
+ flags=self.flags,
+ root_priority=self.root_priority,
+ root_system_id_extension=self.root_system_id_extension,
+ root_mac_address=self.root_mac_address,
+ root_path_cost=self.root_path_cost,
+ bridge_priority=self.bridge_priority,
+ bridge_system_id_extension=self.bridge_system_id_extension,
+ bridge_mac_address=self.bridge_mac_address,
+ port_priority=self.port_priority,
+ port_number=self.port_number,
+ message_age=self.message_age,
+ max_age=self.max_age,
+ hello_time=self.hello_time,
+ forward_delay=self.forward_delay)
+
+ self.fmt = (bpdu.bpdu._PACK_STR
+ + bpdu.ConfigurationBPDUs._PACK_STR[1:])
+ self.buf = struct.pack(self.fmt,
+ self.protocol_id, self.version_id,
+ self.bpdu_type, self.flags,
+ bpdu.ConfigurationBPDUs.encode_bridge_id(
+ self.root_priority,
+ self.root_system_id_extension,
+ self.root_mac_address),
+ self.root_path_cost,
+ bpdu.ConfigurationBPDUs.encode_bridge_id(
+ self.bridge_priority,
+ self.bridge_system_id_extension,
+ self.bridge_mac_address),
+ bpdu.ConfigurationBPDUs.encode_port_id(
+ self.port_priority,
+ self.port_number),
+ bpdu.ConfigurationBPDUs._encode_timer(
+ self.message_age),
+ bpdu.ConfigurationBPDUs._encode_timer(
+ self.max_age),
+ bpdu.ConfigurationBPDUs._encode_timer(
+ self.hello_time),
+ bpdu.ConfigurationBPDUs._encode_timer(
+ self.forward_delay))
+
+ def test_init(self):
+ eq_(self.protocol_id, self.msg._protocol_id)
+ eq_(self.version_id, self.msg._version_id)
+ eq_(self.bpdu_type, self.msg._bpdu_type)
+ eq_(self.flags, self.msg.flags)
+ eq_(self.root_priority, self.msg.root_priority)
+ eq_(self.root_system_id_extension,
+ self.msg.root_system_id_extension)
+ eq_(self.root_mac_address, self.msg.root_mac_address)
+ eq_(self.root_path_cost, self.msg.root_path_cost)
+ eq_(self.bridge_priority, self.msg.bridge_priority)
+ eq_(self.bridge_system_id_extension,
+ self.msg.bridge_system_id_extension)
+ eq_(self.bridge_mac_address, self.msg.bridge_mac_address)
+ eq_(self.port_priority, self.msg.port_priority)
+ eq_(self.port_number, self.msg.port_number)
+ eq_(self.message_age, self.msg.message_age)
+ eq_(self.max_age, self.msg.max_age)
+ eq_(self.hello_time, self.msg.hello_time)
+ eq_(self.forward_delay, self.msg.forward_delay)
+
+ def test_parser(self):
+ r1, r2, _ = bpdu.bpdu.parser(self.buf)
+
+ eq_(type(r1), type(self.msg))
+ eq_(r1._protocol_id, self.protocol_id)
+ eq_(r1._version_id, self.version_id)
+ eq_(r1._bpdu_type, self.bpdu_type)
+ eq_(r1.flags, self.flags)
+ eq_(r1.root_priority, self.root_priority)
+ eq_(r1.root_system_id_extension, self.root_system_id_extension)
+ eq_(r1.root_mac_address, self.root_mac_address)
+ eq_(r1.root_path_cost, self.root_path_cost)
+ eq_(r1.bridge_priority, self.bridge_priority)
+ eq_(r1.bridge_system_id_extension, self.bridge_system_id_extension)
+ eq_(r1.bridge_mac_address, self.bridge_mac_address)
+ eq_(r1.port_priority, self.port_priority)
+ eq_(r1.port_number, self.port_number)
+ eq_(r1.message_age, self.message_age)
+ eq_(r1.max_age, self.max_age)
+ eq_(r1.hello_time, self.hello_time)
+ eq_(r1.forward_delay, self.forward_delay)
+ eq_(r2, None)
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.msg.serialize(data, prev)
+ res = struct.unpack(self.fmt, buf)
+
+ eq_(res[0], self.protocol_id)
+ eq_(res[1], self.version_id)
+ eq_(res[2], self.bpdu_type)
+ eq_(res[3], self.flags)
+ eq_(bpdu.ConfigurationBPDUs._decode_bridge_id(res[4]),
+ (self.root_priority,
+ self.root_system_id_extension,
+ self.root_mac_address))
+ eq_(res[5], self.root_path_cost)
+ eq_(bpdu.ConfigurationBPDUs._decode_bridge_id(res[6]),
+ (self.bridge_priority,
+ self.bridge_system_id_extension,
+ self.bridge_mac_address))
+ eq_(bpdu.ConfigurationBPDUs._decode_port_id(res[7]),
+ (self.port_priority,
+ self.port_number))
+ eq_(bpdu.ConfigurationBPDUs._decode_timer(res[8]), self.message_age)
+ eq_(bpdu.ConfigurationBPDUs._decode_timer(res[9]), self.max_age)
+ eq_(bpdu.ConfigurationBPDUs._decode_timer(res[10]), self.hello_time)
+ eq_(bpdu.ConfigurationBPDUs._decode_timer(res[11]), self.forward_delay)
+
+ def test_json(self):
+ jsondict = self.msg.to_jsondict()
+ msg = bpdu.ConfigurationBPDUs.from_jsondict(
+ jsondict['ConfigurationBPDUs'])
+ eq_(str(self.msg), str(msg))
+
+
+class Test_TopologyChangeNotificationBPDUs(unittest.TestCase):
+ """ Test case for TopologyChangeNotificationBPDUs
+ """
+
+ def setUp(self):
+ self.protocol_id = bpdu.PROTOCOL_IDENTIFIER
+ self.version_id = bpdu.TopologyChangeNotificationBPDUs.VERSION_ID
+ self.bpdu_type = bpdu.TopologyChangeNotificationBPDUs.BPDU_TYPE
+
+ self.msg = bpdu.TopologyChangeNotificationBPDUs()
+
+ self.fmt = bpdu.bpdu._PACK_STR
+ self.buf = struct.pack(self.fmt,
+ self.protocol_id,
+ self.version_id,
+ self.bpdu_type)
+
+ def test_init(self):
+ eq_(self.protocol_id, self.msg._protocol_id)
+ eq_(self.version_id, self.msg._version_id)
+ eq_(self.bpdu_type, self.msg._bpdu_type)
+
+ def test_parser(self):
+ r1, r2, _ = bpdu.bpdu.parser(self.buf)
+
+ eq_(type(r1), type(self.msg))
+ eq_(r1._protocol_id, self.protocol_id)
+ eq_(r1._version_id, self.version_id)
+ eq_(r1._bpdu_type, self.bpdu_type)
+ eq_(r2, None)
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.msg.serialize(data, prev)
+ res = struct.unpack(self.fmt, buf)
+
+ eq_(res[0], self.protocol_id)
+ eq_(res[1], self.version_id)
+ eq_(res[2], self.bpdu_type)
+
+ def test_json(self):
+ jsondict = self.msg.to_jsondict()
+ msg = bpdu.TopologyChangeNotificationBPDUs.from_jsondict(
+ jsondict['TopologyChangeNotificationBPDUs'])
+ eq_(str(self.msg), str(msg))
+
+
+class Test_RstBPDUs(unittest.TestCase):
+ """ Test case for RstBPDUs
+ """
+
+ def setUp(self):
+ self.protocol_id = bpdu.PROTOCOL_IDENTIFIER
+ self.version_id = bpdu.RstBPDUs.VERSION_ID
+ self.bpdu_type = bpdu.RstBPDUs.BPDU_TYPE
+ self.flags = 0b01111110
+ self.root_priority = 4096
+ self.root_system_id_extension = 1
+ self.root_mac_address = '12:34:56:78:9a:bc'
+ self.root_path_cost = 2
+ self.bridge_priority = 8192
+ self.bridge_system_id_extension = 3
+ self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa'
+ self.port_priority = 16
+ self.port_number = 4
+ self.message_age = 5
+ self.max_age = 6
+ self.hello_time = 7
+ self.forward_delay = 8
+ self.version_1_length = bpdu.VERSION_1_LENGTH
+
+ self.msg = bpdu.RstBPDUs(
+ flags=self.flags,
+ root_priority=self.root_priority,
+ root_system_id_extension=self.root_system_id_extension,
+ root_mac_address=self.root_mac_address,
+ root_path_cost=self.root_path_cost,
+ bridge_priority=self.bridge_priority,
+ bridge_system_id_extension=self.bridge_system_id_extension,
+ bridge_mac_address=self.bridge_mac_address,
+ port_priority=self.port_priority,
+ port_number=self.port_number,
+ message_age=self.message_age,
+ max_age=self.max_age,
+ hello_time=self.hello_time,
+ forward_delay=self.forward_delay)
+
+ self.fmt = (bpdu.bpdu._PACK_STR
+ + bpdu.ConfigurationBPDUs._PACK_STR[1:]
+ + bpdu.RstBPDUs._PACK_STR[1:])
+ self.buf = struct.pack(self.fmt,
+ self.protocol_id, self.version_id,
+ self.bpdu_type, self.flags,
+ bpdu.RstBPDUs.encode_bridge_id(
+ self.root_priority,
+ self.root_system_id_extension,
+ self.root_mac_address),
+ self.root_path_cost,
+ bpdu.RstBPDUs.encode_bridge_id(
+ self.bridge_priority,
+ self.bridge_system_id_extension,
+ self.bridge_mac_address),
+ bpdu.RstBPDUs.encode_port_id(
+ self.port_priority,
+ self.port_number),
+ bpdu.RstBPDUs._encode_timer(self.message_age),
+ bpdu.RstBPDUs._encode_timer(self.max_age),
+ bpdu.RstBPDUs._encode_timer(self.hello_time),
+ bpdu.RstBPDUs._encode_timer(self.forward_delay),
+ self.version_1_length)
+
+ def test_init(self):
+ eq_(self.protocol_id, self.msg._protocol_id)
+ eq_(self.version_id, self.msg._version_id)
+ eq_(self.bpdu_type, self.msg._bpdu_type)
+ eq_(self.flags, self.msg.flags)
+ eq_(self.root_priority, self.msg.root_priority)
+ eq_(self.root_system_id_extension,
+ self.msg.root_system_id_extension)
+ eq_(self.root_mac_address, self.msg.root_mac_address)
+ eq_(self.root_path_cost, self.msg.root_path_cost)
+ eq_(self.bridge_priority, self.msg.bridge_priority)
+ eq_(self.bridge_system_id_extension,
+ self.msg.bridge_system_id_extension)
+ eq_(self.bridge_mac_address, self.msg.bridge_mac_address)
+ eq_(self.port_priority, self.msg.port_priority)
+ eq_(self.port_number, self.msg.port_number)
+ eq_(self.message_age, self.msg.message_age)
+ eq_(self.max_age, self.msg.max_age)
+ eq_(self.hello_time, self.msg.hello_time)
+ eq_(self.forward_delay, self.msg.forward_delay)
+ eq_(self.version_1_length, self.msg._version_1_length)
+
+ def test_parser(self):
+ r1, r2, _ = bpdu.bpdu.parser(self.buf)
+
+ eq_(type(r1), type(self.msg))
+ eq_(r1._protocol_id, self.protocol_id)
+ eq_(r1._version_id, self.version_id)
+ eq_(r1._bpdu_type, self.bpdu_type)
+ eq_(r1.flags, self.flags)
+ eq_(r1.root_priority, self.root_priority)
+ eq_(r1.root_system_id_extension, self.root_system_id_extension)
+ eq_(r1.root_mac_address, self.root_mac_address)
+ eq_(r1.root_path_cost, self.root_path_cost)
+ eq_(r1.bridge_priority, self.bridge_priority)
+ eq_(r1.bridge_system_id_extension, self.bridge_system_id_extension)
+ eq_(r1.bridge_mac_address, self.bridge_mac_address)
+ eq_(r1.port_priority, self.port_priority)
+ eq_(r1.port_number, self.port_number)
+ eq_(r1.message_age, self.message_age)
+ eq_(r1.max_age, self.max_age)
+ eq_(r1.hello_time, self.hello_time)
+ eq_(r1.forward_delay, self.forward_delay)
+ eq_(r1._version_1_length, self.version_1_length)
+ eq_(r2, None)
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.msg.serialize(data, prev)
+ res = struct.unpack(self.fmt, buf)
+
+ eq_(res[0], self.protocol_id)
+ eq_(res[1], self.version_id)
+ eq_(res[2], self.bpdu_type)
+ eq_(res[3], self.flags)
+ eq_(bpdu.RstBPDUs._decode_bridge_id(res[4]),
+ (self.root_priority,
+ self.root_system_id_extension,
+ self.root_mac_address))
+ eq_(res[5], self.root_path_cost)
+ eq_(bpdu.RstBPDUs._decode_bridge_id(res[6]),
+ (self.bridge_priority,
+ self.bridge_system_id_extension,
+ self.bridge_mac_address))
+ eq_(bpdu.RstBPDUs._decode_port_id(res[7]),
+ (self.port_priority,
+ self.port_number))
+ eq_(bpdu.RstBPDUs._decode_timer(res[8]), self.message_age)
+ eq_(bpdu.RstBPDUs._decode_timer(res[9]), self.max_age)
+ eq_(bpdu.RstBPDUs._decode_timer(res[10]), self.hello_time)
+ eq_(bpdu.RstBPDUs._decode_timer(res[11]), self.forward_delay)
+ eq_(res[12], self.version_1_length)
+
+ def test_json(self):
+ jsondict = self.msg.to_jsondict()
+ msg = bpdu.RstBPDUs.from_jsondict(jsondict['RstBPDUs'])
+ eq_(str(self.msg), str(msg))
+
+
+class Test_UnknownVersion(unittest.TestCase):
+ """ Test case for unknown BPDU version
+ """
+
+ def setUp(self):
+ self.protocol_id = bpdu.PROTOCOL_IDENTIFIER
+ self.version_id = 111 # Unknown version
+ self.bpdu_type = bpdu.RstBPDUs.BPDU_TYPE
+ self.flags = 0b01111110
+ self.root_priority = 4096
+ self.root_system_id_extension = 1
+ self.root_mac_address = '12:34:56:78:9a:bc'
+ self.root_path_cost = 2
+ self.bridge_priority = 8192
+ self.bridge_system_id_extension = 3
+ self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa'
+ self.port_priority = 16
+ self.port_number = 4
+ self.message_age = 5
+ self.max_age = 6
+ self.hello_time = 7
+ self.forward_delay = 8
+ self.version_1_length = bpdu.VERSION_1_LENGTH
+
+ self.fmt = (bpdu.bpdu._PACK_STR
+ + bpdu.ConfigurationBPDUs._PACK_STR[1:]
+ + bpdu.RstBPDUs._PACK_STR[1:])
+ self.buf = struct.pack(self.fmt,
+ self.protocol_id, self.version_id,
+ self.bpdu_type, self.flags,
+ bpdu.RstBPDUs.encode_bridge_id(
+ self.root_priority,
+ self.root_system_id_extension,
+ self.root_mac_address),
+ self.root_path_cost,
+ bpdu.RstBPDUs.encode_bridge_id(
+ self.bridge_priority,
+ self.bridge_system_id_extension,
+ self.bridge_mac_address),
+ bpdu.RstBPDUs.encode_port_id(
+ self.port_priority,
+ self.port_number),
+ bpdu.RstBPDUs._encode_timer(self.message_age),
+ bpdu.RstBPDUs._encode_timer(self.max_age),
+ bpdu.RstBPDUs._encode_timer(self.hello_time),
+ bpdu.RstBPDUs._encode_timer(self.forward_delay),
+ self.version_1_length)
+
+ def test_parser(self):
+ r1, r2, _ = bpdu.bpdu.parser(self.buf)
+ eq_(r1, self.buf)
+ eq_(r2, None)
+
+
+class Test_UnknownType(unittest.TestCase):
+ """ Test case for unknown BPDU type
+ """
+
+ def setUp(self):
+ self.protocol_id = bpdu.PROTOCOL_IDENTIFIER
+ self.version_id = bpdu.RstBPDUs.VERSION_ID
+ self.bpdu_type = 222 # Unknown type
+ self.flags = 0b01111110
+ self.root_priority = 4096
+ self.root_system_id_extension = 1
+ self.root_mac_address = '12:34:56:78:9a:bc'
+ self.root_path_cost = 2
+ self.bridge_priority = 8192
+ self.bridge_system_id_extension = 3
+ self.bridge_mac_address = 'aa:aa:aa:aa:aa:aa'
+ self.port_priority = 16
+ self.port_number = 4
+ self.message_age = 5
+ self.max_age = 6
+ self.hello_time = 7
+ self.forward_delay = 8
+ self.version_1_length = bpdu.VERSION_1_LENGTH
+
+ self.fmt = (bpdu.bpdu._PACK_STR
+ + bpdu.ConfigurationBPDUs._PACK_STR[1:]
+ + bpdu.RstBPDUs._PACK_STR[1:])
+ self.buf = struct.pack(self.fmt,
+ self.protocol_id, self.version_id,
+ self.bpdu_type, self.flags,
+ bpdu.RstBPDUs.encode_bridge_id(
+ self.root_priority,
+ self.root_system_id_extension,
+ self.root_mac_address),
+ self.root_path_cost,
+ bpdu.RstBPDUs.encode_bridge_id(
+ self.bridge_priority,
+ self.bridge_system_id_extension,
+ self.bridge_mac_address),
+ bpdu.RstBPDUs.encode_port_id(
+ self.port_priority,
+ self.port_number),
+ bpdu.RstBPDUs._encode_timer(self.message_age),
+ bpdu.RstBPDUs._encode_timer(self.max_age),
+ bpdu.RstBPDUs._encode_timer(self.hello_time),
+ bpdu.RstBPDUs._encode_timer(self.forward_delay),
+ self.version_1_length)
+
+ def test_parser(self):
+ r1, r2, _ = bpdu.bpdu.parser(self.buf)
+ eq_(r1, self.buf)
+ eq_(r2, None)
diff --git a/tests/unit/packet/test_cfm.py b/tests/unit/packet/test_cfm.py
new file mode 100644
index 00000000..fb0749d7
--- /dev/null
+++ b/tests/unit/packet/test_cfm.py
@@ -0,0 +1,1761 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import unittest
+import logging
+import inspect
+import six
+import struct
+
+from nose.tools import *
+from ryu.lib import addrconv
+from ryu.lib.packet import cfm
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_cfm(unittest.TestCase):
+
+ def setUp(self):
+ self.message = cfm.cc_message()
+ self.ins = cfm.cfm(self.message)
+ data = bytearray()
+ prev = None
+ self.buf = self.ins.serialize(data, prev)
+
+ def setUp_cc_message(self):
+ self.cc_message_md_lv = 1
+ self.cc_message_version = 1
+ self.cc_message_rdi = 1
+ self.cc_message_interval = 1
+ self.cc_message_seq_num = 123
+ self.cc_message_mep_id = 4
+ self.cc_message_md_name_format = 4
+ self.cc_message_md_name_length = 0
+ self.cc_message_md_name = b"hoge"
+ self.cc_message_short_ma_name_format = 2
+ self.cc_message_short_ma_name_length = 0
+ self.cc_message_short_ma_name = b"pakeratta"
+ self.cc_message_md_name_txfcf = 11
+ self.cc_message_md_name_rxfcb = 22
+ self.cc_message_md_name_txfcb = 33
+ self.cc_message_tlvs = [
+ cfm.sender_id_tlv(),
+ cfm.port_status_tlv(),
+ cfm.data_tlv(),
+ cfm.interface_status_tlv(),
+ cfm.reply_ingress_tlv(),
+ cfm.reply_egress_tlv(),
+ cfm.ltm_egress_identifier_tlv(),
+ cfm.ltr_egress_identifier_tlv(),
+ cfm.organization_specific_tlv(),
+ ]
+ self.message = cfm.cc_message(
+ self.cc_message_md_lv,
+ self.cc_message_version,
+ self.cc_message_rdi,
+ self.cc_message_interval,
+ self.cc_message_seq_num,
+ self.cc_message_mep_id,
+ self.cc_message_md_name_format,
+ self.cc_message_md_name_length,
+ self.cc_message_md_name,
+ self.cc_message_short_ma_name_format,
+ self.cc_message_short_ma_name_length,
+ self.cc_message_short_ma_name,
+ self.cc_message_tlvs
+ )
+ self.ins = cfm.cfm(self.message)
+ data = bytearray()
+ prev = None
+ self.buf = self.ins.serialize(data, prev)
+
+ def setUp_loopback_message(self):
+ self.loopback_message_md_lv = 1
+ self.loopback_message_version = 1
+ self.loopback_message_transaction_id = 12345
+ self.loopback_message_tlvs = [
+ cfm.sender_id_tlv(),
+ cfm.port_status_tlv(),
+ cfm.data_tlv(),
+ cfm.interface_status_tlv(),
+ cfm.reply_ingress_tlv(),
+ cfm.reply_egress_tlv(),
+ cfm.ltm_egress_identifier_tlv(),
+ cfm.ltr_egress_identifier_tlv(),
+ cfm.organization_specific_tlv(),
+ ]
+ self.message = cfm.loopback_message(
+ self.loopback_message_md_lv,
+ self.loopback_message_version,
+ self.loopback_message_transaction_id,
+ self.loopback_message_tlvs)
+ self.ins = cfm.cfm(self.message)
+ data = bytearray()
+ prev = None
+ self.buf = self.ins.serialize(data, prev)
+
+ def setUp_loopback_reply(self):
+ self.loopback_reply_md_lv = 1
+ self.loopback_reply_version = 1
+ self.loopback_reply_transaction_id = 12345
+ self.loopback_reply_tlvs = [
+ cfm.sender_id_tlv(),
+ cfm.port_status_tlv(),
+ cfm.data_tlv(),
+ cfm.interface_status_tlv(),
+ cfm.reply_ingress_tlv(),
+ cfm.reply_egress_tlv(),
+ cfm.ltm_egress_identifier_tlv(),
+ cfm.ltr_egress_identifier_tlv(),
+ cfm.organization_specific_tlv(),
+ ]
+ self.message = cfm.loopback_reply(
+ self.loopback_reply_md_lv,
+ self.loopback_reply_version,
+ self.loopback_reply_transaction_id,
+ self.loopback_reply_tlvs)
+ self.ins = cfm.cfm(self.message)
+ data = bytearray()
+ prev = None
+ self.buf = self.ins.serialize(data, prev)
+
+ def setUp_link_trace_message(self):
+ self.link_trace_message_md_lv = 1
+ self.link_trace_message_version = 1
+ self.link_trace_message_use_fdb_only = 1
+ self.link_trace_message_transaction_id = 12345
+ self.link_trace_message_ttl = 123
+ self.link_trace_message_ltm_orig_addr = '11:22:33:44:55:66'
+ self.link_trace_message_ltm_targ_addr = '77:88:99:aa:cc:dd'
+ self.link_trace_message_tlvs = [
+ cfm.sender_id_tlv(),
+ cfm.port_status_tlv(),
+ cfm.data_tlv(),
+ cfm.interface_status_tlv(),
+ cfm.reply_ingress_tlv(),
+ cfm.reply_egress_tlv(),
+ cfm.ltm_egress_identifier_tlv(),
+ cfm.ltr_egress_identifier_tlv(),
+ cfm.organization_specific_tlv(),
+ ]
+ self.message = cfm.link_trace_message(
+ self.link_trace_message_md_lv,
+ self.link_trace_message_version,
+ self.link_trace_message_use_fdb_only,
+ self.link_trace_message_transaction_id,
+ self.link_trace_message_ttl,
+ self.link_trace_message_ltm_orig_addr,
+ self.link_trace_message_ltm_targ_addr,
+ self.link_trace_message_tlvs)
+ self.ins = cfm.cfm(self.message)
+ data = bytearray()
+ prev = None
+ self.buf = self.ins.serialize(data, prev)
+
+ def setUp_link_trace_reply(self):
+ self.link_trace_reply_md_lv = 1
+ self.link_trace_reply_version = 1
+ self.link_trace_reply_use_fdb_only = 1
+ self.link_trace_reply_fwd_yes = 0
+ self.link_trace_reply_terminal_mep = 1
+ self.link_trace_reply_transaction_id = 5432
+ self.link_trace_reply_ttl = 123
+ self.link_trace_reply_relay_action = 3
+ self.link_trace_reply_tlvs = [
+ cfm.sender_id_tlv(),
+ cfm.port_status_tlv(),
+ cfm.data_tlv(),
+ cfm.interface_status_tlv(),
+ cfm.reply_ingress_tlv(),
+ cfm.reply_egress_tlv(),
+ cfm.ltm_egress_identifier_tlv(),
+ cfm.ltr_egress_identifier_tlv(),
+ cfm.organization_specific_tlv(),
+ ]
+ self.message = cfm.link_trace_reply(
+ self.link_trace_reply_md_lv,
+ self.link_trace_reply_version,
+ self.link_trace_reply_use_fdb_only,
+ self.link_trace_reply_fwd_yes,
+ self.link_trace_reply_terminal_mep,
+ self.link_trace_reply_transaction_id,
+ self.link_trace_reply_ttl,
+ self.link_trace_reply_relay_action,
+ self.link_trace_reply_tlvs)
+ self.ins = cfm.cfm(self.message)
+ data = bytearray()
+ prev = None
+ self.buf = self.ins.serialize(data, prev)
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(str(self.message), str(self.ins.op))
+
+ def test_init_cc_message(self):
+ self.setUp_cc_message()
+ self.test_init()
+
+ def test_init_loopback_message(self):
+ self.setUp_loopback_message()
+ self.test_init()
+
+ def test_init_loopback_reply(self):
+ self.setUp_loopback_reply()
+ self.test_init()
+
+ def test_init_link_trace_message(self):
+ self.setUp_link_trace_message()
+ self.test_init()
+
+ def test_init_link_trace_reply(self):
+ self.setUp_link_trace_reply()
+ self.test_init()
+
+ def test_parser(self):
+ _res = self.ins.parser(six.binary_type(self.buf))
+
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(str(self.message), str(res.op))
+
+ def test_parser_with_cc_message(self):
+ self.setUp_cc_message()
+ self.test_parser()
+
+ def test_parser_with_loopback_message(self):
+ self.setUp_loopback_message()
+ self.test_parser()
+
+ def test_parser_with_loopback_reply(self):
+ self.setUp_loopback_reply()
+ self.test_parser()
+
+ def test_parser_with_link_trace_message(self):
+ self.setUp_link_trace_message()
+ self.test_parser()
+
+ def test_parser_with_link_trace_reply(self):
+ self.setUp_link_trace_reply()
+ self.test_parser()
+
+ def test_serialize(self):
+ pass
+
+ def test_serialize_with_cc_message(self):
+ self.setUp_cc_message()
+ self.test_serialize()
+ data = bytearray()
+ prev = None
+ buf = self.ins.serialize(data, prev)
+ cc_message = cfm.cc_message.parser(six.binary_type(buf))
+ eq_(repr(self.message), repr(cc_message))
+
+ def test_serialize_with_loopback_message(self):
+ self.setUp_loopback_message()
+ self.test_serialize()
+ data = bytearray()
+ prev = None
+ buf = self.ins.serialize(data, prev)
+ loopback_message = cfm.loopback_message.parser(six.binary_type(buf))
+ eq_(repr(self.message), repr(loopback_message))
+
+ def test_serialize_with_loopback_reply(self):
+ self.setUp_loopback_reply()
+ self.test_serialize()
+ data = bytearray()
+ prev = None
+ buf = self.ins.serialize(data, prev)
+ loopback_reply = cfm.loopback_reply.parser(six.binary_type(buf))
+ eq_(repr(self.message), repr(loopback_reply))
+
+ def test_serialize_with_link_trace_message(self):
+ self.setUp_link_trace_message()
+ self.test_serialize()
+ data = bytearray()
+ prev = None
+ buf = self.ins.serialize(data, prev)
+ link_trace_message = cfm.link_trace_message.parser(six.binary_type(buf))
+ eq_(repr(self.message), repr(link_trace_message))
+
+ def test_serialize_with_link_trace_reply(self):
+ self.setUp_link_trace_reply()
+ self.test_serialize()
+ data = bytearray()
+ prev = None
+ buf = self.ins.serialize(data, prev)
+ link_trace_reply = cfm.link_trace_reply.parser(six.binary_type(buf))
+ eq_(repr(self.message), repr(link_trace_reply))
+
+ def test_to_string(self):
+ cfm_values = {'op': self.message}
+ _cfm_str = ','.join(['%s=%s' % (k, cfm_values[k])
+ for k, v in inspect.getmembers(self.ins)
+ if k in cfm_values])
+ cfm_str = '%s(%s)' % (cfm.cfm.__name__, _cfm_str)
+ eq_(str(self.ins), cfm_str)
+ eq_(repr(self.ins), cfm_str)
+
+ def test_to_string_cc_message(self):
+ self.setUp_cc_message()
+ self.test_to_string()
+
+ def test_to_string_loopback_message(self):
+ self.setUp_loopback_message()
+ self.test_to_string()
+
+ def test_to_string_loopback_reply(self):
+ self.setUp_loopback_reply()
+ self.test_to_string()
+
+ def test_to_string_link_trace_message(self):
+ self.setUp_link_trace_message()
+ self.test_to_string()
+
+ def test_to_string_link_trace_reply(self):
+ self.setUp_link_trace_reply()
+ self.test_to_string()
+
+ def test_len(self):
+ pass
+
+ def test_len_cc_message(self):
+ self.setUp_cc_message()
+ eq_(len(self.ins), 0 + len(self.message))
+
+ def test_len_loopback_message(self):
+ self.setUp_loopback_message()
+ eq_(len(self.ins), 0 + len(self.message))
+
+ def test_len_loopback_reply(self):
+ self.setUp_loopback_reply()
+ eq_(len(self.ins), 0 + len(self.message))
+
+ def test_len_link_trace_message(self):
+ self.setUp_link_trace_message()
+ eq_(len(self.ins), 0 + len(self.message))
+
+ def test_len_link_trace_reply(self):
+ self.setUp_link_trace_reply()
+ eq_(len(self.ins), 0 + len(self.message))
+
+ def test_default_args(self):
+ pass
+
+ def test_json(self):
+ jsondict = self.ins.to_jsondict()
+ ins = cfm.cfm.from_jsondict(jsondict['cfm'])
+ eq_(str(self.ins), str(ins))
+
+ def test_json_with_cc_message(self):
+ self.setUp_cc_message()
+ self.test_json()
+
+ def test_json_with_loopback_message(self):
+ self.setUp_loopback_message()
+ self.test_json()
+
+ def test_json_with_loopback_reply(self):
+ self.setUp_loopback_reply()
+ self.test_json()
+
+ def test_json_with_link_trace_message(self):
+ self.setUp_link_trace_message()
+ self.test_json()
+
+ def test_json_with_link_trace_reply(self):
+ self.setUp_link_trace_reply()
+ self.test_json()
+
+
+class Test_cc_message(unittest.TestCase):
+
+ def setUp(self):
+ self.md_lv = 1
+ self.version = 1
+ self.opcode = cfm.CFM_CC_MESSAGE
+ self.rdi = 1
+ self.interval = 5
+ self.first_tlv_offset = cfm.cc_message._TLV_OFFSET
+ self.seq_num = 2
+ self.mep_id = 2
+ self.md_name_format = cfm.cc_message._MD_FMT_CHARACTER_STRING
+ self.md_name_length = 3
+ self.md_name = b"foo"
+ self.short_ma_name_format = 2
+ self.short_ma_name_length = 8
+ self.short_ma_name = b"hogehoge"
+ self.tlvs = [
+ ]
+ self.end_tlv = 0
+ self.ins = cfm.cc_message(
+ self.md_lv,
+ self.version,
+ self.rdi,
+ self.interval,
+ self.seq_num,
+ self.mep_id,
+ self.md_name_format,
+ self.md_name_length,
+ self.md_name,
+ self.short_ma_name_format,
+ self.short_ma_name_length,
+ self.short_ma_name,
+ self.tlvs
+ )
+
+ self.form = '!4BIH2B3s2B8s33x12x4xB'
+ self.buf = struct.pack(
+ self.form,
+ (self.md_lv << 5) | self.version,
+ self.opcode,
+ (self.rdi << 7) | self.interval,
+ self.first_tlv_offset,
+ self.seq_num,
+ self.mep_id,
+ self.md_name_format,
+ self.md_name_length,
+ self.md_name,
+ self.short_ma_name_format,
+ self.short_ma_name_length,
+ self.short_ma_name,
+ self.end_tlv
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.md_lv, self.ins.md_lv)
+ eq_(self.version, self.ins.version)
+ eq_(self.rdi, self.ins.rdi)
+ eq_(self.interval, self.ins.interval)
+ eq_(self.seq_num, self.ins.seq_num)
+ eq_(self.mep_id, self.ins.mep_id)
+ eq_(self.md_name_format, self.ins.md_name_format)
+ eq_(self.md_name_length, self.ins.md_name_length)
+ eq_(self.md_name, self.ins.md_name)
+ eq_(self.short_ma_name_format, self.ins.short_ma_name_format)
+ eq_(self.short_ma_name_length, self.ins.short_ma_name_length)
+ eq_(self.short_ma_name, self.ins.short_ma_name)
+ eq_(self.tlvs, self.ins.tlvs)
+
+ def test_parser(self):
+ _res = cfm.cc_message.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.md_lv, res.md_lv)
+ eq_(self.version, res.version)
+ eq_(self.rdi, res.rdi)
+ eq_(self.interval, res.interval)
+ eq_(self.seq_num, res.seq_num)
+ eq_(self.mep_id, res.mep_id)
+ eq_(self.md_name_format, res.md_name_format)
+ eq_(self.md_name_length, res.md_name_length)
+ eq_(self.md_name, res.md_name)
+ eq_(self.short_ma_name_format, res.short_ma_name_format)
+ eq_(self.short_ma_name_length, res.short_ma_name_length)
+ eq_(self.short_ma_name, res.short_ma_name)
+ eq_(self.tlvs, res.tlvs)
+
+ def test_parser_with_no_maintenance_domain_name_present(self):
+ form = '!4BIH3B8s37x12x4xB'
+ buf = struct.pack(
+ form,
+ (self.md_lv << 5) | self.version,
+ self.opcode,
+ (self.rdi << 7) | self.interval,
+ self.first_tlv_offset,
+ self.seq_num,
+ self.mep_id,
+ cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT,
+ self.short_ma_name_format,
+ self.short_ma_name_length,
+ self.short_ma_name,
+ self.end_tlv
+ )
+ _res = cfm.cc_message.parser(buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.md_lv, res.md_lv)
+ eq_(self.version, res.version)
+ eq_(self.rdi, res.rdi)
+ eq_(self.interval, res.interval)
+ eq_(self.seq_num, res.seq_num)
+ eq_(self.mep_id, res.mep_id)
+ eq_(cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT, res.md_name_format)
+ eq_(self.short_ma_name_format, res.short_ma_name_format)
+ eq_(self.short_ma_name_length, res.short_ma_name_length)
+ eq_(self.short_ma_name, res.short_ma_name)
+ eq_(self.tlvs, res.tlvs)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self.md_lv, res[0] >> 5)
+ eq_(self.version, res[0] & 0x1f)
+ eq_(self.opcode, res[1])
+ eq_(self.rdi, res[2] >> 7)
+ eq_(self.interval, res[2] & 0x07)
+ eq_(self.first_tlv_offset, res[3])
+ eq_(self.seq_num, res[4])
+ eq_(self.mep_id, res[5])
+ eq_(self.md_name_format, res[6])
+ eq_(self.md_name_length, res[7])
+ eq_(self.md_name, res[8])
+ eq_(self.short_ma_name_format, res[9])
+ eq_(self.short_ma_name_length, res[10])
+ eq_(self.short_ma_name, res[11])
+ eq_(self.end_tlv, res[12])
+
+ def test_serialize_with_md_name_length_zero(self):
+ ins = cfm.cc_message(
+ self.md_lv,
+ self.version,
+ self.rdi,
+ self.interval,
+ self.seq_num,
+ self.mep_id,
+ self.md_name_format,
+ 0,
+ self.md_name,
+ self.short_ma_name_format,
+ 0,
+ self.short_ma_name,
+ self.tlvs
+ )
+ buf = ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self.md_lv, res[0] >> 5)
+ eq_(self.version, res[0] & 0x1f)
+ eq_(self.opcode, res[1])
+ eq_(self.rdi, res[2] >> 7)
+ eq_(self.interval, res[2] & 0x07)
+ eq_(self.first_tlv_offset, res[3])
+ eq_(self.seq_num, res[4])
+ eq_(self.mep_id, res[5])
+ eq_(self.md_name_format, res[6])
+ eq_(self.md_name_length, res[7])
+ eq_(self.md_name, res[8])
+ eq_(self.short_ma_name_format, res[9])
+ eq_(self.short_ma_name_length, res[10])
+ eq_(self.short_ma_name, res[11])
+ eq_(self.end_tlv, res[12])
+
+ def test_serialize_with_no_maintenance_domain_name_present(self):
+ form = '!4BIH3B8s37x12x4xB'
+ ins = cfm.cc_message(
+ self.md_lv,
+ self.version,
+ self.rdi,
+ self.interval,
+ self.seq_num,
+ self.mep_id,
+ cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT,
+ 0,
+ self.md_name,
+ self.short_ma_name_format,
+ 0,
+ self.short_ma_name,
+ self.tlvs
+ )
+ buf = ins.serialize()
+ res = struct.unpack_from(form, six.binary_type(buf))
+ eq_(self.md_lv, res[0] >> 5)
+ eq_(self.version, res[0] & 0x1f)
+ eq_(self.opcode, res[1])
+ eq_(self.rdi, res[2] >> 7)
+ eq_(self.interval, res[2] & 0x07)
+ eq_(self.first_tlv_offset, res[3])
+ eq_(self.seq_num, res[4])
+ eq_(self.mep_id, res[5])
+ eq_(cfm.cc_message._MD_FMT_NO_MD_NAME_PRESENT, res[6])
+ eq_(self.short_ma_name_format, res[7])
+ eq_(self.short_ma_name_length, res[8])
+ eq_(self.short_ma_name, res[9])
+ eq_(self.end_tlv, res[10])
+
+ def test_len(self):
+ # 75 octet (If tlv does not exist)
+ eq_(75, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.cc_message()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.cc_message._PACK_STR, six.binary_type(buf))
+ eq_(res[0] >> 5, 0)
+ eq_(res[0] & 0x1f, 0)
+ eq_(res[1], 1)
+ eq_(res[2] >> 7, 0)
+ eq_(res[2] & 0x07, 4)
+ eq_(res[3], 70)
+ eq_(res[4], 0)
+ eq_(res[5], 1)
+ eq_(res[6], 4)
+
+
+class Test_loopback_message(unittest.TestCase):
+
+ def setUp(self):
+ self.md_lv = 1
+ self.version = 1
+ self.opcode = cfm.CFM_LOOPBACK_MESSAGE
+ self.flags = 0
+ self.first_tlv_offset = cfm.loopback_message._TLV_OFFSET
+ self.transaction_id = 12345
+ self.tlvs = [
+ ]
+
+ self.end_tlv = 0
+ self.ins = cfm.loopback_message(
+ self.md_lv,
+ self.version,
+ self.transaction_id,
+ self.tlvs,
+ )
+ self.form = '!4BIB'
+ self.buf = struct.pack(
+ self.form,
+ (self.md_lv << 5) | self.version,
+ self.opcode,
+ self.flags,
+ self.first_tlv_offset,
+ self.transaction_id,
+ self.end_tlv
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.md_lv, self.ins.md_lv)
+ eq_(self.version, self.ins.version)
+ eq_(self.transaction_id, self.ins.transaction_id)
+ eq_(self.tlvs, self.ins.tlvs)
+
+ def test_parser(self):
+ _res = cfm.loopback_message.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.md_lv, res.md_lv)
+ eq_(self.version, res.version)
+ eq_(self.transaction_id, res.transaction_id)
+ eq_(self.tlvs, res.tlvs)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self.md_lv, res[0] >> 5)
+ eq_(self.version, res[0] & 0x1f)
+ eq_(self.opcode, res[1])
+ eq_(self.flags, res[2])
+ eq_(self.first_tlv_offset, res[3])
+ eq_(self.transaction_id, res[4])
+ eq_(self.end_tlv, res[5])
+
+ def test_len(self):
+ # 9 octet (If tlv does not exist)
+ eq_(9, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.loopback_message()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.loopback_message._PACK_STR,
+ six.binary_type(buf))
+ eq_(res[0] >> 5, 0)
+ eq_(res[0] & 0x1f, 0)
+ eq_(res[1], 3)
+ eq_(res[2], 0)
+ eq_(res[3], 4)
+ eq_(res[4], 0)
+
+
+class Test_loopback_reply(unittest.TestCase):
+
+ def setUp(self):
+ self.md_lv = 1
+ self.version = 1
+ self.opcode = cfm.CFM_LOOPBACK_REPLY
+ self.flags = 0
+ self.first_tlv_offset = cfm.loopback_reply._TLV_OFFSET
+ self.transaction_id = 12345
+ self.tlvs = [
+ ]
+ self.end_tlv = 0
+ self.ins = cfm.loopback_reply(
+ self.md_lv,
+ self.version,
+ self.transaction_id,
+ self.tlvs,
+ )
+ self.form = '!4BIB'
+ self.buf = struct.pack(
+ self.form,
+ (self.md_lv << 5) | self.version,
+ self.opcode,
+ self.flags,
+ self.first_tlv_offset,
+ self.transaction_id,
+ self.end_tlv
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.md_lv, self.ins.md_lv)
+ eq_(self.version, self.ins.version)
+ eq_(self.transaction_id, self.ins.transaction_id)
+ eq_(self.tlvs, self.ins.tlvs)
+
+ def test_parser(self):
+ _res = cfm.loopback_reply.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.md_lv, res.md_lv)
+ eq_(self.version, res.version)
+ eq_(self.transaction_id, res.transaction_id)
+ eq_(self.tlvs, res.tlvs)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self.md_lv, res[0] >> 5)
+ eq_(self.version, res[0] & 0x1f)
+ eq_(self.opcode, res[1])
+ eq_(self.flags, res[2])
+ eq_(self.first_tlv_offset, res[3])
+ eq_(self.transaction_id, res[4])
+ eq_(self.end_tlv, res[5])
+
+ def test_len(self):
+ # 9 octet (If tlv does not exist)
+ eq_(9, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.loopback_reply()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.loopback_reply._PACK_STR, six.binary_type(buf))
+ eq_(res[0] >> 5, 0)
+ eq_(res[0] & 0x1f, 0)
+ eq_(res[1], 2)
+ eq_(res[2], 0)
+ eq_(res[3], 4)
+ eq_(res[4], 0)
+
+
+class Test_link_trace_message(unittest.TestCase):
+
+ def setUp(self):
+ self.md_lv = 1
+ self.version = 1
+ self.opcode = cfm.CFM_LINK_TRACE_MESSAGE
+ self.use_fdb_only = 1
+ self.first_tlv_offset = cfm.link_trace_message._TLV_OFFSET
+ self.transaction_id = 12345
+ self.ttl = 55
+ self.ltm_orig_addr = "00:11:22:44:55:66"
+ self.ltm_targ_addr = "ab:cd:ef:23:12:65"
+ self.tlvs = [
+ ]
+
+ self.end_tlv = 0
+ self.ins = cfm.link_trace_message(
+ self.md_lv,
+ self.version,
+ self.use_fdb_only,
+ self.transaction_id,
+ self.ttl,
+ self.ltm_orig_addr,
+ self.ltm_targ_addr,
+ self.tlvs
+ )
+ self.form = '!4BIB6s6sB'
+ self.buf = struct.pack(
+ self.form,
+ (self.md_lv << 5) | self.version,
+ self.opcode,
+ self.use_fdb_only << 7,
+ self.first_tlv_offset,
+ self.transaction_id,
+ self.ttl,
+ addrconv.mac.text_to_bin(self.ltm_orig_addr),
+ addrconv.mac.text_to_bin(self.ltm_targ_addr),
+ self.end_tlv
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.md_lv, self.ins.md_lv)
+ eq_(self.version, self.ins.version)
+ eq_(self.use_fdb_only, self.ins.use_fdb_only)
+ eq_(self.transaction_id, self.ins.transaction_id)
+ eq_(self.ttl, self.ins.ttl)
+ eq_(self.ltm_orig_addr, self.ins.ltm_orig_addr)
+ eq_(self.ltm_targ_addr, self.ins.ltm_targ_addr)
+ eq_(self.tlvs, self.ins.tlvs)
+
+ def test_parser(self):
+ _res = cfm.link_trace_message.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.md_lv, res.md_lv)
+ eq_(self.version, res.version)
+ eq_(self.use_fdb_only, res.use_fdb_only)
+ eq_(self.transaction_id, res.transaction_id)
+ eq_(self.ttl, res.ttl)
+ eq_(self.ltm_orig_addr, res.ltm_orig_addr)
+ eq_(self.ltm_targ_addr, res.ltm_targ_addr)
+ eq_(self.tlvs, res.tlvs)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self.md_lv, res[0] >> 5)
+ eq_(self.version, res[0] & 0x1f)
+ eq_(self.opcode, res[1])
+ eq_(self.use_fdb_only, res[2] >> 7)
+ eq_(self.first_tlv_offset, res[3])
+ eq_(self.transaction_id, res[4])
+ eq_(self.ttl, res[5])
+ eq_(addrconv.mac.text_to_bin(self.ltm_orig_addr), res[6])
+ eq_(addrconv.mac.text_to_bin(self.ltm_targ_addr), res[7])
+ eq_(self.end_tlv, res[8])
+
+ def test_len(self):
+ # 22 octet (If tlv does not exist)
+ eq_(22, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.link_trace_message()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.link_trace_message._PACK_STR, six.binary_type(buf))
+ eq_(res[0] >> 5, 0)
+ eq_(res[0] & 0x1f, 0)
+ eq_(res[1], 5)
+ eq_(res[2] >> 7, 1)
+ eq_(res[3], 17)
+ eq_(res[4], 0)
+ eq_(res[5], 64)
+ eq_(res[6], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+ eq_(res[7], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+
+class Test_link_trace_reply(unittest.TestCase):
+
+ def setUp(self):
+ self.md_lv = 1
+ self.version = 1
+ self.opcode = cfm.CFM_LINK_TRACE_REPLY
+ self.use_fdb_only = 1
+ self.fwd_yes = 0
+ self.terminal_mep = 1
+ self.first_tlv_offset = cfm.link_trace_reply._TLV_OFFSET
+ self.transaction_id = 12345
+ self.ttl = 55
+ self.relay_action = 2
+ self.ltm_orig_addr = "00:11:22:aa:bb:cc"
+ self.ltm_targ_addr = "53:45:24:64:ac:ff"
+ self.tlvs = [
+ ]
+ self.end_tlv = 0
+ self.ins = cfm.link_trace_reply(
+ self.md_lv,
+ self.version,
+ self.use_fdb_only,
+ self.fwd_yes,
+ self.terminal_mep,
+ self.transaction_id,
+ self.ttl,
+ self.relay_action,
+ self.tlvs,
+ )
+ self.form = '!4BIBBB'
+ self.buf = struct.pack(
+ self.form,
+ (self.md_lv << 5) | self.version,
+ self.opcode,
+ (self.use_fdb_only << 7) | (self.fwd_yes << 6) |
+ (self.terminal_mep << 5),
+ self.first_tlv_offset,
+ self.transaction_id,
+ self.ttl,
+ self.relay_action,
+ self.end_tlv
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.md_lv, self.ins.md_lv)
+ eq_(self.version, self.ins.version)
+ eq_(self.use_fdb_only, self.ins.use_fdb_only)
+ eq_(self.fwd_yes, self.ins.fwd_yes)
+ eq_(self.terminal_mep, self.ins.terminal_mep)
+ eq_(self.transaction_id, self.ins.transaction_id)
+ eq_(self.ttl, self.ins.ttl)
+ eq_(self.relay_action, self.ins.relay_action)
+ eq_(self.tlvs, self.ins.tlvs)
+
+ def test_parser(self):
+ _res = cfm.link_trace_reply.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.md_lv, res.md_lv)
+ eq_(self.version, res.version)
+ eq_(self.use_fdb_only, self.ins.use_fdb_only)
+ eq_(self.fwd_yes, self.ins.fwd_yes)
+ eq_(self.terminal_mep, self.ins.terminal_mep)
+ eq_(self.transaction_id, res.transaction_id)
+ eq_(self.ttl, res.ttl)
+ eq_(self.relay_action, res.relay_action)
+ eq_(self.tlvs, res.tlvs)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self.md_lv, res[0] >> 5)
+ eq_(self.version, res[0] & 0x1f)
+ eq_(self.opcode, res[1])
+ eq_(self.use_fdb_only, res[2] >> 7 & 0x01)
+ eq_(self.fwd_yes, res[2] >> 6 & 0x01)
+ eq_(self.terminal_mep, res[2] >> 5 & 0x01)
+ eq_(self.first_tlv_offset, res[3])
+ eq_(self.transaction_id, res[4])
+ eq_(self.ttl, res[5])
+ eq_(self.relay_action, res[6])
+ eq_(self.end_tlv, res[7])
+
+ def test_len(self):
+ # 11 octet (If tlv does not exist)
+ eq_(11, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.link_trace_reply()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.link_trace_reply._PACK_STR, six.binary_type(buf))
+ eq_(res[0] >> 5, 0)
+ eq_(res[0] & 0x1f, 0)
+ eq_(res[1], 4)
+ eq_(res[2] >> 7, 1)
+ eq_(res[2] >> 6 & 0x01, 0)
+ eq_(res[2] >> 5 & 0x01, 1)
+ eq_(res[3], 6)
+ eq_(res[4], 0)
+ eq_(res[5], 64)
+ eq_(res[6], 1)
+
+
+class Test_sender_id_tlv(unittest.TestCase):
+
+ def setUp(self):
+ self._type = cfm.CFM_SENDER_ID_TLV
+ self.length = 10
+ self.chassis_id_length = 1
+ self.chassis_id_subtype = 3
+ self.chassis_id = b"\x0a"
+ self.ma_domain_length = 2
+ self.ma_domain = b"\x04\x05"
+ self.ma_length = 3
+ self.ma = b"\x01\x02\x03"
+ self.ins = cfm.sender_id_tlv(
+ self.length,
+ self.chassis_id_length,
+ self.chassis_id_subtype,
+ self.chassis_id,
+ self.ma_domain_length,
+ self.ma_domain,
+ self.ma_length,
+ self.ma,
+ )
+ self.form = '!BHBB1sB2sB3s'
+ self.buf = struct.pack(
+ self.form,
+ self._type,
+ self.length,
+ self.chassis_id_length,
+ self.chassis_id_subtype,
+ self.chassis_id,
+ self.ma_domain_length,
+ self.ma_domain,
+ self.ma_length,
+ self.ma
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.length, self.ins.length)
+ eq_(self.chassis_id_length, self.ins.chassis_id_length)
+ eq_(self.chassis_id_subtype, self.ins.chassis_id_subtype)
+ eq_(self.chassis_id, self.ins.chassis_id)
+ eq_(self.ma_domain_length, self.ins.ma_domain_length)
+ eq_(self.ma_domain, self.ins.ma_domain)
+ eq_(self.ma_length, self.ins.ma_length)
+ eq_(self.ma, self.ins.ma)
+
+ def test_parser(self):
+ _res = cfm.sender_id_tlv.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.length, res.length)
+ eq_(self.chassis_id_length, res.chassis_id_length)
+ eq_(self.chassis_id_subtype, res.chassis_id_subtype)
+ eq_(self.chassis_id, res.chassis_id)
+ eq_(self.ma_domain_length, res.ma_domain_length)
+ eq_(self.ma_domain, res.ma_domain)
+ eq_(self.ma_length, res.ma_length)
+ eq_(self.ma, res.ma)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.chassis_id_length, res[2])
+ eq_(self.chassis_id_subtype, res[3])
+ eq_(self.chassis_id, res[4])
+ eq_(self.ma_domain_length, res[5])
+ eq_(self.ma_domain, res[6])
+ eq_(self.ma_length, res[7])
+ eq_(self.ma, res[8])
+
+ def test_serialize_semi_normal_ptn1(self):
+ ins = cfm.sender_id_tlv(
+ chassis_id_subtype=self.chassis_id_subtype,
+ chassis_id=self.chassis_id,
+ ma_domain=self.ma_domain,
+ )
+ buf = ins.serialize()
+ form = '!BHBB1sB2sB'
+ res = struct.unpack_from(form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(7, res[1])
+ eq_(self.chassis_id_length, res[2])
+ eq_(self.chassis_id_subtype, res[3])
+ eq_(self.chassis_id, res[4])
+ eq_(self.ma_domain_length, res[5])
+ eq_(self.ma_domain, res[6])
+ eq_(0, res[7])
+
+ def test_serialize_semi_normal_ptn2(self):
+ ins = cfm.sender_id_tlv(
+ ma_domain=self.ma_domain,
+ ma=self.ma,
+ )
+ buf = ins.serialize()
+ form = '!BHBB2sB3s'
+ res = struct.unpack_from(form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(8, res[1])
+ eq_(0, res[2])
+ eq_(self.ma_domain_length, res[3])
+ eq_(self.ma_domain, res[4])
+ eq_(self.ma_length, res[5])
+ eq_(self.ma, res[6])
+
+ def test_serialize_semi_normal_ptn3(self):
+ ins = cfm.sender_id_tlv(
+ chassis_id_subtype=self.chassis_id_subtype,
+ chassis_id=self.chassis_id,
+ )
+ buf = ins.serialize()
+ form = '!BHBB1sB'
+ res = struct.unpack_from(form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(4, res[1])
+ eq_(self.chassis_id_length, res[2])
+ eq_(self.chassis_id_subtype, res[3])
+ eq_(self.chassis_id, res[4])
+ eq_(0, res[5])
+
+ def test_serialize_semi_normal_ptn4(self):
+ ins = cfm.sender_id_tlv(
+ ma_domain=self.ma_domain,
+ )
+ buf = ins.serialize()
+ form = '!BHBB2sB'
+ res = struct.unpack_from(form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(5, res[1])
+ eq_(0, res[2])
+ eq_(self.ma_domain_length, res[3])
+ eq_(self.ma_domain, res[4])
+ eq_(0, res[5])
+
+ def test_serialize_with_length_zero(self):
+ ins = cfm.sender_id_tlv(
+ 0,
+ 0,
+ self.chassis_id_subtype,
+ self.chassis_id,
+ 0,
+ self.ma_domain,
+ 0,
+ self.ma,
+ )
+ buf = ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.chassis_id_length, res[2])
+ eq_(self.chassis_id_subtype, res[3])
+ eq_(self.chassis_id, res[4])
+ eq_(self.ma_domain_length, res[5])
+ eq_(self.ma_domain, res[6])
+ eq_(self.ma_length, res[7])
+ eq_(self.ma, res[8])
+
+ def test_len(self):
+ # tlv_length = type_len + length_len + value_len
+ eq_(1 + 2 + 10, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.sender_id_tlv()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.sender_id_tlv._PACK_STR, six.binary_type(buf))
+ eq_(res[0], cfm.CFM_SENDER_ID_TLV)
+ eq_(res[1], 1)
+ eq_(res[2], 0)
+
+
+class Test_port_status_tlv(unittest.TestCase):
+
+ def setUp(self):
+ self._type = cfm.CFM_PORT_STATUS_TLV
+ self.length = 1
+ self.port_status = 1
+ self.ins = cfm.port_status_tlv(
+ self.length,
+ self.port_status
+ )
+ self.form = '!BHB'
+ self.buf = struct.pack(
+ self.form,
+ self._type,
+ self.length,
+ self.port_status
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.length, self.ins.length)
+ eq_(self.port_status, self.ins.port_status)
+
+ def test_parser(self):
+ _res = cfm.port_status_tlv.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.length, res.length)
+ eq_(self.port_status, res.port_status)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.port_status, res[2])
+
+ def test_len(self):
+ # tlv_length = type_len + length_len + value_len
+ eq_(1 + 2 + 1, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.port_status_tlv()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.port_status_tlv._PACK_STR, six.binary_type(buf))
+ eq_(res[0], cfm.CFM_PORT_STATUS_TLV)
+ eq_(res[1], 1)
+ eq_(res[2], 2)
+
+
+class Test_data_tlv(unittest.TestCase):
+
+ def setUp(self):
+ self._type = cfm.CFM_DATA_TLV
+ self.length = 3
+ self.data_value = b"\x01\x02\x03"
+ self.ins = cfm.data_tlv(
+ self.length,
+ self.data_value
+ )
+ self.form = '!BH3s'
+ self.buf = struct.pack(
+ self.form,
+ self._type,
+ self.length,
+ self.data_value,
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.length, self.ins.length)
+ eq_(self.data_value, self.ins.data_value)
+
+ def test_parser(self):
+ _res = cfm.data_tlv.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.length, res.length)
+ eq_(self.data_value, res.data_value)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.data_value, res[2])
+
+ def test_serialize_with_length_zero(self):
+ ins = cfm.data_tlv(
+ 0,
+ self.data_value
+ )
+ buf = ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.data_value, res[2])
+
+ def test_len(self):
+ # tlv_length = type_len + length_len + value_len
+ eq_(1 + 2 + 3, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.data_tlv()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.data_tlv._PACK_STR, six.binary_type(buf))
+ eq_(res[0], cfm.CFM_DATA_TLV)
+ eq_(res[1], 0)
+
+
+class Test_interface_status_tlv(unittest.TestCase):
+
+ def setUp(self):
+ self._type = cfm.CFM_INTERFACE_STATUS_TLV
+ self.length = 1
+ self.interface_status = 4
+ self.ins = cfm.interface_status_tlv(
+ self.length,
+ self.interface_status
+ )
+ self.form = '!BHB'
+ self.buf = struct.pack(
+ self.form,
+ self._type,
+ self.length,
+ self.interface_status
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.length, self.ins.length)
+ eq_(self.interface_status, self.ins.interface_status)
+
+ def test_parser(self):
+ _res = cfm.interface_status_tlv.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.length, res.length)
+ eq_(self.interface_status, res.interface_status)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.interface_status, res[2])
+
+ def test_len(self):
+ # tlv_length = type_len + length_len + value_len
+ eq_(1 + 2 + 1, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.interface_status_tlv()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.interface_status_tlv._PACK_STR, six.binary_type(buf))
+ eq_(res[0], cfm.CFM_INTERFACE_STATUS_TLV)
+ eq_(res[1], 1)
+ eq_(res[2], 1)
+
+
+class Test_ltm_egress_identifier_tlv(unittest.TestCase):
+
+ def setUp(self):
+ self._type = cfm.CFM_LTM_EGRESS_IDENTIFIER_TLV
+ self.length = 8
+ self.egress_id_ui = 7
+ self.egress_id_mac = "11:22:33:44:55:66"
+ self.ins = cfm.ltm_egress_identifier_tlv(
+ self.length,
+ self.egress_id_ui,
+ self.egress_id_mac
+ )
+ self.form = '!BHH6s'
+ self.buf = struct.pack(
+ self.form,
+ self._type,
+ self.length,
+ self.egress_id_ui,
+ addrconv.mac.text_to_bin(self.egress_id_mac)
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.length, self.ins.length)
+ eq_(self.egress_id_ui, self.ins.egress_id_ui)
+ eq_(self.egress_id_mac, self.ins.egress_id_mac)
+
+ def test_parser(self):
+ _res = cfm.ltm_egress_identifier_tlv.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.length, res.length)
+ eq_(self.egress_id_ui, res.egress_id_ui)
+ eq_(self.egress_id_mac, res.egress_id_mac)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.egress_id_ui, res[2])
+ eq_(addrconv.mac.text_to_bin(self.egress_id_mac), res[3])
+
+ def test_serialize_with_length_zero(self):
+ ins = cfm.ltm_egress_identifier_tlv(
+ 0,
+ self.egress_id_ui,
+ self.egress_id_mac
+ )
+ buf = ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.egress_id_ui, res[2])
+ eq_(addrconv.mac.text_to_bin(self.egress_id_mac), res[3])
+
+ def test_len(self):
+ # tlv_length = type_len + length_len + value_len
+ eq_(1 + 2 + 8, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.ltm_egress_identifier_tlv()
+ buf = ins.serialize()
+ res = struct.unpack_from(
+ cfm.ltm_egress_identifier_tlv._PACK_STR, six.binary_type(buf))
+ eq_(res[0], cfm.CFM_LTM_EGRESS_IDENTIFIER_TLV)
+ eq_(res[1], 8)
+ eq_(res[2], 0)
+ eq_(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+
+class Test_ltr_egress_identifier_tlv(unittest.TestCase):
+
+ def setUp(self):
+ self._type = cfm.CFM_LTR_EGRESS_IDENTIFIER_TLV
+ self.length = 16
+ self.last_egress_id_ui = 7
+ self.last_egress_id_mac = "11:22:33:44:55:66"
+ self.next_egress_id_ui = 5
+ self.next_egress_id_mac = "33:11:33:aa:bb:cc"
+ self.ins = cfm.ltr_egress_identifier_tlv(self.length,
+ self.last_egress_id_ui,
+ self.last_egress_id_mac,
+ self.next_egress_id_ui,
+ self.next_egress_id_mac
+ )
+ self.form = '!BHH6sH6s'
+ self.buf = struct.pack(
+ self.form,
+ self._type,
+ self.length,
+ self.last_egress_id_ui,
+ addrconv.mac.text_to_bin(self.last_egress_id_mac),
+ self.next_egress_id_ui,
+ addrconv.mac.text_to_bin(self.next_egress_id_mac))
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.length, self.ins.length)
+ eq_(self.last_egress_id_ui, self.ins.last_egress_id_ui)
+ eq_(self.last_egress_id_mac, self.ins.last_egress_id_mac)
+ eq_(self.next_egress_id_ui, self.ins.next_egress_id_ui)
+ eq_(self.next_egress_id_mac, self.ins.next_egress_id_mac)
+
+ def test_parser(self):
+ _res = cfm.ltr_egress_identifier_tlv.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.length, res.length)
+ eq_(self.last_egress_id_ui, res.last_egress_id_ui)
+ eq_(self.last_egress_id_mac, res.last_egress_id_mac)
+ eq_(self.next_egress_id_ui, res.next_egress_id_ui)
+ eq_(self.next_egress_id_mac, res.next_egress_id_mac)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.last_egress_id_ui, res[2])
+ eq_(addrconv.mac.text_to_bin(self.last_egress_id_mac), res[3])
+ eq_(self.next_egress_id_ui, res[4])
+ eq_(addrconv.mac.text_to_bin(self.next_egress_id_mac), res[5])
+
+ def test_serialize_with_length_zero(self):
+ ins = cfm.ltr_egress_identifier_tlv(0,
+ self.last_egress_id_ui,
+ self.last_egress_id_mac,
+ self.next_egress_id_ui,
+ self.next_egress_id_mac
+ )
+ buf = ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.last_egress_id_ui, res[2])
+ eq_(addrconv.mac.text_to_bin(self.last_egress_id_mac), res[3])
+ eq_(self.next_egress_id_ui, res[4])
+ eq_(addrconv.mac.text_to_bin(self.next_egress_id_mac), res[5])
+
+ def test_len(self):
+ # tlv_length = type_len + length_len + value_len
+ eq_(1 + 2 + 16, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.ltr_egress_identifier_tlv()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.ltr_egress_identifier_tlv._PACK_STR,
+ six.binary_type(buf))
+ eq_(res[0], cfm.CFM_LTR_EGRESS_IDENTIFIER_TLV)
+ eq_(res[1], 16)
+ eq_(res[2], 0)
+ eq_(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+ eq_(res[4], 0)
+ eq_(res[5], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+
+class Test_organization_specific_tlv(unittest.TestCase):
+
+ def setUp(self):
+ self._type = cfm.CFM_ORGANIZATION_SPECIFIC_TLV
+ self.length = 10
+ self.oui = b"\xff\x12\x34"
+ self.subtype = 3
+ self.value = b"\x01\x02\x0f\x0e\x0d\x0c"
+ self.ins = cfm.organization_specific_tlv(self.length,
+ self.oui,
+ self.subtype,
+ self.value
+ )
+ self.form = '!BH3sB6s'
+ self.buf = struct.pack(self.form,
+ self._type,
+ self.length,
+ self.oui,
+ self.subtype,
+ self.value
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.length, self.ins.length)
+ eq_(self.oui, self.ins.oui)
+ eq_(self.subtype, self.ins.subtype)
+ eq_(self.value, self.ins.value)
+
+ def test_parser(self):
+ _res = cfm.organization_specific_tlv.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.length, res.length)
+ eq_(self.oui, res.oui)
+ eq_(self.subtype, res.subtype)
+ eq_(self.value, res.value)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.oui, res[2])
+ eq_(self.subtype, res[3])
+ eq_(self.value, res[4])
+
+ def test_serialize_with_zero(self):
+ ins = cfm.organization_specific_tlv(0,
+ self.oui,
+ self.subtype,
+ self.value
+ )
+ buf = ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.oui, res[2])
+ eq_(self.subtype, res[3])
+ eq_(self.value, res[4])
+
+ def test_len(self):
+ # tlv_length = type_len + length_len + value_len
+ eq_(1 + 2 + 10, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.organization_specific_tlv()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.organization_specific_tlv._PACK_STR,
+ six.binary_type(buf))
+ eq_(res[0], cfm.CFM_ORGANIZATION_SPECIFIC_TLV)
+ eq_(res[1], 4)
+ eq_(res[2], b"\x00\x00\x00")
+ eq_(res[3], 0)
+
+
+class Test_reply_ingress_tlv(unittest.TestCase):
+
+ def setUp(self):
+ self._type = cfm.CFM_REPLY_INGRESS_TLV
+ self.length = 12
+ self.action = 2
+ self.mac_address = 'aa:bb:cc:56:34:12'
+ self.port_id_length = 3
+ self.port_id_subtype = 2
+ self.port_id = b"\x01\x04\x09"
+ self.ins = cfm.reply_ingress_tlv(self.length, self.action,
+ self.mac_address,
+ self.port_id_length,
+ self.port_id_subtype,
+ self.port_id
+ )
+ self.form = '!BHB6sBB3s'
+ self.buf = struct.pack(self.form,
+ self._type,
+ self.length,
+ self.action,
+ addrconv.mac.text_to_bin(self.mac_address),
+ self.port_id_length,
+ self.port_id_subtype,
+ self.port_id
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.length, self.ins.length)
+ eq_(self.action, self.ins.action)
+ eq_(self.mac_address, self.ins.mac_address)
+ eq_(self.port_id_length, self.ins.port_id_length)
+ eq_(self.port_id_subtype, self.ins.port_id_subtype)
+ eq_(self.port_id, self.ins.port_id)
+
+ def test_parser(self):
+ _res = cfm.reply_ingress_tlv.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.length, res.length)
+ eq_(self.action, res.action)
+ eq_(self.mac_address, res.mac_address)
+ eq_(self.port_id_length, res.port_id_length)
+ eq_(self.port_id_subtype, res.port_id_subtype)
+ eq_(self.port_id, res.port_id)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.action, res[2])
+ eq_(addrconv.mac.text_to_bin(self.mac_address), res[3])
+ eq_(self.port_id_length, res[4])
+ eq_(self.port_id_subtype, res[5])
+ eq_(self.port_id, res[6])
+
+ def test_serialize_with_zero(self):
+ ins = cfm.reply_ingress_tlv(0,
+ self.action,
+ self.mac_address,
+ 0,
+ self.port_id_subtype,
+ self.port_id
+ )
+ buf = ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.action, res[2])
+ eq_(addrconv.mac.text_to_bin(self.mac_address), res[3])
+ eq_(self.port_id_length, res[4])
+ eq_(self.port_id_subtype, res[5])
+ eq_(self.port_id, res[6])
+
+ def test_len(self):
+ # tlv_length = type_len + length_len + value_len
+ eq_(1 + 2 + 12, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.reply_ingress_tlv()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.reply_ingress_tlv._PACK_STR, six.binary_type(buf))
+ eq_(res[0], cfm.CFM_REPLY_INGRESS_TLV)
+ eq_(res[1], 7)
+ eq_(res[2], 1)
+ eq_(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+
+class Test_reply_egress_tlv(unittest.TestCase):
+
+ def setUp(self):
+ self._type = cfm.CFM_REPLY_EGRESS_TLV
+ self.length = 12
+ self.action = 2
+ self.mac_address = 'aa:bb:cc:56:34:12'
+ self.port_id_length = 3
+ self.port_id_subtype = 2
+ self.port_id = b"\x01\x04\x09"
+ self.ins = cfm.reply_egress_tlv(self.length,
+ self.action,
+ self.mac_address,
+ self.port_id_length,
+ self.port_id_subtype,
+ self.port_id
+ )
+ self.form = '!BHB6sBB3s'
+ self.buf = struct.pack(self.form,
+ self._type,
+ self.length,
+ self.action,
+ addrconv.mac.text_to_bin(self.mac_address),
+ self.port_id_length,
+ self.port_id_subtype,
+ self.port_id
+ )
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.length, self.ins.length)
+ eq_(self.action, self.ins.action)
+ eq_(self.mac_address, self.ins.mac_address)
+ eq_(self.port_id_length, self.ins.port_id_length)
+ eq_(self.port_id_subtype, self.ins.port_id_subtype)
+ eq_(self.port_id, self.ins.port_id)
+
+ def test_parser(self):
+ _res = cfm.reply_ingress_tlv.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.length, res.length)
+ eq_(self.action, res.action)
+ eq_(self.mac_address, res.mac_address)
+ eq_(self.port_id_length, res.port_id_length)
+ eq_(self.port_id_subtype, res.port_id_subtype)
+ eq_(self.port_id, res.port_id)
+
+ def test_serialize(self):
+ buf = self.ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.action, res[2])
+ eq_(addrconv.mac.text_to_bin(self.mac_address), res[3])
+ eq_(self.port_id_length, res[4])
+ eq_(self.port_id_subtype, res[5])
+ eq_(self.port_id, res[6])
+
+ def test_serialize_with_zero(self):
+ ins = cfm.reply_egress_tlv(0,
+ self.action,
+ self.mac_address,
+ 0,
+ self.port_id_subtype,
+ self.port_id
+ )
+ buf = ins.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self._type, res[0])
+ eq_(self.length, res[1])
+ eq_(self.action, res[2])
+ eq_(addrconv.mac.text_to_bin(self.mac_address), res[3])
+ eq_(self.port_id_length, res[4])
+ eq_(self.port_id_subtype, res[5])
+ eq_(self.port_id, res[6])
+
+ def test_len(self):
+ # tlv_length = type_len + length_len + value_len
+ eq_(1 + 2 + 12, len(self.ins))
+
+ def test_default_args(self):
+ ins = cfm.reply_egress_tlv()
+ buf = ins.serialize()
+ res = struct.unpack_from(cfm.reply_egress_tlv._PACK_STR,
+ six.binary_type(buf))
+ eq_(res[0], cfm.CFM_REPLY_EGRESS_TLV)
+ eq_(res[1], 7)
+ eq_(res[2], 1)
+ eq_(res[3], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
diff --git a/tests/unit/packet/test_dhcp.py b/tests/unit/packet/test_dhcp.py
new file mode 100644
index 00000000..cc96804b
--- /dev/null
+++ b/tests/unit/packet/test_dhcp.py
@@ -0,0 +1,218 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import inspect
+import logging
+import struct
+import unittest
+
+import six
+from nose.tools import eq_
+from nose.tools import ok_
+
+from ryu.lib import addrconv
+from ryu.lib.packet import dhcp
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_dhcp_offer(unittest.TestCase):
+
+ op = dhcp.DHCP_BOOT_REPLY
+ chaddr = 'aa:aa:aa:aa:aa:aa'
+ htype = 1
+ hlen = 6
+ hops = 0
+ xid = 1
+ secs = 0
+ flags = 1
+ ciaddr = '192.168.10.10'
+ yiaddr = '192.168.20.20'
+ siaddr = '192.168.30.30'
+ giaddr = '192.168.40.40'
+ sname = 'abc'
+ boot_file = ''
+
+ option_list = [
+ dhcp.option(dhcp.DHCP_MESSAGE_TYPE_OPT, b'\x02', 1),
+ dhcp.option(dhcp.DHCP_SUBNET_MASK_OPT, b'\xff\xff\xff\x00', 4),
+ dhcp.option(dhcp.DHCP_GATEWAY_ADDR_OPT, b'\xc0\xa8\x0a\x09', 4),
+ dhcp.option(dhcp.DHCP_DNS_SERVER_ADDR_OPT, b'\xc0\xa8\x0a\x09', 4),
+ dhcp.option(dhcp.DHCP_IP_ADDR_LEASE_TIME_OPT, b'\x00\x03\xf4\x80', 4),
+ dhcp.option(dhcp.DHCP_RENEWAL_TIME_OPT, b'\x00\x01\xfa\x40', 4),
+ dhcp.option(dhcp.DHCP_REBINDING_TIME_OPT, b'\x00\x03\x75\xf0', 4),
+ dhcp.option(dhcp.DHCP_SERVER_IDENTIFIER_OPT, b'\xc0\xa8\x0a\x09', 4)]
+ magic_cookie = '99.130.83.99'
+ options = dhcp.options(option_list=option_list, options_len=50,
+ magic_cookie=magic_cookie)
+
+ dh = dhcp.dhcp(op, chaddr, options, htype=htype, hlen=hlen,
+ hops=hops, xid=xid, secs=secs, flags=flags,
+ ciaddr=ciaddr, yiaddr=yiaddr, siaddr=siaddr,
+ giaddr=giaddr, sname=sname, boot_file=boot_file)
+
+ buf = (
+ b"\x02\x01\x06\x00\x00\x00\x00\x01\x00\x00\x00\x01\xc0\xa8\x0a\x0a"
+ b"\xc0\xa8\x14\x14\xc0\xa8\x1e\x1e\xc0\xa8\x28\x28\xaa\xaa\xaa\xaa"
+ b"\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x62\x63\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x82\x53\x63"
+ b"\x35\x01\x02\x01\x04\xff\xff\xff\x00\x03\x04\xc0\xa8\x0a\x09\x06"
+ b"\x04\xc0\xa8\x0a\x09\x33\x04\x00\x03\xf4\x80\x3a\x04\x00\x01\xfa"
+ b"\x40\x3b\x04\x00\x03\x75\xf0\x36\x04\xc0\xa8\x0a\x09\xff")
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.op, self.dh.op)
+ eq_(self.htype, self.dh.htype)
+ eq_(self.hlen, self.dh.hlen)
+ eq_(self.hops, self.dh.hops)
+ eq_(self.xid, self.dh.xid)
+ eq_(self.secs, self.dh.secs)
+ eq_(self.flags, self.dh.flags)
+ eq_(self.ciaddr, self.dh.ciaddr)
+ eq_(self.yiaddr, self.dh.yiaddr)
+ eq_(self.siaddr, self.dh.siaddr)
+ eq_(self.giaddr, self.dh.giaddr)
+ eq_(self.chaddr, self.dh.chaddr)
+ eq_(self.sname, self.dh.sname)
+ eq_(self.boot_file, self.dh.boot_file)
+ eq_(str(self.options), str(self.dh.options))
+
+ def test_parser(self):
+ res, _, rest = dhcp.dhcp.parser(self.buf)
+
+ eq_(self.op, res.op)
+ eq_(self.htype, res.htype)
+ eq_(self.hlen, res.hlen)
+ eq_(self.hops, res.hops)
+ eq_(self.xid, res.xid)
+ eq_(self.secs, res.secs)
+ eq_(self.flags, res.flags)
+ eq_(self.ciaddr, res.ciaddr)
+ eq_(self.yiaddr, res.yiaddr)
+ eq_(self.siaddr, res.siaddr)
+ eq_(self.giaddr, res.giaddr)
+ eq_(self.chaddr, res.chaddr)
+ # sname is 64 byte length. rest of data is filled by '\x00'.
+ eq_(self.sname.ljust(64, '\x00'), res.sname)
+ # boof_file is 128 byte length. rest of data is filled by '\x00'.
+ eq_(self.boot_file.ljust(128, '\x00'), res.boot_file)
+ eq_(str(self.options), str(res.options))
+ eq_(b'', rest)
+
+ def test_parser_corrupted(self):
+ corrupt_buf = self.buf[:-4]
+ pkt, _, rest = dhcp.dhcp.parser(corrupt_buf)
+
+ ok_(isinstance(pkt, dhcp.dhcp))
+ ok_(isinstance(pkt.options, dhcp.options))
+ for opt in pkt.options.option_list[:-1]:
+ ok_(isinstance(opt, dhcp.option))
+ ok_(isinstance(pkt.options.option_list[-1], six.binary_type))
+
+ buf = pkt.serialize()
+ eq_(str(buf), str(corrupt_buf))
+ eq_(b'', rest)
+
+ def test_serialize(self):
+ buf = self.dh.serialize()
+
+ res = struct.unpack_from(dhcp.dhcp._DHCP_PACK_STR,
+ six.binary_type(buf))
+
+ eq_(self.op, res[0])
+ eq_(self.htype, res[1])
+ eq_(self.hlen, res[2])
+ eq_(self.hops, res[3])
+ eq_(self.xid, res[4])
+ eq_(self.secs, res[5])
+ eq_(self.flags, res[6])
+ eq_(self.ciaddr, addrconv.ipv4.bin_to_text(res[7]))
+ eq_(self.yiaddr, addrconv.ipv4.bin_to_text(res[8]))
+ eq_(self.siaddr, addrconv.ipv4.bin_to_text(res[9]))
+ eq_(self.giaddr, addrconv.ipv4.bin_to_text(res[10]))
+ eq_(self.chaddr, addrconv.mac.bin_to_text(res[11][:6]))
+ # sname is 64 byte length. rest of data is filled by '\x00'.
+ eq_(self.sname.ljust(64, '\x00'), res[12].decode('ascii'))
+ # boof_file is 128 byte length. rest of data is filled by '\x00'.
+ eq_(self.boot_file.ljust(128, '\x00'), res[13].decode('ascii'))
+ options = dhcp.options.parser(
+ buf[struct.calcsize(dhcp.dhcp._DHCP_PACK_STR):])
+ eq_(str(self.options), str(options))
+
+ def test_to_string(self):
+ option_values = ['tag', 'length', 'value']
+ opt_str_list = []
+ for option in self.option_list:
+ _opt_str = ','.join(['%s=%s' % (k, repr(getattr(option, k)))
+ for k, v in inspect.getmembers(option)
+ if k in option_values])
+ opt_str = '%s(%s)' % (dhcp.option.__name__, _opt_str)
+ opt_str_list.append(opt_str)
+ option_str = '[%s]' % ', '.join(opt_str_list)
+
+ opts_vals = {'magic_cookie': repr(self.magic_cookie),
+ 'option_list': option_str,
+ 'options_len': repr(self.options.options_len)}
+ _options_str = ','.join(['%s=%s' % (k, opts_vals[k])
+ for k, v in inspect.getmembers(self.options)
+ if k in opts_vals])
+ options_str = '%s(%s)' % (dhcp.options.__name__, _options_str)
+
+ dhcp_values = {'op': repr(self.op),
+ 'htype': repr(self.htype),
+ 'hlen': repr(self.hlen),
+ 'hops': repr(self.hops),
+ 'xid': repr(self.xid),
+ 'secs': repr(self.secs),
+ 'flags': repr(self.flags),
+ 'ciaddr': repr(self.ciaddr),
+ 'yiaddr': repr(self.yiaddr),
+ 'siaddr': repr(self.siaddr),
+ 'giaddr': repr(self.giaddr),
+ 'chaddr': repr(self.chaddr),
+ 'sname': repr(self.sname),
+ 'boot_file': repr(self.boot_file),
+ 'options': options_str}
+ _dh_str = ','.join(['%s=%s' % (k, dhcp_values[k])
+ for k, v in inspect.getmembers(self.dh)
+ if k in dhcp_values])
+ dh_str = '%s(%s)' % (dhcp.dhcp.__name__, _dh_str)
+
+ eq_(str(self.dh), dh_str)
+ eq_(repr(self.dh), dh_str)
+
+ def test_json(self):
+ jsondict = self.dh.to_jsondict()
+ dh = dhcp.dhcp.from_jsondict(jsondict['dhcp'])
+ eq_(str(self.dh), str(dh))
diff --git a/tests/unit/packet/test_ethernet.py b/tests/unit/packet/test_ethernet.py
new file mode 100644
index 00000000..6fd767bd
--- /dev/null
+++ b/tests/unit/packet/test_ethernet.py
@@ -0,0 +1,103 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import six
+import struct
+import netaddr
+from struct import *
+from nose.tools import *
+from ryu.ofproto import ether, inet
+from ryu.lib.packet.ethernet import ethernet
+from ryu.lib.packet.packet import Packet
+from ryu.lib.packet.arp import arp
+from ryu.lib import addrconv
+
+
+LOG = logging.getLogger('test_ethernet')
+
+
+class Test_ethernet(unittest.TestCase):
+ """ Test case for ethernet
+ """
+
+ dst = 'aa:aa:aa:aa:aa:aa'
+ src = 'bb:bb:bb:bb:bb:bb'
+ ethertype = ether.ETH_TYPE_ARP
+
+ buf = pack(ethernet._PACK_STR,
+ addrconv.mac.text_to_bin(dst),
+ addrconv.mac.text_to_bin(src), ethertype)
+
+ e = ethernet(dst, src, ethertype)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def find_protocol(self, pkt, name):
+ for p in pkt.protocols:
+ if p.protocol_name == name:
+ return p
+
+ def test_init(self):
+ eq_(self.dst, self.e.dst)
+ eq_(self.src, self.e.src)
+ eq_(self.ethertype, self.e.ethertype)
+
+ def test_parser(self):
+ res, ptype, _ = self.e.parser(self.buf)
+ LOG.debug((res, ptype))
+
+ eq_(res.dst, self.dst)
+ eq_(res.src, self.src)
+ eq_(res.ethertype, self.ethertype)
+ eq_(ptype, arp)
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.e.serialize(data, prev)
+
+ fmt = ethernet._PACK_STR
+ res = struct.unpack(fmt, buf)
+
+ eq_(res[0], addrconv.mac.text_to_bin(self.dst))
+ eq_(res[1], addrconv.mac.text_to_bin(self.src))
+ eq_(res[2], self.ethertype)
+
+ @raises(Exception)
+ def test_malformed_ethernet(self):
+ m_short_buf = self.buf[1:ethernet._MIN_LEN]
+ ethernet.parser(m_short_buf)
+
+ def test_default_args(self):
+ e = ethernet()
+ buf = e.serialize(bytearray(), None)
+ res = struct.unpack(e._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], addrconv.mac.text_to_bin('ff:ff:ff:ff:ff:ff'))
+ eq_(res[1], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+ eq_(res[2], ether.ETH_TYPE_IP)
+
+ def test_json(self):
+ jsondict = self.e.to_jsondict()
+ e = ethernet.from_jsondict(jsondict['ethernet'])
+ eq_(str(self.e), str(e))
diff --git a/tests/unit/packet/test_geneve.py b/tests/unit/packet/test_geneve.py
new file mode 100644
index 00000000..919d05f8
--- /dev/null
+++ b/tests/unit/packet/test_geneve.py
@@ -0,0 +1,62 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import logging
+import os
+import sys
+
+import unittest
+from nose.tools import eq_
+from nose.tools import ok_
+
+from ryu.lib import pcaplib
+from ryu.lib.packet import geneve
+from ryu.lib.packet import packet
+from ryu.utils import binary_str
+
+
+LOG = logging.getLogger(__name__)
+
+GENEVE_DATA_DIR = os.path.join(
+ os.path.dirname(sys.modules[__name__].__file__),
+ '../../packet_data/pcap/')
+
+
+class Test_geneve(unittest.TestCase):
+ """
+ Test case for ryu.lib.packet.geneve.
+ """
+
+ def test_parser(self):
+ files = [
+ 'geneve_unknown',
+ ]
+
+ for f in files:
+ # print('*** testing %s ...' % f)
+ for _, buf in pcaplib.Reader(
+ open(GENEVE_DATA_DIR + f + '.pcap', 'rb')):
+ # Checks if message can be parsed as expected.
+ pkt = packet.Packet(buf)
+ geneve_pkt = pkt.get_protocol(geneve.geneve)
+ ok_(isinstance(geneve_pkt, geneve.geneve),
+ 'Failed to parse Geneve message: %s' % pkt)
+
+ # Checks if message can be serialized as expected.
+ pkt.serialize()
+ eq_(buf, pkt.data,
+ "b'%s' != b'%s'" % (binary_str(buf), binary_str(pkt.data)))
diff --git a/tests/unit/packet/test_gre.py b/tests/unit/packet/test_gre.py
new file mode 100644
index 00000000..c955ec70
--- /dev/null
+++ b/tests/unit/packet/test_gre.py
@@ -0,0 +1,115 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import logging
+import os
+import sys
+
+import unittest
+from nose.tools import eq_
+from nose.tools import ok_
+
+from ryu.lib import pcaplib
+from ryu.lib.packet import gre
+from ryu.lib.packet import packet
+from ryu.utils import binary_str
+from ryu.lib.packet.ether_types import ETH_TYPE_IP, ETH_TYPE_TEB
+
+LOG = logging.getLogger(__name__)
+
+GENEVE_DATA_DIR = os.path.join(
+ os.path.dirname(sys.modules[__name__].__file__),
+ '../../packet_data/pcap/')
+
+
+class Test_gre(unittest.TestCase):
+ """
+ Test case gre for ryu.lib.packet.gre.
+ """
+
+ version = 0
+ gre_proto = ETH_TYPE_IP
+ nvgre_proto = ETH_TYPE_TEB
+ checksum = 0x440d
+ seq_number = 10
+ key = 256100
+ vsid = 1000
+ flow_id = 100
+
+ gre = gre.gre(version=version, protocol=gre_proto, checksum=checksum,
+ key=key, seq_number=seq_number)
+
+ def test_key_setter(self):
+ self.gre.key = self.key
+ eq_(self.gre._key, self.key)
+ eq_(self.gre._vsid, self.vsid)
+ eq_(self.gre._flow_id, self.flow_id)
+
+ def test_key_setter_none(self):
+ self.gre.key = None
+ eq_(self.gre._key, None)
+ eq_(self.gre._vsid, None)
+ eq_(self.gre._flow_id, None)
+
+ self.gre.key = self.key
+
+ def test_vsid_setter(self):
+ self.gre.vsid = self.vsid
+ eq_(self.gre._key, self.key)
+ eq_(self.gre._vsid, self.vsid)
+ eq_(self.gre._flow_id, self.flow_id)
+
+ def test_flowid_setter(self):
+ self.gre.flow_id = self.flow_id
+ eq_(self.gre._key, self.key)
+ eq_(self.gre._vsid, self.vsid)
+ eq_(self.gre._flow_id, self.flow_id)
+
+ def test_nvgre_init(self):
+ nvgre = gre.nvgre(version=self.version, vsid=self.vsid,
+ flow_id=self.flow_id)
+
+ eq_(nvgre.version, self.version)
+ eq_(nvgre.protocol, self.nvgre_proto)
+ eq_(nvgre.checksum, None)
+ eq_(nvgre.seq_number, None)
+ eq_(nvgre._key, self.key)
+ eq_(nvgre._vsid, self.vsid)
+ eq_(nvgre._flow_id, self.flow_id)
+
+ def test_parser(self):
+ files = [
+ 'gre_full_options',
+ 'gre_no_option',
+ 'gre_nvgre_option',
+ ]
+
+ for f in files:
+ # print('*** testing %s ...' % f)
+ for _, buf in pcaplib.Reader(
+ open(GENEVE_DATA_DIR + f + '.pcap', 'rb')):
+ # Checks if message can be parsed as expected.
+ pkt = packet.Packet(buf)
+ gre_pkt = pkt.get_protocol(gre.gre)
+ ok_(isinstance(gre_pkt, gre.gre),
+ 'Failed to parse Gre message: %s' % pkt)
+
+ # Checks if message can be serialized as expected.
+ pkt.serialize()
+
+ eq_(buf, pkt.data,
+ "b'%s' != b'%s'" % (binary_str(buf), binary_str(pkt.data)))
diff --git a/tests/unit/packet/test_icmp.py b/tests/unit/packet/test_icmp.py
new file mode 100644
index 00000000..f9438893
--- /dev/null
+++ b/tests/unit/packet/test_icmp.py
@@ -0,0 +1,380 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import inspect
+import logging
+import six
+import struct
+import unittest
+
+from nose.tools import eq_
+from ryu.lib.packet import icmp
+from ryu.lib.packet import packet_utils
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_icmp(unittest.TestCase):
+
+ echo_id = None
+ echo_seq = None
+ echo_data = None
+
+ unreach_mtu = None
+ unreach_data = None
+ unreach_data_len = None
+
+ te_data = None
+ te_data_len = None
+
+ def setUp(self):
+ self.type_ = icmp.ICMP_ECHO_REQUEST
+ self.code = 0
+ self.csum = 0
+ self.data = None
+
+ self.ic = icmp.icmp(self.type_, self.code, self.csum, self.data)
+
+ self.buf = bytearray(struct.pack(
+ icmp.icmp._PACK_STR, self.type_, self.code, self.csum))
+ self.csum_calc = packet_utils.checksum(self.buf)
+ struct.pack_into('!H', self.buf, 2, self.csum_calc)
+
+ def setUp_with_echo(self):
+ self.echo_id = 13379
+ self.echo_seq = 1
+ self.echo_data = b'\x30\x0e\x09\x00\x00\x00\x00\x00' \
+ + b'\x10\x11\x12\x13\x14\x15\x16\x17' \
+ + b'\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f' \
+ + b'\x20\x21\x22\x23\x24\x25\x26\x27' \
+ + b'\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f' \
+ + b'\x30\x31\x32\x33\x34\x35\x36\x37'
+ self.data = icmp.echo(
+ id_=self.echo_id, seq=self.echo_seq, data=self.echo_data)
+
+ self.type_ = icmp.ICMP_ECHO_REQUEST
+ self.code = 0
+ self.ic = icmp.icmp(self.type_, self.code, self.csum, self.data)
+
+ self.buf = bytearray(struct.pack(
+ icmp.icmp._PACK_STR, self.type_, self.code, self.csum))
+ self.buf += self.data.serialize()
+ self.csum_calc = packet_utils.checksum(self.buf)
+ struct.pack_into('!H', self.buf, 2, self.csum_calc)
+
+ def setUp_with_dest_unreach(self):
+ self.unreach_mtu = 10
+ self.unreach_data = b'abc'
+ self.unreach_data_len = len(self.unreach_data)
+ self.data = icmp.dest_unreach(
+ data_len=self.unreach_data_len, mtu=self.unreach_mtu,
+ data=self.unreach_data)
+
+ self.type_ = icmp.ICMP_DEST_UNREACH
+ self.code = icmp.ICMP_HOST_UNREACH_CODE
+ self.ic = icmp.icmp(self.type_, self.code, self.csum, self.data)
+
+ self.buf = bytearray(struct.pack(
+ icmp.icmp._PACK_STR, self.type_, self.code, self.csum))
+ self.buf += self.data.serialize()
+ self.csum_calc = packet_utils.checksum(self.buf)
+ struct.pack_into('!H', self.buf, 2, self.csum_calc)
+
+ def setUp_with_TimeExceeded(self):
+ self.te_data = b'abc'
+ self.te_data_len = len(self.te_data)
+ self.data = icmp.TimeExceeded(
+ data_len=self.te_data_len, data=self.te_data)
+
+ self.type_ = icmp.ICMP_TIME_EXCEEDED
+ self.code = 0
+ self.ic = icmp.icmp(self.type_, self.code, self.csum, self.data)
+
+ self.buf = bytearray(struct.pack(
+ icmp.icmp._PACK_STR, self.type_, self.code, self.csum))
+ self.buf += self.data.serialize()
+ self.csum_calc = packet_utils.checksum(self.buf)
+ struct.pack_into('!H', self.buf, 2, self.csum_calc)
+
+ def test_init(self):
+ eq_(self.type_, self.ic.type)
+ eq_(self.code, self.ic.code)
+ eq_(self.csum, self.ic.csum)
+ eq_(str(self.data), str(self.ic.data))
+
+ def test_init_with_echo(self):
+ self.setUp_with_echo()
+ self.test_init()
+
+ def test_init_with_dest_unreach(self):
+ self.setUp_with_dest_unreach()
+ self.test_init()
+
+ def test_init_with_TimeExceeded(self):
+ self.setUp_with_TimeExceeded()
+ self.test_init()
+
+ def test_parser(self):
+ _res = icmp.icmp.parser(six.binary_type(self.buf))
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+
+ eq_(self.type_, res.type)
+ eq_(self.code, res.code)
+ eq_(self.csum_calc, res.csum)
+ eq_(str(self.data), str(res.data))
+
+ def test_parser_with_echo(self):
+ self.setUp_with_echo()
+ self.test_parser()
+
+ def test_parser_with_dest_unreach(self):
+ self.setUp_with_dest_unreach()
+ self.test_parser()
+
+ def test_parser_with_TimeExceeded(self):
+ self.setUp_with_TimeExceeded()
+ self.test_parser()
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.ic.serialize(data, prev)
+
+ res = struct.unpack_from(icmp.icmp._PACK_STR, six.binary_type(buf))
+
+ eq_(self.type_, res[0])
+ eq_(self.code, res[1])
+ eq_(self.csum_calc, res[2])
+
+ def test_serialize_with_echo(self):
+ self.setUp_with_echo()
+ self.test_serialize()
+
+ data = bytearray()
+ prev = None
+ buf = self.ic.serialize(data, prev)
+ echo = icmp.echo.parser(six.binary_type(buf), icmp.icmp._MIN_LEN)
+ eq_(repr(self.data), repr(echo))
+
+ def test_serialize_with_dest_unreach(self):
+ self.setUp_with_dest_unreach()
+ self.test_serialize()
+
+ data = bytearray()
+ prev = None
+ buf = self.ic.serialize(data, prev)
+ unreach = icmp.dest_unreach.parser(six.binary_type(buf), icmp.icmp._MIN_LEN)
+ eq_(repr(self.data), repr(unreach))
+
+ def test_serialize_with_TimeExceeded(self):
+ self.setUp_with_TimeExceeded()
+ self.test_serialize()
+
+ data = bytearray()
+ prev = None
+ buf = self.ic.serialize(data, prev)
+ te = icmp.TimeExceeded.parser(six.binary_type(buf), icmp.icmp._MIN_LEN)
+ eq_(repr(self.data), repr(te))
+
+ def test_to_string(self):
+ icmp_values = {'type': repr(self.type_),
+ 'code': repr(self.code),
+ 'csum': repr(self.csum),
+ 'data': repr(self.data)}
+ _ic_str = ','.join(['%s=%s' % (k, icmp_values[k])
+ for k, v in inspect.getmembers(self.ic)
+ if k in icmp_values])
+ ic_str = '%s(%s)' % (icmp.icmp.__name__, _ic_str)
+
+ eq_(str(self.ic), ic_str)
+ eq_(repr(self.ic), ic_str)
+
+ def test_to_string_with_echo(self):
+ self.setUp_with_echo()
+ self.test_to_string()
+
+ def test_to_string_with_dest_unreach(self):
+ self.setUp_with_dest_unreach()
+ self.test_to_string()
+
+ def test_to_string_with_TimeExceeded(self):
+ self.setUp_with_TimeExceeded()
+ self.test_to_string()
+
+ def test_default_args(self):
+ ic = icmp.icmp()
+ buf = ic.serialize(bytearray(), None)
+ res = struct.unpack(icmp.icmp._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], 8)
+ eq_(res[1], 0)
+ eq_(buf[4:], b'\x00\x00\x00\x00')
+
+ # with data
+ ic = icmp.icmp(type_=icmp.ICMP_DEST_UNREACH, data=icmp.dest_unreach())
+ buf = ic.serialize(bytearray(), None)
+ res = struct.unpack(icmp.icmp._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], 3)
+ eq_(res[1], 0)
+ eq_(buf[4:], b'\x00\x00\x00\x00')
+
+ def test_json(self):
+ jsondict = self.ic.to_jsondict()
+ ic = icmp.icmp.from_jsondict(jsondict['icmp'])
+ eq_(str(self.ic), str(ic))
+
+ def test_json_with_echo(self):
+ self.setUp_with_echo()
+ self.test_json()
+
+ def test_json_with_dest_unreach(self):
+ self.setUp_with_dest_unreach()
+ self.test_json()
+
+ def test_json_with_TimeExceeded(self):
+ self.setUp_with_TimeExceeded()
+ self.test_json()
+
+
+class Test_echo(unittest.TestCase):
+
+ def setUp(self):
+ self.id_ = 13379
+ self.seq = 1
+ self.data = b'\x30\x0e\x09\x00\x00\x00\x00\x00' \
+ + b'\x10\x11\x12\x13\x14\x15\x16\x17' \
+ + b'\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f' \
+ + b'\x20\x21\x22\x23\x24\x25\x26\x27' \
+ + b'\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f' \
+ + b'\x30\x31\x32\x33\x34\x35\x36\x37'
+ self.echo = icmp.echo(
+ self.id_, self.seq, self.data)
+ self.buf = struct.pack('!HH', self.id_, self.seq)
+ self.buf += self.data
+
+ def test_init(self):
+ eq_(self.id_, self.echo.id)
+ eq_(self.seq, self.echo.seq)
+ eq_(self.data, self.echo.data)
+
+ def test_parser(self):
+ _res = icmp.echo.parser(self.buf, 0)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.id_, res.id)
+ eq_(self.seq, res.seq)
+ eq_(self.data, res.data)
+
+ def test_serialize(self):
+ buf = self.echo.serialize()
+ res = struct.unpack_from('!HH', six.binary_type(buf))
+ eq_(self.id_, res[0])
+ eq_(self.seq, res[1])
+ eq_(self.data, buf[struct.calcsize('!HH'):])
+
+ def test_default_args(self):
+ ec = icmp.echo()
+ buf = ec.serialize()
+ res = struct.unpack(icmp.echo._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+
+
+class Test_dest_unreach(unittest.TestCase):
+
+ def setUp(self):
+ self.mtu = 10
+ self.data = b'abc'
+ self.data_len = len(self.data)
+ self.dest_unreach = icmp.dest_unreach(
+ data_len=self.data_len, mtu=self.mtu, data=self.data)
+ self.buf = struct.pack('!xBH', self.data_len, self.mtu)
+ self.buf += self.data
+
+ def test_init(self):
+ eq_(self.data_len, self.dest_unreach.data_len)
+ eq_(self.mtu, self.dest_unreach.mtu)
+ eq_(self.data, self.dest_unreach.data)
+
+ def test_parser(self):
+ _res = icmp.dest_unreach.parser(self.buf, 0)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.data_len, res.data_len)
+ eq_(self.mtu, res.mtu)
+ eq_(self.data, res.data)
+
+ def test_serialize(self):
+ buf = self.dest_unreach.serialize()
+ res = struct.unpack_from('!xBH', six.binary_type(buf))
+ eq_(self.data_len, res[0])
+ eq_(self.mtu, res[1])
+ eq_(self.data, buf[struct.calcsize('!xBH'):])
+
+ def test_default_args(self):
+ du = icmp.dest_unreach()
+ buf = du.serialize()
+ res = struct.unpack(icmp.dest_unreach._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+
+
+class Test_TimeExceeded(unittest.TestCase):
+
+ def setUp(self):
+ self.data = b'abc'
+ self.data_len = len(self.data)
+ self.te = icmp.TimeExceeded(
+ data_len=self.data_len, data=self.data)
+ self.buf = struct.pack('!xBxx', self.data_len)
+ self.buf += self.data
+
+ def test_init(self):
+ eq_(self.data_len, self.te.data_len)
+ eq_(self.data, self.te.data)
+
+ def test_parser(self):
+ _res = icmp.TimeExceeded.parser(self.buf, 0)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.data_len, res.data_len)
+ eq_(self.data, res.data)
+
+ def test_serialize(self):
+ buf = self.te.serialize()
+ res = struct.unpack_from('!xBxx', six.binary_type(buf))
+ eq_(self.data_len, res[0])
+ eq_(self.data, buf[struct.calcsize('!xBxx'):])
+
+ def test_default_args(self):
+ te = icmp.TimeExceeded()
+ buf = te.serialize()
+ res = struct.unpack(icmp.TimeExceeded._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0)
diff --git a/tests/unit/packet/test_icmpv6.py b/tests/unit/packet/test_icmpv6.py
new file mode 100644
index 00000000..c6438171
--- /dev/null
+++ b/tests/unit/packet/test_icmpv6.py
@@ -0,0 +1,2039 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import six
+import struct
+import inspect
+
+from nose.tools import ok_, eq_, nottest, raises
+from ryu.ofproto import ether, inet
+from ryu.lib.packet.ethernet import ethernet
+from ryu.lib.packet.packet import Packet
+from ryu.lib.packet import icmpv6
+from ryu.lib.packet.ipv6 import ipv6
+from ryu.lib.packet import packet_utils
+from ryu.lib import addrconv
+
+
+LOG = logging.getLogger(__name__)
+
+
+def icmpv6_csum(prev, buf):
+ ph = struct.pack('!16s16sI3xB',
+ addrconv.ipv6.text_to_bin(prev.src),
+ addrconv.ipv6.text_to_bin(prev.dst),
+ prev.payload_length, prev.nxt)
+ h = bytearray(buf)
+ struct.pack_into('!H', h, 2, 0)
+
+ return packet_utils.checksum(ph + h)
+
+
+class Test_icmpv6_header(unittest.TestCase):
+ type_ = 255
+ code = 0
+ csum = 207
+ buf = b'\xff\x00\x00\xcf'
+ icmp = icmpv6.icmpv6(type_, code, 0)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.type_, self.icmp.type_)
+ eq_(self.code, self.icmp.code)
+ eq_(0, self.icmp.csum)
+
+ def test_parser(self):
+ msg, n, _ = self.icmp.parser(self.buf)
+
+ eq_(msg.type_, self.type_)
+ eq_(msg.code, self.code)
+ eq_(msg.csum, self.csum)
+ eq_(msg.data, None)
+ eq_(n, None)
+
+ def test_serialize(self):
+ src_ipv6 = 'fe80::200:ff:fe00:ef'
+ dst_ipv6 = 'fe80::200:ff:fe00:1'
+ prev = ipv6(6, 0, 0, 4, 58, 255, src_ipv6, dst_ipv6)
+
+ buf = self.icmp.serialize(bytearray(), prev)
+ (type_, code, csum) = struct.unpack(self.icmp._PACK_STR, six.binary_type(buf))
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, self.csum)
+
+ @raises(Exception)
+ def test_malformed_icmpv6(self):
+ m_short_buf = self.buf[1:self.icmp._MIN_LEN]
+ self.icmp.parser(m_short_buf)
+
+ def test_default_args(self):
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6()
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ def test_json(self):
+ jsondict = self.icmp.to_jsondict()
+ icmp = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6'])
+ eq_(str(self.icmp), str(icmp))
+
+
+class Test_icmpv6_echo_request(unittest.TestCase):
+ type_ = 128
+ code = 0
+ csum = 0xa572
+ id_ = 0x7620
+ seq = 0
+ data = b'\x01\xc9\xe7\x36\xd3\x39\x06\x00'
+ buf = b'\x80\x00\xa5\x72\x76\x20\x00\x00'
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ echo = icmpv6.echo(0, 0)
+ eq_(echo.id, 0)
+ eq_(echo.seq, 0)
+ eq_(echo.data, None)
+
+ def _test_parser(self, data=None):
+ buf = self.buf + (data or b'')
+ msg, n, _ = icmpv6.icmpv6.parser(buf)
+
+ eq_(msg.type_, self.type_)
+ eq_(msg.code, self.code)
+ eq_(msg.csum, self.csum)
+ eq_(msg.data.id, self.id_)
+ eq_(msg.data.seq, self.seq)
+ eq_(msg.data.data, data)
+ eq_(n, None)
+
+ def test_parser_without_data(self):
+ self._test_parser()
+
+ def test_parser_with_data(self):
+ self._test_parser(self.data)
+
+ def _test_serialize(self, echo_data=None):
+ buf = self.buf + (echo_data or b'')
+ src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da'
+ dst_ipv6 = '3ffe:501:0:1001::2'
+ prev = ipv6(6, 0, 0, len(buf), 64, 255, src_ipv6, dst_ipv6)
+ echo_csum = icmpv6_csum(prev, buf)
+
+ echo = icmpv6.echo(self.id_, self.seq, echo_data)
+ icmp = icmpv6.icmpv6(self.type_, self.code, 0, echo)
+ buf = six.binary_type(icmp.serialize(bytearray(), prev))
+
+ (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0)
+ (id_, seq) = struct.unpack_from(echo._PACK_STR, buf, icmp._MIN_LEN)
+ data = buf[(icmp._MIN_LEN + echo._MIN_LEN):]
+ data = data if len(data) != 0 else None
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, echo_csum)
+ eq_(id_, self.id_)
+ eq_(seq, self.seq)
+ eq_(data, echo_data)
+
+ def test_serialize_without_data(self):
+ self._test_serialize()
+
+ def test_serialize_with_data(self):
+ self._test_serialize(self.data)
+
+ def test_to_string(self):
+ ec = icmpv6.echo(self.id_, self.seq, self.data)
+ ic = icmpv6.icmpv6(self.type_, self.code, self.csum, ec)
+
+ echo_values = {'id': self.id_,
+ 'seq': self.seq,
+ 'data': self.data}
+ _echo_str = ','.join(['%s=%s' % (k, repr(echo_values[k]))
+ for k, v in inspect.getmembers(ec)
+ if k in echo_values])
+ echo_str = '%s(%s)' % (icmpv6.echo.__name__, _echo_str)
+
+ icmp_values = {'type_': repr(self.type_),
+ 'code': repr(self.code),
+ 'csum': repr(self.csum),
+ 'data': echo_str}
+ _ic_str = ','.join(['%s=%s' % (k, icmp_values[k])
+ for k, v in inspect.getmembers(ic)
+ if k in icmp_values])
+ ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str)
+
+ eq_(str(ic), ic_str)
+ eq_(repr(ic), ic_str)
+
+ def test_default_args(self):
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ICMPV6_ECHO_REQUEST, data=icmpv6.echo())
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ICMPV6_ECHO_REQUEST)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.echo._PACK_STR, six.binary_type(buf[4:]))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+
+ def test_json(self):
+ ec = icmpv6.echo(self.id_, self.seq, self.data)
+ ic1 = icmpv6.icmpv6(self.type_, self.code, self.csum, ec)
+ jsondict = ic1.to_jsondict()
+ ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6'])
+ eq_(str(ic1), str(ic2))
+
+
+class Test_icmpv6_echo_reply(Test_icmpv6_echo_request):
+ def setUp(self):
+ self.type_ = 129
+ self.csum = 0xa472
+ self.buf = b'\x81\x00\xa4\x72\x76\x20\x00\x00'
+
+ def test_default_args(self):
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ICMPV6_ECHO_REPLY, data=icmpv6.echo())
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ICMPV6_ECHO_REPLY)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.echo._PACK_STR, six.binary_type(buf[4:]))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+
+
+class Test_icmpv6_neighbor_solicit(unittest.TestCase):
+ type_ = 135
+ code = 0
+ csum = 0x952d
+ res = 0
+ dst = '3ffe:507:0:1:200:86ff:fe05:80da'
+ nd_type = 1
+ nd_length = 1
+ nd_hw_src = '00:60:97:07:69:ea'
+ data = b'\x01\x01\x00\x60\x97\x07\x69\xea'
+ buf = b'\x87\x00\x95\x2d\x00\x00\x00\x00' \
+ + b'\x3f\xfe\x05\x07\x00\x00\x00\x01' \
+ + b'\x02\x00\x86\xff\xfe\x05\x80\xda'
+ src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da'
+ dst_ipv6 = '3ffe:501:0:1001::2'
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ nd = icmpv6.nd_neighbor(self.res, self.dst)
+ eq_(nd.res, self.res)
+ eq_(nd.dst, self.dst)
+ eq_(nd.option, None)
+
+ def _test_parser(self, data=None):
+ buf = self.buf + (data or b'')
+ msg, n, _ = icmpv6.icmpv6.parser(buf)
+
+ eq_(msg.type_, self.type_)
+ eq_(msg.code, self.code)
+ eq_(msg.csum, self.csum)
+ eq_(msg.data.res, self.res)
+ eq_(addrconv.ipv6.text_to_bin(msg.data.dst),
+ addrconv.ipv6.text_to_bin(self.dst))
+ eq_(n, None)
+ if data:
+ nd = msg.data.option
+ eq_(nd.length, self.nd_length)
+ eq_(nd.hw_src, self.nd_hw_src)
+ eq_(nd.data, None)
+
+ def test_parser_without_data(self):
+ self._test_parser()
+
+ def test_parser_with_data(self):
+ self._test_parser(self.data)
+
+ def test_serialize_without_data(self):
+ nd = icmpv6.nd_neighbor(self.res, self.dst)
+ prev = ipv6(6, 0, 0, 24, 64, 255, self.src_ipv6, self.dst_ipv6)
+ nd_csum = icmpv6_csum(prev, self.buf)
+
+ icmp = icmpv6.icmpv6(self.type_, self.code, 0, nd)
+ buf = six.binary_type(icmp.serialize(bytearray(), prev))
+
+ (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0)
+ (res, dst) = struct.unpack_from(nd._PACK_STR, buf, icmp._MIN_LEN)
+ data = buf[(icmp._MIN_LEN + nd._MIN_LEN):]
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, nd_csum)
+ eq_(res >> 29, self.res)
+ eq_(dst, addrconv.ipv6.text_to_bin(self.dst))
+ eq_(data, b'')
+
+ def test_serialize_with_data(self):
+ nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src)
+ nd = icmpv6.nd_neighbor(self.res, self.dst, nd_opt)
+ prev = ipv6(6, 0, 0, 32, 64, 255, self.src_ipv6, self.dst_ipv6)
+ nd_csum = icmpv6_csum(prev, self.buf + self.data)
+
+ icmp = icmpv6.icmpv6(self.type_, self.code, 0, nd)
+ buf = six.binary_type(icmp.serialize(bytearray(), prev))
+
+ (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0)
+ (res, dst) = struct.unpack_from(nd._PACK_STR, buf, icmp._MIN_LEN)
+ (nd_type, nd_length, nd_hw_src) = struct.unpack_from(
+ nd_opt._PACK_STR, buf, icmp._MIN_LEN + nd._MIN_LEN)
+ data = buf[(icmp._MIN_LEN + nd._MIN_LEN + 8):]
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, nd_csum)
+ eq_(res >> 29, self.res)
+ eq_(dst, addrconv.ipv6.text_to_bin(self.dst))
+ eq_(nd_type, self.nd_type)
+ eq_(nd_length, self.nd_length)
+ eq_(nd_hw_src, addrconv.mac.text_to_bin(self.nd_hw_src))
+
+ def test_to_string(self):
+ nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src)
+ nd = icmpv6.nd_neighbor(self.res, self.dst, nd_opt)
+ ic = icmpv6.icmpv6(self.type_, self.code, self.csum, nd)
+
+ nd_opt_values = {'length': self.nd_length,
+ 'hw_src': self.nd_hw_src,
+ 'data': None}
+ _nd_opt_str = ','.join(['%s=%s' % (k, repr(nd_opt_values[k]))
+ for k, v in inspect.getmembers(nd_opt)
+ if k in nd_opt_values])
+ nd_opt_str = '%s(%s)' % (icmpv6.nd_option_sla.__name__, _nd_opt_str)
+
+ nd_values = {'res': repr(nd.res),
+ 'dst': repr(self.dst),
+ 'option': nd_opt_str}
+ _nd_str = ','.join(['%s=%s' % (k, nd_values[k])
+ for k, v in inspect.getmembers(nd)
+ if k in nd_values])
+ nd_str = '%s(%s)' % (icmpv6.nd_neighbor.__name__, _nd_str)
+
+ icmp_values = {'type_': repr(self.type_),
+ 'code': repr(self.code),
+ 'csum': repr(self.csum),
+ 'data': nd_str}
+ _ic_str = ','.join(['%s=%s' % (k, icmp_values[k])
+ for k, v in inspect.getmembers(ic)
+ if k in icmp_values])
+ ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str)
+
+ eq_(str(ic), ic_str)
+ eq_(repr(ic), ic_str)
+
+ def test_default_args(self):
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_NEIGHBOR_SOLICIT, data=icmpv6.nd_neighbor())
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_NEIGHBOR_SOLICIT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_neighbor._PACK_STR, six.binary_type(buf[4:]))
+
+ eq_(res[0], 0)
+ eq_(res[1], addrconv.ipv6.text_to_bin('::'))
+
+ # with nd_option_sla
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_NEIGHBOR_SOLICIT,
+ data=icmpv6.nd_neighbor(
+ option=icmpv6.nd_option_sla()))
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_NEIGHBOR_SOLICIT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_neighbor._PACK_STR,
+ six.binary_type(buf[4:24]))
+
+ eq_(res[0], 0)
+ eq_(res[1], addrconv.ipv6.text_to_bin('::'))
+
+ res = struct.unpack(icmpv6.nd_option_sla._PACK_STR,
+ six.binary_type(buf[24:]))
+
+ eq_(res[0], icmpv6.ND_OPTION_SLA)
+ eq_(res[1], len(icmpv6.nd_option_sla()) // 8)
+ eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+ def test_json(self):
+ nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src)
+ nd = icmpv6.nd_neighbor(self.res, self.dst, nd_opt)
+ ic1 = icmpv6.icmpv6(self.type_, self.code, self.csum, nd)
+ jsondict = ic1.to_jsondict()
+ ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6'])
+ eq_(str(ic1), str(ic2))
+
+
+class Test_icmpv6_neighbor_advert(Test_icmpv6_neighbor_solicit):
+ def setUp(self):
+ self.type_ = 136
+ self.csum = 0xb8ba
+ self.res = 7
+ self.dst = '3ffe:507:0:1:260:97ff:fe07:69ea'
+ self.nd_type = 2
+ self.nd_length = 1
+ self.nd_data = None
+ self.nd_hw_src = '00:60:97:07:69:ea'
+ self.data = b'\x02\x01\x00\x60\x97\x07\x69\xea'
+ self.buf = b'\x88\x00\xb8\xba\xe0\x00\x00\x00' \
+ + b'\x3f\xfe\x05\x07\x00\x00\x00\x01' \
+ + b'\x02\x60\x97\xff\xfe\x07\x69\xea'
+
+ def test_serialize_with_data(self):
+ nd_opt = icmpv6.nd_option_tla(self.nd_length, self.nd_hw_src)
+ nd = icmpv6.nd_neighbor(self.res, self.dst, nd_opt)
+ prev = ipv6(6, 0, 0, 32, 64, 255, self.src_ipv6, self.dst_ipv6)
+ nd_csum = icmpv6_csum(prev, self.buf + self.data)
+
+ icmp = icmpv6.icmpv6(self.type_, self.code, 0, nd)
+ buf = six.binary_type(icmp.serialize(bytearray(), prev))
+
+ (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0)
+ (res, dst) = struct.unpack_from(nd._PACK_STR, buf, icmp._MIN_LEN)
+ (nd_type, nd_length, nd_hw_src) = struct.unpack_from(
+ nd_opt._PACK_STR, buf, icmp._MIN_LEN + nd._MIN_LEN)
+ data = buf[(icmp._MIN_LEN + nd._MIN_LEN + 8):]
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, nd_csum)
+ eq_(res >> 29, self.res)
+ eq_(dst, addrconv.ipv6.text_to_bin(self.dst))
+ eq_(nd_type, self.nd_type)
+ eq_(nd_length, self.nd_length)
+ eq_(nd_hw_src, addrconv.mac.text_to_bin(self.nd_hw_src))
+
+ def test_to_string(self):
+ nd_opt = icmpv6.nd_option_tla(self.nd_length, self.nd_hw_src)
+ nd = icmpv6.nd_neighbor(self.res, self.dst, nd_opt)
+ ic = icmpv6.icmpv6(self.type_, self.code, self.csum, nd)
+
+ nd_opt_values = {'length': self.nd_length,
+ 'hw_src': self.nd_hw_src,
+ 'data': None}
+ _nd_opt_str = ','.join(['%s=%s' % (k, repr(nd_opt_values[k]))
+ for k, v in inspect.getmembers(nd_opt)
+ if k in nd_opt_values])
+ nd_opt_str = '%s(%s)' % (icmpv6.nd_option_tla.__name__, _nd_opt_str)
+
+ nd_values = {'res': repr(nd.res),
+ 'dst': repr(self.dst),
+ 'option': nd_opt_str}
+ _nd_str = ','.join(['%s=%s' % (k, nd_values[k])
+ for k, v in inspect.getmembers(nd)
+ if k in nd_values])
+ nd_str = '%s(%s)' % (icmpv6.nd_neighbor.__name__, _nd_str)
+
+ icmp_values = {'type_': repr(self.type_),
+ 'code': repr(self.code),
+ 'csum': repr(self.csum),
+ 'data': nd_str}
+ _ic_str = ','.join(['%s=%s' % (k, icmp_values[k])
+ for k, v in inspect.getmembers(ic)
+ if k in icmp_values])
+ ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str)
+
+ eq_(str(ic), ic_str)
+ eq_(repr(ic), ic_str)
+
+ def test_default_args(self):
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_NEIGHBOR_ADVERT, data=icmpv6.nd_neighbor())
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_NEIGHBOR_ADVERT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_neighbor._PACK_STR, six.binary_type(buf[4:]))
+
+ eq_(res[0], 0)
+ eq_(res[1], addrconv.ipv6.text_to_bin('::'))
+
+ # with nd_option_tla
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_NEIGHBOR_ADVERT,
+ data=icmpv6.nd_neighbor(
+ option=icmpv6.nd_option_tla()))
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_NEIGHBOR_ADVERT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_neighbor._PACK_STR,
+ six.binary_type(buf[4:24]))
+
+ eq_(res[0], 0)
+ eq_(res[1], addrconv.ipv6.text_to_bin('::'))
+
+ res = struct.unpack(icmpv6.nd_option_tla._PACK_STR,
+ six.binary_type(buf[24:]))
+
+ eq_(res[0], icmpv6.ND_OPTION_TLA)
+ eq_(res[1], len(icmpv6.nd_option_tla()) // 8)
+ eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+
+class Test_icmpv6_router_solicit(unittest.TestCase):
+ type_ = 133
+ code = 0
+ csum = 0x97d9
+ res = 0
+ nd_type = 1
+ nd_length = 1
+ nd_hw_src = '12:2d:a5:6d:bc:0f'
+ data = b'\x00\x00\x00\x00\x01\x01\x12\x2d\xa5\x6d\xbc\x0f'
+ buf = b'\x85\x00\x97\xd9'
+ src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da'
+ dst_ipv6 = '3ffe:501:0:1001::2'
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ rs = icmpv6.nd_router_solicit(self.res)
+ eq_(rs.res, self.res)
+ eq_(rs.option, None)
+
+ def _test_parser(self, data=None):
+ buf = self.buf + (data or b'')
+ msg, n, _ = icmpv6.icmpv6.parser(buf)
+
+ eq_(msg.type_, self.type_)
+ eq_(msg.code, self.code)
+ eq_(msg.csum, self.csum)
+ if data is not None:
+ eq_(msg.data.res, self.res)
+ eq_(n, None)
+ if data:
+ rs = msg.data.option
+ eq_(rs.length, self.nd_length)
+ eq_(rs.hw_src, self.nd_hw_src)
+ eq_(rs.data, None)
+
+ def test_parser_without_data(self):
+ self._test_parser()
+
+ def test_parser_with_data(self):
+ self._test_parser(self.data)
+
+ def test_serialize_without_data(self):
+ rs = icmpv6.nd_router_solicit(self.res)
+ prev = ipv6(6, 0, 0, 8, 64, 255, self.src_ipv6, self.dst_ipv6)
+ rs_csum = icmpv6_csum(prev, self.buf)
+
+ icmp = icmpv6.icmpv6(self.type_, self.code, 0, rs)
+ buf = six.binary_type(icmp.serialize(bytearray(), prev))
+
+ (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0)
+ res = struct.unpack_from(rs._PACK_STR, buf, icmp._MIN_LEN)
+ data = buf[(icmp._MIN_LEN + rs._MIN_LEN):]
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, rs_csum)
+ eq_(res[0], self.res)
+ eq_(data, b'')
+
+ def test_serialize_with_data(self):
+ nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src)
+ rs = icmpv6.nd_router_solicit(self.res, nd_opt)
+ prev = ipv6(6, 0, 0, 16, 64, 255, self.src_ipv6, self.dst_ipv6)
+ rs_csum = icmpv6_csum(prev, self.buf + self.data)
+
+ icmp = icmpv6.icmpv6(self.type_, self.code, 0, rs)
+ buf = six.binary_type(icmp.serialize(bytearray(), prev))
+
+ (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0)
+ res = struct.unpack_from(rs._PACK_STR, buf, icmp._MIN_LEN)
+ (nd_type, nd_length, nd_hw_src) = struct.unpack_from(
+ nd_opt._PACK_STR, buf, icmp._MIN_LEN + rs._MIN_LEN)
+ data = buf[(icmp._MIN_LEN + rs._MIN_LEN + 8):]
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, rs_csum)
+ eq_(res[0], self.res)
+ eq_(nd_type, self.nd_type)
+ eq_(nd_length, self.nd_length)
+ eq_(nd_hw_src, addrconv.mac.text_to_bin(self.nd_hw_src))
+
+ def test_to_string(self):
+ nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src)
+ rs = icmpv6.nd_router_solicit(self.res, nd_opt)
+ ic = icmpv6.icmpv6(self.type_, self.code, self.csum, rs)
+
+ nd_opt_values = {'length': self.nd_length,
+ 'hw_src': self.nd_hw_src,
+ 'data': None}
+ _nd_opt_str = ','.join(['%s=%s' % (k, repr(nd_opt_values[k]))
+ for k, v in inspect.getmembers(nd_opt)
+ if k in nd_opt_values])
+ nd_opt_str = '%s(%s)' % (icmpv6.nd_option_sla.__name__, _nd_opt_str)
+
+ rs_values = {'res': repr(rs.res),
+ 'option': nd_opt_str}
+ _rs_str = ','.join(['%s=%s' % (k, rs_values[k])
+ for k, v in inspect.getmembers(rs)
+ if k in rs_values])
+ rs_str = '%s(%s)' % (icmpv6.nd_router_solicit.__name__, _rs_str)
+
+ icmp_values = {'type_': repr(self.type_),
+ 'code': repr(self.code),
+ 'csum': repr(self.csum),
+ 'data': rs_str}
+ _ic_str = ','.join(['%s=%s' % (k, icmp_values[k])
+ for k, v in inspect.getmembers(ic)
+ if k in icmp_values])
+ ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str)
+
+ eq_(str(ic), ic_str)
+ eq_(repr(ic), ic_str)
+
+ def test_default_args(self):
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_ROUTER_SOLICIT, data=icmpv6.nd_router_solicit())
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_ROUTER_SOLICIT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_router_solicit._PACK_STR,
+ six.binary_type(buf[4:]))
+
+ eq_(res[0], 0)
+
+ # with nd_option_sla
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_ROUTER_SOLICIT,
+ data=icmpv6.nd_router_solicit(
+ option=icmpv6.nd_option_sla()))
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_ROUTER_SOLICIT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_router_solicit._PACK_STR,
+ six.binary_type(buf[4:8]))
+
+ eq_(res[0], 0)
+
+ res = struct.unpack(icmpv6.nd_option_sla._PACK_STR,
+ six.binary_type(buf[8:]))
+
+ eq_(res[0], icmpv6.ND_OPTION_SLA)
+ eq_(res[1], len(icmpv6.nd_option_sla()) // 8)
+ eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+ def test_json(self):
+ nd_opt = icmpv6.nd_option_sla(self.nd_length, self.nd_hw_src)
+ rs = icmpv6.nd_router_solicit(self.res, nd_opt)
+ ic1 = icmpv6.icmpv6(self.type_, self.code, self.csum, rs)
+ jsondict = ic1.to_jsondict()
+ ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6'])
+ eq_(str(ic1), str(ic2))
+
+
+class Test_icmpv6_router_advert(unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_default_args(self):
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_ROUTER_ADVERT, data=icmpv6.nd_router_advert())
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_ROUTER_ADVERT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_router_advert._PACK_STR,
+ six.binary_type(buf[4:]))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 0)
+
+ # with nd_option_sla
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_ROUTER_ADVERT,
+ data=icmpv6.nd_router_advert(
+ options=[icmpv6.nd_option_sla()]))
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_ROUTER_ADVERT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_router_advert._PACK_STR,
+ six.binary_type(buf[4:16]))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 0)
+
+ res = struct.unpack(icmpv6.nd_option_sla._PACK_STR,
+ six.binary_type(buf[16:]))
+
+ eq_(res[0], icmpv6.ND_OPTION_SLA)
+ eq_(res[1], len(icmpv6.nd_option_sla()) // 8)
+ eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+ # with nd_option_pi
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_ROUTER_ADVERT,
+ data=icmpv6.nd_router_advert(
+ options=[icmpv6.nd_option_pi()]))
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_ROUTER_ADVERT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_router_advert._PACK_STR,
+ six.binary_type(buf[4:16]))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 0)
+
+ res = struct.unpack(icmpv6.nd_option_pi._PACK_STR,
+ six.binary_type(buf[16:]))
+
+ eq_(res[0], icmpv6.ND_OPTION_PI)
+ eq_(res[1], 4)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 0)
+ eq_(res[5], 0)
+ eq_(res[6], 0)
+ eq_(res[7], addrconv.ipv6.text_to_bin('::'))
+
+ # with nd_option_sla and nd_option_pi
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_ROUTER_ADVERT,
+ data=icmpv6.nd_router_advert(
+ options=[icmpv6.nd_option_sla(), icmpv6.nd_option_pi()]))
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_ROUTER_ADVERT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_router_advert._PACK_STR,
+ six.binary_type(buf[4:16]))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 0)
+
+ res = struct.unpack(icmpv6.nd_option_sla._PACK_STR,
+ six.binary_type(buf[16:24]))
+
+ eq_(res[0], icmpv6.ND_OPTION_SLA)
+ eq_(res[1], len(icmpv6.nd_option_sla()) // 8)
+ eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+ res = struct.unpack(icmpv6.nd_option_pi._PACK_STR,
+ six.binary_type(buf[24:]))
+
+ eq_(res[0], icmpv6.ND_OPTION_PI)
+ eq_(res[1], len(icmpv6.nd_option_pi()) // 8)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 0)
+ eq_(res[5], 0)
+ eq_(res[6], 0)
+ eq_(res[7], addrconv.ipv6.text_to_bin('::'))
+
+ def test_json(self):
+ ic1 = icmpv6.icmpv6(
+ type_=icmpv6.ND_ROUTER_ADVERT,
+ data=icmpv6.nd_router_advert(
+ options=[icmpv6.nd_option_sla(), icmpv6.nd_option_pi()]))
+ jsondict = ic1.to_jsondict()
+ ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6'])
+ eq_(str(ic1), str(ic2))
+
+
+class Test_icmpv6_nd_option_la(unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_default_args(self):
+ la = icmpv6.nd_option_sla()
+ buf = la.serialize()
+ res = struct.unpack(icmpv6.nd_option_sla._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], icmpv6.ND_OPTION_SLA)
+ eq_(res[1], len(icmpv6.nd_option_sla()) // 8)
+ eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+ # with nd_neighbor
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_NEIGHBOR_ADVERT,
+ data=icmpv6.nd_neighbor(
+ option=icmpv6.nd_option_tla()))
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_NEIGHBOR_ADVERT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_neighbor._PACK_STR,
+ six.binary_type(buf[4:24]))
+
+ eq_(res[0], 0)
+ eq_(res[1], addrconv.ipv6.text_to_bin('::'))
+
+ res = struct.unpack(icmpv6.nd_option_tla._PACK_STR,
+ six.binary_type(buf[24:]))
+
+ eq_(res[0], icmpv6.ND_OPTION_TLA)
+ eq_(res[1], len(icmpv6.nd_option_tla()) // 8)
+ eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+ # with nd_router_solicit
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_ROUTER_SOLICIT,
+ data=icmpv6.nd_router_solicit(
+ option=icmpv6.nd_option_sla()))
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_ROUTER_SOLICIT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_router_solicit._PACK_STR,
+ six.binary_type(buf[4:8]))
+
+ eq_(res[0], 0)
+
+ res = struct.unpack(icmpv6.nd_option_sla._PACK_STR,
+ six.binary_type(buf[8:]))
+
+ eq_(res[0], icmpv6.ND_OPTION_SLA)
+ eq_(res[1], len(icmpv6.nd_option_sla()) // 8)
+ eq_(res[2], addrconv.mac.text_to_bin('00:00:00:00:00:00'))
+
+
+class Test_icmpv6_nd_option_pi(unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_default_args(self):
+ pi = icmpv6.nd_option_pi()
+ buf = pi.serialize()
+ res = struct.unpack(icmpv6.nd_option_pi._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], icmpv6.ND_OPTION_PI)
+ eq_(res[1], len(icmpv6.nd_option_pi()) // 8)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 0)
+ eq_(res[5], 0)
+ eq_(res[6], 0)
+ eq_(res[7], addrconv.ipv6.text_to_bin('::'))
+
+ # with nd_router_advert
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.ND_ROUTER_ADVERT,
+ data=icmpv6.nd_router_advert(
+ options=[icmpv6.nd_option_pi()]))
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.ND_ROUTER_ADVERT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.nd_router_advert._PACK_STR,
+ six.binary_type(buf[4:16]))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 0)
+
+ res = struct.unpack(icmpv6.nd_option_pi._PACK_STR,
+ six.binary_type(buf[16:]))
+
+ eq_(res[0], icmpv6.ND_OPTION_PI)
+ eq_(res[1], 4)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 0)
+ eq_(res[5], 0)
+ eq_(res[6], 0)
+ eq_(res[7], addrconv.ipv6.text_to_bin('::'))
+
+
+class Test_icmpv6_membership_query(unittest.TestCase):
+ type_ = 130
+ code = 0
+ csum = 0xb5a4
+ maxresp = 10000
+ address = 'ff08::1'
+ buf = b'\x82\x00\xb5\xa4\x27\x10\x00\x00' \
+ + b'\xff\x08\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01'
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ mld = icmpv6.mld(self.maxresp, self.address)
+ eq_(mld.maxresp, self.maxresp)
+ eq_(mld.address, self.address)
+
+ def test_parser(self):
+ msg, n, _ = icmpv6.icmpv6.parser(self.buf)
+
+ eq_(msg.type_, self.type_)
+ eq_(msg.code, self.code)
+ eq_(msg.csum, self.csum)
+ eq_(msg.data.maxresp, self.maxresp)
+ eq_(msg.data.address, self.address)
+ eq_(n, None)
+
+ def test_serialize(self):
+ src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da'
+ dst_ipv6 = '3ffe:501:0:1001::2'
+ prev = ipv6(6, 0, 0, len(self.buf), 64, 255, src_ipv6, dst_ipv6)
+ mld_csum = icmpv6_csum(prev, self.buf)
+
+ mld = icmpv6.mld(self.maxresp, self.address)
+ icmp = icmpv6.icmpv6(self.type_, self.code, 0, mld)
+ buf = six.binary_type(icmp.serialize(bytearray(), prev))
+
+ (type_, code, csum) = struct.unpack_from(icmp._PACK_STR, buf, 0)
+ (maxresp, address) = struct.unpack_from(
+ mld._PACK_STR, buf, icmp._MIN_LEN)
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, mld_csum)
+ eq_(maxresp, self.maxresp)
+ eq_(address, addrconv.ipv6.text_to_bin(self.address))
+
+ def test_to_string(self):
+ ml = icmpv6.mld(self.maxresp, self.address)
+ ic = icmpv6.icmpv6(self.type_, self.code, self.csum, ml)
+
+ mld_values = {'maxresp': self.maxresp,
+ 'address': self.address}
+ _mld_str = ','.join(['%s=%s' % (k, repr(mld_values[k]))
+ for k, v in inspect.getmembers(ml)
+ if k in mld_values])
+ mld_str = '%s(%s)' % (icmpv6.mld.__name__, _mld_str)
+
+ icmp_values = {'type_': repr(self.type_),
+ 'code': repr(self.code),
+ 'csum': repr(self.csum),
+ 'data': mld_str}
+ _ic_str = ','.join(['%s=%s' % (k, icmp_values[k])
+ for k, v in inspect.getmembers(ic)
+ if k in icmp_values])
+ ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str)
+
+ eq_(str(ic), ic_str)
+ eq_(repr(ic), ic_str)
+
+ def test_default_args(self):
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.MLD_LISTENER_QUERY, data=icmpv6.mld())
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.MLD_LISTENER_QUERY)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.mld._PACK_STR, six.binary_type(buf[4:]))
+
+ eq_(res[0], 0)
+ eq_(res[1], addrconv.ipv6.text_to_bin('::'))
+
+ def test_json(self):
+ ic1 = icmpv6.icmpv6(
+ type_=icmpv6.MLD_LISTENER_QUERY,
+ data=icmpv6.mld())
+ jsondict = ic1.to_jsondict()
+ ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6'])
+ eq_(str(ic1), str(ic2))
+
+
+class Test_icmpv6_membership_report(Test_icmpv6_membership_query):
+ type_ = 131
+ code = 0
+ csum = 0xb4a4
+ maxresp = 10000
+ address = 'ff08::1'
+ buf = b'\x83\x00\xb4\xa4\x27\x10\x00\x00' \
+ + b'\xff\x08\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01'
+
+ def test_json(self):
+ ic1 = icmpv6.icmpv6(
+ type_=icmpv6.MLD_LISTENER_REPOR,
+ data=icmpv6.mld())
+ jsondict = ic1.to_jsondict()
+ ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6'])
+ eq_(str(ic1), str(ic2))
+
+
+class Test_icmpv6_membership_done(Test_icmpv6_membership_query):
+ type_ = 132
+ code = 0
+ csum = 0xb3a4
+ maxresp = 10000
+ address = 'ff08::1'
+ buf = b'\x84\x00\xb3\xa4\x27\x10\x00\x00' \
+ + b'\xff\x08\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01'
+
+ def test_json(self):
+ ic1 = icmpv6.icmpv6(
+ type_=icmpv6.MLD_LISTENER_DONE,
+ data=icmpv6.mld())
+ jsondict = ic1.to_jsondict()
+ ic2 = icmpv6.icmpv6.from_jsondict(jsondict['icmpv6'])
+ eq_(str(ic1), str(ic2))
+
+
+class Test_mldv2_query(unittest.TestCase):
+ type_ = 130
+ code = 0
+ csum = 0xb5a4
+ maxresp = 10000
+ address = 'ff08::1'
+ s_flg = 0
+ qrv = 2
+ s_qrv = s_flg << 3 | qrv
+ qqic = 10
+ num = 0
+ srcs = []
+
+ mld = icmpv6.mldv2_query(
+ maxresp, address, s_flg, qrv, qqic, num, srcs)
+
+ buf = b'\x82\x00\xb5\xa4\x27\x10\x00\x00' \
+ + b'\xff\x08\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01' \
+ + b'\x02\x0a\x00\x00'
+
+ def setUp(self):
+ pass
+
+ def setUp_with_srcs(self):
+ self.num = 2
+ self.srcs = ['ff80::1', 'ff80::2']
+ self.mld = icmpv6.mldv2_query(
+ self.maxresp, self.address, self.s_flg, self.qrv, self.qqic,
+ self.num, self.srcs)
+ self.buf = b'\x82\x00\xb5\xa4\x27\x10\x00\x00' \
+ + b'\xff\x08\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01' \
+ + b'\x02\x0a\x00\x02' \
+ + b'\xff\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01' \
+ + b'\xff\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x02'
+
+ def tearDown(self):
+ pass
+
+ def find_protocol(self, pkt, name):
+ for p in pkt.protocols:
+ if p.protocol_name == name:
+ return p
+
+ def test_init(self):
+ eq_(self.mld.maxresp, self.maxresp)
+ eq_(self.mld.address, self.address)
+ eq_(self.mld.s_flg, self.s_flg)
+ eq_(self.mld.qrv, self.qrv)
+ eq_(self.mld.qqic, self.qqic)
+ eq_(self.mld.num, self.num)
+ eq_(self.mld.srcs, self.srcs)
+
+ def test_init_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_init()
+
+ def test_parser(self):
+ msg, n, _ = icmpv6.icmpv6.parser(self.buf)
+
+ eq_(msg.type_, self.type_)
+ eq_(msg.code, self.code)
+ eq_(msg.csum, self.csum)
+ eq_(msg.data.maxresp, self.maxresp)
+ eq_(msg.data.address, self.address)
+ eq_(msg.data.s_flg, self.s_flg)
+ eq_(msg.data.qrv, self.qrv)
+ eq_(msg.data.qqic, self.qqic)
+ eq_(msg.data.num, self.num)
+ eq_(msg.data.srcs, self.srcs)
+ eq_(n, None)
+
+ def test_parser_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_parser()
+
+ def test_serialize(self):
+ src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da'
+ dst_ipv6 = '3ffe:501:0:1001::2'
+ prev = ipv6(6, 0, 0, len(self.buf), 64, 255, src_ipv6, dst_ipv6)
+ mld_csum = icmpv6_csum(prev, self.buf)
+
+ icmp = icmpv6.icmpv6(self.type_, self.code, 0, self.mld)
+ buf = icmp.serialize(bytearray(), prev)
+
+ (type_, code, csum) = struct.unpack_from(icmp._PACK_STR,
+ six.binary_type(buf))
+ (maxresp, address, s_qrv, qqic, num) = struct.unpack_from(
+ self.mld._PACK_STR, six.binary_type(buf), icmp._MIN_LEN)
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, mld_csum)
+ eq_(maxresp, self.maxresp)
+ eq_(address, addrconv.ipv6.text_to_bin(self.address))
+ s_flg = (s_qrv >> 3) & 0b1
+ qrv = s_qrv & 0b111
+ eq_(s_flg, self.s_flg)
+ eq_(qrv, self.qrv)
+ eq_(qqic, self.qqic)
+ eq_(num, self.num)
+
+ def test_serialize_with_srcs(self):
+ self.setUp_with_srcs()
+ src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da'
+ dst_ipv6 = '3ffe:501:0:1001::2'
+ prev = ipv6(6, 0, 0, len(self.buf), 64, 255, src_ipv6, dst_ipv6)
+ mld_csum = icmpv6_csum(prev, self.buf)
+
+ icmp = icmpv6.icmpv6(self.type_, self.code, 0, self.mld)
+ buf = icmp.serialize(bytearray(), prev)
+
+ (type_, code, csum) = struct.unpack_from(icmp._PACK_STR,
+ six.binary_type(buf))
+ (maxresp, address, s_qrv, qqic, num) = struct.unpack_from(
+ self.mld._PACK_STR, six.binary_type(buf), icmp._MIN_LEN)
+ (addr1, addr2) = struct.unpack_from(
+ '!16s16s', six.binary_type(buf), icmp._MIN_LEN + self.mld._MIN_LEN)
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, mld_csum)
+ eq_(maxresp, self.maxresp)
+ eq_(address, addrconv.ipv6.text_to_bin(self.address))
+ s_flg = (s_qrv >> 3) & 0b1
+ qrv = s_qrv & 0b111
+ eq_(s_flg, self.s_flg)
+ eq_(qrv, self.qrv)
+ eq_(qqic, self.qqic)
+ eq_(num, self.num)
+ eq_(addr1, addrconv.ipv6.text_to_bin(self.srcs[0]))
+ eq_(addr2, addrconv.ipv6.text_to_bin(self.srcs[1]))
+
+ def _build_mldv2_query(self):
+ e = ethernet(ethertype=ether.ETH_TYPE_IPV6)
+ i = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(type_=icmpv6.MLD_LISTENER_QUERY,
+ data=self.mld)
+ p = e / i / ic
+ return p
+
+ def test_build_mldv2_query(self):
+ p = self._build_mldv2_query()
+
+ e = self.find_protocol(p, "ethernet")
+ ok_(e)
+ eq_(e.ethertype, ether.ETH_TYPE_IPV6)
+
+ i = self.find_protocol(p, "ipv6")
+ ok_(i)
+ eq_(i.nxt, inet.IPPROTO_ICMPV6)
+
+ ic = self.find_protocol(p, "icmpv6")
+ ok_(ic)
+ eq_(ic.type_, icmpv6.MLD_LISTENER_QUERY)
+
+ eq_(ic.data.maxresp, self.maxresp)
+ eq_(ic.data.address, self.address)
+ eq_(ic.data.s_flg, self.s_flg)
+ eq_(ic.data.qrv, self.qrv)
+ eq_(ic.data.num, self.num)
+ eq_(ic.data.srcs, self.srcs)
+
+ def test_build_mldv2_query_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_build_mldv2_query()
+
+ def test_to_string(self):
+ ic = icmpv6.icmpv6(self.type_, self.code, self.csum, self.mld)
+
+ mld_values = {'maxresp': self.maxresp,
+ 'address': self.address,
+ 's_flg': self.s_flg,
+ 'qrv': self.qrv,
+ 'qqic': self.qqic,
+ 'num': self.num,
+ 'srcs': self.srcs}
+ _mld_str = ','.join(['%s=%s' % (k, repr(mld_values[k]))
+ for k, v in inspect.getmembers(self.mld)
+ if k in mld_values])
+ mld_str = '%s(%s)' % (icmpv6.mldv2_query.__name__, _mld_str)
+
+ icmp_values = {'type_': repr(self.type_),
+ 'code': repr(self.code),
+ 'csum': repr(self.csum),
+ 'data': mld_str}
+ _ic_str = ','.join(['%s=%s' % (k, icmp_values[k])
+ for k, v in inspect.getmembers(ic)
+ if k in icmp_values])
+ ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str)
+
+ eq_(str(ic), ic_str)
+ eq_(repr(ic), ic_str)
+
+ def test_to_string_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_to_string()
+
+ @raises(Exception)
+ def test_num_larger_than_srcs(self):
+ self.srcs = ['ff80::1', 'ff80::2', 'ff80::3']
+ self.num = len(self.srcs) + 1
+ self.buf = pack(icmpv6.mldv2_query._PACK_STR, self.maxresp,
+ addrconv.ipv6.text_to_bin(self.address),
+ self.s_qrv, self.qqic, self.num)
+ for src in self.srcs:
+ self.buf += pack('16s', addrconv.ipv6.text_to_bin(src))
+ self.mld = icmpv6.mldv2_query(
+ self.maxresp, self.address, self.s_flg, self.qrv, self.qqic,
+ self.num, self.srcs)
+ self.test_parser()
+
+ @raises(Exception)
+ def test_num_smaller_than_srcs(self):
+ self.srcs = ['ff80::1', 'ff80::2', 'ff80::3']
+ self.num = len(self.srcs) - 1
+ self.buf = pack(icmpv6.mldv2_query._PACK_STR, self.maxresp,
+ addrconv.ipv6.text_to_bin(self.address),
+ self.s_qrv, self.qqic, self.num)
+ for src in self.srcs:
+ self.buf += pack('16s', addrconv.ipv6.text_to_bin(src))
+ self.mld = icmpv6.mldv2_query(
+ self.maxresp, self.address, self.s_flg, self.qrv, self.qqic,
+ self.num, self.srcs)
+ self.test_parser()
+
+ def test_default_args(self):
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.MLD_LISTENER_QUERY, data=icmpv6.mldv2_query())
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.MLD_LISTENER_QUERY)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.mldv2_query._PACK_STR, six.binary_type(buf[4:]))
+
+ eq_(res[0], 0)
+ eq_(res[1], addrconv.ipv6.text_to_bin('::'))
+ eq_(res[2], 2)
+ eq_(res[3], 0)
+ eq_(res[4], 0)
+
+ # srcs without num
+ srcs = ['ff80::1', 'ff80::2', 'ff80::3']
+ que = icmpv6.mldv2_query(srcs=srcs)
+ buf = que.serialize()
+ res = struct.unpack_from(
+ icmpv6.mldv2_query._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0)
+ eq_(res[1], addrconv.ipv6.text_to_bin('::'))
+ eq_(res[2], 2)
+ eq_(res[3], 0)
+ eq_(res[4], len(srcs))
+
+ (src1, src2, src3) = struct.unpack_from(
+ '16s16s16s', six.binary_type(buf), icmpv6.mldv2_query._MIN_LEN)
+
+ eq_(src1, addrconv.ipv6.text_to_bin(srcs[0]))
+ eq_(src2, addrconv.ipv6.text_to_bin(srcs[1]))
+ eq_(src3, addrconv.ipv6.text_to_bin(srcs[2]))
+
+ def test_json(self):
+ jsondict = self.mld.to_jsondict()
+ mld = icmpv6.mldv2_query.from_jsondict(jsondict['mldv2_query'])
+ eq_(str(self.mld), str(mld))
+
+ def test_json_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_json()
+
+
+class Test_mldv2_report(unittest.TestCase):
+ type_ = 143
+ code = 0
+ csum = 0xb5a4
+ record_num = 0
+ records = []
+
+ mld = icmpv6.mldv2_report(record_num, records)
+
+ buf = b'\x8f\x00\xb5\xa4\x00\x00\x00\x00'
+
+ def setUp(self):
+ pass
+
+ def setUp_with_records(self):
+ self.record1 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 0, 0, 'ff00::1')
+ self.record2 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 0, 2, 'ff00::2',
+ ['fe80::1', 'fe80::2'])
+ self.record3 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 1, 0, 'ff00::3', [], b'abc\x00')
+ self.record4 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 2, 2, 'ff00::4',
+ ['fe80::1', 'fe80::2'], b'abcde\x00\x00\x00')
+ self.records = [self.record1, self.record2, self.record3,
+ self.record4]
+ self.record_num = len(self.records)
+ self.mld = icmpv6.mldv2_report(self.record_num, self.records)
+ self.buf = b'\x8f\x00\xb5\xa4\x00\x00\x00\x04' \
+ + b'\x01\x00\x00\x00' \
+ + b'\xff\x00\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01' \
+ + b'\x01\x00\x00\x02' \
+ + b'\xff\x00\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x02' \
+ + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01' \
+ + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x02' \
+ + b'\x01\x01\x00\x00' \
+ + b'\xff\x00\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x03' \
+ + b'\x61\x62\x63\x00' \
+ + b'\x01\x02\x00\x02' \
+ + b'\xff\x00\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x04' \
+ + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01' \
+ + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x02' \
+ + b'\x61\x62\x63\x64\x65\x00\x00\x00'
+
+ def tearDown(self):
+ pass
+
+ def find_protocol(self, pkt, name):
+ for p in pkt.protocols:
+ if p.protocol_name == name:
+ return p
+
+ def test_init(self):
+ eq_(self.mld.record_num, self.record_num)
+ eq_(self.mld.records, self.records)
+
+ def test_init_with_records(self):
+ self.setUp_with_records()
+ self.test_init()
+
+ def test_parser(self):
+ msg, n, _ = icmpv6.icmpv6.parser(self.buf)
+
+ eq_(msg.type_, self.type_)
+ eq_(msg.code, self.code)
+ eq_(msg.csum, self.csum)
+ eq_(msg.data.record_num, self.record_num)
+ eq_(repr(msg.data.records), repr(self.records))
+
+ def test_parser_with_records(self):
+ self.setUp_with_records()
+ self.test_parser()
+
+ def test_serialize(self):
+ src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da'
+ dst_ipv6 = '3ffe:501:0:1001::2'
+ prev = ipv6(6, 0, 0, len(self.buf), 64, 255, src_ipv6, dst_ipv6)
+ mld_csum = icmpv6_csum(prev, self.buf)
+
+ icmp = icmpv6.icmpv6(self.type_, self.code, 0, self.mld)
+ buf = icmp.serialize(bytearray(), prev)
+
+ (type_, code, csum) = struct.unpack_from(icmp._PACK_STR,
+ six.binary_type(buf))
+ (record_num, ) = struct.unpack_from(
+ self.mld._PACK_STR, six.binary_type(buf), icmp._MIN_LEN)
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, mld_csum)
+ eq_(record_num, self.record_num)
+
+ def test_serialize_with_records(self):
+ self.setUp_with_records()
+ src_ipv6 = '3ffe:507:0:1:200:86ff:fe05:80da'
+ dst_ipv6 = '3ffe:501:0:1001::2'
+ prev = ipv6(6, 0, 0, len(self.buf), 64, 255, src_ipv6, dst_ipv6)
+ mld_csum = icmpv6_csum(prev, self.buf)
+
+ icmp = icmpv6.icmpv6(self.type_, self.code, 0, self.mld)
+ buf = six.binary_type(icmp.serialize(bytearray(), prev))
+
+ (type_, code, csum) = struct.unpack_from(icmp._PACK_STR,
+ six.binary_type(buf))
+ (record_num, ) = struct.unpack_from(
+ self.mld._PACK_STR, six.binary_type(buf), icmp._MIN_LEN)
+ offset = icmp._MIN_LEN + self.mld._MIN_LEN
+ rec1 = icmpv6.mldv2_report_group.parser(buf[offset:])
+ offset += len(rec1)
+ rec2 = icmpv6.mldv2_report_group.parser(buf[offset:])
+ offset += len(rec2)
+ rec3 = icmpv6.mldv2_report_group.parser(buf[offset:])
+ offset += len(rec3)
+ rec4 = icmpv6.mldv2_report_group.parser(buf[offset:])
+
+ eq_(type_, self.type_)
+ eq_(code, self.code)
+ eq_(csum, mld_csum)
+ eq_(record_num, self.record_num)
+ eq_(repr(rec1), repr(self.record1))
+ eq_(repr(rec2), repr(self.record2))
+ eq_(repr(rec3), repr(self.record3))
+ eq_(repr(rec4), repr(self.record4))
+
+ def _build_mldv2_report(self):
+ e = ethernet(ethertype=ether.ETH_TYPE_IPV6)
+ i = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(type_=icmpv6.MLDV2_LISTENER_REPORT,
+ data=self.mld)
+ p = e / i / ic
+ return p
+
+ def test_build_mldv2_report(self):
+ p = self._build_mldv2_report()
+
+ e = self.find_protocol(p, "ethernet")
+ ok_(e)
+ eq_(e.ethertype, ether.ETH_TYPE_IPV6)
+
+ i = self.find_protocol(p, "ipv6")
+ ok_(i)
+ eq_(i.nxt, inet.IPPROTO_ICMPV6)
+
+ ic = self.find_protocol(p, "icmpv6")
+ ok_(ic)
+ eq_(ic.type_, icmpv6.MLDV2_LISTENER_REPORT)
+
+ eq_(ic.data.record_num, self.record_num)
+ eq_(ic.data.records, self.records)
+
+ def test_build_mldv2_report_with_records(self):
+ self.setUp_with_records()
+ self.test_build_mldv2_report()
+
+ def test_to_string(self):
+ ic = icmpv6.icmpv6(self.type_, self.code, self.csum, self.mld)
+
+ mld_values = {'record_num': self.record_num,
+ 'records': self.records}
+ _mld_str = ','.join(['%s=%s' % (k, repr(mld_values[k]))
+ for k, v in inspect.getmembers(self.mld)
+ if k in mld_values])
+ mld_str = '%s(%s)' % (icmpv6.mldv2_report.__name__, _mld_str)
+
+ icmp_values = {'type_': repr(self.type_),
+ 'code': repr(self.code),
+ 'csum': repr(self.csum),
+ 'data': mld_str}
+ _ic_str = ','.join(['%s=%s' % (k, icmp_values[k])
+ for k, v in inspect.getmembers(ic)
+ if k in icmp_values])
+ ic_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _ic_str)
+
+ eq_(str(ic), ic_str)
+ eq_(repr(ic), ic_str)
+
+ def test_to_string_with_records(self):
+ self.setUp_with_records()
+ self.test_to_string()
+
+ @raises(Exception)
+ def test_record_num_larger_than_records(self):
+ self.record1 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 0, 0, 'ff00::1')
+ self.record2 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 0, 2, 'ff00::2',
+ ['fe80::1', 'fe80::2'])
+ self.record3 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 1, 0, 'ff00::3', [], b'abc\x00')
+ self.record4 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 2, 2, 'ff00::4',
+ ['fe80::1', 'fe80::2'], b'abcde\x00\x00\x00')
+ self.records = [self.record1, self.record2, self.record3,
+ self.record4]
+ self.record_num = len(self.records) + 1
+ self.buf = struct.pack(
+ icmpv6.mldv2_report._PACK_STR, self.record_num)
+ self.buf += self.record1.serialize()
+ self.buf += self.record2.serialize()
+ self.buf += self.record3.serialize()
+ self.buf += self.record4.serialize()
+ self.mld = icmpv6.mldv2_report(self.record_num, self.records)
+ self.test_parser()
+
+ @raises(Exception)
+ def test_record_num_smaller_than_records(self):
+ self.record1 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 0, 0, 'ff00::1')
+ self.record2 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 0, 2, 'ff00::2',
+ ['fe80::1', 'fe80::2'])
+ self.record3 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 1, 0, 'ff00::3', [], b'abc\x00')
+ self.record4 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 2, 2, 'ff00::4',
+ ['fe80::1', 'fe80::2'], b'abcde\x00\x00\x00')
+ self.records = [self.record1, self.record2, self.record3,
+ self.record4]
+ self.record_num = len(self.records) - 1
+ self.buf = struct.pack(
+ icmpv6.mldv2_report._PACK_STR, self.record_num)
+ self.buf += self.record1.serialize()
+ self.buf += self.record2.serialize()
+ self.buf += self.record3.serialize()
+ self.buf += self.record4.serialize()
+ self.mld = icmpv6.mldv2_report(self.record_num, self.records)
+ self.test_parser()
+
+ def test_default_args(self):
+ prev = ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6(
+ type_=icmpv6.MLDV2_LISTENER_REPORT, data=icmpv6.mldv2_report())
+ prev.serialize(ic, None)
+ buf = ic.serialize(bytearray(), prev)
+ res = struct.unpack(icmpv6.icmpv6._PACK_STR, six.binary_type(buf[:4]))
+
+ eq_(res[0], icmpv6.MLDV2_LISTENER_REPORT)
+ eq_(res[1], 0)
+ eq_(res[2], icmpv6_csum(prev, buf))
+
+ res = struct.unpack(icmpv6.mldv2_report._PACK_STR, six.binary_type(buf[4:]))
+
+ eq_(res[0], 0)
+
+ # records without record_num
+ record1 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 0, 0, 'ff00::1')
+ record2 = icmpv6.mldv2_report_group(
+ icmpv6.MODE_IS_INCLUDE, 0, 2, 'ff00::2',
+ ['fe80::1', 'fe80::2'])
+ records = [record1, record2]
+ rep = icmpv6.mldv2_report(records=records)
+ buf = rep.serialize()
+ res = struct.unpack_from(
+ icmpv6.mldv2_report._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], len(records))
+
+ res = struct.unpack_from(
+ icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf),
+ icmpv6.mldv2_report._MIN_LEN)
+
+ eq_(res[0], icmpv6.MODE_IS_INCLUDE)
+ eq_(res[1], 0)
+ eq_(res[2], 0)
+ eq_(res[3], addrconv.ipv6.text_to_bin('ff00::1'))
+
+ res = struct.unpack_from(
+ icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf),
+ icmpv6.mldv2_report._MIN_LEN +
+ icmpv6.mldv2_report_group._MIN_LEN)
+
+ eq_(res[0], icmpv6.MODE_IS_INCLUDE)
+ eq_(res[1], 0)
+ eq_(res[2], 2)
+ eq_(res[3], addrconv.ipv6.text_to_bin('ff00::2'))
+
+ res = struct.unpack_from(
+ '16s16s', six.binary_type(buf),
+ icmpv6.mldv2_report._MIN_LEN +
+ icmpv6.mldv2_report_group._MIN_LEN +
+ icmpv6.mldv2_report_group._MIN_LEN)
+
+ eq_(res[0], addrconv.ipv6.text_to_bin('fe80::1'))
+ eq_(res[1], addrconv.ipv6.text_to_bin('fe80::2'))
+
+ def test_json(self):
+ jsondict = self.mld.to_jsondict()
+ mld = icmpv6.mldv2_report.from_jsondict(jsondict['mldv2_report'])
+ eq_(str(self.mld), str(mld))
+
+ def test_json_with_records(self):
+ self.setUp_with_records()
+ self.test_json()
+
+
+class Test_mldv2_report_group(unittest.TestCase):
+ type_ = icmpv6.MODE_IS_INCLUDE
+ aux_len = 0
+ num = 0
+ address = 'ff00::1'
+ srcs = []
+ aux = None
+ mld = icmpv6.mldv2_report_group(
+ type_, aux_len, num, address, srcs, aux)
+ buf = b'\x01\x00\x00\x00' \
+ + b'\xff\x00\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01'
+
+ def setUp(self):
+ pass
+
+ def setUp_with_srcs(self):
+ self.srcs = ['fe80::1', 'fe80::2', 'fe80::3']
+ self.num = len(self.srcs)
+ self.mld = icmpv6.mldv2_report_group(
+ self.type_, self.aux_len, self.num, self.address, self.srcs,
+ self.aux)
+ self.buf = b'\x01\x00\x00\x03' \
+ + b'\xff\x00\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01' \
+ + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01' \
+ + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x02' \
+ + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x03'
+
+ def setUp_with_aux(self):
+ self.aux = b'\x01\x02\x03\x04\x05\x06\x07\x08'
+ self.aux_len = len(self.aux) // 4
+ self.mld = icmpv6.mldv2_report_group(
+ self.type_, self.aux_len, self.num, self.address, self.srcs,
+ self.aux)
+ self.buf = b'\x01\x02\x00\x00' \
+ + b'\xff\x00\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01' \
+ + b'\x01\x02\x03\x04\x05\x06\x07\x08'
+
+ def setUp_with_srcs_and_aux(self):
+ self.srcs = ['fe80::1', 'fe80::2', 'fe80::3']
+ self.num = len(self.srcs)
+ self.aux = b'\x01\x02\x03\x04\x05\x06\x07\x08'
+ self.aux_len = len(self.aux) // 4
+ self.mld = icmpv6.mldv2_report_group(
+ self.type_, self.aux_len, self.num, self.address, self.srcs,
+ self.aux)
+ self.buf = b'\x01\x02\x00\x03' \
+ + b'\xff\x00\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01' \
+ + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01' \
+ + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x02' \
+ + b'\xfe\x80\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x03' \
+ + b'\x01\x02\x03\x04\x05\x06\x07\x08'
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.mld.type_, self.type_)
+ eq_(self.mld.aux_len, self.aux_len)
+ eq_(self.mld.num, self.num)
+ eq_(self.mld.address, self.address)
+ eq_(self.mld.srcs, self.srcs)
+ eq_(self.mld.aux, self.aux)
+
+ def test_init_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_init()
+
+ def test_init_with_aux(self):
+ self.setUp_with_aux()
+ self.test_init()
+
+ def test_init_with_srcs_and_aux(self):
+ self.setUp_with_srcs_and_aux()
+ self.test_init()
+
+ def test_parser(self):
+ _res = icmpv6.mldv2_report_group.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+
+ eq_(res.type_, self.type_)
+ eq_(res.aux_len, self.aux_len)
+ eq_(res.num, self.num)
+ eq_(res.address, self.address)
+ eq_(res.srcs, self.srcs)
+ eq_(res.aux, self.aux)
+
+ def test_parser_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_parser()
+
+ def test_parser_with_aux(self):
+ self.setUp_with_aux()
+ self.test_parser()
+
+ def test_parser_with_srcs_and_aux(self):
+ self.setUp_with_srcs_and_aux()
+ self.test_parser()
+
+ def test_serialize(self):
+ buf = self.mld.serialize()
+ res = struct.unpack_from(
+ icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], self.type_)
+ eq_(res[1], self.aux_len)
+ eq_(res[2], self.num)
+ eq_(res[3], addrconv.ipv6.text_to_bin(self.address))
+
+ def test_serialize_with_srcs(self):
+ self.setUp_with_srcs()
+ buf = self.mld.serialize()
+ res = struct.unpack_from(
+ icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf))
+ (src1, src2, src3) = struct.unpack_from(
+ '16s16s16s', six.binary_type(buf), icmpv6.mldv2_report_group._MIN_LEN)
+ eq_(res[0], self.type_)
+ eq_(res[1], self.aux_len)
+ eq_(res[2], self.num)
+ eq_(res[3], addrconv.ipv6.text_to_bin(self.address))
+ eq_(src1, addrconv.ipv6.text_to_bin(self.srcs[0]))
+ eq_(src2, addrconv.ipv6.text_to_bin(self.srcs[1]))
+ eq_(src3, addrconv.ipv6.text_to_bin(self.srcs[2]))
+
+ def test_serialize_with_aux(self):
+ self.setUp_with_aux()
+ buf = self.mld.serialize()
+ res = struct.unpack_from(
+ icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf))
+ (aux, ) = struct.unpack_from(
+ '%ds' % (self.aux_len * 4), six.binary_type(buf),
+ icmpv6.mldv2_report_group._MIN_LEN)
+ eq_(res[0], self.type_)
+ eq_(res[1], self.aux_len)
+ eq_(res[2], self.num)
+ eq_(res[3], addrconv.ipv6.text_to_bin(self.address))
+ eq_(aux, self.aux)
+
+ def test_serialize_with_srcs_and_aux(self):
+ self.setUp_with_srcs_and_aux()
+ buf = self.mld.serialize()
+ res = struct.unpack_from(
+ icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf))
+ (src1, src2, src3) = struct.unpack_from(
+ '16s16s16s', six.binary_type(buf), icmpv6.mldv2_report_group._MIN_LEN)
+ (aux, ) = struct.unpack_from(
+ '%ds' % (self.aux_len * 4), six.binary_type(buf),
+ icmpv6.mldv2_report_group._MIN_LEN + 16 * 3)
+ eq_(res[0], self.type_)
+ eq_(res[1], self.aux_len)
+ eq_(res[2], self.num)
+ eq_(res[3], addrconv.ipv6.text_to_bin(self.address))
+ eq_(src1, addrconv.ipv6.text_to_bin(self.srcs[0]))
+ eq_(src2, addrconv.ipv6.text_to_bin(self.srcs[1]))
+ eq_(src3, addrconv.ipv6.text_to_bin(self.srcs[2]))
+ eq_(aux, self.aux)
+
+ def test_to_string(self):
+ igmp_values = {'type_': repr(self.type_),
+ 'aux_len': repr(self.aux_len),
+ 'num': repr(self.num),
+ 'address': repr(self.address),
+ 'srcs': repr(self.srcs),
+ 'aux': repr(self.aux)}
+ _g_str = ','.join(['%s=%s' % (k, igmp_values[k])
+ for k, v in inspect.getmembers(self.mld)
+ if k in igmp_values])
+ g_str = '%s(%s)' % (icmpv6.mldv2_report_group.__name__, _g_str)
+
+ eq_(str(self.mld), g_str)
+ eq_(repr(self.mld), g_str)
+
+ def test_to_string_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_to_string()
+
+ def test_to_string_with_aux(self):
+ self.setUp_with_aux()
+ self.test_to_string()
+
+ def test_to_string_with_srcs_and_aux(self):
+ self.setUp_with_srcs_and_aux()
+ self.test_to_string()
+
+ def test_len(self):
+ eq_(len(self.mld), 20)
+
+ def test_len_with_srcs(self):
+ self.setUp_with_srcs()
+ eq_(len(self.mld), 68)
+
+ def test_len_with_aux(self):
+ self.setUp_with_aux()
+ eq_(len(self.mld), 28)
+
+ def test_len_with_srcs_and_aux(self):
+ self.setUp_with_srcs_and_aux()
+ eq_(len(self.mld), 76)
+
+ @raises
+ def test_num_larger_than_srcs(self):
+ self.srcs = ['fe80::1', 'fe80::2', 'fe80::3']
+ self.num = len(self.srcs) + 1
+ self.buf = struct.pack(
+ icmpv6.mldv2_report_group._PACK_STR, self.type_, self.aux_len,
+ self.num, addrconv.ipv6.text_to_bin(self.address))
+ for src in self.srcs:
+ self.buf += pack('16s', addrconv.ipv6.text_to_bin(src))
+ self.mld = icmpv6.mldv2_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+ self.test_parser()
+
+ @raises
+ def test_num_smaller_than_srcs(self):
+ self.srcs = ['fe80::1', 'fe80::2', 'fe80::3']
+ self.num = len(self.srcs) - 1
+ self.buf = struct.pack(
+ icmpv6.mldv2_report_group._PACK_STR, self.type_, self.aux_len,
+ self.num, addrconv.ipv6.text_to_bin(self.address))
+ for src in self.srcs:
+ self.buf += pack('16s', addrconv.ipv6.text_to_bin(src))
+ self.mld = icmpv6.mldv2_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+ self.test_parser()
+
+ @raises
+ def test_aux_len_larger_than_aux(self):
+ self.aux = b'\x01\x02\x03\x04\x05\x06\x07\x08'
+ self.aux_len = len(self.aux) // 4 + 1
+ self.buf = struct.pack(
+ icmpv6.mldv2_report_group._PACK_STR, self.type_, self.aux_len,
+ self.num, addrconv.ipv6.text_to_bin(self.address))
+ self.buf += self.aux
+ self.mld = icmpv6.mldv2_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+ self.test_parser()
+
+ @raises
+ def test_aux_len_smaller_than_aux(self):
+ self.aux = b'\x01\x02\x03\x04\x05\x06\x07\x08'
+ self.aux_len = len(self.aux) // 4 - 1
+ self.buf = struct.pack(
+ icmpv6.mldv2_report_group._PACK_STR, self.type_, self.aux_len,
+ self.num, addrconv.ipv6.text_to_bin(self.address))
+ self.buf += self.aux
+ self.mld = icmpv6.mldv2_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+ self.test_parser()
+
+ def test_default_args(self):
+ rep = icmpv6.mldv2_report_group()
+ buf = rep.serialize()
+ res = struct.unpack_from(
+ icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+ eq_(res[2], 0)
+ eq_(res[3], addrconv.ipv6.text_to_bin('::'))
+
+ # srcs without num
+ srcs = ['fe80::1', 'fe80::2', 'fe80::3']
+ rep = icmpv6.mldv2_report_group(srcs=srcs)
+ buf = rep.serialize()
+ LOG.info(repr(buf))
+ res = struct.unpack_from(
+ icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+ eq_(res[2], len(srcs))
+ eq_(res[3], addrconv.ipv6.text_to_bin('::'))
+
+ (src1, src2, src3) = struct.unpack_from(
+ '16s16s16s', six.binary_type(buf), icmpv6.mldv2_report_group._MIN_LEN)
+
+ eq_(src1, addrconv.ipv6.text_to_bin(srcs[0]))
+ eq_(src2, addrconv.ipv6.text_to_bin(srcs[1]))
+ eq_(src3, addrconv.ipv6.text_to_bin(srcs[2]))
+
+ # aux without aux_len
+ rep = icmpv6.mldv2_report_group(aux=b'\x01\x02\x03')
+ buf = rep.serialize()
+ res = struct.unpack_from(
+ icmpv6.mldv2_report_group._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0)
+ eq_(res[1], 1)
+ eq_(res[2], 0)
+ eq_(res[3], addrconv.ipv6.text_to_bin('::'))
+ eq_(buf[icmpv6.mldv2_report_group._MIN_LEN:], b'\x01\x02\x03\x00')
+
+ def test_json(self):
+ jsondict = self.mld.to_jsondict()
+ mld = icmpv6.mldv2_report_group.from_jsondict(
+ jsondict['mldv2_report_group'])
+ eq_(str(self.mld), str(mld))
+
+ def test_json_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_json()
+
+ def test_json_with_aux(self):
+ self.setUp_with_aux()
+ self.test_json()
+
+ def test_json_with_srcs_and_aux(self):
+ self.setUp_with_srcs_and_aux()
+ self.test_json()
diff --git a/tests/unit/packet/test_igmp.py b/tests/unit/packet/test_igmp.py
new file mode 100644
index 00000000..9813450d
--- /dev/null
+++ b/tests/unit/packet/test_igmp.py
@@ -0,0 +1,997 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import inspect
+import logging
+import six
+
+from struct import pack, unpack_from, pack_into
+from nose.tools import ok_, eq_, raises
+from ryu.ofproto import ether
+from ryu.ofproto import inet
+from ryu.lib.packet.ethernet import ethernet
+from ryu.lib.packet.ipv4 import ipv4
+from ryu.lib.packet.packet import Packet
+from ryu.lib.packet.packet_utils import checksum
+from ryu.lib import addrconv
+from ryu.lib.packet.igmp import igmp
+from ryu.lib.packet.igmp import igmpv3_query
+from ryu.lib.packet.igmp import igmpv3_report
+from ryu.lib.packet.igmp import igmpv3_report_group
+from ryu.lib.packet.igmp import IGMP_TYPE_QUERY
+from ryu.lib.packet.igmp import IGMP_TYPE_REPORT_V3
+from ryu.lib.packet.igmp import MODE_IS_INCLUDE
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_igmp(unittest.TestCase):
+ """ Test case for Internet Group Management Protocol
+ """
+ def setUp(self):
+ self.msgtype = IGMP_TYPE_QUERY
+ self.maxresp = 100
+ self.csum = 0
+ self.address = '225.0.0.1'
+
+ self.buf = pack(igmp._PACK_STR, self.msgtype, self.maxresp,
+ self.csum,
+ addrconv.ipv4.text_to_bin(self.address))
+
+ self.g = igmp(self.msgtype, self.maxresp, self.csum,
+ self.address)
+
+ def tearDown(self):
+ pass
+
+ def find_protocol(self, pkt, name):
+ for p in pkt.protocols:
+ if p.protocol_name == name:
+ return p
+
+ def test_init(self):
+ eq_(self.msgtype, self.g.msgtype)
+ eq_(self.maxresp, self.g.maxresp)
+ eq_(self.csum, self.g.csum)
+ eq_(self.address, self.g.address)
+
+ def test_parser(self):
+ _res = self.g.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+
+ eq_(res.msgtype, self.msgtype)
+ eq_(res.maxresp, self.maxresp)
+ eq_(res.csum, self.csum)
+ eq_(res.address, self.address)
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.g.serialize(data, prev)
+
+ res = unpack_from(igmp._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], self.msgtype)
+ eq_(res[1], self.maxresp)
+ eq_(res[2], checksum(self.buf))
+ eq_(res[3], addrconv.ipv4.text_to_bin(self.address))
+
+ def _build_igmp(self):
+ dl_dst = '11:22:33:44:55:66'
+ dl_src = 'aa:bb:cc:dd:ee:ff'
+ dl_type = ether.ETH_TYPE_IP
+ e = ethernet(dl_dst, dl_src, dl_type)
+
+ total_length = 20 + igmp._MIN_LEN
+ nw_proto = inet.IPPROTO_IGMP
+ nw_dst = '11.22.33.44'
+ nw_src = '55.66.77.88'
+ i = ipv4(total_length=total_length, src=nw_src, dst=nw_dst,
+ proto=nw_proto)
+
+ p = Packet()
+
+ p.add_protocol(e)
+ p.add_protocol(i)
+ p.add_protocol(self.g)
+ p.serialize()
+ return p
+
+ def test_build_igmp(self):
+ p = self._build_igmp()
+
+ e = self.find_protocol(p, "ethernet")
+ ok_(e)
+ eq_(e.ethertype, ether.ETH_TYPE_IP)
+
+ i = self.find_protocol(p, "ipv4")
+ ok_(i)
+ eq_(i.proto, inet.IPPROTO_IGMP)
+
+ g = self.find_protocol(p, "igmp")
+ ok_(g)
+
+ eq_(g.msgtype, self.msgtype)
+ eq_(g.maxresp, self.maxresp)
+ eq_(g.csum, checksum(self.buf))
+ eq_(g.address, self.address)
+
+ def test_to_string(self):
+ igmp_values = {'msgtype': repr(self.msgtype),
+ 'maxresp': repr(self.maxresp),
+ 'csum': repr(self.csum),
+ 'address': repr(self.address)}
+ _g_str = ','.join(['%s=%s' % (k, igmp_values[k])
+ for k, v in inspect.getmembers(self.g)
+ if k in igmp_values])
+ g_str = '%s(%s)' % (igmp.__name__, _g_str)
+
+ eq_(str(self.g), g_str)
+ eq_(repr(self.g), g_str)
+
+ @raises(Exception)
+ def test_malformed_igmp(self):
+ m_short_buf = self.buf[1:igmp._MIN_LEN]
+ igmp.parser(m_short_buf)
+
+ def test_default_args(self):
+ ig = igmp()
+ buf = ig.serialize(bytearray(), None)
+ res = unpack_from(igmp._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0x11)
+ eq_(res[1], 0)
+ eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0'))
+
+ def test_json(self):
+ jsondict = self.g.to_jsondict()
+ g = igmp.from_jsondict(jsondict['igmp'])
+ eq_(str(self.g), str(g))
+
+
+class Test_igmpv3_query(unittest.TestCase):
+ """ Test case for Internet Group Management Protocol v3
+ Membership Query Message"""
+ def setUp(self):
+ self.msgtype = IGMP_TYPE_QUERY
+ self.maxresp = 100
+ self.csum = 0
+ self.address = '225.0.0.1'
+ self.s_flg = 0
+ self.qrv = 2
+ self.qqic = 10
+ self.num = 0
+ self.srcs = []
+
+ self.s_qrv = self.s_flg << 3 | self.qrv
+
+ self.buf = pack(igmpv3_query._PACK_STR, self.msgtype,
+ self.maxresp, self.csum,
+ addrconv.ipv4.text_to_bin(self.address),
+ self.s_qrv, self.qqic, self.num)
+
+ self.g = igmpv3_query(
+ self.msgtype, self.maxresp, self.csum, self.address,
+ self.s_flg, self.qrv, self.qqic, self.num, self.srcs)
+
+ def setUp_with_srcs(self):
+ self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
+ self.num = len(self.srcs)
+ self.buf = pack(igmpv3_query._PACK_STR, self.msgtype,
+ self.maxresp, self.csum,
+ addrconv.ipv4.text_to_bin(self.address),
+ self.s_qrv, self.qqic, self.num)
+ for src in self.srcs:
+ self.buf += pack('4s', addrconv.ipv4.text_to_bin(src))
+ self.g = igmpv3_query(
+ self.msgtype, self.maxresp, self.csum, self.address,
+ self.s_flg, self.qrv, self.qqic, self.num, self.srcs)
+
+ def tearDown(self):
+ pass
+
+ def find_protocol(self, pkt, name):
+ for p in pkt.protocols:
+ if p.protocol_name == name:
+ return p
+
+ def test_init(self):
+ eq_(self.msgtype, self.g.msgtype)
+ eq_(self.maxresp, self.g.maxresp)
+ eq_(self.csum, self.g.csum)
+ eq_(self.address, self.g.address)
+ eq_(self.s_flg, self.g.s_flg)
+ eq_(self.qrv, self.g.qrv)
+ eq_(self.qqic, self.g.qqic)
+ eq_(self.num, self.g.num)
+ eq_(self.srcs, self.g.srcs)
+
+ def test_init_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_init()
+
+ def test_parser(self):
+ _res = self.g.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+
+ eq_(res.msgtype, self.msgtype)
+ eq_(res.maxresp, self.maxresp)
+ eq_(res.csum, self.csum)
+ eq_(res.address, self.address)
+ eq_(res.s_flg, self.s_flg)
+ eq_(res.qrv, self.qrv)
+ eq_(res.qqic, self.qqic)
+ eq_(res.num, self.num)
+ eq_(res.srcs, self.srcs)
+
+ def test_parser_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_parser()
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.g.serialize(data, prev)
+
+ res = unpack_from(igmpv3_query._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], self.msgtype)
+ eq_(res[1], self.maxresp)
+ eq_(res[2], checksum(self.buf))
+ eq_(res[3], addrconv.ipv4.text_to_bin(self.address))
+ eq_(res[4], self.s_qrv)
+ eq_(res[5], self.qqic)
+ eq_(res[6], self.num)
+
+ def test_serialize_with_srcs(self):
+ self.setUp_with_srcs()
+ data = bytearray()
+ prev = None
+ buf = self.g.serialize(data, prev)
+
+ res = unpack_from(igmpv3_query._PACK_STR, six.binary_type(buf))
+ (src1, src2, src3) = unpack_from('4s4s4s', six.binary_type(buf),
+ igmpv3_query._MIN_LEN)
+
+ eq_(res[0], self.msgtype)
+ eq_(res[1], self.maxresp)
+ eq_(res[2], checksum(self.buf))
+ eq_(res[3], addrconv.ipv4.text_to_bin(self.address))
+ eq_(res[4], self.s_qrv)
+ eq_(res[5], self.qqic)
+ eq_(res[6], self.num)
+ eq_(src1, addrconv.ipv4.text_to_bin(self.srcs[0]))
+ eq_(src2, addrconv.ipv4.text_to_bin(self.srcs[1]))
+ eq_(src3, addrconv.ipv4.text_to_bin(self.srcs[2]))
+
+ def _build_igmp(self):
+ dl_dst = '11:22:33:44:55:66'
+ dl_src = 'aa:bb:cc:dd:ee:ff'
+ dl_type = ether.ETH_TYPE_IP
+ e = ethernet(dl_dst, dl_src, dl_type)
+
+ total_length = len(ipv4()) + len(self.g)
+ nw_proto = inet.IPPROTO_IGMP
+ nw_dst = '11.22.33.44'
+ nw_src = '55.66.77.88'
+ i = ipv4(total_length=total_length, src=nw_src, dst=nw_dst,
+ proto=nw_proto, ttl=1)
+
+ p = Packet()
+
+ p.add_protocol(e)
+ p.add_protocol(i)
+ p.add_protocol(self.g)
+ p.serialize()
+ return p
+
+ def test_build_igmp(self):
+ p = self._build_igmp()
+
+ e = self.find_protocol(p, "ethernet")
+ ok_(e)
+ eq_(e.ethertype, ether.ETH_TYPE_IP)
+
+ i = self.find_protocol(p, "ipv4")
+ ok_(i)
+ eq_(i.proto, inet.IPPROTO_IGMP)
+
+ g = self.find_protocol(p, "igmpv3_query")
+ ok_(g)
+
+ eq_(g.msgtype, self.msgtype)
+ eq_(g.maxresp, self.maxresp)
+ eq_(g.csum, checksum(self.buf))
+ eq_(g.address, self.address)
+ eq_(g.s_flg, self.s_flg)
+ eq_(g.qrv, self.qrv)
+ eq_(g.qqic, self.qqic)
+ eq_(g.num, self.num)
+ eq_(g.srcs, self.srcs)
+
+ def test_build_igmp_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_build_igmp()
+
+ def test_to_string(self):
+ igmp_values = {'msgtype': repr(self.msgtype),
+ 'maxresp': repr(self.maxresp),
+ 'csum': repr(self.csum),
+ 'address': repr(self.address),
+ 's_flg': repr(self.s_flg),
+ 'qrv': repr(self.qrv),
+ 'qqic': repr(self.qqic),
+ 'num': repr(self.num),
+ 'srcs': repr(self.srcs)}
+ _g_str = ','.join(['%s=%s' % (k, igmp_values[k])
+ for k, v in inspect.getmembers(self.g)
+ if k in igmp_values])
+ g_str = '%s(%s)' % (igmpv3_query.__name__, _g_str)
+
+ eq_(str(self.g), g_str)
+ eq_(repr(self.g), g_str)
+
+ def test_to_string_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_to_string()
+
+ @raises(Exception)
+ def test_num_larger_than_srcs(self):
+ self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
+ self.num = len(self.srcs) + 1
+ self.buf = pack(igmpv3_query._PACK_STR, self.msgtype,
+ self.maxresp, self.csum,
+ addrconv.ipv4.text_to_bin(self.address),
+ self.s_qrv, self.qqic, self.num)
+ for src in self.srcs:
+ self.buf += pack('4s', addrconv.ipv4.text_to_bin(src))
+ self.g = igmpv3_query(
+ self.msgtype, self.maxresp, self.csum, self.address,
+ self.s_flg, self.qrv, self.qqic, self.num, self.srcs)
+ self.test_parser()
+
+ @raises(Exception)
+ def test_num_smaller_than_srcs(self):
+ self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
+ self.num = len(self.srcs) - 1
+ self.buf = pack(igmpv3_query._PACK_STR, self.msgtype,
+ self.maxresp, self.csum,
+ addrconv.ipv4.text_to_bin(self.address),
+ self.s_qrv, self.qqic, self.num)
+ for src in self.srcs:
+ self.buf += pack('4s', addrconv.ipv4.text_to_bin(src))
+ self.g = igmpv3_query(
+ self.msgtype, self.maxresp, self.csum, self.address,
+ self.s_flg, self.qrv, self.qqic, self.num, self.srcs)
+ self.test_parser()
+
+ def test_default_args(self):
+ prev = ipv4(proto=inet.IPPROTO_IGMP)
+ g = igmpv3_query()
+ prev.serialize(g, None)
+ buf = g.serialize(bytearray(), prev)
+ res = unpack_from(igmpv3_query._PACK_STR, six.binary_type(buf))
+ buf = bytearray(buf)
+ pack_into('!H', buf, 2, 0)
+
+ eq_(res[0], IGMP_TYPE_QUERY)
+ eq_(res[1], 100)
+ eq_(res[2], checksum(buf))
+ eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0'))
+ eq_(res[4], 2)
+ eq_(res[5], 0)
+ eq_(res[6], 0)
+
+ # srcs without num
+ prev = ipv4(proto=inet.IPPROTO_IGMP)
+ srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
+ g = igmpv3_query(srcs=srcs)
+ prev.serialize(g, None)
+ buf = g.serialize(bytearray(), prev)
+ res = unpack_from(igmpv3_query._PACK_STR, six.binary_type(buf))
+ buf = bytearray(buf)
+ pack_into('!H', buf, 2, 0)
+
+ eq_(res[0], IGMP_TYPE_QUERY)
+ eq_(res[1], 100)
+ eq_(res[2], checksum(buf))
+ eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0'))
+ eq_(res[4], 2)
+ eq_(res[5], 0)
+ eq_(res[6], len(srcs))
+
+ res = unpack_from('4s4s4s', six.binary_type(buf), igmpv3_query._MIN_LEN)
+
+ eq_(res[0], addrconv.ipv4.text_to_bin(srcs[0]))
+ eq_(res[1], addrconv.ipv4.text_to_bin(srcs[1]))
+ eq_(res[2], addrconv.ipv4.text_to_bin(srcs[2]))
+
+ def test_json(self):
+ jsondict = self.g.to_jsondict()
+ g = igmpv3_query.from_jsondict(jsondict['igmpv3_query'])
+ eq_(str(self.g), str(g))
+
+ def test_json_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_json()
+
+
+class Test_igmpv3_report(unittest.TestCase):
+ """ Test case for Internet Group Management Protocol v3
+ Membership Report Message"""
+ def setUp(self):
+ self.msgtype = IGMP_TYPE_REPORT_V3
+ self.csum = 0
+ self.record_num = 0
+ self.records = []
+
+ self.buf = pack(igmpv3_report._PACK_STR, self.msgtype,
+ self.csum, self.record_num)
+
+ self.g = igmpv3_report(
+ self.msgtype, self.csum, self.record_num, self.records)
+
+ def setUp_with_records(self):
+ self.record1 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 0, 0, '225.0.0.1')
+ self.record2 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 0, 2, '225.0.0.2',
+ ['172.16.10.10', '172.16.10.27'])
+ self.record3 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 1, 0, '225.0.0.3', [], b'abc\x00')
+ self.record4 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 2, 2, '225.0.0.4',
+ ['172.16.10.10', '172.16.10.27'], b'abcde\x00\x00\x00')
+ self.records = [self.record1, self.record2, self.record3,
+ self.record4]
+ self.record_num = len(self.records)
+ self.buf = pack(igmpv3_report._PACK_STR, self.msgtype,
+ self.csum, self.record_num)
+ self.buf += self.record1.serialize()
+ self.buf += self.record2.serialize()
+ self.buf += self.record3.serialize()
+ self.buf += self.record4.serialize()
+ self.g = igmpv3_report(
+ self.msgtype, self.csum, self.record_num, self.records)
+
+ def tearDown(self):
+ pass
+
+ def find_protocol(self, pkt, name):
+ for p in pkt.protocols:
+ if p.protocol_name == name:
+ return p
+
+ def test_init(self):
+ eq_(self.msgtype, self.g.msgtype)
+ eq_(self.csum, self.g.csum)
+ eq_(self.record_num, self.g.record_num)
+ eq_(self.records, self.g.records)
+
+ def test_init_with_records(self):
+ self.setUp_with_records()
+ self.test_init()
+
+ def test_parser(self):
+ _res = self.g.parser(six.binary_type(self.buf))
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+
+ eq_(res.msgtype, self.msgtype)
+ eq_(res.csum, self.csum)
+ eq_(res.record_num, self.record_num)
+ eq_(repr(res.records), repr(self.records))
+
+ def test_parser_with_records(self):
+ self.setUp_with_records()
+ self.test_parser()
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.g.serialize(data, prev)
+
+ res = unpack_from(igmpv3_report._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], self.msgtype)
+ eq_(res[1], checksum(self.buf))
+ eq_(res[2], self.record_num)
+
+ def test_serialize_with_records(self):
+ self.setUp_with_records()
+ data = bytearray()
+ prev = None
+ buf = six.binary_type(self.g.serialize(data, prev))
+
+ res = unpack_from(igmpv3_report._PACK_STR, buf)
+ offset = igmpv3_report._MIN_LEN
+ rec1 = igmpv3_report_group.parser(buf[offset:])
+ offset += len(rec1)
+ rec2 = igmpv3_report_group.parser(buf[offset:])
+ offset += len(rec2)
+ rec3 = igmpv3_report_group.parser(buf[offset:])
+ offset += len(rec3)
+ rec4 = igmpv3_report_group.parser(buf[offset:])
+
+ eq_(res[0], self.msgtype)
+ eq_(res[1], checksum(self.buf))
+ eq_(res[2], self.record_num)
+ eq_(repr(rec1), repr(self.record1))
+ eq_(repr(rec2), repr(self.record2))
+ eq_(repr(rec3), repr(self.record3))
+ eq_(repr(rec4), repr(self.record4))
+
+ def _build_igmp(self):
+ dl_dst = '11:22:33:44:55:66'
+ dl_src = 'aa:bb:cc:dd:ee:ff'
+ dl_type = ether.ETH_TYPE_IP
+ e = ethernet(dl_dst, dl_src, dl_type)
+
+ total_length = len(ipv4()) + len(self.g)
+ nw_proto = inet.IPPROTO_IGMP
+ nw_dst = '11.22.33.44'
+ nw_src = '55.66.77.88'
+ i = ipv4(total_length=total_length, src=nw_src, dst=nw_dst,
+ proto=nw_proto, ttl=1)
+
+ p = Packet()
+
+ p.add_protocol(e)
+ p.add_protocol(i)
+ p.add_protocol(self.g)
+ p.serialize()
+ return p
+
+ def test_build_igmp(self):
+ p = self._build_igmp()
+
+ e = self.find_protocol(p, "ethernet")
+ ok_(e)
+ eq_(e.ethertype, ether.ETH_TYPE_IP)
+
+ i = self.find_protocol(p, "ipv4")
+ ok_(i)
+ eq_(i.proto, inet.IPPROTO_IGMP)
+
+ g = self.find_protocol(p, "igmpv3_report")
+ ok_(g)
+
+ eq_(g.msgtype, self.msgtype)
+ eq_(g.csum, checksum(self.buf))
+ eq_(g.record_num, self.record_num)
+ eq_(g.records, self.records)
+
+ def test_build_igmp_with_records(self):
+ self.setUp_with_records()
+ self.test_build_igmp()
+
+ def test_to_string(self):
+ igmp_values = {'msgtype': repr(self.msgtype),
+ 'csum': repr(self.csum),
+ 'record_num': repr(self.record_num),
+ 'records': repr(self.records)}
+ _g_str = ','.join(['%s=%s' % (k, igmp_values[k])
+ for k, v in inspect.getmembers(self.g)
+ if k in igmp_values])
+ g_str = '%s(%s)' % (igmpv3_report.__name__, _g_str)
+
+ eq_(str(self.g), g_str)
+ eq_(repr(self.g), g_str)
+
+ def test_to_string_with_records(self):
+ self.setUp_with_records()
+ self.test_to_string()
+
+ @raises(Exception)
+ def test_record_num_larger_than_records(self):
+ self.record1 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 0, 0, '225.0.0.1')
+ self.record2 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 0, 2, '225.0.0.2',
+ ['172.16.10.10', '172.16.10.27'])
+ self.record3 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 1, 0, '225.0.0.3', [], b'abc\x00')
+ self.record4 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 1, 2, '225.0.0.4',
+ ['172.16.10.10', '172.16.10.27'], b'abc\x00')
+ self.records = [self.record1, self.record2, self.record3,
+ self.record4]
+ self.record_num = len(self.records) + 1
+ self.buf = pack(igmpv3_report._PACK_STR, self.msgtype,
+ self.csum, self.record_num)
+ self.buf += self.record1.serialize()
+ self.buf += self.record2.serialize()
+ self.buf += self.record3.serialize()
+ self.buf += self.record4.serialize()
+ self.g = igmpv3_report(
+ self.msgtype, self.csum, self.record_num, self.records)
+ self.test_parser()
+
+ @raises(Exception)
+ def test_record_num_smaller_than_records(self):
+ self.record1 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 0, 0, '225.0.0.1')
+ self.record2 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 0, 2, '225.0.0.2',
+ ['172.16.10.10', '172.16.10.27'])
+ self.record3 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 1, 0, '225.0.0.3', [], b'abc\x00')
+ self.record4 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 1, 2, '225.0.0.4',
+ ['172.16.10.10', '172.16.10.27'], b'abc\x00')
+ self.records = [self.record1, self.record2, self.record3,
+ self.record4]
+ self.record_num = len(self.records) - 1
+ self.buf = pack(igmpv3_report._PACK_STR, self.msgtype,
+ self.csum, self.record_num)
+ self.buf += self.record1.serialize()
+ self.buf += self.record2.serialize()
+ self.buf += self.record3.serialize()
+ self.buf += self.record4.serialize()
+ self.g = igmpv3_report(
+ self.msgtype, self.csum, self.record_num, self.records)
+ self.test_parser()
+
+ def test_default_args(self):
+ prev = ipv4(proto=inet.IPPROTO_IGMP)
+ g = igmpv3_report()
+ prev.serialize(g, None)
+ buf = g.serialize(bytearray(), prev)
+ res = unpack_from(igmpv3_report._PACK_STR, six.binary_type(buf))
+ buf = bytearray(buf)
+ pack_into('!H', buf, 2, 0)
+
+ eq_(res[0], IGMP_TYPE_REPORT_V3)
+ eq_(res[1], checksum(buf))
+ eq_(res[2], 0)
+
+ # records without record_num
+ prev = ipv4(proto=inet.IPPROTO_IGMP)
+ record1 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 0, 0, '225.0.0.1')
+ record2 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 0, 2, '225.0.0.2',
+ ['172.16.10.10', '172.16.10.27'])
+ record3 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 1, 0, '225.0.0.3', [], b'abc\x00')
+ record4 = igmpv3_report_group(
+ MODE_IS_INCLUDE, 1, 2, '225.0.0.4',
+ ['172.16.10.10', '172.16.10.27'], b'abc\x00')
+ records = [record1, record2, record3, record4]
+ g = igmpv3_report(records=records)
+ prev.serialize(g, None)
+ buf = g.serialize(bytearray(), prev)
+ res = unpack_from(igmpv3_report._PACK_STR, six.binary_type(buf))
+ buf = bytearray(buf)
+ pack_into('!H', buf, 2, 0)
+
+ eq_(res[0], IGMP_TYPE_REPORT_V3)
+ eq_(res[1], checksum(buf))
+ eq_(res[2], len(records))
+
+ def test_json(self):
+ jsondict = self.g.to_jsondict()
+ g = igmpv3_report.from_jsondict(jsondict['igmpv3_report'])
+ eq_(str(self.g), str(g))
+
+ def test_json_with_records(self):
+ self.setUp_with_records()
+ self.test_json()
+
+
+class Test_igmpv3_report_group(unittest.TestCase):
+ """Test case for Group Records of
+ Internet Group Management Protocol v3 Membership Report Message"""
+ def setUp(self):
+ self.type_ = MODE_IS_INCLUDE
+ self.aux_len = 0
+ self.num = 0
+ self.address = '225.0.0.1'
+ self.srcs = []
+ self.aux = None
+
+ self.buf = pack(igmpv3_report_group._PACK_STR, self.type_,
+ self.aux_len, self.num,
+ addrconv.ipv4.text_to_bin(self.address))
+
+ self.g = igmpv3_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+
+ def setUp_with_srcs(self):
+ self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
+ self.num = len(self.srcs)
+ self.buf = pack(igmpv3_report_group._PACK_STR, self.type_,
+ self.aux_len, self.num,
+ addrconv.ipv4.text_to_bin(self.address))
+ for src in self.srcs:
+ self.buf += pack('4s', addrconv.ipv4.text_to_bin(src))
+ self.g = igmpv3_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+
+ def setUp_with_aux(self):
+ self.aux = b'\x01\x02\x03\x04\x05\x00\x00\x00'
+ self.aux_len = len(self.aux) // 4
+ self.buf = pack(igmpv3_report_group._PACK_STR, self.type_,
+ self.aux_len, self.num,
+ addrconv.ipv4.text_to_bin(self.address))
+ self.buf += self.aux
+ self.g = igmpv3_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+
+ def setUp_with_srcs_and_aux(self):
+ self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
+ self.num = len(self.srcs)
+ self.aux = b'\x01\x02\x03\x04\x05\x00\x00\x00'
+ self.aux_len = len(self.aux) // 4
+ self.buf = pack(igmpv3_report_group._PACK_STR, self.type_,
+ self.aux_len, self.num,
+ addrconv.ipv4.text_to_bin(self.address))
+ for src in self.srcs:
+ self.buf += pack('4s', addrconv.ipv4.text_to_bin(src))
+ self.buf += self.aux
+ self.g = igmpv3_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.type_, self.g.type_)
+ eq_(self.aux_len, self.g.aux_len)
+ eq_(self.num, self.g.num)
+ eq_(self.address, self.g.address)
+ eq_(self.srcs, self.g.srcs)
+ eq_(self.aux, self.g.aux)
+
+ def test_init_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_init()
+
+ def test_init_with_aux(self):
+ self.setUp_with_aux()
+ self.test_init()
+
+ def test_init_with_srcs_and_aux(self):
+ self.setUp_with_srcs_and_aux()
+ self.test_init()
+
+ def test_parser(self):
+ _res = self.g.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+
+ eq_(res.type_, self.type_)
+ eq_(res.aux_len, self.aux_len)
+ eq_(res.num, self.num)
+ eq_(res.address, self.address)
+ eq_(res.srcs, self.srcs)
+ eq_(res.aux, self.aux)
+
+ def test_parser_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_parser()
+
+ def test_parser_with_aux(self):
+ self.setUp_with_aux()
+ self.test_parser()
+
+ def test_parser_with_srcs_and_aux(self):
+ self.setUp_with_srcs_and_aux()
+ self.test_parser()
+
+ def test_serialize(self):
+ buf = self.g.serialize()
+ res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], self.type_)
+ eq_(res[1], self.aux_len)
+ eq_(res[2], self.num)
+ eq_(res[3], addrconv.ipv4.text_to_bin(self.address))
+
+ def test_serialize_with_srcs(self):
+ self.setUp_with_srcs()
+ buf = self.g.serialize()
+ res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf))
+ (src1, src2, src3) = unpack_from('4s4s4s', six.binary_type(buf),
+ igmpv3_report_group._MIN_LEN)
+ eq_(res[0], self.type_)
+ eq_(res[1], self.aux_len)
+ eq_(res[2], self.num)
+ eq_(res[3], addrconv.ipv4.text_to_bin(self.address))
+ eq_(src1, addrconv.ipv4.text_to_bin(self.srcs[0]))
+ eq_(src2, addrconv.ipv4.text_to_bin(self.srcs[1]))
+ eq_(src3, addrconv.ipv4.text_to_bin(self.srcs[2]))
+
+ def test_serialize_with_aux(self):
+ self.setUp_with_aux()
+ buf = self.g.serialize()
+ res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf))
+ (aux, ) = unpack_from('%ds' % (self.aux_len * 4), six.binary_type(buf),
+ igmpv3_report_group._MIN_LEN)
+ eq_(res[0], self.type_)
+ eq_(res[1], self.aux_len)
+ eq_(res[2], self.num)
+ eq_(res[3], addrconv.ipv4.text_to_bin(self.address))
+ eq_(aux, self.aux)
+
+ def test_serialize_with_srcs_and_aux(self):
+ self.setUp_with_srcs_and_aux()
+ buf = self.g.serialize()
+ res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf))
+ (src1, src2, src3) = unpack_from('4s4s4s', six.binary_type(buf),
+ igmpv3_report_group._MIN_LEN)
+ (aux, ) = unpack_from('%ds' % (self.aux_len * 4), six.binary_type(buf),
+ igmpv3_report_group._MIN_LEN + 12)
+ eq_(res[0], self.type_)
+ eq_(res[1], self.aux_len)
+ eq_(res[2], self.num)
+ eq_(res[3], addrconv.ipv4.text_to_bin(self.address))
+ eq_(src1, addrconv.ipv4.text_to_bin(self.srcs[0]))
+ eq_(src2, addrconv.ipv4.text_to_bin(self.srcs[1]))
+ eq_(src3, addrconv.ipv4.text_to_bin(self.srcs[2]))
+ eq_(aux, self.aux)
+
+ def test_to_string(self):
+ igmp_values = {'type_': repr(self.type_),
+ 'aux_len': repr(self.aux_len),
+ 'num': repr(self.num),
+ 'address': repr(self.address),
+ 'srcs': repr(self.srcs),
+ 'aux': repr(self.aux)}
+ _g_str = ','.join(['%s=%s' % (k, igmp_values[k])
+ for k, v in inspect.getmembers(self.g)
+ if k in igmp_values])
+ g_str = '%s(%s)' % (igmpv3_report_group.__name__, _g_str)
+
+ eq_(str(self.g), g_str)
+ eq_(repr(self.g), g_str)
+
+ def test_to_string_with_srcs(self):
+ self.setUp_with_srcs()
+ self.test_to_string()
+
+ def test_to_string_with_aux(self):
+ self.setUp_with_aux()
+ self.test_to_string()
+
+ def test_to_string_with_srcs_and_aux(self):
+ self.setUp_with_srcs_and_aux()
+ self.test_to_string()
+
+ def test_len(self):
+ eq_(len(self.g), 8)
+
+ def test_len_with_srcs(self):
+ self.setUp_with_srcs()
+ eq_(len(self.g), 20)
+
+ def test_len_with_aux(self):
+ self.setUp_with_aux()
+ eq_(len(self.g), 16)
+
+ def test_len_with_srcs_and_aux(self):
+ self.setUp_with_srcs_and_aux()
+ eq_(len(self.g), 28)
+
+ @raises
+ def test_num_larger_than_srcs(self):
+ self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
+ self.num = len(self.srcs) + 1
+ self.buf = pack(igmpv3_report_group._PACK_STR, self.type_,
+ self.aux_len, self.num,
+ addrconv.ipv4.text_to_bin(self.address))
+ for src in self.srcs:
+ self.buf += pack('4s', addrconv.ipv4.text_to_bin(src))
+ self.g = igmpv3_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+ self.test_parser()
+
+ @raises
+ def test_num_smaller_than_srcs(self):
+ self.srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
+ self.num = len(self.srcs) - 1
+ self.buf = pack(igmpv3_report_group._PACK_STR, self.type_,
+ self.aux_len, self.num,
+ addrconv.ipv4.text_to_bin(self.address))
+ for src in self.srcs:
+ self.buf += pack('4s', addrconv.ipv4.text_to_bin(src))
+ self.g = igmpv3_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+ self.test_parser()
+
+ @raises
+ def test_aux_len_larger_than_aux(self):
+ self.aux = b'\x01\x02\x03\x04\x05\x00\x00\x00'
+ self.aux_len = len(self.aux) // 4 + 1
+ self.buf = pack(igmpv3_report_group._PACK_STR, self.type_,
+ self.aux_len, self.num,
+ addrconv.ipv4.text_to_bin(self.address))
+ self.buf += self.aux
+ self.g = igmpv3_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+ self.test_parser()
+
+ @raises
+ def test_aux_len_smaller_than_aux(self):
+ self.aux = b'\x01\x02\x03\x04\x05\x00\x00\x00'
+ self.aux_len = len(self.aux) // 4 - 1
+ self.buf = pack(igmpv3_report_group._PACK_STR, self.type_,
+ self.aux_len, self.num,
+ addrconv.ipv4.text_to_bin(self.address))
+ self.buf += self.aux
+ self.g = igmpv3_report_group(
+ self.type_, self.aux_len, self.num, self.address,
+ self.srcs, self.aux)
+ self.test_parser()
+
+ def test_default_args(self):
+ rep = igmpv3_report_group()
+ buf = rep.serialize()
+ res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+ eq_(res[2], 0)
+ eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0'))
+
+ # srcs without num
+ srcs = ['192.168.1.1', '192.168.1.2', '192.168.1.3']
+ rep = igmpv3_report_group(srcs=srcs)
+ buf = rep.serialize()
+ res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0)
+ eq_(res[1], 0)
+ eq_(res[2], len(srcs))
+ eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0'))
+
+ res = unpack_from('4s4s4s', six.binary_type(buf),
+ igmpv3_report_group._MIN_LEN)
+
+ eq_(res[0], addrconv.ipv4.text_to_bin(srcs[0]))
+ eq_(res[1], addrconv.ipv4.text_to_bin(srcs[1]))
+ eq_(res[2], addrconv.ipv4.text_to_bin(srcs[2]))
+
+ # aux without aux_len
+ aux = b'abcde'
+ rep = igmpv3_report_group(aux=aux)
+ buf = rep.serialize()
+ res = unpack_from(igmpv3_report_group._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 0)
+ eq_(res[1], 2)
+ eq_(res[2], 0)
+ eq_(res[3], addrconv.ipv4.text_to_bin('0.0.0.0'))
+ eq_(buf[igmpv3_report_group._MIN_LEN:], b'abcde\x00\x00\x00')
diff --git a/tests/unit/packet/test_ipv4.py b/tests/unit/packet/test_ipv4.py
new file mode 100644
index 00000000..69186f3f
--- /dev/null
+++ b/tests/unit/packet/test_ipv4.py
@@ -0,0 +1,137 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import six
+import struct
+from struct import *
+from nose.tools import *
+from ryu.ofproto import ether, inet
+from ryu.lib.packet import packet_utils
+from ryu.lib.packet.ethernet import ethernet
+from ryu.lib.packet.packet import Packet
+from ryu.lib.packet.ipv4 import ipv4
+from ryu.lib.packet.tcp import tcp
+from ryu.lib import addrconv
+
+
+LOG = logging.getLogger('test_ipv4')
+
+
+class Test_ipv4(unittest.TestCase):
+ """ Test case for ipv4
+ """
+
+ version = 4
+ header_length = 5 + 10
+ ver_hlen = version << 4 | header_length
+ tos = 0
+ total_length = header_length + 64
+ identification = 30774
+ flags = 4
+ offset = 1480
+ flg_off = flags << 13 | offset
+ ttl = 64
+ proto = inet.IPPROTO_TCP
+ csum = 0xadc6
+ src = '131.151.32.21'
+ dst = '131.151.32.129'
+ length = header_length * 4
+ option = b'\x86\x28\x00\x00\x00\x01\x01\x22' \
+ + b'\x00\x01\xae\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00\x00\x00\x00\x01'
+
+ buf = pack(ipv4._PACK_STR, ver_hlen, tos, total_length, identification,
+ flg_off, ttl, proto, csum,
+ addrconv.ipv4.text_to_bin(src),
+ addrconv.ipv4.text_to_bin(dst)) \
+ + option
+
+ ip = ipv4(version, header_length, tos, total_length, identification,
+ flags, offset, ttl, proto, csum, src, dst, option)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.version, self.ip.version)
+ eq_(self.header_length, self.ip.header_length)
+ eq_(self.tos, self.ip.tos)
+ eq_(self.total_length, self.ip.total_length)
+ eq_(self.identification, self.ip.identification)
+ eq_(self.flags, self.ip.flags)
+ eq_(self.offset, self.ip.offset)
+ eq_(self.ttl, self.ip.ttl)
+ eq_(self.proto, self.ip.proto)
+ eq_(self.csum, self.ip.csum)
+ eq_(self.src, self.ip.src)
+ eq_(self.dst, self.ip.dst)
+ eq_(self.length, len(self.ip))
+ eq_(self.option, self.ip.option)
+
+ def test_parser(self):
+ res, ptype, _ = self.ip.parser(self.buf)
+
+ eq_(res.version, self.version)
+ eq_(res.header_length, self.header_length)
+ eq_(res.tos, self.tos)
+ eq_(res.total_length, self.total_length)
+ eq_(res.identification, self.identification)
+ eq_(res.flags, self.flags)
+ eq_(res.offset, self.offset)
+ eq_(res.ttl, self.ttl)
+ eq_(res.proto, self.proto)
+ eq_(res.csum, self.csum)
+ eq_(res.src, self.src)
+ eq_(res.dst, self.dst)
+ eq_(ptype, tcp)
+
+ def test_serialize(self):
+ buf = self.ip.serialize(bytearray(), None)
+ res = struct.unpack_from(ipv4._PACK_STR, six.binary_type(buf))
+ option = buf[ipv4._MIN_LEN:ipv4._MIN_LEN + len(self.option)]
+
+ eq_(res[0], self.ver_hlen)
+ eq_(res[1], self.tos)
+ eq_(res[2], self.total_length)
+ eq_(res[3], self.identification)
+ eq_(res[4], self.flg_off)
+ eq_(res[5], self.ttl)
+ eq_(res[6], self.proto)
+ eq_(res[8], addrconv.ipv4.text_to_bin(self.src))
+ eq_(res[9], addrconv.ipv4.text_to_bin(self.dst))
+ eq_(option, self.option)
+
+ # checksum
+ csum = packet_utils.checksum(buf)
+ eq_(csum, 0)
+
+ @raises(Exception)
+ def test_malformed_ipv4(self):
+ m_short_buf = self.buf[1:ipv4._MIN_LEN]
+ ipv4.parser(m_short_buf)
+
+ def test_json(self):
+ jsondict = self.ip.to_jsondict()
+ ip = ipv4.from_jsondict(jsondict['ipv4'])
+ eq_(str(self.ip), str(ip))
diff --git a/tests/unit/packet/test_ipv6.py b/tests/unit/packet/test_ipv6.py
new file mode 100644
index 00000000..455dc8c3
--- /dev/null
+++ b/tests/unit/packet/test_ipv6.py
@@ -0,0 +1,1128 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import unittest
+import logging
+import inspect
+import six
+import struct
+
+from nose.tools import *
+from ryu.lib import addrconv
+from ryu.lib import ip
+from ryu.lib.packet import ipv6
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_ipv6(unittest.TestCase):
+
+ def setUp(self):
+ self.version = 6
+ self.traffic_class = 0
+ self.flow_label = 0
+ self.payload_length = 817
+ self.nxt = 6
+ self.hop_limit = 128
+ self.src = '2002:4637:d5d3::4637:d5d3'
+ self.dst = '2001:4860:0:2001::68'
+ self.ext_hdrs = []
+ self.ip = ipv6.ipv6(
+ self.version, self.traffic_class, self.flow_label,
+ self.payload_length, self.nxt, self.hop_limit, self.src,
+ self.dst, self.ext_hdrs)
+
+ self.v_tc_flow = (
+ self.version << 28 | self.traffic_class << 20 |
+ self.flow_label << 12)
+ self.buf = struct.pack(
+ ipv6.ipv6._PACK_STR, self.v_tc_flow,
+ self.payload_length, self.nxt, self.hop_limit,
+ addrconv.ipv6.text_to_bin(self.src),
+ addrconv.ipv6.text_to_bin(self.dst))
+
+ def setUp_with_hop_opts(self):
+ self.opt1_type = 5
+ self.opt1_len = 2
+ self.opt1_data = b'\x00\x00'
+ self.opt2_type = 1
+ self.opt2_len = 0
+ self.opt2_data = None
+ self.options = [
+ ipv6.option(self.opt1_type, self.opt1_len, self.opt1_data),
+ ipv6.option(self.opt2_type, self.opt2_len, self.opt2_data),
+ ]
+ self.hop_opts_nxt = 6
+ self.hop_opts_size = 0
+ self.hop_opts = ipv6.hop_opts(
+ self.hop_opts_nxt, self.hop_opts_size, self.options)
+ self.ext_hdrs = [self.hop_opts]
+ self.payload_length += len(self.hop_opts)
+ self.nxt = ipv6.hop_opts.TYPE
+ self.ip = ipv6.ipv6(
+ self.version, self.traffic_class, self.flow_label,
+ self.payload_length, self.nxt, self.hop_limit, self.src,
+ self.dst, self.ext_hdrs)
+ self.buf = struct.pack(
+ ipv6.ipv6._PACK_STR, self.v_tc_flow,
+ self.payload_length, self.nxt, self.hop_limit,
+ addrconv.ipv6.text_to_bin(self.src),
+ addrconv.ipv6.text_to_bin(self.dst))
+ self.buf += self.hop_opts.serialize()
+
+ def setUp_with_dst_opts(self):
+ self.opt1_type = 5
+ self.opt1_len = 2
+ self.opt1_data = b'\x00\x00'
+ self.opt2_type = 1
+ self.opt2_len = 0
+ self.opt2_data = None
+ self.options = [
+ ipv6.option(self.opt1_type, self.opt1_len, self.opt1_data),
+ ipv6.option(self.opt2_type, self.opt2_len, self.opt2_data),
+ ]
+ self.dst_opts_nxt = 6
+ self.dst_opts_size = 0
+ self.dst_opts = ipv6.dst_opts(
+ self.dst_opts_nxt, self.dst_opts_size, self.options)
+ self.ext_hdrs = [self.dst_opts]
+ self.payload_length += len(self.dst_opts)
+ self.nxt = ipv6.dst_opts.TYPE
+ self.ip = ipv6.ipv6(
+ self.version, self.traffic_class, self.flow_label,
+ self.payload_length, self.nxt, self.hop_limit, self.src,
+ self.dst, self.ext_hdrs)
+ self.buf = struct.pack(
+ ipv6.ipv6._PACK_STR, self.v_tc_flow,
+ self.payload_length, self.nxt, self.hop_limit,
+ addrconv.ipv6.text_to_bin(self.src),
+ addrconv.ipv6.text_to_bin(self.dst))
+ self.buf += self.dst_opts.serialize()
+
+ def setUp_with_routing_type3(self):
+ self.routing_nxt = 6
+ self.routing_size = 6
+ self.routing_type = 3
+ self.routing_seg = 2
+ self.routing_cmpi = 0
+ self.routing_cmpe = 0
+ self.routing_adrs = ["2001:db8:dead::1", "2001:db8:dead::2",
+ "2001:db8:dead::3"]
+ self.routing = ipv6.routing_type3(
+ self.routing_nxt, self.routing_size,
+ self.routing_type, self.routing_seg,
+ self.routing_cmpi, self.routing_cmpe,
+ self.routing_adrs)
+ self.ext_hdrs = [self.routing]
+ self.payload_length += len(self.routing)
+ self.nxt = ipv6.routing.TYPE
+ self.ip = ipv6.ipv6(
+ self.version, self.traffic_class, self.flow_label,
+ self.payload_length, self.nxt, self.hop_limit, self.src,
+ self.dst, self.ext_hdrs)
+ self.buf = struct.pack(
+ ipv6.ipv6._PACK_STR, self.v_tc_flow,
+ self.payload_length, self.nxt, self.hop_limit,
+ addrconv.ipv6.text_to_bin(self.src),
+ addrconv.ipv6.text_to_bin(self.dst))
+ self.buf += self.routing.serialize()
+
+ def setUp_with_fragment(self):
+ self.fragment_nxt = 6
+ self.fragment_offset = 50
+ self.fragment_more = 1
+ self.fragment_id = 123
+ self.fragment = ipv6.fragment(
+ self.fragment_nxt, self.fragment_offset, self.fragment_more,
+ self.fragment_id)
+ self.ext_hdrs = [self.fragment]
+ self.payload_length += len(self.fragment)
+ self.nxt = ipv6.fragment.TYPE
+ self.ip = ipv6.ipv6(
+ self.version, self.traffic_class, self.flow_label,
+ self.payload_length, self.nxt, self.hop_limit, self.src,
+ self.dst, self.ext_hdrs)
+ self.buf = struct.pack(
+ ipv6.ipv6._PACK_STR, self.v_tc_flow,
+ self.payload_length, self.nxt, self.hop_limit,
+ addrconv.ipv6.text_to_bin(self.src),
+ addrconv.ipv6.text_to_bin(self.dst))
+ self.buf += self.fragment.serialize()
+
+ def setUp_with_auth(self):
+ self.auth_nxt = 6
+ self.auth_size = 4
+ self.auth_spi = 256
+ self.auth_seq = 1
+ self.auth_data = b'\xa0\xe7\xf8\xab\xf9\x69\x1a\x8b\xf3\x9f\x7c\xae'
+ self.auth = ipv6.auth(
+ self.auth_nxt, self.auth_size, self.auth_spi, self.auth_seq,
+ self.auth_data)
+ self.ext_hdrs = [self.auth]
+ self.payload_length += len(self.auth)
+ self.nxt = ipv6.auth.TYPE
+ self.ip = ipv6.ipv6(
+ self.version, self.traffic_class, self.flow_label,
+ self.payload_length, self.nxt, self.hop_limit, self.src,
+ self.dst, self.ext_hdrs)
+ self.buf = struct.pack(
+ ipv6.ipv6._PACK_STR, self.v_tc_flow,
+ self.payload_length, self.nxt, self.hop_limit,
+ addrconv.ipv6.text_to_bin(self.src),
+ addrconv.ipv6.text_to_bin(self.dst))
+ self.buf += self.auth.serialize()
+
+ def setUp_with_multi_headers(self):
+ self.opt1_type = 5
+ self.opt1_len = 2
+ self.opt1_data = b'\x00\x00'
+ self.opt2_type = 1
+ self.opt2_len = 0
+ self.opt2_data = None
+ self.options = [
+ ipv6.option(self.opt1_type, self.opt1_len, self.opt1_data),
+ ipv6.option(self.opt2_type, self.opt2_len, self.opt2_data),
+ ]
+ self.hop_opts_nxt = ipv6.auth.TYPE
+ self.hop_opts_size = 0
+ self.hop_opts = ipv6.hop_opts(
+ self.hop_opts_nxt, self.hop_opts_size, self.options)
+ self.auth_nxt = 6
+ self.auth_size = 4
+ self.auth_spi = 256
+ self.auth_seq = 1
+ self.auth_data = b'\xa0\xe7\xf8\xab\xf9\x69\x1a\x8b\xf3\x9f\x7c\xae'
+ self.auth = ipv6.auth(
+ self.auth_nxt, self.auth_size, self.auth_spi, self.auth_seq,
+ self.auth_data)
+ self.ext_hdrs = [self.hop_opts, self.auth]
+ self.payload_length += len(self.hop_opts) + len(self.auth)
+ self.nxt = ipv6.hop_opts.TYPE
+ self.ip = ipv6.ipv6(
+ self.version, self.traffic_class, self.flow_label,
+ self.payload_length, self.nxt, self.hop_limit, self.src,
+ self.dst, self.ext_hdrs)
+ self.buf = struct.pack(
+ ipv6.ipv6._PACK_STR, self.v_tc_flow,
+ self.payload_length, self.nxt, self.hop_limit,
+ addrconv.ipv6.text_to_bin(self.src),
+ addrconv.ipv6.text_to_bin(self.dst))
+ self.buf += self.hop_opts.serialize()
+ self.buf += self.auth.serialize()
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.version, self.ip.version)
+ eq_(self.traffic_class, self.ip.traffic_class)
+ eq_(self.flow_label, self.ip.flow_label)
+ eq_(self.payload_length, self.ip.payload_length)
+ eq_(self.nxt, self.ip.nxt)
+ eq_(self.hop_limit, self.ip.hop_limit)
+ eq_(self.src, self.ip.src)
+ eq_(self.dst, self.ip.dst)
+ eq_(str(self.ext_hdrs), str(self.ip.ext_hdrs))
+
+ def test_init_with_hop_opts(self):
+ self.setUp_with_hop_opts()
+ self.test_init()
+
+ def test_init_with_dst_opts(self):
+ self.setUp_with_dst_opts()
+ self.test_init()
+
+ def test_init_with_routing_type3(self):
+ self.setUp_with_routing_type3()
+ self.test_init()
+
+ def test_init_with_fragment(self):
+ self.setUp_with_fragment()
+ self.test_init()
+
+ def test_init_with_auth(self):
+ self.setUp_with_auth()
+ self.test_init()
+
+ def test_init_with_multi_headers(self):
+ self.setUp_with_multi_headers()
+ self.test_init()
+
+ def test_parser(self):
+ _res = self.ip.parser(six.binary_type(self.buf))
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+
+ eq_(self.version, res.version)
+ eq_(self.traffic_class, res.traffic_class)
+ eq_(self.flow_label, res.flow_label)
+ eq_(self.payload_length, res.payload_length)
+ eq_(self.nxt, res.nxt)
+ eq_(self.hop_limit, res.hop_limit)
+ eq_(self.src, res.src)
+ eq_(self.dst, res.dst)
+ eq_(str(self.ext_hdrs), str(res.ext_hdrs))
+
+ def test_parser_with_hop_opts(self):
+ self.setUp_with_hop_opts()
+ self.test_parser()
+
+ def test_parser_with_dst_opts(self):
+ self.setUp_with_dst_opts()
+ self.test_parser()
+
+ def test_parser_with_routing_type3(self):
+ self.setUp_with_routing_type3()
+ self.test_parser()
+
+ def test_parser_with_fragment(self):
+ self.setUp_with_fragment()
+ self.test_parser()
+
+ def test_parser_with_auth(self):
+ self.setUp_with_auth()
+ self.test_parser()
+
+ def test_parser_with_multi_headers(self):
+ self.setUp_with_multi_headers()
+ self.test_parser()
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.ip.serialize(data, prev)
+
+ res = struct.unpack_from(ipv6.ipv6._PACK_STR, six.binary_type(buf))
+
+ eq_(self.v_tc_flow, res[0])
+ eq_(self.payload_length, res[1])
+ eq_(self.nxt, res[2])
+ eq_(self.hop_limit, res[3])
+ eq_(self.src, addrconv.ipv6.bin_to_text(res[4]))
+ eq_(self.dst, addrconv.ipv6.bin_to_text(res[5]))
+
+ def test_serialize_with_hop_opts(self):
+ self.setUp_with_hop_opts()
+ self.test_serialize()
+
+ data = bytearray()
+ prev = None
+ buf = self.ip.serialize(data, prev)
+ hop_opts = ipv6.hop_opts.parser(six.binary_type(buf[ipv6.ipv6._MIN_LEN:]))
+ eq_(repr(self.hop_opts), repr(hop_opts))
+
+ def test_serialize_with_dst_opts(self):
+ self.setUp_with_dst_opts()
+ self.test_serialize()
+
+ data = bytearray()
+ prev = None
+ buf = self.ip.serialize(data, prev)
+ dst_opts = ipv6.dst_opts.parser(six.binary_type(buf[ipv6.ipv6._MIN_LEN:]))
+ eq_(repr(self.dst_opts), repr(dst_opts))
+
+ def test_serialize_with_routing_type3(self):
+ self.setUp_with_routing_type3()
+ self.test_serialize()
+
+ data = bytearray()
+ prev = None
+ buf = self.ip.serialize(data, prev)
+ routing = ipv6.routing.parser(six.binary_type(buf[ipv6.ipv6._MIN_LEN:]))
+ eq_(repr(self.routing), repr(routing))
+
+ def test_serialize_with_fragment(self):
+ self.setUp_with_fragment()
+ self.test_serialize()
+
+ data = bytearray()
+ prev = None
+ buf = self.ip.serialize(data, prev)
+ fragment = ipv6.fragment.parser(six.binary_type(buf[ipv6.ipv6._MIN_LEN:]))
+ eq_(repr(self.fragment), repr(fragment))
+
+ def test_serialize_with_auth(self):
+ self.setUp_with_auth()
+ self.test_serialize()
+
+ data = bytearray()
+ prev = None
+ buf = self.ip.serialize(data, prev)
+ auth = ipv6.auth.parser(six.binary_type(buf[ipv6.ipv6._MIN_LEN:]))
+ eq_(repr(self.auth), repr(auth))
+
+ def test_serialize_with_multi_headers(self):
+ self.setUp_with_multi_headers()
+ self.test_serialize()
+
+ data = bytearray()
+ prev = None
+ buf = self.ip.serialize(data, prev)
+ offset = ipv6.ipv6._MIN_LEN
+ hop_opts = ipv6.hop_opts.parser(six.binary_type(buf[offset:]))
+ offset += len(hop_opts)
+ auth = ipv6.auth.parser(six.binary_type(buf[offset:]))
+ eq_(repr(self.hop_opts), repr(hop_opts))
+ eq_(repr(self.auth), repr(auth))
+
+ def test_to_string(self):
+ ipv6_values = {'version': self.version,
+ 'traffic_class': self.traffic_class,
+ 'flow_label': self.flow_label,
+ 'payload_length': self.payload_length,
+ 'nxt': self.nxt,
+ 'hop_limit': self.hop_limit,
+ 'src': repr(self.src),
+ 'dst': repr(self.dst),
+ 'ext_hdrs': self.ext_hdrs}
+ _ipv6_str = ','.join(['%s=%s' % (k, ipv6_values[k])
+ for k, v in inspect.getmembers(self.ip)
+ if k in ipv6_values])
+ ipv6_str = '%s(%s)' % (ipv6.ipv6.__name__, _ipv6_str)
+
+ eq_(str(self.ip), ipv6_str)
+ eq_(repr(self.ip), ipv6_str)
+
+ def test_to_string_with_hop_opts(self):
+ self.setUp_with_hop_opts()
+ self.test_to_string()
+
+ def test_to_string_with_dst_opts(self):
+ self.setUp_with_dst_opts()
+ self.test_to_string()
+
+ def test_to_string_with_fragment(self):
+ self.setUp_with_fragment()
+ self.test_to_string()
+
+ def test_to_string_with_auth(self):
+ self.setUp_with_auth()
+ self.test_to_string()
+
+ def test_to_string_with_multi_headers(self):
+ self.setUp_with_multi_headers()
+ self.test_to_string()
+
+ def test_len(self):
+ eq_(len(self.ip), 40)
+
+ def test_len_with_hop_opts(self):
+ self.setUp_with_hop_opts()
+ eq_(len(self.ip), 40 + len(self.hop_opts))
+
+ def test_len_with_dst_opts(self):
+ self.setUp_with_dst_opts()
+ eq_(len(self.ip), 40 + len(self.dst_opts))
+
+ def test_len_with_routing_type3(self):
+ self.setUp_with_routing_type3()
+ eq_(len(self.ip), 40 + len(self.routing))
+
+ def test_len_with_fragment(self):
+ self.setUp_with_fragment()
+ eq_(len(self.ip), 40 + len(self.fragment))
+
+ def test_len_with_auth(self):
+ self.setUp_with_auth()
+ eq_(len(self.ip), 40 + len(self.auth))
+
+ def test_len_with_multi_headers(self):
+ self.setUp_with_multi_headers()
+ eq_(len(self.ip), 40 + len(self.hop_opts) + len(self.auth))
+
+ def test_default_args(self):
+ ip = ipv6.ipv6()
+ buf = ip.serialize(bytearray(), None)
+ res = struct.unpack(ipv6.ipv6._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], 6 << 28)
+ eq_(res[1], 0)
+ eq_(res[2], 6)
+ eq_(res[3], 255)
+ eq_(res[4], addrconv.ipv6.text_to_bin('10::10'))
+ eq_(res[5], addrconv.ipv6.text_to_bin('20::20'))
+
+ # with extension header
+ ip = ipv6.ipv6(
+ nxt=0, ext_hdrs=[
+ ipv6.hop_opts(58, 0, [
+ ipv6.option(5, 2, b'\x00\x00'),
+ ipv6.option(1, 0, None)])])
+ buf = ip.serialize(bytearray(), None)
+ res = struct.unpack(ipv6.ipv6._PACK_STR + '8s', six.binary_type(buf))
+
+ eq_(res[0], 6 << 28)
+ eq_(res[1], 8)
+ eq_(res[2], 0)
+ eq_(res[3], 255)
+ eq_(res[4], addrconv.ipv6.text_to_bin('10::10'))
+ eq_(res[5], addrconv.ipv6.text_to_bin('20::20'))
+ eq_(res[6], b'\x3a\x00\x05\x02\x00\x00\x01\x00')
+
+ def test_json(self):
+ jsondict = self.ip.to_jsondict()
+ ip = ipv6.ipv6.from_jsondict(jsondict['ipv6'])
+ eq_(str(self.ip), str(ip))
+
+ def test_json_with_hop_opts(self):
+ self.setUp_with_hop_opts()
+ self.test_json()
+
+ def test_json_with_dst_opts(self):
+ self.setUp_with_dst_opts()
+ self.test_json()
+
+ def test_json_with_routing_type3(self):
+ self.setUp_with_routing_type3()
+ self.test_json()
+
+ def test_json_with_fragment(self):
+ self.setUp_with_fragment()
+ self.test_json()
+
+ def test_json_with_auth(self):
+ self.setUp_with_auth()
+ self.test_json()
+
+ def test_json_with_multi_headers(self):
+ self.setUp_with_multi_headers()
+ self.test_json()
+
+
+class Test_hop_opts(unittest.TestCase):
+
+ def setUp(self):
+ self.nxt = 0
+ self.size = 8
+ self.data = [
+ ipv6.option(5, 2, b'\x00\x00'),
+ ipv6.option(1, 0, None),
+ ipv6.option(0xc2, 4, b'\x00\x01\x00\x00'),
+ ipv6.option(1, 0, None),
+ ]
+ self.hop = ipv6.hop_opts(self.nxt, self.size, self.data)
+ self.form = '!BB'
+ self.buf = struct.pack(self.form, self.nxt, self.size) \
+ + self.data[0].serialize() \
+ + self.data[1].serialize() \
+ + self.data[2].serialize() \
+ + self.data[3].serialize()
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.nxt, self.hop.nxt)
+ eq_(self.size, self.hop.size)
+ eq_(self.data, self.hop.data)
+
+ @raises(Exception)
+ def test_invalid_size(self):
+ ipv6.hop_opts(self.nxt, 1, self.data)
+
+ def test_parser(self):
+ _res = ipv6.hop_opts.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.nxt, res.nxt)
+ eq_(self.size, res.size)
+ eq_(str(self.data), str(res.data))
+
+ def test_serialize(self):
+ buf = self.hop.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self.nxt, res[0])
+ eq_(self.size, res[1])
+ offset = struct.calcsize(self.form)
+ opt1 = ipv6.option.parser(six.binary_type(buf[offset:]))
+ offset += len(opt1)
+ opt2 = ipv6.option.parser(six.binary_type(buf[offset:]))
+ offset += len(opt2)
+ opt3 = ipv6.option.parser(six.binary_type(buf[offset:]))
+ offset += len(opt3)
+ opt4 = ipv6.option.parser(six.binary_type(buf[offset:]))
+ eq_(5, opt1.type_)
+ eq_(2, opt1.len_)
+ eq_(b'\x00\x00', opt1.data)
+ eq_(1, opt2.type_)
+ eq_(0, opt2.len_)
+ eq_(None, opt2.data)
+ eq_(0xc2, opt3.type_)
+ eq_(4, opt3.len_)
+ eq_(b'\x00\x01\x00\x00', opt3.data)
+ eq_(1, opt4.type_)
+ eq_(0, opt4.len_)
+ eq_(None, opt4.data)
+
+ def test_len(self):
+ eq_(16, len(self.hop))
+
+ def test_default_args(self):
+ hdr = ipv6.hop_opts()
+ buf = hdr.serialize()
+ res = struct.unpack('!BB', six.binary_type(buf[:2]))
+
+ eq_(res[0], 6)
+ eq_(res[1], 0)
+ opt = ipv6.option(type_=1, len_=4, data=b'\x00\x00\x00\x00')
+ eq_(six.binary_type(buf[2:]), opt.serialize())
+
+
+class Test_dst_opts(unittest.TestCase):
+
+ def setUp(self):
+ self.nxt = 60
+ self.size = 8
+ self.data = [
+ ipv6.option(5, 2, b'\x00\x00'),
+ ipv6.option(1, 0, None),
+ ipv6.option(0xc2, 4, b'\x00\x01\x00\x00'),
+ ipv6.option(1, 0, None),
+ ]
+ self.dst = ipv6.dst_opts(self.nxt, self.size, self.data)
+ self.form = '!BB'
+ self.buf = struct.pack(self.form, self.nxt, self.size) \
+ + self.data[0].serialize() \
+ + self.data[1].serialize() \
+ + self.data[2].serialize() \
+ + self.data[3].serialize()
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.nxt, self.dst.nxt)
+ eq_(self.size, self.dst.size)
+ eq_(self.data, self.dst.data)
+
+ @raises(Exception)
+ def test_invalid_size(self):
+ ipv6.dst_opts(self.nxt, 1, self.data)
+
+ def test_parser(self):
+ _res = ipv6.dst_opts.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.nxt, res.nxt)
+ eq_(self.size, res.size)
+ eq_(str(self.data), str(res.data))
+
+ def test_serialize(self):
+ buf = self.dst.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self.nxt, res[0])
+ eq_(self.size, res[1])
+ offset = struct.calcsize(self.form)
+ opt1 = ipv6.option.parser(six.binary_type(buf[offset:]))
+ offset += len(opt1)
+ opt2 = ipv6.option.parser(six.binary_type(buf[offset:]))
+ offset += len(opt2)
+ opt3 = ipv6.option.parser(six.binary_type(buf[offset:]))
+ offset += len(opt3)
+ opt4 = ipv6.option.parser(six.binary_type(buf[offset:]))
+ eq_(5, opt1.type_)
+ eq_(2, opt1.len_)
+ eq_(b'\x00\x00', opt1.data)
+ eq_(1, opt2.type_)
+ eq_(0, opt2.len_)
+ eq_(None, opt2.data)
+ eq_(0xc2, opt3.type_)
+ eq_(4, opt3.len_)
+ eq_(b'\x00\x01\x00\x00', opt3.data)
+ eq_(1, opt4.type_)
+ eq_(0, opt4.len_)
+ eq_(None, opt4.data)
+
+ def test_len(self):
+ eq_(16, len(self.dst))
+
+ def test_default_args(self):
+ hdr = ipv6.dst_opts()
+ buf = hdr.serialize()
+ res = struct.unpack('!BB', six.binary_type(buf[:2]))
+
+ eq_(res[0], 6)
+ eq_(res[1], 0)
+ opt = ipv6.option(type_=1, len_=4, data=b'\x00\x00\x00\x00')
+ eq_(six.binary_type(buf[2:]), opt.serialize())
+
+
+class Test_option(unittest.TestCase):
+
+ def setUp(self):
+ self.type_ = 5
+ self.data = b'\x00\x00'
+ self.len_ = len(self.data)
+ self.opt = ipv6.option(self.type_, self.len_, self.data)
+ self.form = '!BB%ds' % self.len_
+ self.buf = struct.pack(self.form, self.type_, self.len_, self.data)
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.type_, self.opt.type_)
+ eq_(self.len_, self.opt.len_)
+ eq_(self.data, self.opt.data)
+
+ def test_parser(self):
+ _res = ipv6.option.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.type_, res.type_)
+ eq_(self.len_, res.len_)
+ eq_(self.data, res.data)
+
+ def test_serialize(self):
+ buf = self.opt.serialize()
+ res = struct.unpack_from(self.form, buf)
+ eq_(self.type_, res[0])
+ eq_(self.len_, res[1])
+ eq_(self.data, res[2])
+
+ def test_len(self):
+ eq_(len(self.opt), 2 + self.len_)
+
+
+class Test_option_pad1(Test_option):
+
+ def setUp(self):
+ self.type_ = 0
+ self.len_ = -1
+ self.data = None
+ self.opt = ipv6.option(self.type_, self.len_, self.data)
+ self.form = '!B'
+ self.buf = struct.pack(self.form, self.type_)
+
+ def test_serialize(self):
+ buf = self.opt.serialize()
+ res = struct.unpack_from(self.form, buf)
+ eq_(self.type_, res[0])
+
+ def test_default_args(self):
+ opt = ipv6.option()
+ buf = opt.serialize()
+ res = struct.unpack('!B', buf)
+
+ eq_(res[0], 0)
+
+
+class Test_option_padN(Test_option):
+
+ def setUp(self):
+ self.type_ = 1
+ self.len_ = 0
+ self.data = None
+ self.opt = ipv6.option(self.type_, self.len_, self.data)
+ self.form = '!BB'
+ self.buf = struct.pack(self.form, self.type_, self.len_)
+
+ def test_serialize(self):
+ buf = self.opt.serialize()
+ res = struct.unpack_from(self.form, buf)
+ eq_(self.type_, res[0])
+ eq_(self.len_, res[1])
+
+
+class Test_routing(unittest.TestCase):
+
+ def setUp(self):
+ self.nxt = 0
+ self.size = 6
+ self.type_ = ipv6.routing.ROUTING_TYPE_3
+ self.seg = 0
+ self.cmpi = 0
+ self.cmpe = 0
+ self.adrs = ["2001:db8:dead::1",
+ "2001:db8:dead::2",
+ "2001:db8:dead::3"]
+ # calculate pad
+ self.pad = (8 - ((len(self.adrs) - 1) * (16 - self.cmpi) +
+ (16 - self.cmpe) % 8)) % 8
+ # create buf
+ self.form = '!BBBBBB2x16s16s16s'
+ self.buf = struct.pack(self.form, self.nxt, self.size,
+ self.type_, self.seg,
+ (self.cmpi << 4) | self.cmpe,
+ self.pad << 4,
+ addrconv.ipv6.text_to_bin(self.adrs[0]),
+ addrconv.ipv6.text_to_bin(self.adrs[1]),
+ addrconv.ipv6.text_to_bin(self.adrs[2]))
+
+ def tearDown(self):
+ pass
+
+ def test_parser(self):
+ _res = ipv6.routing.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.nxt, res.nxt)
+ eq_(self.size, res.size)
+ eq_(self.type_, res.type_)
+ eq_(self.seg, res.seg)
+ eq_(self.cmpi, res.cmpi)
+ eq_(self.cmpe, res.cmpe)
+ eq_(self.pad, res._pad)
+ eq_(self.adrs[0], res.adrs[0])
+ eq_(self.adrs[1], res.adrs[1])
+ eq_(self.adrs[2], res.adrs[2])
+
+ def test_not_implemented_type(self):
+ not_implemented_buf = struct.pack(
+ '!BBBBBB2x', 0, 6, ipv6.routing.ROUTING_TYPE_2, 0, 0, 0)
+ instance = ipv6.routing.parser(not_implemented_buf)
+ assert None == instance
+
+ def test_invalid_type(self):
+ invalid_type = 99
+ invalid_buf = struct.pack('!BBBBBB2x', 0, 6, invalid_type, 0, 0, 0)
+ instance = ipv6.routing.parser(invalid_buf)
+ assert None == instance
+
+
+class Test_routing_type3(unittest.TestCase):
+
+ def setUp(self):
+ self.nxt = 0
+ self.size = 6
+ self.type_ = 3
+ self.seg = 0
+ self.cmpi = 0
+ self.cmpe = 0
+ self.adrs = ["2001:db8:dead::1",
+ "2001:db8:dead::2",
+ "2001:db8:dead::3"]
+ # calculate pad
+ self.pad = (8 - ((len(self.adrs) - 1) * (16 - self.cmpi) +
+ (16 - self.cmpe) % 8)) % 8
+
+ self.routing = ipv6.routing_type3(
+ self.nxt, self.size, self.type_, self.seg, self.cmpi,
+ self.cmpe, self.adrs)
+ self.form = '!BBBBBB2x16s16s16s'
+ self.buf = struct.pack(self.form, self.nxt, self.size,
+ self.type_, self.seg,
+ (self.cmpi << 4) | self.cmpe,
+ self.pad << 4,
+ addrconv.ipv6.text_to_bin(self.adrs[0]),
+ addrconv.ipv6.text_to_bin(self.adrs[1]),
+ addrconv.ipv6.text_to_bin(self.adrs[2]))
+
+ def test_init(self):
+ eq_(self.nxt, self.routing.nxt)
+ eq_(self.size, self.routing.size)
+ eq_(self.type_, self.routing.type_)
+ eq_(self.seg, self.routing.seg)
+ eq_(self.cmpi, self.routing.cmpi)
+ eq_(self.cmpe, self.routing.cmpe)
+ eq_(self.pad, self.routing._pad)
+ eq_(self.adrs[0], self.routing.adrs[0])
+ eq_(self.adrs[1], self.routing.adrs[1])
+ eq_(self.adrs[2], self.routing.adrs[2])
+
+ def test_parser(self):
+ _res = ipv6.routing.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.nxt, res.nxt)
+ eq_(self.size, res.size)
+ eq_(self.type_, res.type_)
+ eq_(self.seg, res.seg)
+ eq_(self.cmpi, res.cmpi)
+ eq_(self.cmpe, res.cmpe)
+ eq_(self.pad, res._pad)
+ eq_(self.adrs[0], res.adrs[0])
+ eq_(self.adrs[1], res.adrs[1])
+ eq_(self.adrs[2], res.adrs[2])
+
+ def test_serialize(self):
+ buf = self.routing.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self.nxt, res[0])
+ eq_(self.size, res[1])
+ eq_(self.type_, res[2])
+ eq_(self.seg, res[3])
+ eq_(self.cmpi, res[4] >> 4)
+ eq_(self.cmpe, res[4] & 0xf)
+ eq_(self.pad, res[5])
+ eq_(addrconv.ipv6.text_to_bin(self.adrs[0]), res[6])
+ eq_(addrconv.ipv6.text_to_bin(self.adrs[1]), res[7])
+ eq_(addrconv.ipv6.text_to_bin(self.adrs[2]), res[8])
+
+ def test_parser_with_adrs_zero(self):
+ nxt = 0
+ size = 0
+ type_ = 3
+ seg = 0
+ cmpi = 0
+ cmpe = 0
+ adrs = []
+ # calculate pad
+ pad = (8 - ((len(adrs) - 1) * (16 - cmpi) + (16 - cmpe) % 8)) % 8
+
+ form = '!BBBBBB2x'
+ buf = struct.pack(form, nxt, size, type_, seg,
+ (cmpi << 4) | cmpe, pad << 4)
+ _res = ipv6.routing.parser(buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(nxt, res.nxt)
+ eq_(size, res.size)
+ eq_(type_, res.type_)
+ eq_(seg, res.seg)
+ eq_(cmpi, res.cmpi)
+ eq_(cmpe, res.cmpe)
+ eq_(pad, res._pad)
+
+ def test_serialize_with_adrs_zero(self):
+ nxt = 0
+ size = 0
+ type_ = 3
+ seg = 0
+ cmpi = 0
+ cmpe = 0
+ adrs = []
+ # calculate pad
+ pad = (8 - ((len(adrs) - 1) * (16 - cmpi) + (16 - cmpe) % 8)) % 8
+ routing = ipv6.routing_type3(
+ nxt, size, type_, seg, cmpi,
+ cmpe, pad)
+ buf = routing.serialize()
+ form = '!BBBBBB2x'
+ res = struct.unpack_from(form, six.binary_type(buf))
+ eq_(nxt, res[0])
+ eq_(size, res[1])
+ eq_(type_, res[2])
+ eq_(seg, res[3])
+ eq_(cmpi, res[4] >> 4)
+ eq_(cmpe, res[4] & 0xf)
+ eq_(pad, res[5])
+
+ def test_parser_with_compression(self):
+ pass
+ nxt = 0
+ size = 3
+ type_ = 3
+ seg = 0
+ cmpi = 8
+ cmpe = 12
+ adrs = ["2001:0db8:dead:0123:4567:89ab:cdef:0001",
+ "2001:0db8:dead:0123:4567:89ab:cdef:0002",
+ "2001:0db8:dead:0123:4567:89ab:cdef:0003"]
+ # calculate pad
+ pad = (8 - ((len(adrs) - 1) * (16 - cmpi) + (16 - cmpe) % 8)) % 8
+ form = '!BBBBBB2x%ds%ds%ds' % (16 - cmpi, 16 - cmpi, 16 - cmpe)
+ slice_i = slice(cmpi, 16)
+ slice_e = slice(cmpe, 16)
+ buf = struct.pack(form, nxt, size, type_, seg,
+ (cmpi << 4) | cmpe, pad << 4,
+ addrconv.ipv6.text_to_bin(adrs[0])[slice_i],
+ addrconv.ipv6.text_to_bin(adrs[1])[slice_i],
+ addrconv.ipv6.text_to_bin(adrs[2])[slice_e])
+ _res = ipv6.routing.parser(buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(nxt, res.nxt)
+ eq_(size, res.size)
+ eq_(type_, res.type_)
+ eq_(seg, res.seg)
+ eq_(cmpi, res.cmpi)
+ eq_(cmpe, res.cmpe)
+ eq_(pad, res._pad)
+ eq_("::4567:89ab:cdef:1", res.adrs[0])
+ eq_("::4567:89ab:cdef:2", res.adrs[1])
+ eq_("::205.239.0.3", res.adrs[2])
+
+ def test_serialize_with_compression(self):
+ nxt = 0
+ size = 3
+ type_ = 3
+ seg = 0
+ cmpi = 8
+ cmpe = 8
+ adrs = ["2001:db8:dead::1",
+ "2001:db8:dead::2",
+ "2001:db8:dead::3"]
+ # calculate pad
+ pad = (8 - ((len(adrs) - 1) * (16 - cmpi) + (16 - cmpe) % 8)) % 8
+ slice_i = slice(cmpi, 16)
+ slice_e = slice(cmpe, 16)
+ routing = ipv6.routing_type3(
+ nxt, size, type_, seg, cmpi, cmpe, adrs)
+ buf = routing.serialize()
+ form = '!BBBBBB2x8s8s8s'
+ res = struct.unpack_from(form, six.binary_type(buf))
+ eq_(nxt, res[0])
+ eq_(size, res[1])
+ eq_(type_, res[2])
+ eq_(seg, res[3])
+ eq_(cmpi, res[4] >> 4)
+ eq_(cmpe, res[4] & 0xf)
+ eq_(pad, res[5])
+ eq_(addrconv.ipv6.text_to_bin(adrs[0])[slice_i], res[6])
+ eq_(addrconv.ipv6.text_to_bin(adrs[1])[slice_i], res[7])
+ eq_(addrconv.ipv6.text_to_bin(adrs[2])[slice_e], res[8])
+
+ def test_len(self):
+ eq_((6 + 1) * 8, len(self.routing))
+
+ def test_default_args(self):
+ hdr = ipv6.routing_type3()
+ buf = hdr.serialize()
+ LOG.info(repr(buf))
+ res = struct.unpack_from(ipv6.routing_type3._PACK_STR, six.binary_type(buf))
+ LOG.info(res)
+
+ eq_(res[0], 6)
+ eq_(res[1], 0)
+ eq_(res[2], 3)
+ eq_(res[3], 0)
+ eq_(res[4], (0 << 4) | 0)
+ eq_(res[5], 0)
+
+
+class Test_fragment(unittest.TestCase):
+
+ def setUp(self):
+ self.nxt = 44
+ self.offset = 50
+ self.more = 1
+ self.id_ = 123
+ self.fragment = ipv6.fragment(
+ self.nxt, self.offset, self.more, self.id_)
+
+ self.off_m = (self.offset << 3 | self.more)
+ self.form = '!BxHI'
+ self.buf = struct.pack(self.form, self.nxt, self.off_m, self.id_)
+
+ def test_init(self):
+ eq_(self.nxt, self.fragment.nxt)
+ eq_(self.offset, self.fragment.offset)
+ eq_(self.more, self.fragment.more)
+ eq_(self.id_, self.fragment.id_)
+
+ def test_parser(self):
+ _res = ipv6.fragment.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.nxt, res.nxt)
+ eq_(self.offset, res.offset)
+ eq_(self.more, res.more)
+ eq_(self.id_, res.id_)
+
+ def test_serialize(self):
+ buf = self.fragment.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self.nxt, res[0])
+ eq_(self.off_m, res[1])
+ eq_(self.id_, res[2])
+
+ def test_len(self):
+ eq_(8, len(self.fragment))
+
+ def test_default_args(self):
+ hdr = ipv6.fragment()
+ buf = hdr.serialize()
+ res = struct.unpack_from(ipv6.fragment._PACK_STR, buf)
+
+ eq_(res[0], 6)
+ eq_(res[1], 0)
+ eq_(res[2], 0)
+
+
+class Test_auth(unittest.TestCase):
+
+ def setUp(self):
+ self.nxt = 0
+ self.size = 4
+ self.spi = 256
+ self.seq = 1
+ self.data = b'\x21\xd3\xa9\x5c\x5f\xfd\x4d\x18\x46\x22\xb9\xf8'
+ self.auth = ipv6.auth(
+ self.nxt, self.size, self.spi, self.seq, self.data)
+ self.form = '!BB2xII12s'
+ self.buf = struct.pack(self.form, self.nxt, self.size, self.spi,
+ self.seq, self.data)
+
+ def test_init(self):
+ eq_(self.nxt, self.auth.nxt)
+ eq_(self.size, self.auth.size)
+ eq_(self.spi, self.auth.spi)
+ eq_(self.seq, self.auth.seq)
+ eq_(self.data, self.auth.data)
+
+ def test_parser(self):
+ _res = ipv6.auth.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(self.nxt, res.nxt)
+ eq_(self.size, res.size)
+ eq_(self.spi, res.spi)
+ eq_(self.seq, res.seq)
+ eq_(self.data, res.data)
+
+ def test_serialize(self):
+ buf = self.auth.serialize()
+ res = struct.unpack_from(self.form, six.binary_type(buf))
+ eq_(self.nxt, res[0])
+ eq_(self.size, res[1])
+ eq_(self.spi, res[2])
+ eq_(self.seq, res[3])
+ eq_(self.data, res[4])
+
+ def test_len(self):
+ eq_((4 + 2) * 4, len(self.auth))
+
+ def test_len_re(self):
+ size = 5
+ auth = ipv6.auth(
+ 0, size, 256, 1,
+ b'\x21\xd3\xa9\x5c\x5f\xfd\x4d\x18\x46\x22\xb9\xf8\xf8\xf8\xf8\xf8')
+ eq_((size + 2) * 4, len(auth))
+
+ def test_default_args(self):
+ hdr = ipv6.auth()
+ buf = hdr.serialize()
+ LOG.info(repr(buf))
+ res = struct.unpack_from(ipv6.auth._PACK_STR, six.binary_type(buf))
+ LOG.info(res)
+
+ eq_(res[0], 6)
+ eq_(res[1], 2)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(buf[ipv6.auth._MIN_LEN:], b'\x00\x00\x00\x00')
diff --git a/tests/unit/packet/test_llc.py b/tests/unit/packet/test_llc.py
new file mode 100644
index 00000000..05894ab7
--- /dev/null
+++ b/tests/unit/packet/test_llc.py
@@ -0,0 +1,42 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+
+from nose.tools import eq_
+from ryu.lib.packet import llc
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_ControlFormatI(unittest.TestCase):
+ msg = llc.llc(llc.SAP_BPDU, llc.SAP_BPDU, llc.ControlFormatI())
+
+ def test_json(self):
+ jsondict = self.msg.to_jsondict()
+ msg = llc.llc.from_jsondict(jsondict['llc'])
+ eq_(str(self.msg), str(msg))
+
+
+class Test_ControlFormatS(Test_ControlFormatI):
+ msg = llc.llc(llc.SAP_BPDU, llc.SAP_BPDU, llc.ControlFormatS())
+
+
+class Test_ControlFormatU(Test_ControlFormatI):
+ msg = llc.llc(llc.SAP_BPDU, llc.SAP_BPDU, llc.ControlFormatU())
diff --git a/tests/unit/packet/test_lldp.py b/tests/unit/packet/test_lldp.py
new file mode 100644
index 00000000..d8d261c2
--- /dev/null
+++ b/tests/unit/packet/test_lldp.py
@@ -0,0 +1,533 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import six
+import struct
+import inspect
+from nose.tools import ok_, eq_, nottest
+
+from ryu.ofproto import ether
+from ryu.lib.packet import packet
+from ryu.lib.packet import ethernet
+from ryu.lib.packet import lldp
+from ryu.lib import addrconv
+
+LOG = logging.getLogger(__name__)
+
+
+class TestLLDPMandatoryTLV(unittest.TestCase):
+ def setUp(self):
+ # sample data is based on:
+ # http://wiki.wireshark.org/LinkLayerDiscoveryProtocol
+ #
+ # mandatory TLV only
+ self.data = b'\x01\x80\xc2\x00\x00\x0e\x00\x04' \
+ + b'\x96\x1f\xa7\x26\x88\xcc\x02\x07' \
+ + b'\x04\x00\x04\x96\x1f\xa7\x26\x04' \
+ + b'\x04\x05\x31\x2f\x33\x06\x02\x00' \
+ + b'\x78\x00\x00'
+
+ def tearDown(self):
+ pass
+
+ def test_get_tlv_type(self):
+ buf = b'\x02\x07\x04\x00\x04\x96\x1f\xa7\x26'
+ eq_(lldp.LLDPBasicTLV.get_type(buf), lldp.LLDP_TLV_CHASSIS_ID)
+
+ def test_parse_without_ethernet(self):
+ buf = self.data[ethernet.ethernet._MIN_LEN:]
+ (lldp_pkt, cls, rest_buf) = lldp.lldp.parser(buf)
+ eq_(len(rest_buf), 0)
+
+ tlvs = lldp_pkt.tlvs
+ eq_(tlvs[0].tlv_type, lldp.LLDP_TLV_CHASSIS_ID)
+ eq_(tlvs[0].len, 7)
+ eq_(tlvs[0].subtype, lldp.ChassisID.SUB_MAC_ADDRESS)
+ eq_(tlvs[0].chassis_id, b'\x00\x04\x96\x1f\xa7\x26')
+ eq_(tlvs[1].tlv_type, lldp.LLDP_TLV_PORT_ID)
+ eq_(tlvs[1].len, 4)
+ eq_(tlvs[1].subtype, lldp.PortID.SUB_INTERFACE_NAME)
+ eq_(tlvs[1].port_id, b'1/3')
+ eq_(tlvs[2].tlv_type, lldp.LLDP_TLV_TTL)
+ eq_(tlvs[2].len, 2)
+ eq_(tlvs[2].ttl, 120)
+ eq_(tlvs[3].tlv_type, lldp.LLDP_TLV_END)
+
+ def test_parse(self):
+ buf = self.data
+ pkt = packet.Packet(buf)
+ i = iter(pkt)
+
+ eq_(type(next(i)), ethernet.ethernet)
+ eq_(type(next(i)), lldp.lldp)
+
+ def test_tlv(self):
+ tlv = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS,
+ chassis_id=b'\x00\x04\x96\x1f\xa7\x26')
+ eq_(tlv.tlv_type, lldp.LLDP_TLV_CHASSIS_ID)
+ eq_(tlv.len, 7)
+ (typelen, ) = struct.unpack('!H', b'\x02\x07')
+ eq_(tlv.typelen, typelen)
+
+ def test_serialize_without_ethernet(self):
+ tlv_chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS,
+ chassis_id=b'\x00\x04\x96\x1f\xa7\x26')
+ tlv_port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME,
+ port_id=b'1/3')
+ tlv_ttl = lldp.TTL(ttl=120)
+ tlv_end = lldp.End()
+ tlvs = (tlv_chassis_id, tlv_port_id, tlv_ttl, tlv_end)
+ lldp_pkt = lldp.lldp(tlvs)
+
+ eq_(lldp_pkt.serialize(None, None),
+ self.data[ethernet.ethernet._MIN_LEN:])
+
+ def test_serialize(self):
+ pkt = packet.Packet()
+
+ dst = lldp.LLDP_MAC_NEAREST_BRIDGE
+ src = '00:04:96:1f:a7:26'
+ ethertype = ether.ETH_TYPE_LLDP
+ eth_pkt = ethernet.ethernet(dst, src, ethertype)
+ pkt.add_protocol(eth_pkt)
+
+ tlv_chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS,
+ chassis_id=addrconv.mac.
+ text_to_bin(src))
+ tlv_port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME,
+ port_id=b'1/3')
+ tlv_ttl = lldp.TTL(ttl=120)
+ tlv_end = lldp.End()
+ tlvs = (tlv_chassis_id, tlv_port_id, tlv_ttl, tlv_end)
+ lldp_pkt = lldp.lldp(tlvs)
+ pkt.add_protocol(lldp_pkt)
+
+ eq_(len(pkt.protocols), 2)
+
+ pkt.serialize()
+
+ # Note: If ethernet frame is less than 60 bytes length,
+ # ethernet.ethernet() appends padding to the payload.
+ # So, we splits the serialized data to compare.
+ data_len = len(self.data)
+ pkt_data_lldp = pkt.data[:data_len]
+ pkt_data_pad = pkt.data[data_len:]
+ eq_(b'\x00' * (60 - data_len), pkt_data_pad)
+
+ eq_(self.data, pkt_data_lldp)
+
+ def test_to_string(self):
+ chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS,
+ chassis_id=b'\x00\x04\x96\x1f\xa7\x26')
+ port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME,
+ port_id=b'1/3')
+ ttl = lldp.TTL(ttl=120)
+ end = lldp.End()
+ tlvs = (chassis_id, port_id, ttl, end)
+ lldp_pkt = lldp.lldp(tlvs)
+
+ chassis_id_values = {'subtype': lldp.ChassisID.SUB_MAC_ADDRESS,
+ 'chassis_id': b'\x00\x04\x96\x1f\xa7\x26',
+ 'len': chassis_id.len,
+ 'typelen': chassis_id.typelen}
+ _ch_id_str = ','.join(['%s=%s' % (k, repr(chassis_id_values[k]))
+ for k, v in inspect.getmembers(chassis_id)
+ if k in chassis_id_values])
+ tlv_chassis_id_str = '%s(%s)' % (lldp.ChassisID.__name__, _ch_id_str)
+
+ port_id_values = {'subtype': port_id.subtype,
+ 'port_id': port_id.port_id,
+ 'len': port_id.len,
+ 'typelen': port_id.typelen}
+ _port_id_str = ','.join(['%s=%s' % (k, repr(port_id_values[k]))
+ for k, v in inspect.getmembers(port_id)
+ if k in port_id_values])
+ tlv_port_id_str = '%s(%s)' % (lldp.PortID.__name__, _port_id_str)
+
+ ttl_values = {'ttl': ttl.ttl,
+ 'len': ttl.len,
+ 'typelen': ttl.typelen}
+ _ttl_str = ','.join(['%s=%s' % (k, repr(ttl_values[k]))
+ for k, v in inspect.getmembers(ttl)
+ if k in ttl_values])
+ tlv_ttl_str = '%s(%s)' % (lldp.TTL.__name__, _ttl_str)
+
+ end_values = {'len': end.len,
+ 'typelen': end.typelen}
+ _end_str = ','.join(['%s=%s' % (k, repr(end_values[k]))
+ for k, v in inspect.getmembers(end)
+ if k in end_values])
+ tlv_end_str = '%s(%s)' % (lldp.End.__name__, _end_str)
+
+ _tlvs_str = '(%s, %s, %s, %s)'
+ tlvs_str = _tlvs_str % (tlv_chassis_id_str,
+ tlv_port_id_str,
+ tlv_ttl_str,
+ tlv_end_str)
+
+ _lldp_str = '%s(tlvs=%s)'
+ lldp_str = _lldp_str % (lldp.lldp.__name__,
+ tlvs_str)
+
+ eq_(str(lldp_pkt), lldp_str)
+ eq_(repr(lldp_pkt), lldp_str)
+
+ def test_json(self):
+ chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS,
+ chassis_id=b'\x00\x04\x96\x1f\xa7\x26')
+ port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME,
+ port_id=b'1/3')
+ ttl = lldp.TTL(ttl=120)
+ end = lldp.End()
+ tlvs = (chassis_id, port_id, ttl, end)
+ lldp1 = lldp.lldp(tlvs)
+ jsondict = lldp1.to_jsondict()
+ lldp2 = lldp.lldp.from_jsondict(jsondict['lldp'])
+ eq_(str(lldp1), str(lldp2))
+
+
+class TestLLDPOptionalTLV(unittest.TestCase):
+ def setUp(self):
+ # sample data is based on:
+ # http://wiki.wireshark.org/LinkLayerDiscoveryProtocol
+ #
+ # include optional TLV
+ self.data = b'\x01\x80\xc2\x00\x00\x0e\x00\x01' \
+ + b'\x30\xf9\xad\xa0\x88\xcc\x02\x07' \
+ + b'\x04\x00\x01\x30\xf9\xad\xa0\x04' \
+ + b'\x04\x05\x31\x2f\x31\x06\x02\x00' \
+ + b'\x78\x08\x17\x53\x75\x6d\x6d\x69' \
+ + b'\x74\x33\x30\x30\x2d\x34\x38\x2d' \
+ + b'\x50\x6f\x72\x74\x20\x31\x30\x30' \
+ + b'\x31\x00\x0a\x0d\x53\x75\x6d\x6d' \
+ + b'\x69\x74\x33\x30\x30\x2d\x34\x38' \
+ + b'\x00\x0c\x4c\x53\x75\x6d\x6d\x69' \
+ + b'\x74\x33\x30\x30\x2d\x34\x38\x20' \
+ + b'\x2d\x20\x56\x65\x72\x73\x69\x6f' \
+ + b'\x6e\x20\x37\x2e\x34\x65\x2e\x31' \
+ + b'\x20\x28\x42\x75\x69\x6c\x64\x20' \
+ + b'\x35\x29\x20\x62\x79\x20\x52\x65' \
+ + b'\x6c\x65\x61\x73\x65\x5f\x4d\x61' \
+ + b'\x73\x74\x65\x72\x20\x30\x35\x2f' \
+ + b'\x32\x37\x2f\x30\x35\x20\x30\x34' \
+ + b'\x3a\x35\x33\x3a\x31\x31\x00\x0e' \
+ + b'\x05\x01\x00\x14\x00\x14\x10\x0e' \
+ + b'\x07' \
+ + b'\x06\x00\x01\x30\xf9\xad\xa0\x02' \
+ + b'\x00\x00\x03\xe9\x00\xfe\x07\x00' \
+ + b'\x12\x0f\x02\x07\x01\x00\xfe\x09' \
+ + b'\x00\x12\x0f\x01\x03\x6c\x00\x00' \
+ + b'\x10\xfe\x09\x00\x12\x0f\x03\x01' \
+ + b'\x00\x00\x00\x00\xfe\x06\x00\x12' \
+ + b'\x0f\x04\x05\xf2\xfe\x06\x00\x80' \
+ + b'\xc2\x01\x01\xe8\xfe\x07\x00\x80' \
+ + b'\xc2\x02\x01\x00\x00\xfe\x17\x00' \
+ + b'\x80\xc2\x03\x01\xe8\x10\x76\x32' \
+ + b'\x2d\x30\x34\x38\x38\x2d\x30\x33' \
+ + b'\x2d\x30\x35\x30\x35\x00\xfe\x05' \
+ + b'\x00\x80\xc2\x04\x00\x00\x00'
+
+ def tearDown(self):
+ pass
+
+ def test_parse(self):
+ buf = self.data
+ pkt = packet.Packet(buf)
+ i = iter(pkt)
+
+ eq_(type(next(i)), ethernet.ethernet)
+ lldp_pkt = next(i)
+ eq_(type(lldp_pkt), lldp.lldp)
+
+ tlvs = lldp_pkt.tlvs
+
+ # Port Description
+ eq_(tlvs[3].tlv_type, lldp.LLDP_TLV_PORT_DESCRIPTION)
+ eq_(tlvs[3].port_description, b'Summit300-48-Port 1001\x00')
+
+ # System Name
+ eq_(tlvs[4].tlv_type, lldp.LLDP_TLV_SYSTEM_NAME)
+ eq_(tlvs[4].system_name, b'Summit300-48\x00')
+
+ # System Description
+
+ eq_(tlvs[5].tlv_type, lldp.LLDP_TLV_SYSTEM_DESCRIPTION)
+ eq_(tlvs[5].system_description,
+ b'Summit300-48 - Version 7.4e.1 (Build 5) '
+ + b'by Release_Master 05/27/05 04:53:11\x00')
+
+ # SystemCapabilities
+ eq_(tlvs[6].tlv_type, lldp.LLDP_TLV_SYSTEM_CAPABILITIES)
+ eq_(tlvs[6].subtype, lldp.ChassisID.SUB_CHASSIS_COMPONENT)
+ eq_(tlvs[6].system_cap & lldp.SystemCapabilities.CAP_MAC_BRIDGE,
+ lldp.SystemCapabilities.CAP_MAC_BRIDGE)
+ eq_(tlvs[6].enabled_cap & lldp.SystemCapabilities.CAP_MAC_BRIDGE,
+ lldp.SystemCapabilities.CAP_MAC_BRIDGE)
+ eq_(tlvs[6].system_cap & lldp.SystemCapabilities.CAP_TELEPHONE, 0)
+ eq_(tlvs[6].enabled_cap & lldp.SystemCapabilities.CAP_TELEPHONE, 0)
+
+ # Management Address
+ eq_(tlvs[7].tlv_type, lldp.LLDP_TLV_MANAGEMENT_ADDRESS)
+ eq_(tlvs[7].addr_len, 7)
+ eq_(tlvs[7].addr, b'\x00\x01\x30\xf9\xad\xa0')
+ eq_(tlvs[7].intf_num, 1001)
+
+ # Organizationally Specific
+ eq_(tlvs[8].tlv_type, lldp.LLDP_TLV_ORGANIZATIONALLY_SPECIFIC)
+ eq_(tlvs[8].oui, b'\x00\x12\x0f') # IEEE 802.3
+ eq_(tlvs[8].subtype, 0x02) # Power Via MDI
+
+ # End
+ eq_(tlvs[16].tlv_type, lldp.LLDP_TLV_END)
+
+ def test_parse_corrupted(self):
+ buf = self.data
+ pkt = packet.Packet(buf[:128])
+
+ def test_serialize(self):
+ pkt = packet.Packet()
+
+ dst = lldp.LLDP_MAC_NEAREST_BRIDGE
+ src = '00:01:30:f9:ad:a0'
+ ethertype = ether.ETH_TYPE_LLDP
+ eth_pkt = ethernet.ethernet(dst, src, ethertype)
+ pkt.add_protocol(eth_pkt)
+
+ tlv_chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS,
+ chassis_id=addrconv.mac.
+ text_to_bin(src))
+ tlv_port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME,
+ port_id=b'1/1')
+ tlv_ttl = lldp.TTL(ttl=120)
+ tlv_port_description = lldp.PortDescription(
+ port_description=b'Summit300-48-Port 1001\x00')
+ tlv_system_name = lldp.SystemName(system_name=b'Summit300-48\x00')
+ tlv_system_description = lldp.SystemDescription(
+ system_description=b'Summit300-48 - Version 7.4e.1 (Build 5) '
+ + b'by Release_Master 05/27/05 04:53:11\x00')
+ tlv_system_capabilities = lldp.SystemCapabilities(
+ subtype=lldp.ChassisID.SUB_CHASSIS_COMPONENT,
+ system_cap=0x14,
+ enabled_cap=0x14)
+ tlv_management_address = lldp.ManagementAddress(
+ addr_subtype=0x06, addr=b'\x00\x01\x30\xf9\xad\xa0',
+ intf_subtype=0x02, intf_num=1001,
+ oid=b'')
+ tlv_organizationally_specific = lldp.OrganizationallySpecific(
+ oui=b'\x00\x12\x0f', subtype=0x02, info=b'\x07\x01\x00')
+ tlv_end = lldp.End()
+ tlvs = (tlv_chassis_id, tlv_port_id, tlv_ttl, tlv_port_description,
+ tlv_system_name, tlv_system_description,
+ tlv_system_capabilities, tlv_management_address,
+ tlv_organizationally_specific, tlv_end)
+ lldp_pkt = lldp.lldp(tlvs)
+ pkt.add_protocol(lldp_pkt)
+
+ eq_(len(pkt.protocols), 2)
+
+ pkt.serialize()
+
+ # self.data has many organizationally specific TLVs
+ data = six.binary_type(pkt.data[:-2])
+ eq_(data, self.data[:len(data)])
+
+ def test_to_string(self):
+ chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS,
+ chassis_id=b'\x00\x01\x30\xf9\xad\xa0')
+ port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME,
+ port_id=b'1/1')
+ ttl = lldp.TTL(ttl=120)
+ port_desc = lldp.PortDescription(
+ port_description=b'Summit300-48-Port 1001\x00')
+ sys_name = lldp.SystemName(system_name=b'Summit300-48\x00')
+ sys_desc = lldp.SystemDescription(
+ system_description=b'Summit300-48 - Version 7.4e.1 (Build 5) '
+ + b'by Release_Master 05/27/05 04:53:11\x00')
+ sys_cap = lldp.SystemCapabilities(
+ subtype=lldp.ChassisID.SUB_CHASSIS_COMPONENT,
+ system_cap=0x14,
+ enabled_cap=0x14)
+ man_addr = lldp.ManagementAddress(
+ addr_subtype=0x06, addr=b'\x00\x01\x30\xf9\xad\xa0',
+ intf_subtype=0x02, intf_num=1001,
+ oid='')
+ org_spec = lldp.OrganizationallySpecific(
+ oui=b'\x00\x12\x0f', subtype=0x02, info=b'\x07\x01\x00')
+ end = lldp.End()
+ tlvs = (chassis_id, port_id, ttl, port_desc, sys_name,
+ sys_desc, sys_cap, man_addr, org_spec, end)
+ lldp_pkt = lldp.lldp(tlvs)
+
+ # ChassisID string
+ chassis_id_values = {'subtype': lldp.ChassisID.SUB_MAC_ADDRESS,
+ 'chassis_id': b'\x00\x01\x30\xf9\xad\xa0',
+ 'len': chassis_id.len,
+ 'typelen': chassis_id.typelen}
+ _ch_id_str = ','.join(['%s=%s' % (k, repr(chassis_id_values[k]))
+ for k, v in inspect.getmembers(chassis_id)
+ if k in chassis_id_values])
+ tlv_chassis_id_str = '%s(%s)' % (lldp.ChassisID.__name__, _ch_id_str)
+
+ # PortID string
+ port_id_values = {'subtype': port_id.subtype,
+ 'port_id': port_id.port_id,
+ 'len': port_id.len,
+ 'typelen': port_id.typelen}
+ _port_id_str = ','.join(['%s=%s' % (k, repr(port_id_values[k]))
+ for k, v in inspect.getmembers(port_id)
+ if k in port_id_values])
+ tlv_port_id_str = '%s(%s)' % (lldp.PortID.__name__, _port_id_str)
+
+ # TTL string
+ ttl_values = {'ttl': ttl.ttl,
+ 'len': ttl.len,
+ 'typelen': ttl.typelen}
+ _ttl_str = ','.join(['%s=%s' % (k, repr(ttl_values[k]))
+ for k, v in inspect.getmembers(ttl)
+ if k in ttl_values])
+ tlv_ttl_str = '%s(%s)' % (lldp.TTL.__name__, _ttl_str)
+
+ # PortDescription string
+ port_desc_values = {'tlv_info': port_desc.tlv_info,
+ 'len': port_desc.len,
+ 'typelen': port_desc.typelen}
+ _port_desc_str = ','.join(['%s=%s' % (k, repr(port_desc_values[k]))
+ for k, v in inspect.getmembers(port_desc)
+ if k in port_desc_values])
+ tlv_port_desc_str = '%s(%s)' % (lldp.PortDescription.__name__,
+ _port_desc_str)
+
+ # SystemName string
+ sys_name_values = {'tlv_info': sys_name.tlv_info,
+ 'len': sys_name.len,
+ 'typelen': sys_name.typelen}
+ _system_name_str = ','.join(['%s=%s' % (k, repr(sys_name_values[k]))
+ for k, v in inspect.getmembers(sys_name)
+ if k in sys_name_values])
+ tlv_system_name_str = '%s(%s)' % (lldp.SystemName.__name__,
+ _system_name_str)
+
+ # SystemDescription string
+ sys_desc_values = {'tlv_info': sys_desc.tlv_info,
+ 'len': sys_desc.len,
+ 'typelen': sys_desc.typelen}
+ _sys_desc_str = ','.join(['%s=%s' % (k, repr(sys_desc_values[k]))
+ for k, v in inspect.getmembers(sys_desc)
+ if k in sys_desc_values])
+ tlv_sys_desc_str = '%s(%s)' % (lldp.SystemDescription.__name__,
+ _sys_desc_str)
+
+ # SystemCapabilities string
+ sys_cap_values = {'subtype': lldp.ChassisID.SUB_CHASSIS_COMPONENT,
+ 'system_cap': 0x14,
+ 'enabled_cap': 0x14,
+ 'len': sys_cap.len,
+ 'typelen': sys_cap.typelen}
+ _sys_cap_str = ','.join(['%s=%s' % (k, repr(sys_cap_values[k]))
+ for k, v in inspect.getmembers(sys_cap)
+ if k in sys_cap_values])
+ tlv_sys_cap_str = '%s(%s)' % (lldp.SystemCapabilities.__name__,
+ _sys_cap_str)
+
+ # ManagementAddress string
+ man_addr_values = {'addr_subtype': 0x06,
+ 'addr': b'\x00\x01\x30\xf9\xad\xa0',
+ 'addr_len': man_addr.addr_len,
+ 'intf_subtype': 0x02,
+ 'intf_num': 1001,
+ 'oid': '',
+ 'oid_len': man_addr.oid_len,
+ 'len': man_addr.len,
+ 'typelen': man_addr.typelen}
+ _man_addr_str = ','.join(['%s=%s' % (k, repr(man_addr_values[k]))
+ for k, v in inspect.getmembers(man_addr)
+ if k in man_addr_values])
+ tlv_man_addr_str = '%s(%s)' % (lldp.ManagementAddress.__name__,
+ _man_addr_str)
+
+ # OrganizationallySpecific string
+ org_spec_values = {'oui': b'\x00\x12\x0f',
+ 'subtype': 0x02,
+ 'info': b'\x07\x01\x00',
+ 'len': org_spec.len,
+ 'typelen': org_spec.typelen}
+ _org_spec_str = ','.join(['%s=%s' % (k, repr(org_spec_values[k]))
+ for k, v in inspect.getmembers(org_spec)
+ if k in org_spec_values])
+ tlv_org_spec_str = '%s(%s)' % (lldp.OrganizationallySpecific.__name__,
+ _org_spec_str)
+
+ # End string
+ end_values = {'len': end.len,
+ 'typelen': end.typelen}
+ _end_str = ','.join(['%s=%s' % (k, repr(end_values[k]))
+ for k, v in inspect.getmembers(end)
+ if k in end_values])
+ tlv_end_str = '%s(%s)' % (lldp.End.__name__, _end_str)
+
+ # tlvs string
+ _tlvs_str = '(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
+ tlvs_str = _tlvs_str % (tlv_chassis_id_str,
+ tlv_port_id_str,
+ tlv_ttl_str,
+ tlv_port_desc_str,
+ tlv_system_name_str,
+ tlv_sys_desc_str,
+ tlv_sys_cap_str,
+ tlv_man_addr_str,
+ tlv_org_spec_str,
+ tlv_end_str)
+
+ # lldp string
+ _lldp_str = '%s(tlvs=%s)'
+ lldp_str = _lldp_str % (lldp.lldp.__name__,
+ tlvs_str)
+
+ eq_(str(lldp_pkt), lldp_str)
+ eq_(repr(lldp_pkt), lldp_str)
+
+ def test_json(self):
+ chassis_id = lldp.ChassisID(subtype=lldp.ChassisID.SUB_MAC_ADDRESS,
+ chassis_id=b'\x00\x01\x30\xf9\xad\xa0')
+ port_id = lldp.PortID(subtype=lldp.PortID.SUB_INTERFACE_NAME,
+ port_id=b'1/1')
+ ttl = lldp.TTL(ttl=120)
+ port_desc = lldp.PortDescription(
+ port_description=b'Summit300-48-Port 1001\x00')
+ sys_name = lldp.SystemName(system_name=b'Summit300-48\x00')
+ sys_desc = lldp.SystemDescription(
+ system_description=b'Summit300-48 - Version 7.4e.1 (Build 5) '
+ + b'by Release_Master 05/27/05 04:53:11\x00')
+ sys_cap = lldp.SystemCapabilities(
+ subtype=lldp.ChassisID.SUB_CHASSIS_COMPONENT,
+ system_cap=0x14,
+ enabled_cap=0x14)
+ man_addr = lldp.ManagementAddress(
+ addr_subtype=0x06, addr=b'\x00\x01\x30\xf9\xad\xa0',
+ intf_subtype=0x02, intf_num=1001,
+ oid='')
+ org_spec = lldp.OrganizationallySpecific(
+ oui=b'\x00\x12\x0f', subtype=0x02, info=b'\x07\x01\x00')
+ end = lldp.End()
+ tlvs = (chassis_id, port_id, ttl, port_desc, sys_name,
+ sys_desc, sys_cap, man_addr, org_spec, end)
+ lldp1 = lldp.lldp(tlvs)
+ jsondict = lldp1.to_jsondict()
+ lldp2 = lldp.lldp.from_jsondict(jsondict['lldp'])
+ eq_(str(lldp1), str(lldp2))
diff --git a/tests/unit/packet/test_mpls.py b/tests/unit/packet/test_mpls.py
new file mode 100644
index 00000000..e3f9bccf
--- /dev/null
+++ b/tests/unit/packet/test_mpls.py
@@ -0,0 +1,92 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import unittest
+import logging
+import inspect
+
+from nose.tools import eq_
+from ryu.lib.packet import mpls
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_mpls(unittest.TestCase):
+
+ label = 29
+ exp = 6
+ bsb = 1
+ ttl = 64
+ mp = mpls.mpls(label, exp, bsb, ttl)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_to_string(self):
+ mpls_values = {'label': self.label,
+ 'exp': self.exp,
+ 'bsb': self.bsb,
+ 'ttl': self.ttl}
+ _mpls_str = ','.join(['%s=%s' % (k, repr(mpls_values[k]))
+ for k, v in inspect.getmembers(self.mp)
+ if k in mpls_values])
+ mpls_str = '%s(%s)' % (mpls.mpls.__name__, _mpls_str)
+
+ eq_(str(self.mp), mpls_str)
+ eq_(repr(self.mp), mpls_str)
+
+ def test_json(self):
+ jsondict = self.mp.to_jsondict()
+ mp = mpls.mpls.from_jsondict(jsondict['mpls'])
+ eq_(str(self.mp), str(mp))
+
+ def test_label_from_bin_true(self):
+ mpls_label = 0xfffff
+ is_bos = True
+ buf = b'\xff\xff\xf1'
+ mpls_label_out, is_bos_out = mpls.label_from_bin(buf)
+
+ eq_(mpls_label, mpls_label_out)
+ eq_(is_bos, is_bos_out)
+
+ def test_label_from_bin_false(self):
+ mpls_label = 0xfffff
+ is_bos = False
+ buf = b'\xff\xff\xf0'
+ mpls_label_out, is_bos_out = mpls.label_from_bin(buf)
+
+ eq_(mpls_label, mpls_label_out)
+ eq_(is_bos, is_bos_out)
+
+ def test_label_to_bin_true(self):
+ mpls_label = 0xfffff
+ is_bos = True
+ label = b'\xff\xff\xf1'
+ label_out = mpls.label_to_bin(mpls_label, is_bos)
+
+ eq_(label, label_out)
+
+ def test_label_to_bin_false(self):
+ mpls_label = 0xfffff
+ is_bos = False
+ label = b'\xff\xff\xf0'
+ label_out = mpls.label_to_bin(mpls_label, is_bos)
+
+ eq_(label, label_out)
diff --git a/tests/unit/packet/test_openflow.py b/tests/unit/packet/test_openflow.py
new file mode 100644
index 00000000..b0dca25f
--- /dev/null
+++ b/tests/unit/packet/test_openflow.py
@@ -0,0 +1,64 @@
+# Copyright (C) 2017 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import logging
+import os
+import sys
+
+import unittest
+from nose.tools import eq_
+from nose.tools import ok_
+
+from ryu.lib import pcaplib
+from ryu.lib.packet import openflow
+from ryu.lib.packet import packet
+from ryu.utils import binary_str
+
+
+LOG = logging.getLogger(__name__)
+
+OPENFLOW_DATA_DIR = os.path.join(
+ os.path.dirname(sys.modules[__name__].__file__),
+ '../../packet_data/pcap/')
+
+
+class Test_openflow(unittest.TestCase):
+ """
+ Test case for ryu.lib.packet.openflow.
+ """
+
+ def test_pcap(self):
+ files = [
+ 'openflow_flowmod',
+ 'openflow_flowstats_req',
+ 'openflow_invalid_version',
+ ]
+
+ for f in files:
+ # print('*** testing %s ...' % f)
+ for _, buf in pcaplib.Reader(
+ open(OPENFLOW_DATA_DIR + f + '.pcap', 'rb')):
+ # Checks if message can be parsed as expected.
+ pkt = packet.Packet(buf)
+ openflow_pkt = pkt.get_protocol(openflow.openflow)
+ ok_(isinstance(openflow_pkt, openflow.openflow),
+ 'Failed to parse OpenFlow message: %s' % pkt)
+
+ # Checks if message can be serialized as expected.
+ pkt.serialize()
+ eq_(buf, pkt.data,
+ "b'%s' != b'%s'" % (binary_str(buf), binary_str(pkt.data)))
diff --git a/tests/unit/packet/test_ospf.py b/tests/unit/packet/test_ospf.py
new file mode 100644
index 00000000..df57b8de
--- /dev/null
+++ b/tests/unit/packet/test_ospf.py
@@ -0,0 +1,120 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+from nose.tools import eq_
+from nose.tools import ok_
+
+from ryu.lib.packet import ospf
+
+
+class Test_ospf(unittest.TestCase):
+ """ Test case for ryu.lib.packet.ospf
+ """
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_router_lsa(self):
+ link1 = ospf.RouterLSA.Link(id_='10.0.0.1', data='255.255.255.0',
+ type_=ospf.LSA_LINK_TYPE_STUB, metric=10)
+ msg = ospf.RouterLSA(id_='192.168.0.1', adv_router='192.168.0.2',
+ links=[link1])
+ binmsg = msg.serialize()
+ msg2, cls, rest = ospf.LSA.parser(binmsg)
+ eq_(msg.header.checksum, msg2.header.checksum)
+ eq_(str(msg), str(msg2))
+ eq_(rest, b'')
+
+ def test_network_lsa(self):
+ msg = ospf.NetworkLSA(id_='192.168.0.1', adv_router='192.168.0.2',
+ mask='255.255.255.0', routers=['192.168.0.2'])
+ binmsg = msg.serialize()
+ msg2, cls, rest = ospf.LSA.parser(binmsg)
+ eq_(msg.header.checksum, msg2.header.checksum)
+ eq_(str(msg), str(msg2))
+ eq_(rest, b'')
+
+ def test_as_external_lsa(self):
+ extnw1 = ospf.ASExternalLSA.ExternalNetwork(mask='255.255.255.0',
+ metric=20,
+ fwd_addr='10.0.0.1')
+ msg = ospf.ASExternalLSA(id_='192.168.0.1', adv_router='192.168.0.2',
+ extnws=[extnw1])
+ binmsg = msg.serialize()
+ msg2, cls, rest = ospf.LSA.parser(binmsg)
+ eq_(msg.header.checksum, msg2.header.checksum)
+ eq_(str(msg), str(msg2))
+ eq_(rest, b'')
+
+ def test_hello(self):
+ msg = ospf.OSPFHello(router_id='192.168.0.1',
+ neighbors=['192.168.0.2'])
+ binmsg = msg.serialize()
+ msg2, cls, rest = ospf.OSPFMessage.parser(binmsg)
+ eq_(msg.checksum, msg2.checksum)
+ eq_(str(msg), str(msg2))
+ eq_(rest, b'')
+
+ def test_dbdesc(self):
+ link1 = ospf.RouterLSA.Link(id_='10.0.0.1', data='255.255.255.0',
+ type_=ospf.LSA_LINK_TYPE_STUB, metric=10)
+ lsa1 = ospf.RouterLSA(id_='192.168.0.1', adv_router='192.168.0.2',
+ links=[link1])
+ msg = ospf.OSPFDBDesc(router_id='192.168.0.1',
+ lsa_headers=[lsa1.header])
+ binmsg = msg.serialize()
+ msg2, cls, rest = ospf.OSPFMessage.parser(binmsg)
+ eq_(msg.checksum, msg2.checksum)
+ eq_(str(msg), str(msg2))
+ eq_(rest, b'')
+
+ def test_lsreq(self):
+ req = ospf.OSPFLSReq.Request(type_=ospf.OSPF_ROUTER_LSA,
+ id_='192.168.0.1',
+ adv_router='192.168.0.2')
+ msg = ospf.OSPFLSReq(router_id='192.168.0.1', lsa_requests=[req])
+ binmsg = msg.serialize()
+ msg2, cls, rest = ospf.OSPFMessage.parser(binmsg)
+ eq_(msg.checksum, msg2.checksum)
+ eq_(str(msg), str(msg2))
+ eq_(rest, b'')
+
+ def test_lsupd(self):
+ link1 = ospf.RouterLSA.Link(id_='10.0.0.1', data='255.255.255.0',
+ type_=ospf.LSA_LINK_TYPE_STUB, metric=10)
+ lsa1 = ospf.RouterLSA(id_='192.168.0.1', adv_router='192.168.0.2',
+ links=[link1])
+ msg = ospf.OSPFLSUpd(router_id='192.168.0.1', lsas=[lsa1])
+ binmsg = msg.serialize()
+ msg2, cls, rest = ospf.OSPFMessage.parser(binmsg)
+ eq_(msg.checksum, msg2.checksum)
+ eq_(str(msg), str(msg2))
+ eq_(rest, b'')
+
+ def test_lsack(self):
+ link1 = ospf.RouterLSA.Link(id_='10.0.0.1', data='255.255.255.0',
+ type_=ospf.LSA_LINK_TYPE_STUB, metric=10)
+ lsa1 = ospf.RouterLSA(id_='192.168.0.1', adv_router='192.168.0.2',
+ links=[link1])
+ msg = ospf.OSPFLSAck(router_id='192.168.0.1',
+ lsa_headers=[lsa1.header])
+ binmsg = msg.serialize()
+ msg2, cls, rest = ospf.OSPFMessage.parser(binmsg)
+ eq_(msg.checksum, msg2.checksum)
+ eq_(str(msg), str(msg2))
+ eq_(rest, b'')
diff --git a/tests/unit/packet/test_packet.py b/tests/unit/packet/test_packet.py
new file mode 100644
index 00000000..1b4c704b
--- /dev/null
+++ b/tests/unit/packet/test_packet.py
@@ -0,0 +1,1553 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import struct
+import inspect
+from nose.tools import ok_, eq_
+import six
+from ryu.ofproto import ether, inet
+from ryu.lib.packet import arp
+from ryu.lib.packet import bpdu
+from ryu.lib.packet import ethernet
+from ryu.lib.packet import icmp, icmpv6
+from ryu.lib.packet import ipv4, ipv6
+from ryu.lib.packet import llc
+from ryu.lib.packet import packet, packet_utils
+from ryu.lib.packet import sctp
+from ryu.lib.packet import tcp, udp
+from ryu.lib.packet import vlan
+from ryu.lib import addrconv
+
+
+LOG = logging.getLogger('test_packet')
+
+
+class TestPacket(unittest.TestCase):
+ """ Test case for packet
+ """
+
+ dst_mac = 'aa:aa:aa:aa:aa:aa'
+ src_mac = 'bb:bb:bb:bb:bb:bb'
+ dst_mac_bin = addrconv.mac.text_to_bin(dst_mac)
+ src_mac_bin = addrconv.mac.text_to_bin(src_mac)
+ dst_ip = '192.168.128.10'
+ src_ip = '192.168.122.20'
+ dst_ip_bin = addrconv.ipv4.text_to_bin(dst_ip)
+ src_port = 50001
+ dst_port = 50002
+ src_ip_bin = addrconv.ipv4.text_to_bin(src_ip)
+ payload = b'\x06\x06\x47\x50\x00\x00\x00\x00' \
+ + b'\xcd\xc5\x00\x00\x00\x00\x00\x00' \
+ + b'\x10\x11\x12\x13\x14\x15\x16\x17' \
+ + b'\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'
+
+ def get_protocols(self, pkt):
+ protocols = {}
+ for p in pkt:
+ if hasattr(p, 'protocol_name'):
+ protocols[p.protocol_name] = p
+ else:
+ protocols['payload'] = p
+ return protocols
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_arp(self):
+ # buid packet
+ e = ethernet.ethernet(self.dst_mac, self.src_mac,
+ ether.ETH_TYPE_ARP)
+ a = arp.arp(1, ether.ETH_TYPE_IP, 6, 4, 2,
+ self.src_mac, self.src_ip, self.dst_mac,
+ self.dst_ip)
+ p = packet.Packet()
+ p.add_protocol(e)
+ p.add_protocol(a)
+ p.serialize()
+
+ # ethernet !6s6sH
+ e_buf = self.dst_mac_bin \
+ + self.src_mac_bin \
+ + b'\x08\x06'
+
+ # arp !HHBBH6sI6sI
+ a_buf = b'\x00\x01' \
+ + b'\x08\x00' \
+ + b'\x06' \
+ + b'\x04' \
+ + b'\x00\x02' \
+ + self.src_mac_bin \
+ + self.src_ip_bin \
+ + self.dst_mac_bin \
+ + self.dst_ip_bin
+
+ buf = e_buf + a_buf
+
+ # Append padding if ethernet frame is less than 60 bytes length
+ pad_len = 60 - len(buf)
+ if pad_len > 0:
+ buf += b'\x00' * pad_len
+ eq_(buf, p.data)
+
+ # parse
+ pkt = packet.Packet(p.data)
+ protocols = self.get_protocols(pkt)
+ p_eth = protocols['ethernet']
+ p_arp = protocols['arp']
+
+ # ethernet
+ ok_(p_eth)
+ eq_(self.dst_mac, p_eth.dst)
+ eq_(self.src_mac, p_eth.src)
+ eq_(ether.ETH_TYPE_ARP, p_eth.ethertype)
+
+ # arp
+ ok_(p_arp)
+ eq_(1, p_arp.hwtype)
+ eq_(ether.ETH_TYPE_IP, p_arp.proto)
+ eq_(6, p_arp.hlen)
+ eq_(4, p_arp.plen)
+ eq_(2, p_arp.opcode)
+ eq_(self.src_mac, p_arp.src_mac)
+ eq_(self.src_ip, p_arp.src_ip)
+ eq_(self.dst_mac, p_arp.dst_mac)
+ eq_(self.dst_ip, p_arp.dst_ip)
+
+ # to string
+ eth_values = {'dst': self.dst_mac,
+ 'src': self.src_mac,
+ 'ethertype': ether.ETH_TYPE_ARP}
+ _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k]))
+ for k, v in inspect.getmembers(p_eth)
+ if k in eth_values])
+ eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str)
+
+ arp_values = {'hwtype': 1,
+ 'proto': ether.ETH_TYPE_IP,
+ 'hlen': 6,
+ 'plen': 4,
+ 'opcode': 2,
+ 'src_mac': self.src_mac,
+ 'dst_mac': self.dst_mac,
+ 'src_ip': self.src_ip,
+ 'dst_ip': self.dst_ip}
+ _arp_str = ','.join(['%s=%s' % (k, repr(arp_values[k]))
+ for k, v in inspect.getmembers(p_arp)
+ if k in arp_values])
+ arp_str = '%s(%s)' % (arp.arp.__name__, _arp_str)
+
+ pkt_str = '%s, %s' % (eth_str, arp_str)
+
+ eq_(eth_str, str(p_eth))
+ eq_(eth_str, repr(p_eth))
+
+ eq_(arp_str, str(p_arp))
+ eq_(arp_str, repr(p_arp))
+
+ eq_(pkt_str, str(pkt))
+ eq_(pkt_str, repr(pkt))
+
+ def test_vlan_arp(self):
+ # buid packet
+ e = ethernet.ethernet(self.dst_mac, self.src_mac,
+ ether.ETH_TYPE_8021Q)
+ v = vlan.vlan(0b111, 0b1, 3, ether.ETH_TYPE_ARP)
+ a = arp.arp(1, ether.ETH_TYPE_IP, 6, 4, 2,
+ self.src_mac, self.src_ip, self.dst_mac,
+ self.dst_ip)
+ p = packet.Packet()
+ p.add_protocol(e)
+ p.add_protocol(v)
+ p.add_protocol(a)
+ p.serialize()
+
+ # ethernet !6s6sH
+ e_buf = self.dst_mac_bin \
+ + self.src_mac_bin \
+ + b'\x81\x00'
+
+ # vlan !HH
+ v_buf = b'\xF0\x03' \
+ + b'\x08\x06'
+
+ # arp !HHBBH6sI6sI
+ a_buf = b'\x00\x01' \
+ + b'\x08\x00' \
+ + b'\x06' \
+ + b'\x04' \
+ + b'\x00\x02' \
+ + self.src_mac_bin \
+ + self.src_ip_bin \
+ + self.dst_mac_bin \
+ + self.dst_ip_bin
+
+ buf = e_buf + v_buf + a_buf
+
+ # Append padding if ethernet frame is less than 60 bytes length
+ pad_len = 60 - len(buf)
+ if pad_len > 0:
+ buf += b'\x00' * pad_len
+ eq_(buf, p.data)
+
+ # parse
+ pkt = packet.Packet(p.data)
+ protocols = self.get_protocols(pkt)
+ p_eth = protocols['ethernet']
+ p_vlan = protocols['vlan']
+ p_arp = protocols['arp']
+
+ # ethernet
+ ok_(p_eth)
+ eq_(self.dst_mac, p_eth.dst)
+ eq_(self.src_mac, p_eth.src)
+ eq_(ether.ETH_TYPE_8021Q, p_eth.ethertype)
+
+ # vlan
+ ok_(p_vlan)
+ eq_(0b111, p_vlan.pcp)
+ eq_(0b1, p_vlan.cfi)
+ eq_(3, p_vlan.vid)
+ eq_(ether.ETH_TYPE_ARP, p_vlan.ethertype)
+
+ # arp
+ ok_(p_arp)
+ eq_(1, p_arp.hwtype)
+ eq_(ether.ETH_TYPE_IP, p_arp.proto)
+ eq_(6, p_arp.hlen)
+ eq_(4, p_arp.plen)
+ eq_(2, p_arp.opcode)
+ eq_(self.src_mac, p_arp.src_mac)
+ eq_(self.src_ip, p_arp.src_ip)
+ eq_(self.dst_mac, p_arp.dst_mac)
+ eq_(self.dst_ip, p_arp.dst_ip)
+
+ # to string
+ eth_values = {'dst': self.dst_mac,
+ 'src': self.src_mac,
+ 'ethertype': ether.ETH_TYPE_8021Q}
+ _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k]))
+ for k, v in inspect.getmembers(p_eth)
+ if k in eth_values])
+ eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str)
+
+ vlan_values = {'pcp': 0b111,
+ 'cfi': 0b1,
+ 'vid': 3,
+ 'ethertype': ether.ETH_TYPE_ARP}
+ _vlan_str = ','.join(['%s=%s' % (k, repr(vlan_values[k]))
+ for k, v in inspect.getmembers(p_vlan)
+ if k in vlan_values])
+ vlan_str = '%s(%s)' % (vlan.vlan.__name__, _vlan_str)
+
+ arp_values = {'hwtype': 1,
+ 'proto': ether.ETH_TYPE_IP,
+ 'hlen': 6,
+ 'plen': 4,
+ 'opcode': 2,
+ 'src_mac': self.src_mac,
+ 'dst_mac': self.dst_mac,
+ 'src_ip': self.src_ip,
+ 'dst_ip': self.dst_ip}
+ _arp_str = ','.join(['%s=%s' % (k, repr(arp_values[k]))
+ for k, v in inspect.getmembers(p_arp)
+ if k in arp_values])
+ arp_str = '%s(%s)' % (arp.arp.__name__, _arp_str)
+
+ pkt_str = '%s, %s, %s' % (eth_str, vlan_str, arp_str)
+
+ eq_(eth_str, str(p_eth))
+ eq_(eth_str, repr(p_eth))
+
+ eq_(vlan_str, str(p_vlan))
+ eq_(vlan_str, repr(p_vlan))
+
+ eq_(arp_str, str(p_arp))
+ eq_(arp_str, repr(p_arp))
+
+ eq_(pkt_str, str(pkt))
+ eq_(pkt_str, repr(pkt))
+
+ def test_ipv4_udp(self):
+ # buid packet
+ e = ethernet.ethernet(self.dst_mac, self.src_mac,
+ ether.ETH_TYPE_IP)
+ ip = ipv4.ipv4(4, 5, 1, 0, 3, 1, 4, 64, inet.IPPROTO_UDP, 0,
+ self.src_ip, self.dst_ip)
+ u = udp.udp(0x190F, 0x1F90, 0, 0)
+
+ p = packet.Packet()
+ p.add_protocol(e)
+ p.add_protocol(ip)
+ p.add_protocol(u)
+ p.add_protocol(self.payload)
+ p.serialize()
+
+ # ethernet !6s6sH
+ e_buf = self.dst_mac_bin \
+ + self.src_mac_bin \
+ + b'\x08\x00'
+
+ # ipv4 !BBHHHBBHII
+ ip_buf = b'\x45' \
+ + b'\x01' \
+ + b'\x00\x3C' \
+ + b'\x00\x03' \
+ + b'\x20\x04' \
+ + b'\x40' \
+ + b'\x11' \
+ + b'\x00\x00' \
+ + self.src_ip_bin \
+ + self.dst_ip_bin
+
+ # udp !HHHH
+ u_buf = b'\x19\x0F' \
+ + b'\x1F\x90' \
+ + b'\x00\x28' \
+ + b'\x00\x00'
+
+ buf = e_buf + ip_buf + u_buf + self.payload
+
+ # parse
+ pkt = packet.Packet(p.data)
+ protocols = self.get_protocols(pkt)
+ p_eth = protocols['ethernet']
+ p_ipv4 = protocols['ipv4']
+ p_udp = protocols['udp']
+
+ # ethernet
+ ok_(p_eth)
+ eq_(self.dst_mac, p_eth.dst)
+ eq_(self.src_mac, p_eth.src)
+ eq_(ether.ETH_TYPE_IP, p_eth.ethertype)
+
+ # ipv4
+ ok_(p_ipv4)
+ eq_(4, p_ipv4.version)
+ eq_(5, p_ipv4.header_length)
+ eq_(1, p_ipv4.tos)
+ l = len(ip_buf) + len(u_buf) + len(self.payload)
+ eq_(l, p_ipv4.total_length)
+ eq_(3, p_ipv4.identification)
+ eq_(1, p_ipv4.flags)
+ eq_(64, p_ipv4.ttl)
+ eq_(inet.IPPROTO_UDP, p_ipv4.proto)
+ eq_(self.src_ip, p_ipv4.src)
+ eq_(self.dst_ip, p_ipv4.dst)
+ t = bytearray(ip_buf)
+ struct.pack_into('!H', t, 10, p_ipv4.csum)
+ eq_(packet_utils.checksum(t), 0)
+
+ # udp
+ ok_(p_udp)
+ eq_(0x190f, p_udp.src_port)
+ eq_(0x1F90, p_udp.dst_port)
+ eq_(len(u_buf) + len(self.payload), p_udp.total_length)
+ eq_(0x77b2, p_udp.csum)
+ t = bytearray(u_buf)
+ struct.pack_into('!H', t, 6, p_udp.csum)
+ ph = struct.pack('!4s4sBBH', self.src_ip_bin, self.dst_ip_bin, 0,
+ 17, len(u_buf) + len(self.payload))
+ t = ph + t + self.payload
+ eq_(packet_utils.checksum(t), 0)
+
+ # payload
+ ok_('payload' in protocols)
+ eq_(self.payload, protocols['payload'])
+
+ # to string
+ eth_values = {'dst': self.dst_mac,
+ 'src': self.src_mac,
+ 'ethertype': ether.ETH_TYPE_IP}
+ _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k]))
+ for k, v in inspect.getmembers(p_eth)
+ if k in eth_values])
+ eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str)
+
+ ipv4_values = {'version': 4,
+ 'header_length': 5,
+ 'tos': 1,
+ 'total_length': l,
+ 'identification': 3,
+ 'flags': 1,
+ 'offset': p_ipv4.offset,
+ 'ttl': 64,
+ 'proto': inet.IPPROTO_UDP,
+ 'csum': p_ipv4.csum,
+ 'src': self.src_ip,
+ 'dst': self.dst_ip,
+ 'option': None}
+ _ipv4_str = ','.join(['%s=%s' % (k, repr(ipv4_values[k]))
+ for k, v in inspect.getmembers(p_ipv4)
+ if k in ipv4_values])
+ ipv4_str = '%s(%s)' % (ipv4.ipv4.__name__, _ipv4_str)
+
+ udp_values = {'src_port': 0x190f,
+ 'dst_port': 0x1F90,
+ 'total_length': len(u_buf) + len(self.payload),
+ 'csum': 0x77b2}
+ _udp_str = ','.join(['%s=%s' % (k, repr(udp_values[k]))
+ for k, v in inspect.getmembers(p_udp)
+ if k in udp_values])
+ udp_str = '%s(%s)' % (udp.udp.__name__, _udp_str)
+
+ pkt_str = '%s, %s, %s, %s' % (eth_str, ipv4_str, udp_str,
+ repr(protocols['payload']))
+
+ eq_(eth_str, str(p_eth))
+ eq_(eth_str, repr(p_eth))
+
+ eq_(ipv4_str, str(p_ipv4))
+ eq_(ipv4_str, repr(p_ipv4))
+
+ eq_(udp_str, str(p_udp))
+ eq_(udp_str, repr(p_udp))
+
+ eq_(pkt_str, str(pkt))
+ eq_(pkt_str, repr(pkt))
+
+ def test_ipv4_tcp(self):
+ # buid packet
+ e = ethernet.ethernet(self.dst_mac, self.src_mac,
+ ether.ETH_TYPE_IP)
+ ip = ipv4.ipv4(4, 5, 0, 0, 0, 0, 0, 64, inet.IPPROTO_TCP, 0,
+ self.src_ip, self.dst_ip)
+ t = tcp.tcp(0x190F, 0x1F90, 0x123, 1, 6, 0b101010, 2048, 0, 0x6f,
+ b'\x01\x02')
+
+ p = packet.Packet()
+ p.add_protocol(e)
+ p.add_protocol(ip)
+ p.add_protocol(t)
+ p.add_protocol(self.payload)
+ p.serialize()
+
+ # ethernet !6s6sH
+ e_buf = self.dst_mac_bin \
+ + self.src_mac_bin \
+ + b'\x08\x00'
+
+ # ipv4 !BBHHHBBHII
+ ip_buf = b'\x45' \
+ + b'\x00' \
+ + b'\x00\x4C' \
+ + b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x40' \
+ + b'\x06' \
+ + b'\x00\x00' \
+ + self.src_ip_bin \
+ + self.dst_ip_bin
+
+ # tcp !HHIIBBHHH + option
+ t_buf = b'\x19\x0F' \
+ + b'\x1F\x90' \
+ + b'\x00\x00\x01\x23' \
+ + b'\x00\x00\x00\x01' \
+ + b'\x60' \
+ + b'\x2A' \
+ + b'\x08\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x6F' \
+ + b'\x01\x02\x00\x00'
+
+ buf = e_buf + ip_buf + t_buf + self.payload
+
+ # parse
+ pkt = packet.Packet(p.data)
+ protocols = self.get_protocols(pkt)
+ p_eth = protocols['ethernet']
+ p_ipv4 = protocols['ipv4']
+ p_tcp = protocols['tcp']
+
+ # ethernet
+ ok_(p_eth)
+ eq_(self.dst_mac, p_eth.dst)
+ eq_(self.src_mac, p_eth.src)
+ eq_(ether.ETH_TYPE_IP, p_eth.ethertype)
+
+ # ipv4
+ ok_(p_ipv4)
+ eq_(4, p_ipv4.version)
+ eq_(5, p_ipv4.header_length)
+ eq_(0, p_ipv4.tos)
+ l = len(ip_buf) + len(t_buf) + len(self.payload)
+ eq_(l, p_ipv4.total_length)
+ eq_(0, p_ipv4.identification)
+ eq_(0, p_ipv4.flags)
+ eq_(64, p_ipv4.ttl)
+ eq_(inet.IPPROTO_TCP, p_ipv4.proto)
+ eq_(self.src_ip, p_ipv4.src)
+ eq_(self.dst_ip, p_ipv4.dst)
+ t = bytearray(ip_buf)
+ struct.pack_into('!H', t, 10, p_ipv4.csum)
+ eq_(packet_utils.checksum(t), 0)
+
+ # tcp
+ ok_(p_tcp)
+ eq_(0x190f, p_tcp.src_port)
+ eq_(0x1F90, p_tcp.dst_port)
+ eq_(0x123, p_tcp.seq)
+ eq_(1, p_tcp.ack)
+ eq_(6, p_tcp.offset)
+ eq_(0b101010, p_tcp.bits)
+ eq_(2048, p_tcp.window_size)
+ eq_(0x6f, p_tcp.urgent)
+ eq_(len(t_buf), len(p_tcp))
+ t = bytearray(t_buf)
+ struct.pack_into('!H', t, 16, p_tcp.csum)
+ ph = struct.pack('!4s4sBBH', self.src_ip_bin, self.dst_ip_bin, 0,
+ 6, len(t_buf) + len(self.payload))
+ t = ph + t + self.payload
+ eq_(packet_utils.checksum(t), 0)
+
+ # payload
+ ok_('payload' in protocols)
+ eq_(self.payload, protocols['payload'])
+
+ # to string
+ eth_values = {'dst': self.dst_mac,
+ 'src': self.src_mac,
+ 'ethertype': ether.ETH_TYPE_IP}
+ _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k]))
+ for k, v in inspect.getmembers(p_eth)
+ if k in eth_values])
+ eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str)
+
+ ipv4_values = {'version': 4,
+ 'header_length': 5,
+ 'tos': 0,
+ 'total_length': l,
+ 'identification': 0,
+ 'flags': 0,
+ 'offset': p_ipv4.offset,
+ 'ttl': 64,
+ 'proto': inet.IPPROTO_TCP,
+ 'csum': p_ipv4.csum,
+ 'src': self.src_ip,
+ 'dst': self.dst_ip,
+ 'option': None}
+ _ipv4_str = ','.join(['%s=%s' % (k, repr(ipv4_values[k]))
+ for k, v in inspect.getmembers(p_ipv4)
+ if k in ipv4_values])
+ ipv4_str = '%s(%s)' % (ipv4.ipv4.__name__, _ipv4_str)
+
+ tcp_values = {'src_port': 0x190f,
+ 'dst_port': 0x1F90,
+ 'seq': 0x123,
+ 'ack': 1,
+ 'offset': 6,
+ 'bits': 0b101010,
+ 'window_size': 2048,
+ 'csum': p_tcp.csum,
+ 'urgent': 0x6f,
+ 'option': p_tcp.option}
+ _tcp_str = ','.join(['%s=%s' % (k, repr(tcp_values[k]))
+ for k, v in inspect.getmembers(p_tcp)
+ if k in tcp_values])
+ tcp_str = '%s(%s)' % (tcp.tcp.__name__, _tcp_str)
+
+ pkt_str = '%s, %s, %s, %s' % (eth_str, ipv4_str, tcp_str,
+ repr(protocols['payload']))
+
+ eq_(eth_str, str(p_eth))
+ eq_(eth_str, repr(p_eth))
+
+ eq_(ipv4_str, str(p_ipv4))
+ eq_(ipv4_str, repr(p_ipv4))
+
+ eq_(tcp_str, str(p_tcp))
+ eq_(tcp_str, repr(p_tcp))
+
+ eq_(pkt_str, str(pkt))
+ eq_(pkt_str, repr(pkt))
+
+ def test_ipv4_sctp(self):
+ # build packet
+ e = ethernet.ethernet()
+ ip = ipv4.ipv4(proto=inet.IPPROTO_SCTP)
+ s = sctp.sctp(chunks=[sctp.chunk_data(payload_data=self.payload)])
+
+ p = e / ip / s
+ p.serialize()
+
+ ipaddr = addrconv.ipv4.text_to_bin('0.0.0.0')
+
+ # ethernet !6s6sH
+ e_buf = b'\xff\xff\xff\xff\xff\xff' \
+ + b'\x00\x00\x00\x00\x00\x00' \
+ + b'\x08\x00'
+
+ # ipv4 !BBHHHBBHII
+ ip_buf = b'\x45' \
+ + b'\x00' \
+ + b'\x00\x50' \
+ + b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\xff' \
+ + b'\x84' \
+ + b'\x00\x00' \
+ + ipaddr \
+ + ipaddr
+
+ # sctp !HHII + chunk_data !BBHIHHI + payload
+ s_buf = b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00' \
+ + b'\x00' \
+ + b'\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00\x00\x00' \
+ + self.payload
+
+ buf = e_buf + ip_buf + s_buf
+
+ # parse
+ pkt = packet.Packet(p.data)
+ protocols = self.get_protocols(pkt)
+ p_eth = protocols['ethernet']
+ p_ipv4 = protocols['ipv4']
+ p_sctp = protocols['sctp']
+
+ # ethernet
+ ok_(p_eth)
+ eq_('ff:ff:ff:ff:ff:ff', p_eth.dst)
+ eq_('00:00:00:00:00:00', p_eth.src)
+ eq_(ether.ETH_TYPE_IP, p_eth.ethertype)
+
+ # ipv4
+ ok_(p_ipv4)
+ eq_(4, p_ipv4.version)
+ eq_(5, p_ipv4.header_length)
+ eq_(0, p_ipv4.tos)
+ l = len(ip_buf) + len(s_buf)
+ eq_(l, p_ipv4.total_length)
+ eq_(0, p_ipv4.identification)
+ eq_(0, p_ipv4.flags)
+ eq_(255, p_ipv4.ttl)
+ eq_(inet.IPPROTO_SCTP, p_ipv4.proto)
+ eq_('10.0.0.1', p_ipv4.src)
+ eq_('10.0.0.2', p_ipv4.dst)
+ t = bytearray(ip_buf)
+ struct.pack_into('!H', t, 10, p_ipv4.csum)
+ eq_(packet_utils.checksum(t), 0x1403)
+
+ # sctp
+ ok_(p_sctp)
+ eq_(1, p_sctp.src_port)
+ eq_(1, p_sctp.dst_port)
+ eq_(0, p_sctp.vtag)
+ assert isinstance(p_sctp.chunks[0], sctp.chunk_data)
+ eq_(0, p_sctp.chunks[0]._type)
+ eq_(0, p_sctp.chunks[0].unordered)
+ eq_(0, p_sctp.chunks[0].begin)
+ eq_(0, p_sctp.chunks[0].end)
+ eq_(16 + len(self.payload), p_sctp.chunks[0].length)
+ eq_(0, p_sctp.chunks[0].tsn)
+ eq_(0, p_sctp.chunks[0].sid)
+ eq_(0, p_sctp.chunks[0].seq)
+ eq_(0, p_sctp.chunks[0].payload_id)
+ eq_(self.payload, p_sctp.chunks[0].payload_data)
+ eq_(len(s_buf), len(p_sctp))
+
+ # to string
+ eth_values = {'dst': 'ff:ff:ff:ff:ff:ff',
+ 'src': '00:00:00:00:00:00',
+ 'ethertype': ether.ETH_TYPE_IP}
+ _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k]))
+ for k, v in inspect.getmembers(p_eth)
+ if k in eth_values])
+ eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str)
+
+ ipv4_values = {'version': 4,
+ 'header_length': 5,
+ 'tos': 0,
+ 'total_length': l,
+ 'identification': 0,
+ 'flags': 0,
+ 'offset': 0,
+ 'ttl': 255,
+ 'proto': inet.IPPROTO_SCTP,
+ 'csum': p_ipv4.csum,
+ 'src': '10.0.0.1',
+ 'dst': '10.0.0.2',
+ 'option': None}
+ _ipv4_str = ','.join(['%s=%s' % (k, repr(ipv4_values[k]))
+ for k, v in inspect.getmembers(p_ipv4)
+ if k in ipv4_values])
+ ipv4_str = '%s(%s)' % (ipv4.ipv4.__name__, _ipv4_str)
+
+ data_values = {'unordered': 0,
+ 'begin': 0,
+ 'end': 0,
+ 'length': 16 + len(self.payload),
+ 'tsn': 0,
+ 'sid': 0,
+ 'seq': 0,
+ 'payload_id': 0,
+ 'payload_data': self.payload}
+ _data_str = ','.join(['%s=%s' % (k, repr(data_values[k]))
+ for k in sorted(data_values.keys())])
+ data_str = '[%s(%s)]' % (sctp.chunk_data.__name__, _data_str)
+
+ sctp_values = {'src_port': 1,
+ 'dst_port': 1,
+ 'vtag': 0,
+ 'csum': repr(p_sctp.csum),
+ 'chunks': data_str}
+ _sctp_str = ','.join(['%s=%s' % (k, sctp_values[k])
+ for k, _ in inspect.getmembers(p_sctp)
+ if k in sctp_values])
+ sctp_str = '%s(%s)' % (sctp.sctp.__name__, _sctp_str)
+
+ pkt_str = '%s, %s, %s' % (eth_str, ipv4_str, sctp_str)
+
+ eq_(eth_str, str(p_eth))
+ eq_(eth_str, repr(p_eth))
+
+ eq_(ipv4_str, str(p_ipv4))
+ eq_(ipv4_str, repr(p_ipv4))
+
+ eq_(sctp_str, str(p_sctp))
+ eq_(sctp_str, repr(p_sctp))
+
+ eq_(pkt_str, str(pkt))
+ eq_(pkt_str, repr(pkt))
+
+ def test_ipv4_icmp(self):
+ # buid packet
+ e = ethernet.ethernet()
+ ip = ipv4.ipv4(proto=inet.IPPROTO_ICMP)
+ ic = icmp.icmp()
+
+ p = e / ip / ic
+ p.serialize()
+
+ ipaddr = addrconv.ipv4.text_to_bin('0.0.0.0')
+
+ # ethernet !6s6sH
+ e_buf = b'\xff\xff\xff\xff\xff\xff' \
+ + b'\x00\x00\x00\x00\x00\x00' \
+ + b'\x08\x00'
+
+ # ipv4 !BBHHHBBHII
+ ip_buf = b'\x45' \
+ + b'\x00' \
+ + b'\x00\x1c' \
+ + b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\xff' \
+ + b'\x01' \
+ + b'\x00\x00' \
+ + ipaddr \
+ + ipaddr
+
+ # icmp !BBH + echo !HH
+ ic_buf = b'\x08' \
+ + b'\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00'
+
+ buf = e_buf + ip_buf + ic_buf
+
+ # parse
+ pkt = packet.Packet(p.data)
+ protocols = self.get_protocols(pkt)
+ p_eth = protocols['ethernet']
+ p_ipv4 = protocols['ipv4']
+ p_icmp = protocols['icmp']
+
+ # ethernet
+ ok_(p_eth)
+ eq_('ff:ff:ff:ff:ff:ff', p_eth.dst)
+ eq_('00:00:00:00:00:00', p_eth.src)
+ eq_(ether.ETH_TYPE_IP, p_eth.ethertype)
+
+ # ipv4
+ ok_(p_ipv4)
+ eq_(4, p_ipv4.version)
+ eq_(5, p_ipv4.header_length)
+ eq_(0, p_ipv4.tos)
+ l = len(ip_buf) + len(ic_buf)
+ eq_(l, p_ipv4.total_length)
+ eq_(0, p_ipv4.identification)
+ eq_(0, p_ipv4.flags)
+ eq_(255, p_ipv4.ttl)
+ eq_(inet.IPPROTO_ICMP, p_ipv4.proto)
+ eq_('10.0.0.1', p_ipv4.src)
+ eq_('10.0.0.2', p_ipv4.dst)
+ t = bytearray(ip_buf)
+ struct.pack_into('!H', t, 10, p_ipv4.csum)
+ eq_(packet_utils.checksum(t), 0x1403)
+
+ # icmp
+ ok_(p_icmp)
+ eq_(8, p_icmp.type)
+ eq_(0, p_icmp.code)
+ eq_(0, p_icmp.data.id)
+ eq_(0, p_icmp.data.seq)
+ eq_(len(ic_buf), len(p_icmp))
+ t = bytearray(ic_buf)
+ struct.pack_into('!H', t, 2, p_icmp.csum)
+ eq_(packet_utils.checksum(t), 0)
+
+ # to string
+ eth_values = {'dst': 'ff:ff:ff:ff:ff:ff',
+ 'src': '00:00:00:00:00:00',
+ 'ethertype': ether.ETH_TYPE_IP}
+ _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k]))
+ for k, _ in inspect.getmembers(p_eth)
+ if k in eth_values])
+ eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str)
+
+ ipv4_values = {'version': 4,
+ 'header_length': 5,
+ 'tos': 0,
+ 'total_length': l,
+ 'identification': 0,
+ 'flags': 0,
+ 'offset': p_ipv4.offset,
+ 'ttl': 255,
+ 'proto': inet.IPPROTO_ICMP,
+ 'csum': p_ipv4.csum,
+ 'src': '10.0.0.1',
+ 'dst': '10.0.0.2',
+ 'option': None}
+ _ipv4_str = ','.join(['%s=%s' % (k, repr(ipv4_values[k]))
+ for k, _ in inspect.getmembers(p_ipv4)
+ if k in ipv4_values])
+ ipv4_str = '%s(%s)' % (ipv4.ipv4.__name__, _ipv4_str)
+
+ echo_values = {'id': 0,
+ 'seq': 0,
+ 'data': None}
+ _echo_str = ','.join(['%s=%s' % (k, repr(echo_values[k]))
+ for k in sorted(echo_values.keys())])
+ echo_str = '%s(%s)' % (icmp.echo.__name__, _echo_str)
+ icmp_values = {'type': 8,
+ 'code': 0,
+ 'csum': p_icmp.csum,
+ 'data': echo_str}
+ _icmp_str = ','.join(['%s=%s' % (k, icmp_values[k])
+ for k, _ in inspect.getmembers(p_icmp)
+ if k in icmp_values])
+ icmp_str = '%s(%s)' % (icmp.icmp.__name__, _icmp_str)
+
+ pkt_str = '%s, %s, %s' % (eth_str, ipv4_str, icmp_str)
+
+ eq_(eth_str, str(p_eth))
+ eq_(eth_str, repr(p_eth))
+
+ eq_(ipv4_str, str(p_ipv4))
+ eq_(ipv4_str, repr(p_ipv4))
+
+ eq_(icmp_str, str(p_icmp))
+ eq_(icmp_str, repr(p_icmp))
+
+ eq_(pkt_str, str(pkt))
+ eq_(pkt_str, repr(pkt))
+
+ def test_ipv6_udp(self):
+ # build packet
+ e = ethernet.ethernet(ethertype=ether.ETH_TYPE_IPV6)
+ ip = ipv6.ipv6(nxt=inet.IPPROTO_UDP)
+ u = udp.udp()
+
+ p = e / ip / u / self.payload
+ p.serialize()
+
+ ipaddr = addrconv.ipv6.text_to_bin('::')
+
+ # ethernet !6s6sH
+ e_buf = b'\xff\xff\xff\xff\xff\xff' \
+ + b'\x00\x00\x00\x00\x00\x00' \
+ + b'\x86\xdd'
+
+ # ipv6 !IHBB16s16s'
+ ip_buf = b'\x60\x00\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x11' \
+ + b'\xff' \
+ + b'\x00\x00' \
+ + ipaddr \
+ + ipaddr
+
+ # udp !HHHH
+ u_buf = b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x28' \
+ + b'\x00\x00'
+
+ buf = e_buf + ip_buf + u_buf + self.payload
+
+ # parse
+ pkt = packet.Packet(p.data)
+ protocols = self.get_protocols(pkt)
+ p_eth = protocols['ethernet']
+ p_ipv6 = protocols['ipv6']
+ p_udp = protocols['udp']
+
+ # ethernet
+ ok_(p_eth)
+ eq_('ff:ff:ff:ff:ff:ff', p_eth.dst)
+ eq_('00:00:00:00:00:00', p_eth.src)
+ eq_(ether.ETH_TYPE_IPV6, p_eth.ethertype)
+
+ # ipv6
+ ok_(p_ipv6)
+ eq_(6, p_ipv6.version)
+ eq_(0, p_ipv6.traffic_class)
+ eq_(0, p_ipv6.flow_label)
+ eq_(len(u_buf) + len(self.payload), p_ipv6.payload_length)
+ eq_(inet.IPPROTO_UDP, p_ipv6.nxt)
+ eq_(255, p_ipv6.hop_limit)
+ eq_('10::10', p_ipv6.src)
+ eq_('20::20', p_ipv6.dst)
+
+ # udp
+ ok_(p_udp)
+ eq_(1, p_udp.src_port)
+ eq_(1, p_udp.dst_port)
+ eq_(len(u_buf) + len(self.payload), p_udp.total_length)
+ eq_(0x2B60, p_udp.csum)
+ t = bytearray(u_buf)
+ struct.pack_into('!H', t, 6, p_udp.csum)
+ ph = struct.pack('!16s16sI3xB', ipaddr, ipaddr,
+ len(u_buf) + len(self.payload), 17)
+ t = ph + t + self.payload
+ eq_(packet_utils.checksum(t), 0x62)
+
+ # payload
+ ok_('payload' in protocols)
+ eq_(self.payload, protocols['payload'])
+
+ # to string
+ eth_values = {'dst': 'ff:ff:ff:ff:ff:ff',
+ 'src': '00:00:00:00:00:00',
+ 'ethertype': ether.ETH_TYPE_IPV6}
+ _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k]))
+ for k, v in inspect.getmembers(p_eth)
+ if k in eth_values])
+ eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str)
+
+ ipv6_values = {'version': 6,
+ 'traffic_class': 0,
+ 'flow_label': 0,
+ 'payload_length': len(u_buf) + len(self.payload),
+ 'nxt': inet.IPPROTO_UDP,
+ 'hop_limit': 255,
+ 'src': '10::10',
+ 'dst': '20::20',
+ 'ext_hdrs': []}
+ _ipv6_str = ','.join(['%s=%s' % (k, repr(ipv6_values[k]))
+ for k, v in inspect.getmembers(p_ipv6)
+ if k in ipv6_values])
+ ipv6_str = '%s(%s)' % (ipv6.ipv6.__name__, _ipv6_str)
+
+ udp_values = {'src_port': 1,
+ 'dst_port': 1,
+ 'total_length': len(u_buf) + len(self.payload),
+ 'csum': 0x2B60}
+ _udp_str = ','.join(['%s=%s' % (k, repr(udp_values[k]))
+ for k, v in inspect.getmembers(p_udp)
+ if k in udp_values])
+ udp_str = '%s(%s)' % (udp.udp.__name__, _udp_str)
+
+ pkt_str = '%s, %s, %s, %s' % (eth_str, ipv6_str, udp_str,
+ repr(protocols['payload']))
+
+ eq_(eth_str, str(p_eth))
+ eq_(eth_str, repr(p_eth))
+
+ eq_(ipv6_str, str(p_ipv6))
+ eq_(ipv6_str, repr(p_ipv6))
+
+ eq_(udp_str, str(p_udp))
+ eq_(udp_str, repr(p_udp))
+
+ eq_(pkt_str, str(pkt))
+ eq_(pkt_str, repr(pkt))
+
+ def test_ipv6_tcp(self):
+ # build packet
+ e = ethernet.ethernet(ethertype=ether.ETH_TYPE_IPV6)
+ ip = ipv6.ipv6()
+ t = tcp.tcp(option=b'\x01\x02')
+
+ p = e / ip / t / self.payload
+ p.serialize()
+
+ ipaddr = addrconv.ipv6.text_to_bin('::')
+
+ # ethernet !6s6sH
+ e_buf = b'\xff\xff\xff\xff\xff\xff' \
+ + b'\x00\x00\x00\x00\x00\x00' \
+ + b'\x86\xdd'
+
+ # ipv6 !IHBB16s16s'
+ ip_buf = b'\x60\x00\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x06' \
+ + b'\xff' \
+ + b'\x00\x00' \
+ + ipaddr \
+ + ipaddr
+
+ # tcp !HHIIBBHHH + option
+ t_buf = b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00' \
+ + b'\x60' \
+ + b'\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x01\x02\x00\x00'
+
+ buf = e_buf + ip_buf + t_buf + self.payload
+
+ # parse
+ pkt = packet.Packet(p.data)
+ protocols = self.get_protocols(pkt)
+ p_eth = protocols['ethernet']
+ p_ipv6 = protocols['ipv6']
+ p_tcp = protocols['tcp']
+
+ # ethernet
+ ok_(p_eth)
+ eq_('ff:ff:ff:ff:ff:ff', p_eth.dst)
+ eq_('00:00:00:00:00:00', p_eth.src)
+ eq_(ether.ETH_TYPE_IPV6, p_eth.ethertype)
+
+ # ipv6
+ ok_(p_ipv6)
+ eq_(6, p_ipv6.version)
+ eq_(0, p_ipv6.traffic_class)
+ eq_(0, p_ipv6.flow_label)
+ eq_(len(t_buf) + len(self.payload), p_ipv6.payload_length)
+ eq_(inet.IPPROTO_TCP, p_ipv6.nxt)
+ eq_(255, p_ipv6.hop_limit)
+ eq_('10::10', p_ipv6.src)
+ eq_('20::20', p_ipv6.dst)
+
+ # tcp
+ ok_(p_tcp)
+ eq_(1, p_tcp.src_port)
+ eq_(1, p_tcp.dst_port)
+ eq_(0, p_tcp.seq)
+ eq_(0, p_tcp.ack)
+ eq_(6, p_tcp.offset)
+ eq_(0, p_tcp.bits)
+ eq_(0, p_tcp.window_size)
+ eq_(0, p_tcp.urgent)
+ eq_(len(t_buf), len(p_tcp))
+ t = bytearray(t_buf)
+ struct.pack_into('!H', t, 16, p_tcp.csum)
+ ph = struct.pack('!16s16sI3xB', ipaddr, ipaddr,
+ len(t_buf) + len(self.payload), 6)
+ t = ph + t + self.payload
+ eq_(packet_utils.checksum(t), 0x62)
+
+ # payload
+ ok_('payload' in protocols)
+ eq_(self.payload, protocols['payload'])
+
+ # to string
+ eth_values = {'dst': 'ff:ff:ff:ff:ff:ff',
+ 'src': '00:00:00:00:00:00',
+ 'ethertype': ether.ETH_TYPE_IPV6}
+ _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k]))
+ for k, v in inspect.getmembers(p_eth)
+ if k in eth_values])
+ eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str)
+
+ ipv6_values = {'version': 6,
+ 'traffic_class': 0,
+ 'flow_label': 0,
+ 'payload_length': len(t_buf) + len(self.payload),
+ 'nxt': inet.IPPROTO_TCP,
+ 'hop_limit': 255,
+ 'src': '10::10',
+ 'dst': '20::20',
+ 'ext_hdrs': []}
+ _ipv6_str = ','.join(['%s=%s' % (k, repr(ipv6_values[k]))
+ for k, v in inspect.getmembers(p_ipv6)
+ if k in ipv6_values])
+ ipv6_str = '%s(%s)' % (ipv6.ipv6.__name__, _ipv6_str)
+
+ tcp_values = {'src_port': 1,
+ 'dst_port': 1,
+ 'seq': 0,
+ 'ack': 0,
+ 'offset': 6,
+ 'bits': 0,
+ 'window_size': 0,
+ 'csum': p_tcp.csum,
+ 'urgent': 0,
+ 'option': p_tcp.option}
+ _tcp_str = ','.join(['%s=%s' % (k, repr(tcp_values[k]))
+ for k, v in inspect.getmembers(p_tcp)
+ if k in tcp_values])
+ tcp_str = '%s(%s)' % (tcp.tcp.__name__, _tcp_str)
+
+ pkt_str = '%s, %s, %s, %s' % (eth_str, ipv6_str, tcp_str,
+ repr(protocols['payload']))
+
+ eq_(eth_str, str(p_eth))
+ eq_(eth_str, repr(p_eth))
+
+ eq_(ipv6_str, str(p_ipv6))
+ eq_(ipv6_str, repr(p_ipv6))
+
+ eq_(tcp_str, str(p_tcp))
+ eq_(tcp_str, repr(p_tcp))
+
+ eq_(pkt_str, str(pkt))
+ eq_(pkt_str, repr(pkt))
+
+ def test_ipv6_sctp(self):
+ # build packet
+ e = ethernet.ethernet(ethertype=ether.ETH_TYPE_IPV6)
+ ip = ipv6.ipv6(nxt=inet.IPPROTO_SCTP)
+ s = sctp.sctp(chunks=[sctp.chunk_data(payload_data=self.payload)])
+
+ p = e / ip / s
+ p.serialize()
+
+ ipaddr = addrconv.ipv6.text_to_bin('::')
+
+ # ethernet !6s6sH
+ e_buf = b'\xff\xff\xff\xff\xff\xff' \
+ + b'\x00\x00\x00\x00\x00\x00' \
+ + b'\x86\xdd'
+
+ # ipv6 !IHBB16s16s'
+ ip_buf = b'\x60\x00\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x84' \
+ + b'\xff' \
+ + b'\x00\x00' \
+ + ipaddr \
+ + ipaddr
+
+ # sctp !HHII + chunk_data !BBHIHHI + payload
+ s_buf = b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00\x00\x00' \
+ + b'\x00\x00\x00\x00' \
+ + b'\x00' \
+ + b'\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x00\x00\x00\x00' \
+ + self.payload
+
+ buf = e_buf + ip_buf + s_buf
+
+ # parse
+ pkt = packet.Packet(p.data)
+ protocols = self.get_protocols(pkt)
+ p_eth = protocols['ethernet']
+ p_ipv6 = protocols['ipv6']
+ p_sctp = protocols['sctp']
+
+ # ethernet
+ ok_(p_eth)
+ eq_('ff:ff:ff:ff:ff:ff', p_eth.dst)
+ eq_('00:00:00:00:00:00', p_eth.src)
+ eq_(ether.ETH_TYPE_IPV6, p_eth.ethertype)
+
+ # ipv6
+ ok_(p_ipv6)
+ eq_(6, p_ipv6.version)
+ eq_(0, p_ipv6.traffic_class)
+ eq_(0, p_ipv6.flow_label)
+ eq_(len(s_buf), p_ipv6.payload_length)
+ eq_(inet.IPPROTO_SCTP, p_ipv6.nxt)
+ eq_(255, p_ipv6.hop_limit)
+ eq_('10::10', p_ipv6.src)
+ eq_('20::20', p_ipv6.dst)
+
+ # sctp
+ ok_(p_sctp)
+ eq_(1, p_sctp.src_port)
+ eq_(1, p_sctp.dst_port)
+ eq_(0, p_sctp.vtag)
+ assert isinstance(p_sctp.chunks[0], sctp.chunk_data)
+ eq_(0, p_sctp.chunks[0]._type)
+ eq_(0, p_sctp.chunks[0].unordered)
+ eq_(0, p_sctp.chunks[0].begin)
+ eq_(0, p_sctp.chunks[0].end)
+ eq_(16 + len(self.payload), p_sctp.chunks[0].length)
+ eq_(0, p_sctp.chunks[0].tsn)
+ eq_(0, p_sctp.chunks[0].sid)
+ eq_(0, p_sctp.chunks[0].seq)
+ eq_(0, p_sctp.chunks[0].payload_id)
+ eq_(self.payload, p_sctp.chunks[0].payload_data)
+ eq_(len(s_buf), len(p_sctp))
+
+ # to string
+ eth_values = {'dst': 'ff:ff:ff:ff:ff:ff',
+ 'src': '00:00:00:00:00:00',
+ 'ethertype': ether.ETH_TYPE_IPV6}
+ _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k]))
+ for k, v in inspect.getmembers(p_eth)
+ if k in eth_values])
+ eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str)
+
+ ipv6_values = {'version': 6,
+ 'traffic_class': 0,
+ 'flow_label': 0,
+ 'payload_length': len(s_buf),
+ 'nxt': inet.IPPROTO_SCTP,
+ 'hop_limit': 255,
+ 'src': '10::10',
+ 'dst': '20::20',
+ 'ext_hdrs': []}
+ _ipv6_str = ','.join(['%s=%s' % (k, repr(ipv6_values[k]))
+ for k, v in inspect.getmembers(p_ipv6)
+ if k in ipv6_values])
+ ipv6_str = '%s(%s)' % (ipv6.ipv6.__name__, _ipv6_str)
+
+ data_values = {'unordered': 0,
+ 'begin': 0,
+ 'end': 0,
+ 'length': 16 + len(self.payload),
+ 'tsn': 0,
+ 'sid': 0,
+ 'seq': 0,
+ 'payload_id': 0,
+ 'payload_data': self.payload}
+ _data_str = ','.join(['%s=%s' % (k, repr(data_values[k]))
+ for k in sorted(data_values.keys())])
+ data_str = '[%s(%s)]' % (sctp.chunk_data.__name__, _data_str)
+
+ sctp_values = {'src_port': 1,
+ 'dst_port': 1,
+ 'vtag': 0,
+ 'csum': repr(p_sctp.csum),
+ 'chunks': data_str}
+ _sctp_str = ','.join(['%s=%s' % (k, sctp_values[k])
+ for k, _ in inspect.getmembers(p_sctp)
+ if k in sctp_values])
+ sctp_str = '%s(%s)' % (sctp.sctp.__name__, _sctp_str)
+
+ pkt_str = '%s, %s, %s' % (eth_str, ipv6_str, sctp_str)
+
+ eq_(eth_str, str(p_eth))
+ eq_(eth_str, repr(p_eth))
+
+ eq_(ipv6_str, str(p_ipv6))
+ eq_(ipv6_str, repr(p_ipv6))
+
+ eq_(sctp_str, str(p_sctp))
+ eq_(sctp_str, repr(p_sctp))
+
+ eq_(pkt_str, str(pkt))
+ eq_(pkt_str, repr(pkt))
+
+ def test_ipv6_icmpv6(self):
+ # build packet
+ e = ethernet.ethernet(ethertype=ether.ETH_TYPE_IPV6)
+ ip = ipv6.ipv6(nxt=inet.IPPROTO_ICMPV6)
+ ic = icmpv6.icmpv6()
+
+ p = e / ip / ic
+ p.serialize()
+
+ ipaddr = addrconv.ipv6.text_to_bin('::')
+
+ # ethernet !6s6sH
+ e_buf = b'\xff\xff\xff\xff\xff\xff' \
+ + b'\x00\x00\x00\x00\x00\x00' \
+ + b'\x86\xdd'
+
+ # ipv6 !IHBB16s16s'
+ ip_buf = b'\x60\x00\x00\x00' \
+ + b'\x00\x00' \
+ + b'\x3a' \
+ + b'\xff' \
+ + b'\x00\x00' \
+ + ipaddr \
+ + ipaddr
+
+ # icmpv6 !BBH
+ ic_buf = b'\x00' \
+ + b'\x00' \
+ + b'\x00\x00'
+
+ buf = e_buf + ip_buf + ic_buf
+
+ # parse
+ pkt = packet.Packet(p.data)
+ protocols = self.get_protocols(pkt)
+ p_eth = protocols['ethernet']
+ p_ipv6 = protocols['ipv6']
+ p_icmpv6 = protocols['icmpv6']
+
+ # ethernet
+ ok_(p_eth)
+ eq_('ff:ff:ff:ff:ff:ff', p_eth.dst)
+ eq_('00:00:00:00:00:00', p_eth.src)
+ eq_(ether.ETH_TYPE_IPV6, p_eth.ethertype)
+
+ # ipv6
+ ok_(p_ipv6)
+ eq_(6, p_ipv6.version)
+ eq_(0, p_ipv6.traffic_class)
+ eq_(0, p_ipv6.flow_label)
+ eq_(len(ic_buf), p_ipv6.payload_length)
+ eq_(inet.IPPROTO_ICMPV6, p_ipv6.nxt)
+ eq_(255, p_ipv6.hop_limit)
+ eq_('10::10', p_ipv6.src)
+ eq_('20::20', p_ipv6.dst)
+
+ # icmpv6
+ ok_(p_icmpv6)
+ eq_(0, p_icmpv6.type_)
+ eq_(0, p_icmpv6.code)
+ eq_(len(ic_buf), len(p_icmpv6))
+ t = bytearray(ic_buf)
+ struct.pack_into('!H', t, 2, p_icmpv6.csum)
+ ph = struct.pack('!16s16sI3xB', ipaddr, ipaddr, len(ic_buf), 58)
+ t = ph + t
+ eq_(packet_utils.checksum(t), 0x60)
+
+ # to string
+ eth_values = {'dst': 'ff:ff:ff:ff:ff:ff',
+ 'src': '00:00:00:00:00:00',
+ 'ethertype': ether.ETH_TYPE_IPV6}
+ _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k]))
+ for k, _ in inspect.getmembers(p_eth)
+ if k in eth_values])
+ eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str)
+
+ ipv6_values = {'version': 6,
+ 'traffic_class': 0,
+ 'flow_label': 0,
+ 'payload_length': len(ic_buf),
+ 'nxt': inet.IPPROTO_ICMPV6,
+ 'hop_limit': 255,
+ 'src': '10::10',
+ 'dst': '20::20',
+ 'ext_hdrs': []}
+ _ipv6_str = ','.join(['%s=%s' % (k, repr(ipv6_values[k]))
+ for k, _ in inspect.getmembers(p_ipv6)
+ if k in ipv6_values])
+ ipv6_str = '%s(%s)' % (ipv6.ipv6.__name__, _ipv6_str)
+
+ icmpv6_values = {'type_': 0,
+ 'code': 0,
+ 'csum': p_icmpv6.csum,
+ 'data': None}
+ _icmpv6_str = ','.join(['%s=%s' % (k, repr(icmpv6_values[k]))
+ for k, _ in inspect.getmembers(p_icmpv6)
+ if k in icmpv6_values])
+ icmpv6_str = '%s(%s)' % (icmpv6.icmpv6.__name__, _icmpv6_str)
+
+ pkt_str = '%s, %s, %s' % (eth_str, ipv6_str, icmpv6_str)
+
+ eq_(eth_str, str(p_eth))
+ eq_(eth_str, repr(p_eth))
+
+ eq_(ipv6_str, str(p_ipv6))
+ eq_(ipv6_str, repr(p_ipv6))
+
+ eq_(icmpv6_str, str(p_icmpv6))
+ eq_(icmpv6_str, repr(p_icmpv6))
+
+ eq_(pkt_str, str(pkt))
+ eq_(pkt_str, repr(pkt))
+
+ def test_llc_bpdu(self):
+ # buid packet
+ e = ethernet.ethernet(self.dst_mac, self.src_mac,
+ ether.ETH_TYPE_IEEE802_3)
+ llc_control = llc.ControlFormatU(0, 0, 0)
+ l = llc.llc(llc.SAP_BPDU, llc.SAP_BPDU, llc_control)
+ b = bpdu.ConfigurationBPDUs(flags=0,
+ root_priority=32768,
+ root_system_id_extension=0,
+ root_mac_address=self.src_mac,
+ root_path_cost=0,
+ bridge_priority=32768,
+ bridge_system_id_extension=0,
+ bridge_mac_address=self.dst_mac,
+ port_priority=128,
+ port_number=4,
+ message_age=1,
+ max_age=20,
+ hello_time=2,
+ forward_delay=15)
+
+ p = packet.Packet()
+ p.add_protocol(e)
+ p.add_protocol(l)
+ p.add_protocol(b)
+ p.serialize()
+
+ # ethernet !6s6sH
+ e_buf = self.dst_mac_bin + self.src_mac_bin + b'\x05\xdc'
+
+ # llc !BBB
+ l_buf = (b'\x42'
+ b'\x42'
+ b'\x03')
+
+ # bpdu !HBBBQIQHHHHH
+ b_buf = (b'\x00\x00'
+ b'\x00'
+ b'\x00'
+ b'\x00'
+ b'\x80\x00\xbb\xbb\xbb\xbb\xbb\xbb'
+ b'\x00\x00\x00\x00'
+ b'\x80\x00\xaa\xaa\xaa\xaa\xaa\xaa'
+ b'\x80\x04'
+ b'\x01\x00'
+ b'\x14\x00'
+ b'\x02\x00'
+ b'\x0f\x00')
+
+ buf = e_buf + l_buf + b_buf
+
+ # Append padding if ethernet frame is less than 60 bytes length
+ pad_len = 60 - len(buf)
+ if pad_len > 0:
+ buf += b'\x00' * pad_len
+ eq_(buf, p.data)
+
+ # parse
+ pkt = packet.Packet(p.data)
+ protocols = self.get_protocols(pkt)
+ p_eth = protocols['ethernet']
+ p_llc = protocols['llc']
+ p_bpdu = protocols['ConfigurationBPDUs']
+
+ # ethernet
+ ok_(p_eth)
+ eq_(self.dst_mac, p_eth.dst)
+ eq_(self.src_mac, p_eth.src)
+ eq_(ether.ETH_TYPE_IEEE802_3, p_eth.ethertype)
+
+ # llc
+ ok_(p_llc)
+ eq_(llc.SAP_BPDU, p_llc.dsap_addr)
+ eq_(llc.SAP_BPDU, p_llc.ssap_addr)
+ eq_(0, p_llc.control.modifier_function1)
+ eq_(0, p_llc.control.pf_bit)
+ eq_(0, p_llc.control.modifier_function2)
+
+ # bpdu
+ ok_(p_bpdu)
+ eq_(bpdu.PROTOCOL_IDENTIFIER, p_bpdu._protocol_id)
+ eq_(bpdu.PROTOCOLVERSION_ID_BPDU, p_bpdu._version_id)
+ eq_(bpdu.TYPE_CONFIG_BPDU, p_bpdu._bpdu_type)
+ eq_(0, p_bpdu.flags)
+ eq_(32768, p_bpdu.root_priority)
+ eq_(0, p_bpdu.root_system_id_extension)
+ eq_(self.src_mac, p_bpdu.root_mac_address)
+ eq_(0, p_bpdu.root_path_cost)
+ eq_(32768, p_bpdu.bridge_priority)
+ eq_(0, p_bpdu.bridge_system_id_extension)
+ eq_(self.dst_mac, p_bpdu.bridge_mac_address)
+ eq_(128, p_bpdu.port_priority)
+ eq_(4, p_bpdu.port_number)
+ eq_(1, p_bpdu.message_age)
+ eq_(20, p_bpdu.max_age)
+ eq_(2, p_bpdu.hello_time)
+ eq_(15, p_bpdu.forward_delay)
+
+ # to string
+ eth_values = {'dst': self.dst_mac,
+ 'src': self.src_mac,
+ 'ethertype': ether.ETH_TYPE_IEEE802_3}
+ _eth_str = ','.join(['%s=%s' % (k, repr(eth_values[k]))
+ for k, v in inspect.getmembers(p_eth)
+ if k in eth_values])
+ eth_str = '%s(%s)' % (ethernet.ethernet.__name__, _eth_str)
+
+ ctrl_values = {'modifier_function1': 0,
+ 'pf_bit': 0,
+ 'modifier_function2': 0}
+ _ctrl_str = ','.join(['%s=%s' % (k, repr(ctrl_values[k]))
+ for k, v in inspect.getmembers(p_llc.control)
+ if k in ctrl_values])
+ ctrl_str = '%s(%s)' % (llc.ControlFormatU.__name__, _ctrl_str)
+
+ llc_values = {'dsap_addr': repr(llc.SAP_BPDU),
+ 'ssap_addr': repr(llc.SAP_BPDU),
+ 'control': ctrl_str}
+ _llc_str = ','.join(['%s=%s' % (k, llc_values[k])
+ for k, v in inspect.getmembers(p_llc)
+ if k in llc_values])
+ llc_str = '%s(%s)' % (llc.llc.__name__, _llc_str)
+
+ _long = int if six.PY3 else long
+ bpdu_values = {'flags': 0,
+ 'root_priority': _long(32768),
+ 'root_system_id_extension': _long(0),
+ 'root_mac_address': self.src_mac,
+ 'root_path_cost': 0,
+ 'bridge_priority': _long(32768),
+ 'bridge_system_id_extension': _long(0),
+ 'bridge_mac_address': self.dst_mac,
+ 'port_priority': 128,
+ 'port_number': 4,
+ 'message_age': float(1),
+ 'max_age': float(20),
+ 'hello_time': float(2),
+ 'forward_delay': float(15)}
+ _bpdu_str = ','.join(['%s=%s' % (k, repr(bpdu_values[k]))
+ for k, v in inspect.getmembers(p_bpdu)
+ if k in bpdu_values])
+ bpdu_str = '%s(%s)' % (bpdu.ConfigurationBPDUs.__name__, _bpdu_str)
+
+ pkt_str = '%s, %s, %s' % (eth_str, llc_str, bpdu_str)
+
+ eq_(eth_str, str(p_eth))
+ eq_(eth_str, repr(p_eth))
+
+ eq_(llc_str, str(p_llc))
+ eq_(llc_str, repr(p_llc))
+
+ eq_(bpdu_str, str(p_bpdu))
+ eq_(bpdu_str, repr(p_bpdu))
+
+ eq_(pkt_str, str(pkt))
+ eq_(pkt_str, repr(pkt))
+
+ def test_div_api(self):
+ e = ethernet.ethernet(self.dst_mac, self.src_mac, ether.ETH_TYPE_IP)
+ i = ipv4.ipv4()
+ u = udp.udp(self.src_port, self.dst_port)
+ pkt = e / i / u
+ ok_(isinstance(pkt, packet.Packet))
+ ok_(isinstance(pkt.protocols[0], ethernet.ethernet))
+ ok_(isinstance(pkt.protocols[1], ipv4.ipv4))
+ ok_(isinstance(pkt.protocols[2], udp.udp))
diff --git a/tests/unit/packet/test_pbb.py b/tests/unit/packet/test_pbb.py
new file mode 100644
index 00000000..dd7778cd
--- /dev/null
+++ b/tests/unit/packet/test_pbb.py
@@ -0,0 +1,172 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import struct
+import unittest
+
+from nose.tools import eq_
+from nose.tools import ok_
+from nose.tools import raises
+from ryu.ofproto import ether
+from ryu.ofproto import inet
+from ryu.lib.packet import ethernet
+from ryu.lib.packet import packet
+from ryu.lib.packet import ipv4
+from ryu.lib.packet import vlan
+from ryu.lib.packet import pbb
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_itag(unittest.TestCase):
+
+ pcp = 3
+ dei = 0
+ uca = 1
+ sid = 16770000
+ data = pcp << 29 | dei << 28 | uca << 27 | sid
+ buf = struct.pack(pbb.itag._PACK_STR, data)
+ it = pbb.itag(pcp, dei, uca, sid)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.pcp, self.it.pcp)
+ eq_(self.dei, self.it.dei)
+ eq_(self.uca, self.it.uca)
+ eq_(self.sid, self.it.sid)
+
+ def test_parser(self):
+ _res = pbb.itag.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ eq_(res.pcp, self.pcp)
+ eq_(res.dei, self.dei)
+ eq_(res.uca, self.uca)
+ eq_(res.sid, self.sid)
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.it.serialize(data, prev)
+ res = struct.unpack(pbb.itag._PACK_STR, buf)
+ eq_(res[0], self.data)
+
+ def _build_itag(self):
+ b_src_mac = '00:07:0d:af:f4:54'
+ b_dst_mac = '00:00:00:00:00:00'
+ b_ethertype = ether.ETH_TYPE_8021AD
+ e1 = ethernet.ethernet(b_dst_mac, b_src_mac, b_ethertype)
+
+ b_pcp = 0
+ b_cfi = 0
+ b_vid = 32
+ b_ethertype = ether.ETH_TYPE_8021Q
+ bt = vlan.svlan(b_pcp, b_cfi, b_vid, b_ethertype)
+
+ c_src_mac = '11:11:11:11:11:11'
+ c_dst_mac = 'aa:aa:aa:aa:aa:aa'
+ c_ethertype = ether.ETH_TYPE_8021AD
+ e2 = ethernet.ethernet(c_dst_mac, c_src_mac, c_ethertype)
+
+ s_pcp = 0
+ s_cfi = 0
+ s_vid = 32
+ s_ethertype = ether.ETH_TYPE_8021Q
+ st = vlan.svlan(s_pcp, s_cfi, s_vid, s_ethertype)
+
+ c_pcp = 0
+ c_cfi = 0
+ c_vid = 32
+ c_ethertype = ether.ETH_TYPE_IP
+ ct = vlan.vlan(c_pcp, c_cfi, c_vid, c_ethertype)
+
+ version = 4
+ header_length = 20
+ tos = 0
+ total_length = 24
+ identification = 0x8a5d
+ flags = 0
+ offset = 1480
+ ttl = 64
+ proto = inet.IPPROTO_ICMP
+ csum = 0xa7f2
+ src = '131.151.32.21'
+ dst = '131.151.32.129'
+ option = b'TEST'
+ ip = ipv4.ipv4(version, header_length, tos, total_length,
+ identification, flags, offset, ttl, proto, csum,
+ src, dst, option)
+
+ p = packet.Packet()
+
+ p.add_protocol(e1)
+ p.add_protocol(bt)
+ p.add_protocol(self.it)
+ p.add_protocol(e2)
+ p.add_protocol(st)
+ p.add_protocol(ct)
+ p.add_protocol(ip)
+ p.serialize()
+
+ return p
+
+ def test_build_itag(self):
+ p = self._build_itag()
+
+ e = p.get_protocols(ethernet.ethernet)
+ ok_(e)
+ ok_(isinstance(e, list))
+ eq_(e[0].ethertype, ether.ETH_TYPE_8021AD)
+ eq_(e[1].ethertype, ether.ETH_TYPE_8021AD)
+
+ sv = p.get_protocols(vlan.svlan)
+ ok_(sv)
+ ok_(isinstance(sv, list))
+ eq_(sv[0].ethertype, ether.ETH_TYPE_8021Q)
+ eq_(sv[1].ethertype, ether.ETH_TYPE_8021Q)
+
+ it = p.get_protocol(pbb.itag)
+ ok_(it)
+
+ v = p.get_protocol(vlan.vlan)
+ ok_(v)
+ eq_(v.ethertype, ether.ETH_TYPE_IP)
+
+ ip = p.get_protocol(ipv4.ipv4)
+ ok_(ip)
+
+ eq_(it.pcp, self.pcp)
+ eq_(it.dei, self.dei)
+ eq_(it.uca, self.uca)
+ eq_(it.sid, self.sid)
+
+ @raises(Exception)
+ def test_malformed_itag(self):
+ m_short_buf = self.buf[1:pbb.itag._MIN_LEN]
+ pbb.itag.parser(m_short_buf)
+
+ def test_json(self):
+ jsondict = self.it.to_jsondict()
+ it = pbb.itag.from_jsondict(jsondict['itag'])
+ eq_(str(self.it), str(it))
diff --git a/tests/unit/packet/test_sctp.py b/tests/unit/packet/test_sctp.py
new file mode 100644
index 00000000..d7afb7cc
--- /dev/null
+++ b/tests/unit/packet/test_sctp.py
@@ -0,0 +1,1454 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import inspect
+import logging
+import six
+import struct
+import unittest
+
+from nose.tools import eq_
+from nose.tools import ok_
+from ryu.lib import addrconv
+from ryu.lib.packet import packet
+from ryu.lib.packet import ethernet
+from ryu.lib.packet import ipv4
+from ryu.lib.packet import sctp
+from ryu.ofproto import ether
+from ryu.ofproto import inet
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_sctp(unittest.TestCase):
+
+ def setUp(self):
+ self.chunks = []
+ self.csum = 0
+ self.dst_port = 1234
+ self.src_port = 5678
+ self.vtag = 98765432
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf = b'\x16\x2e\x04\xd2\x05\xe3\x0a\x78\x00\x00\x00\x00'
+
+ def setUp_with_data(self):
+ self.unordered = 1
+ self.begin = 1
+ self.end = 1
+ self.length = 16 + 10
+ self.tsn = 12345
+ self.sid = 1
+ self.seq = 0
+ self.payload_id = 0
+ self.payload_data = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a'
+
+ self.data = sctp.chunk_data(
+ unordered=self.unordered, begin=self.begin, end=self.end,
+ tsn=self.tsn, sid=self.sid, payload_data=self.payload_data)
+
+ self.chunks = [self.data]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x00\x07\x00\x1a\x00\x00\x30\x39\x00\x01\x00\x00' + \
+ b'\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a'
+
+ def setUp_with_init(self):
+ self.flags = 0
+ self.length = 20 + 8 + 20 + 8 + 4 + 16 + 16
+ self.init_tag = 123456
+ self.a_rwnd = 9876
+ self.os = 3
+ self.mis = 3
+ self.i_tsn = 123456
+
+ self.p_ipv4 = sctp.param_ipv4('192.168.1.1')
+ self.p_ipv6 = sctp.param_ipv6('fe80::647e:1aff:fec4:8284')
+ self.p_cookie_preserve = sctp.param_cookie_preserve(5000)
+ self.p_ecn = sctp.param_ecn()
+ self.p_host_addr = sctp.param_host_addr(b'test host\x00')
+ self.p_support_type = sctp.param_supported_addr(
+ [sctp.PTYPE_IPV4, sctp.PTYPE_IPV6, sctp.PTYPE_COOKIE_PRESERVE,
+ sctp.PTYPE_ECN, sctp.PTYPE_HOST_ADDR])
+ self.params = [
+ self.p_ipv4, self.p_ipv6, self.p_cookie_preserve,
+ self.p_ecn, self.p_host_addr, self.p_support_type]
+
+ self.init = sctp.chunk_init(
+ init_tag=self.init_tag, a_rwnd=self.a_rwnd, os=self.os,
+ mis=self.mis, i_tsn=self.i_tsn, params=self.params)
+
+ self.chunks = [self.init]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x01\x00\x00\x5c\x00\x01\xe2\x40\x00\x00\x26\x94' + \
+ b'\x00\x03\x00\x03\x00\x01\xe2\x40' + \
+ b'\x00\x05\x00\x08\xc0\xa8\x01\x01' + \
+ b'\x00\x06\x00\x14' + \
+ b'\xfe\x80\x00\x00\x00\x00\x00\x00' + \
+ b'\x64\x7e\x1a\xff\xfe\xc4\x82\x84' + \
+ b'\x00\x09\x00\x08\x00\x00\x13\x88' + \
+ b'\x80\x00\x00\x04' + \
+ b'\x00\x0b\x00\x0e' + \
+ b'\x74\x65\x73\x74\x20\x68\x6f\x73\x74\x00\x00\x00' + \
+ b'\x00\x0c\x00\x0e\x00\x05\x00\x06\x00\x09\x80\x00' + \
+ b'\x00\x0b\x00\x00'
+
+ def setUp_with_init_ack(self):
+ self.flags = 0
+ self.length = 20 + 8 + 8 + 20 + 8 + 4 + 16
+ self.init_tag = 123456
+ self.a_rwnd = 9876
+ self.os = 3
+ self.mis = 3
+ self.i_tsn = 123456
+
+ self.p_state_cookie = sctp.param_state_cookie(b'\x01\x02\x03')
+ self.p_ipv4 = sctp.param_ipv4('192.168.1.1')
+ self.p_ipv6 = sctp.param_ipv6('fe80::647e:1aff:fec4:8284')
+ self.p_unrecognized_param = sctp.param_unrecognized_param(
+ b'\xff\xff\x00\x04')
+ self.p_ecn = sctp.param_ecn()
+ self.p_host_addr = sctp.param_host_addr(b'test host\x00')
+ self.params = [
+ self.p_state_cookie, self.p_ipv4, self.p_ipv6,
+ self.p_unrecognized_param, self.p_ecn, self.p_host_addr]
+
+ self.init_ack = sctp.chunk_init_ack(
+ init_tag=self.init_tag, a_rwnd=self.a_rwnd, os=self.os,
+ mis=self.mis, i_tsn=self.i_tsn, params=self.params)
+
+ self.chunks = [self.init_ack]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x02\x00\x00\x54\x00\x01\xe2\x40\x00\x00\x26\x94' + \
+ b'\x00\x03\x00\x03\x00\x01\xe2\x40' + \
+ b'\x00\x07\x00\x07\x01\x02\x03\x00' + \
+ b'\x00\x05\x00\x08\xc0\xa8\x01\x01' + \
+ b'\x00\x06\x00\x14' + \
+ b'\xfe\x80\x00\x00\x00\x00\x00\x00' + \
+ b'\x64\x7e\x1a\xff\xfe\xc4\x82\x84' + \
+ b'\x00\x08\x00\x08\xff\xff\x00\x04' + \
+ b'\x80\x00\x00\x04' + \
+ b'\x00\x0b\x00\x0e' + \
+ b'\x74\x65\x73\x74\x20\x68\x6f\x73\x74\x00\x00\x00'
+
+ def setUp_with_sack(self):
+ self.flags = 0
+ self.length = 16 + 2 * 2 * 5 + 4 * 5
+ self.tsn_ack = 123456
+ self.a_rwnd = 9876
+ self.gapack_num = 5
+ self.duptsn_num = 5
+ self.gapacks = [[2, 3], [10, 12], [20, 24], [51, 52], [62, 63]]
+ self.duptsns = [123458, 123466, 123476, 123507, 123518]
+
+ self.sack = sctp.chunk_sack(
+ tsn_ack=self.tsn_ack, a_rwnd=self.a_rwnd,
+ gapack_num=self.gapack_num, duptsn_num=self.duptsn_num,
+ gapacks=self.gapacks, duptsns=self.duptsns)
+
+ self.chunks = [self.sack]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x03\x00\x00\x38\x00\x01\xe2\x40' + \
+ b'\x00\x00\x26\x94\x00\x05\x00\x05' + \
+ b'\x00\x02\x00\x03\x00\x0a\x00\x0c\x00\x14\x00\x18' + \
+ b'\x00\x33\x00\x34\x00\x3e\x00\x3f' + \
+ b'\x00\x01\xe2\x42\x00\x01\xe2\x4a\x00\x01\xe2\x54' + \
+ b'\x00\x01\xe2\x73\x00\x01\xe2\x7e'
+
+ def setUp_with_heartbeat(self):
+ self.flags = 0
+ self.length = 4 + 8
+
+ self.p_heartbeat = sctp.param_heartbeat(b'\x01\x02\x03\x04')
+
+ self.heartbeat = sctp.chunk_heartbeat(info=self.p_heartbeat)
+
+ self.chunks = [self.heartbeat]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x04\x00\x00\x0c' + \
+ b'\x00\x01\x00\x08' + \
+ b'\x01\x02\x03\x04'
+
+ def setUp_with_heartbeat_ack(self):
+ self.flags = 0
+ self.length = 4 + 12
+
+ self.p_heartbeat = sctp.param_heartbeat(
+ b'\xff\xee\xdd\xcc\xbb\xaa\x99\x88')
+
+ self.heartbeat_ack = sctp.chunk_heartbeat_ack(info=self.p_heartbeat)
+
+ self.chunks = [self.heartbeat_ack]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x05\x00\x00\x10' + \
+ b'\x00\x01\x00\x0c' + \
+ b'\xff\xee\xdd\xcc\xbb\xaa\x99\x88'
+
+ def setUp_with_abort(self):
+ self.tflag = 0
+ self.length = 4 + 8 + 16 + 8 + 4 + 20 + 8 + 4 + 8 + 8 + 4 + 12 \
+ + 20 + 20
+
+ self.c_invalid_stream_id = sctp.cause_invalid_stream_id(4096)
+ self.c_missing_param = sctp.cause_missing_param(
+ [sctp.PTYPE_IPV4, sctp.PTYPE_IPV6,
+ sctp.PTYPE_COOKIE_PRESERVE, sctp.PTYPE_HOST_ADDR])
+ self.c_stale_cookie = sctp.cause_stale_cookie(b'\x00\x00\x13\x88')
+ self.c_out_of_resource = sctp.cause_out_of_resource()
+ self.c_unresolvable_addr = sctp.cause_unresolvable_addr(
+ sctp.param_host_addr(b'test host\x00'))
+ self.c_unrecognized_chunk = sctp.cause_unrecognized_chunk(
+ b'\xff\x00\x00\x04')
+ self.c_invalid_param = sctp.cause_invalid_param()
+ self.c_unrecognized_param = sctp.cause_unrecognized_param(
+ b'\xff\xff\x00\x04')
+ self.c_no_userdata = sctp.cause_no_userdata(b'\x00\x01\xe2\x40')
+ self.c_cookie_while_shutdown = sctp.cause_cookie_while_shutdown()
+ self.c_restart_with_new_addr = sctp.cause_restart_with_new_addr(
+ sctp.param_ipv4('192.168.1.1'))
+ self.c_user_initiated_abort = sctp.cause_user_initiated_abort(
+ b'Key Interrupt.\x00')
+ self.c_protocol_violation = sctp.cause_protocol_violation(
+ b'Unknown reason.\x00')
+
+ self.causes = [
+ self.c_invalid_stream_id, self.c_missing_param,
+ self.c_stale_cookie, self.c_out_of_resource,
+ self.c_unresolvable_addr, self.c_unrecognized_chunk,
+ self.c_invalid_param, self.c_unrecognized_param,
+ self.c_no_userdata, self.c_cookie_while_shutdown,
+ self.c_restart_with_new_addr, self.c_user_initiated_abort,
+ self.c_protocol_violation]
+
+ self.abort = sctp.chunk_abort(causes=self.causes)
+
+ self.chunks = [self.abort]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x06\x00\x00\x90' + \
+ b'\x00\x01\x00\x08\x10\x00\x00\x00' + \
+ b'\x00\x02\x00\x10\x00\x00\x00\x04' + \
+ b'\x00\x05\x00\x06\x00\x09\x00\x0b' + \
+ b'\x00\x03\x00\x08\x00\x00\x13\x88' + \
+ b'\x00\x04\x00\x04' + \
+ b'\x00\x05\x00\x14' + \
+ b'\x00\x0b\x00\x0e' + \
+ b'\x74\x65\x73\x74\x20\x68\x6f\x73\x74\x00\x00\x00' + \
+ b'\x00\x06\x00\x08\xff\x00\x00\x04' + \
+ b'\x00\x07\x00\x04' + \
+ b'\x00\x08\x00\x08\xff\xff\x00\x04' + \
+ b'\x00\x09\x00\x08\x00\x01\xe2\x40' + \
+ b'\x00\x0a\x00\x04' + \
+ b'\x00\x0b\x00\x0c' + \
+ b'\x00\x05\x00\x08\xc0\xa8\x01\x01' + \
+ b'\x00\x0c\x00\x13' + \
+ b'\x4b\x65\x79\x20\x49\x6e\x74\x65' + \
+ b'\x72\x72\x75\x70\x74\x2e\x00\x00' + \
+ b'\x00\x0d\x00\x14' + \
+ b'\x55\x6e\x6b\x6e\x6f\x77\x6e\x20' + \
+ b'\x72\x65\x61\x73\x6f\x6e\x2e\x00'
+
+ def setUp_with_shutdown(self):
+ self.flags = 0
+ self.length = 8
+ self.tsn_ack = 123456
+
+ self.shutdown = sctp.chunk_shutdown(tsn_ack=self.tsn_ack)
+
+ self.chunks = [self.shutdown]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x07\x00\x00\x08\x00\x01\xe2\x40'
+
+ def setUp_with_shutdown_ack(self):
+ self.flags = 0
+ self.length = 4
+
+ self.shutdown_ack = sctp.chunk_shutdown_ack()
+
+ self.chunks = [self.shutdown_ack]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x08\x00\x00\x04'
+
+ def setUp_with_error(self):
+ self.flags = 0
+ self.length = 4 + 8 + 16 + 8 + 4 + 20 + 8 + 4 + 8 + 8 + 4 + 12 \
+ + 20 + 20
+
+ self.c_invalid_stream_id = sctp.cause_invalid_stream_id(4096)
+ self.c_missing_param = sctp.cause_missing_param(
+ [sctp.PTYPE_IPV4, sctp.PTYPE_IPV6,
+ sctp.PTYPE_COOKIE_PRESERVE, sctp.PTYPE_HOST_ADDR])
+ self.c_stale_cookie = sctp.cause_stale_cookie(b'\x00\x00\x13\x88')
+ self.c_out_of_resource = sctp.cause_out_of_resource()
+ self.c_unresolvable_addr = sctp.cause_unresolvable_addr(
+ sctp.param_host_addr(b'test host\x00'))
+ self.c_unrecognized_chunk = sctp.cause_unrecognized_chunk(
+ b'\xff\x00\x00\x04')
+ self.c_invalid_param = sctp.cause_invalid_param()
+ self.c_unrecognized_param = sctp.cause_unrecognized_param(
+ b'\xff\xff\x00\x04')
+ self.c_no_userdata = sctp.cause_no_userdata(b'\x00\x01\xe2\x40')
+ self.c_cookie_while_shutdown = sctp.cause_cookie_while_shutdown()
+ self.c_restart_with_new_addr = sctp.cause_restart_with_new_addr(
+ sctp.param_ipv4('192.168.1.1'))
+ self.c_user_initiated_abort = sctp.cause_user_initiated_abort(
+ b'Key Interrupt.\x00')
+ self.c_protocol_violation = sctp.cause_protocol_violation(
+ b'Unknown reason.\x00')
+
+ self.causes = [
+ self.c_invalid_stream_id, self.c_missing_param,
+ self.c_stale_cookie, self.c_out_of_resource,
+ self.c_unresolvable_addr, self.c_unrecognized_chunk,
+ self.c_invalid_param, self.c_unrecognized_param,
+ self.c_no_userdata, self.c_cookie_while_shutdown,
+ self.c_restart_with_new_addr, self.c_user_initiated_abort,
+ self.c_protocol_violation]
+
+ self.error = sctp.chunk_error(causes=self.causes)
+
+ self.chunks = [self.error]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x09\x00\x00\x90' + \
+ b'\x00\x01\x00\x08\x10\x00\x00\x00' + \
+ b'\x00\x02\x00\x10\x00\x00\x00\x04' + \
+ b'\x00\x05\x00\x06\x00\x09\x00\x0b' + \
+ b'\x00\x03\x00\x08\x00\x00\x13\x88' + \
+ b'\x00\x04\x00\x04' + \
+ b'\x00\x05\x00\x14' + \
+ b'\x00\x0b\x00\x0e' + \
+ b'\x74\x65\x73\x74\x20\x68\x6f\x73\x74\x00\x00\x00' + \
+ b'\x00\x06\x00\x08\xff\x00\x00\x04' + \
+ b'\x00\x07\x00\x04' + \
+ b'\x00\x08\x00\x08\xff\xff\x00\x04' + \
+ b'\x00\x09\x00\x08\x00\x01\xe2\x40' + \
+ b'\x00\x0a\x00\x04' + \
+ b'\x00\x0b\x00\x0c' + \
+ b'\x00\x05\x00\x08\xc0\xa8\x01\x01' + \
+ b'\x00\x0c\x00\x13' + \
+ b'\x4b\x65\x79\x20\x49\x6e\x74\x65' + \
+ b'\x72\x72\x75\x70\x74\x2e\x00\x00' + \
+ b'\x00\x0d\x00\x14' + \
+ b'\x55\x6e\x6b\x6e\x6f\x77\x6e\x20' + \
+ b'\x72\x65\x61\x73\x6f\x6e\x2e\x00'
+
+ def setUp_with_cookie_echo(self):
+ self.flags = 0
+ self.length = 8
+ self.cookie = b'\x12\x34\x56\x78'
+
+ self.cookie_echo = sctp.chunk_cookie_echo(cookie=self.cookie)
+
+ self.chunks = [self.cookie_echo]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x0a\x00\x00\x08\x12\x34\x56\x78'
+
+ def setUp_with_cookie_ack(self):
+ self.flags = 0
+ self.length = 4
+
+ self.cookie_ack = sctp.chunk_cookie_ack()
+
+ self.chunks = [self.cookie_ack]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x0b\x00\x00\x04'
+
+ def setUp_with_ecn_echo(self):
+ self.flags = 0
+ self.length = 8
+ self.low_tsn = 123456
+
+ self.ecn_echo = sctp.chunk_ecn_echo(low_tsn=self.low_tsn)
+
+ self.chunks = [self.ecn_echo]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x0c\x00\x00\x08\x00\x01\xe2\x40'
+
+ def setUp_with_cwr(self):
+ self.flags = 0
+ self.length = 8
+ self.low_tsn = 123456
+
+ self.cwr = sctp.chunk_cwr(low_tsn=self.low_tsn)
+
+ self.chunks = [self.cwr]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x0d\x00\x00\x08\x00\x01\xe2\x40'
+
+ def setUp_with_shutdown_complete(self):
+ self.tflag = 0
+ self.length = 4
+
+ self.shutdown_complete = sctp.chunk_shutdown_complete()
+
+ self.chunks = [self.shutdown_complete]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x0e\x00\x00\x04'
+
+ def setUp_with_multi_chunks(self):
+ self.s_flags = 0
+ self.s_length = 16
+ self.s_tsn_ack = 123456
+ self.s_a_rwnd = 9876
+ self.s_gapack_num = 0
+ self.s_duptsn_num = 0
+ self.s_gapacks = None
+ self.s_duptsns = None
+
+ self.sack = sctp.chunk_sack(
+ tsn_ack=self.s_tsn_ack, a_rwnd=self.s_a_rwnd)
+
+ self.d1_unordered = 0
+ self.d1_begin = 1
+ self.d1_end = 0
+ self.d1_length = 16 + 10
+ self.d1_tsn = 12345
+ self.d1_sid = 1
+ self.d1_seq = 0
+ self.d1_payload_id = 0
+ self.d1_payload_data = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a'
+
+ self.data1 = sctp.chunk_data(
+ begin=self.d1_begin, tsn=self.d1_tsn, sid=self.d1_sid,
+ payload_data=self.d1_payload_data)
+
+ self.d2_unordered = 0
+ self.d2_begin = 0
+ self.d2_end = 1
+ self.d2_length = 16 + 10
+ self.d2_tsn = 12346
+ self.d2_sid = 1
+ self.d2_seq = 1
+ self.d2_payload_id = 0
+ self.d2_payload_data = b'\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a'
+
+ self.data2 = sctp.chunk_data(
+ end=self.d2_end, tsn=self.d2_tsn, sid=self.d2_sid,
+ seq=self.d2_seq, payload_data=self.d2_payload_data)
+
+ self.chunks = [self.sack, self.data1, self.data2]
+
+ self.sc = sctp.sctp(
+ self.src_port, self.dst_port, self.vtag, self.csum,
+ self.chunks)
+
+ self.buf += b'\x03\x00\x00\x10\x00\x01\xe2\x40' + \
+ b'\x00\x00\x26\x94\x00\x00\x00\x00' + \
+ b'\x00\x02\x00\x1a\x00\x00\x30\x39\x00\x01\x00\x00' + \
+ b'\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a' + \
+ b'\x00\x01\x00\x1a\x00\x00\x30\x3a\x00\x01\x00\x01' + \
+ b'\x00\x00\x00\x00\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a'
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.src_port, self.sc.src_port)
+ eq_(self.dst_port, self.sc.dst_port)
+ eq_(self.vtag, self.sc.vtag)
+ eq_(self.csum, self.sc.csum)
+ eq_(self.chunks, self.sc.chunks)
+
+ def test_init_with_data(self):
+ self.setUp_with_data()
+ self.test_init()
+
+ def test_init_with_init(self):
+ self.setUp_with_init()
+ self.test_init()
+
+ def test_init_with_init_ack(self):
+ self.setUp_with_init_ack()
+ self.test_init()
+
+ def test_init_with_sack(self):
+ self.setUp_with_sack()
+ self.test_init()
+
+ def test_init_with_heartbeat(self):
+ self.setUp_with_heartbeat()
+ self.test_init()
+
+ def test_init_with_heartbeat_ack(self):
+ self.setUp_with_heartbeat_ack()
+ self.test_init()
+
+ def test_init_with_abort(self):
+ self.setUp_with_abort()
+ self.test_init()
+
+ def test_init_with_shutdown(self):
+ self.setUp_with_shutdown()
+ self.test_init()
+
+ def test_init_with_shutdown_ack(self):
+ self.setUp_with_shutdown_ack()
+ self.test_init()
+
+ def test_init_with_error(self):
+ self.setUp_with_error()
+ self.test_init()
+
+ def test_init_with_cookie_echo(self):
+ self.setUp_with_cookie_echo()
+ self.test_init()
+
+ def test_init_with_cookie_ack(self):
+ self.setUp_with_cookie_ack()
+ self.test_init()
+
+ def test_init_with_ecn_echo(self):
+ self.setUp_with_ecn_echo()
+ self.test_init()
+
+ def test_init_with_cwr(self):
+ self.setUp_with_cwr()
+ self.test_init()
+
+ def test_init_with_shutdown_complete(self):
+ self.setUp_with_shutdown_complete()
+ self.test_init()
+
+ def test_init_with_multi_chunks(self):
+ self.setUp_with_multi_chunks()
+ self.test_init()
+
+ def test_parser(self):
+ _res = self.sc.parser(six.binary_type(self.buf))
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+ # to calculate the lengths of parameters.
+ self.sc.serialize(None, None)
+
+ eq_(self.src_port, res.src_port)
+ eq_(self.dst_port, res.dst_port)
+ eq_(self.vtag, res.vtag)
+ eq_(self.csum, res.csum)
+ eq_(str(self.chunks), str(res.chunks))
+
+ def test_parser_with_data(self):
+ self.setUp_with_data()
+ self.test_parser()
+
+ def test_parser_with_init(self):
+ self.setUp_with_init()
+ self.test_parser()
+
+ def test_parser_with_init_ack(self):
+ self.setUp_with_init_ack()
+ self.test_parser()
+
+ def test_parser_with_sack(self):
+ self.setUp_with_sack()
+ self.test_parser()
+
+ def test_parser_with_heartbeat(self):
+ self.setUp_with_heartbeat()
+ self.test_parser()
+
+ def test_parser_with_heartbeat_ack(self):
+ self.setUp_with_heartbeat_ack()
+ self.test_parser()
+
+ def test_parser_with_abort(self):
+ self.setUp_with_abort()
+ self.test_parser()
+
+ def test_parser_with_shutdown(self):
+ self.setUp_with_shutdown()
+ self.test_parser()
+
+ def test_parser_with_shutdown_ack(self):
+ self.setUp_with_shutdown_ack()
+ self.test_parser()
+
+ def test_parser_with_error(self):
+ self.setUp_with_error()
+ self.test_parser()
+
+ def test_parser_with_cookie_echo(self):
+ self.setUp_with_cookie_echo()
+ self.test_parser()
+
+ def test_parser_with_cookie_ack(self):
+ self.setUp_with_cookie_ack()
+ self.test_parser()
+
+ def test_parser_with_ecn_echo(self):
+ self.setUp_with_ecn_echo()
+ self.test_parser()
+
+ def test_parser_with_cwr(self):
+ self.setUp_with_cwr()
+ self.test_parser()
+
+ def test_parser_with_shutdown_complete(self):
+ self.setUp_with_shutdown_complete()
+ self.test_parser()
+
+ def test_parser_with_multi_chunks(self):
+ self.setUp_with_multi_chunks()
+ self.test_parser()
+
+ def _test_serialize(self):
+ buf = self.sc.serialize(bytearray(), None)
+ res = struct.unpack_from(sctp.sctp._PACK_STR, buf)
+ eq_(self.src_port, res[0])
+ eq_(self.dst_port, res[1])
+ eq_(self.vtag, res[2])
+ # skip compare checksum
+ # eq_(self.csum, res[3])
+
+ return buf[sctp.sctp._MIN_LEN:]
+
+ def test_serialize(self):
+ self._test_serialize()
+
+ def test_serialize_with_data(self):
+ self.setUp_with_data()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_data._PACK_STR, buf)
+ eq_(sctp.chunk_data.chunk_type(), res[0])
+ flags = (
+ (self.unordered << 2) |
+ (self.begin << 1) |
+ (self.end << 0))
+ eq_(flags, res[1])
+ eq_(self.length, res[2])
+ eq_(self.tsn, res[3])
+ eq_(self.sid, res[4])
+ eq_(self.seq, res[5])
+ eq_(self.payload_id, res[6])
+ eq_(self.payload_data, buf[sctp.chunk_data._MIN_LEN:])
+
+ def test_serialize_with_init(self):
+ self.setUp_with_init()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_init._PACK_STR, buf)
+ eq_(sctp.chunk_init.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+ eq_(self.init_tag, res[3])
+ eq_(self.a_rwnd, res[4])
+ eq_(self.os, res[5])
+ eq_(self.mis, res[6])
+ eq_(self.i_tsn, res[7])
+
+ buf = buf[sctp.chunk_init._MIN_LEN:]
+ res1 = struct.unpack_from(sctp.param_ipv4._PACK_STR, buf)
+ eq_(sctp.param_ipv4.param_type(), res1[0])
+ eq_(8, res1[1])
+ eq_('192.168.1.1', addrconv.ipv4.bin_to_text(
+ buf[sctp.param_ipv4._MIN_LEN:sctp.param_ipv4._MIN_LEN + 4]))
+
+ buf = buf[8:]
+ res2 = struct.unpack_from(sctp.param_ipv6._PACK_STR, buf)
+ eq_(sctp.param_ipv6.param_type(), res2[0])
+ eq_(20, res2[1])
+ eq_('fe80::647e:1aff:fec4:8284', addrconv.ipv6.bin_to_text(
+ buf[sctp.param_ipv6._MIN_LEN:sctp.param_ipv6._MIN_LEN + 16]))
+
+ buf = buf[20:]
+ res3 = struct.unpack_from(sctp.param_cookie_preserve._PACK_STR,
+ buf)
+ eq_(sctp.param_cookie_preserve.param_type(), res3[0])
+ eq_(8, res3[1])
+ eq_(5000, res3[2])
+
+ buf = buf[8:]
+ res4 = struct.unpack_from(sctp.param_ecn._PACK_STR, buf)
+ eq_(sctp.param_ecn.param_type(), res4[0])
+ eq_(4, res4[1])
+
+ buf = buf[4:]
+ res5 = struct.unpack_from(sctp.param_host_addr._PACK_STR, buf)
+ eq_(sctp.param_host_addr.param_type(), res5[0])
+ eq_(14, res5[1])
+ eq_(b'test host\x00',
+ buf[sctp.param_host_addr._MIN_LEN:
+ sctp.param_host_addr._MIN_LEN + 10])
+
+ buf = buf[16:]
+ res6 = struct.unpack_from(sctp.param_supported_addr._PACK_STR, buf)
+ res6 = list(res6)
+ eq_(sctp.param_supported_addr.param_type(), res6[0])
+ eq_(14, res6[1])
+ buf = buf[sctp.param_supported_addr._MIN_LEN:]
+ offset = 0
+ tmplist = []
+ while offset < len(buf):
+ (tmp, ) = struct.unpack_from('!H', buf, offset)
+ tmplist.append(tmp)
+ offset += struct.calcsize('!H')
+ res6.extend(tmplist)
+ eq_(sctp.PTYPE_IPV4, res6[2])
+ eq_(sctp.PTYPE_IPV6, res6[3])
+ eq_(sctp.PTYPE_COOKIE_PRESERVE, res6[4])
+ eq_(sctp.PTYPE_ECN, res6[5])
+ eq_(sctp.PTYPE_HOST_ADDR, res6[6])
+
+ def test_serialize_with_init_ack(self):
+ self.setUp_with_init_ack()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_init_ack._PACK_STR, buf)
+ eq_(sctp.chunk_init_ack.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+ eq_(self.init_tag, res[3])
+ eq_(self.a_rwnd, res[4])
+ eq_(self.os, res[5])
+ eq_(self.mis, res[6])
+ eq_(self.i_tsn, res[7])
+
+ buf = buf[sctp.chunk_init_ack._MIN_LEN:]
+ res1 = struct.unpack_from(sctp.param_state_cookie._PACK_STR, buf)
+ eq_(sctp.param_state_cookie.param_type(), res1[0])
+ eq_(7, res1[1])
+ eq_(b'\x01\x02\x03',
+ buf[sctp.param_state_cookie._MIN_LEN:
+ sctp.param_state_cookie._MIN_LEN + 3])
+
+ buf = buf[8:]
+ res2 = struct.unpack_from(sctp.param_ipv4._PACK_STR, buf)
+ eq_(sctp.param_ipv4.param_type(), res2[0])
+ eq_(8, res2[1])
+ eq_('192.168.1.1', addrconv.ipv4.bin_to_text(
+ buf[sctp.param_ipv4._MIN_LEN:sctp.param_ipv4._MIN_LEN + 4]))
+
+ buf = buf[8:]
+ res3 = struct.unpack_from(sctp.param_ipv6._PACK_STR, buf)
+ eq_(sctp.param_ipv6.param_type(), res3[0])
+ eq_(20, res3[1])
+ eq_('fe80::647e:1aff:fec4:8284', addrconv.ipv6.bin_to_text(
+ buf[sctp.param_ipv6._MIN_LEN:sctp.param_ipv6._MIN_LEN + 16]))
+
+ buf = buf[20:]
+ res4 = struct.unpack_from(
+ sctp.param_unrecognized_param._PACK_STR, buf)
+ eq_(sctp.param_unrecognized_param.param_type(), res4[0])
+ eq_(8, res4[1])
+ eq_(b'\xff\xff\x00\x04',
+ buf[sctp.param_unrecognized_param._MIN_LEN:
+ sctp.param_unrecognized_param._MIN_LEN + 4])
+
+ buf = buf[8:]
+ res5 = struct.unpack_from(sctp.param_ecn._PACK_STR, buf)
+ eq_(sctp.param_ecn.param_type(), res5[0])
+ eq_(4, res5[1])
+
+ buf = buf[4:]
+ res6 = struct.unpack_from(sctp.param_host_addr._PACK_STR, buf)
+ eq_(sctp.param_host_addr.param_type(), res6[0])
+ eq_(14, res6[1])
+ eq_(b'test host\x00',
+ buf[sctp.param_host_addr._MIN_LEN:
+ sctp.param_host_addr._MIN_LEN + 10])
+
+ def test_serialize_with_sack(self):
+ self.setUp_with_sack()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_sack._PACK_STR, buf)
+ eq_(sctp.chunk_sack.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+ eq_(self.tsn_ack, res[3])
+ eq_(self.a_rwnd, res[4])
+ eq_(self.gapack_num, res[5])
+ eq_(self.duptsn_num, res[6])
+
+ buf = buf[sctp.chunk_sack._MIN_LEN:]
+ gapacks = []
+ for _ in range(self.gapack_num):
+ (gap_s, gap_e) = struct.unpack_from(
+ sctp.chunk_sack._GAPACK_STR, buf)
+ one = [gap_s, gap_e]
+ gapacks.append(one)
+ buf = buf[sctp.chunk_sack._GAPACK_LEN:]
+ duptsns = []
+ for _ in range(self.duptsn_num):
+ (duptsn, ) = struct.unpack_from(
+ sctp.chunk_sack._DUPTSN_STR, buf)
+ duptsns.append(duptsn)
+ buf = buf[sctp.chunk_sack._DUPTSN_LEN:]
+ eq_(self.gapacks, gapacks)
+ eq_(self.duptsns, duptsns)
+
+ def test_serialize_with_heartbeat(self):
+ self.setUp_with_heartbeat()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_heartbeat._PACK_STR, buf)
+ eq_(sctp.chunk_heartbeat.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+
+ buf = buf[sctp.chunk_heartbeat._MIN_LEN:]
+ res1 = struct.unpack_from(sctp.param_heartbeat._PACK_STR, buf)
+ eq_(sctp.param_heartbeat.param_type(), res1[0])
+ eq_(8, res1[1])
+ eq_(b'\x01\x02\x03\x04',
+ buf[sctp.param_heartbeat._MIN_LEN:
+ sctp.param_heartbeat._MIN_LEN + 4])
+
+ def test_serialize_with_heartbeat_ack(self):
+ self.setUp_with_heartbeat_ack()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_heartbeat_ack._PACK_STR, buf)
+ eq_(sctp.chunk_heartbeat_ack.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+
+ buf = buf[sctp.chunk_heartbeat_ack._MIN_LEN:]
+ res1 = struct.unpack_from(sctp.param_heartbeat._PACK_STR, buf)
+ eq_(sctp.param_heartbeat.param_type(), res1[0])
+ eq_(12, res1[1])
+ eq_(b'\xff\xee\xdd\xcc\xbb\xaa\x99\x88',
+ buf[sctp.param_heartbeat._MIN_LEN:
+ sctp.param_heartbeat._MIN_LEN + 8])
+
+ def test_serialize_with_abort(self):
+ self.setUp_with_abort()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_abort._PACK_STR, buf)
+ eq_(sctp.chunk_abort.chunk_type(), res[0])
+ flags = self.tflag << 0
+ eq_(flags, res[1])
+ eq_(self.length, res[2])
+
+ buf = buf[sctp.chunk_abort._MIN_LEN:]
+ res1 = struct.unpack_from(sctp.cause_invalid_stream_id._PACK_STR, buf)
+ eq_(sctp.cause_invalid_stream_id.cause_code(), res1[0])
+ eq_(8, res1[1])
+ eq_(4096, res1[2])
+
+ buf = buf[8:]
+ res2 = struct.unpack_from(sctp.cause_missing_param._PACK_STR, buf)
+ eq_(sctp.cause_missing_param.cause_code(), res2[0])
+ eq_(16, res2[1])
+ eq_(4, res2[2])
+ types = []
+ for count in range(4):
+ (tmp, ) = struct.unpack_from(
+ '!H', buf, sctp.cause_missing_param._MIN_LEN + 2 * count)
+ types.append(tmp)
+ eq_(str([sctp.PTYPE_IPV4, sctp.PTYPE_IPV6,
+ sctp.PTYPE_COOKIE_PRESERVE, sctp.PTYPE_HOST_ADDR]),
+ str(types))
+
+ buf = buf[16:]
+ res3 = struct.unpack_from(sctp.cause_stale_cookie._PACK_STR, buf)
+ eq_(sctp.cause_stale_cookie.cause_code(), res3[0])
+ eq_(8, res3[1])
+ eq_(b'\x00\x00\x13\x88',
+ buf[sctp.cause_stale_cookie._MIN_LEN:
+ sctp.cause_stale_cookie._MIN_LEN + 4])
+
+ buf = buf[8:]
+ res4 = struct.unpack_from(sctp.cause_out_of_resource._PACK_STR, buf)
+ eq_(sctp.cause_out_of_resource.cause_code(), res4[0])
+ eq_(4, res4[1])
+
+ buf = buf[4:]
+ res5 = struct.unpack_from(
+ sctp.cause_unresolvable_addr._PACK_STR, buf)
+ eq_(sctp.cause_unresolvable_addr.cause_code(), res5[0])
+ eq_(20, res5[1])
+ eq_(b'\x00\x0b\x00\x0e\x74\x65\x73\x74' +
+ b'\x20\x68\x6f\x73\x74\x00\x00\x00',
+ buf[sctp.cause_unresolvable_addr._MIN_LEN:
+ sctp.cause_unresolvable_addr._MIN_LEN + 16])
+
+ buf = buf[20:]
+ res6 = struct.unpack_from(
+ sctp.cause_unrecognized_chunk._PACK_STR, buf)
+ eq_(sctp.cause_unrecognized_chunk.cause_code(), res6[0])
+ eq_(8, res6[1])
+ eq_(b'\xff\x00\x00\x04',
+ buf[sctp.cause_unrecognized_chunk._MIN_LEN:
+ sctp.cause_unrecognized_chunk._MIN_LEN + 4])
+
+ buf = buf[8:]
+ res7 = struct.unpack_from(sctp.cause_invalid_param._PACK_STR, buf)
+ eq_(sctp.cause_invalid_param.cause_code(), res7[0])
+ eq_(4, res7[1])
+
+ buf = buf[4:]
+ res8 = struct.unpack_from(
+ sctp.cause_unrecognized_param._PACK_STR, buf)
+ eq_(sctp.cause_unrecognized_param.cause_code(), res8[0])
+ eq_(8, res8[1])
+ eq_(b'\xff\xff\x00\x04',
+ buf[sctp.cause_unrecognized_param._MIN_LEN:
+ sctp.cause_unrecognized_param._MIN_LEN + 4])
+
+ buf = buf[8:]
+ res9 = struct.unpack_from(sctp.cause_no_userdata._PACK_STR, buf)
+ eq_(sctp.cause_no_userdata.cause_code(), res9[0])
+ eq_(8, res9[1])
+ eq_(b'\x00\x01\xe2\x40',
+ buf[sctp.cause_no_userdata._MIN_LEN:
+ sctp.cause_no_userdata._MIN_LEN + 4])
+
+ buf = buf[8:]
+ res10 = struct.unpack_from(
+ sctp.cause_cookie_while_shutdown._PACK_STR, buf)
+ eq_(sctp.cause_cookie_while_shutdown.cause_code(), res10[0])
+ eq_(4, res10[1])
+
+ buf = buf[4:]
+ res11 = struct.unpack_from(
+ sctp.cause_restart_with_new_addr._PACK_STR, buf)
+ eq_(sctp.cause_restart_with_new_addr.cause_code(), res11[0])
+ eq_(12, res11[1])
+ eq_(b'\x00\x05\x00\x08\xc0\xa8\x01\x01',
+ buf[sctp.cause_restart_with_new_addr._MIN_LEN:
+ sctp.cause_restart_with_new_addr._MIN_LEN + 8])
+
+ buf = buf[12:]
+ res12 = struct.unpack_from(
+ sctp.cause_user_initiated_abort._PACK_STR, buf)
+ eq_(sctp.cause_user_initiated_abort.cause_code(), res12[0])
+ eq_(19, res12[1])
+ eq_(b'Key Interrupt.\x00',
+ buf[sctp.cause_user_initiated_abort._MIN_LEN:
+ sctp.cause_user_initiated_abort._MIN_LEN + 15])
+
+ buf = buf[20:]
+ res13 = struct.unpack_from(
+ sctp.cause_protocol_violation._PACK_STR, buf)
+ eq_(sctp.cause_protocol_violation.cause_code(), res13[0])
+ eq_(20, res13[1])
+ eq_(b'Unknown reason.\x00',
+ buf[sctp.cause_protocol_violation._MIN_LEN:
+ sctp.cause_protocol_violation._MIN_LEN + 16])
+
+ def test_serialize_with_shutdown(self):
+ self.setUp_with_shutdown()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_shutdown._PACK_STR, buf)
+ eq_(sctp.chunk_shutdown.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+ eq_(self.tsn_ack, res[3])
+
+ def test_serialize_with_shutdown_ack(self):
+ self.setUp_with_shutdown_ack()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_shutdown_ack._PACK_STR, buf)
+ eq_(sctp.chunk_shutdown_ack.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+
+ def test_serialize_with_error(self):
+ self.setUp_with_error()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_error._PACK_STR, buf)
+ eq_(sctp.chunk_error.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+
+ buf = buf[sctp.chunk_error._MIN_LEN:]
+ res1 = struct.unpack_from(sctp.cause_invalid_stream_id._PACK_STR, buf)
+ eq_(sctp.cause_invalid_stream_id.cause_code(), res1[0])
+ eq_(8, res1[1])
+ eq_(4096, res1[2])
+
+ buf = buf[8:]
+ res2 = struct.unpack_from(sctp.cause_missing_param._PACK_STR, buf)
+ eq_(sctp.cause_missing_param.cause_code(), res2[0])
+ eq_(16, res2[1])
+ eq_(4, res2[2])
+ types = []
+ for count in range(4):
+ (tmp, ) = struct.unpack_from(
+ '!H', buf, sctp.cause_missing_param._MIN_LEN + 2 * count)
+ types.append(tmp)
+ eq_(str([sctp.PTYPE_IPV4, sctp.PTYPE_IPV6,
+ sctp.PTYPE_COOKIE_PRESERVE, sctp.PTYPE_HOST_ADDR]),
+ str(types))
+
+ buf = buf[16:]
+ res3 = struct.unpack_from(sctp.cause_stale_cookie._PACK_STR, buf)
+ eq_(sctp.cause_stale_cookie.cause_code(), res3[0])
+ eq_(8, res3[1])
+ eq_(b'\x00\x00\x13\x88',
+ buf[sctp.cause_stale_cookie._MIN_LEN:
+ sctp.cause_stale_cookie._MIN_LEN + 4])
+
+ buf = buf[8:]
+ res4 = struct.unpack_from(sctp.cause_out_of_resource._PACK_STR, buf)
+ eq_(sctp.cause_out_of_resource.cause_code(), res4[0])
+ eq_(4, res4[1])
+
+ buf = buf[4:]
+ res5 = struct.unpack_from(
+ sctp.cause_unresolvable_addr._PACK_STR, buf)
+ eq_(sctp.cause_unresolvable_addr.cause_code(), res5[0])
+ eq_(20, res5[1])
+ eq_(b'\x00\x0b\x00\x0e\x74\x65\x73\x74' +
+ b'\x20\x68\x6f\x73\x74\x00\x00\x00',
+ buf[sctp.cause_unresolvable_addr._MIN_LEN:
+ sctp.cause_unresolvable_addr._MIN_LEN + 16])
+
+ buf = buf[20:]
+ res6 = struct.unpack_from(
+ sctp.cause_unrecognized_chunk._PACK_STR, buf)
+ eq_(sctp.cause_unrecognized_chunk.cause_code(), res6[0])
+ eq_(8, res6[1])
+ eq_(b'\xff\x00\x00\x04',
+ buf[sctp.cause_unrecognized_chunk._MIN_LEN:
+ sctp.cause_unrecognized_chunk._MIN_LEN + 4])
+
+ buf = buf[8:]
+ res7 = struct.unpack_from(sctp.cause_invalid_param._PACK_STR, buf)
+ eq_(sctp.cause_invalid_param.cause_code(), res7[0])
+ eq_(4, res7[1])
+
+ buf = buf[4:]
+ res8 = struct.unpack_from(
+ sctp.cause_unrecognized_param._PACK_STR, buf)
+ eq_(sctp.cause_unrecognized_param.cause_code(), res8[0])
+ eq_(8, res8[1])
+ eq_(b'\xff\xff\x00\x04',
+ buf[sctp.cause_unrecognized_param._MIN_LEN:
+ sctp.cause_unrecognized_param._MIN_LEN + 4])
+
+ buf = buf[8:]
+ res9 = struct.unpack_from(sctp.cause_no_userdata._PACK_STR, buf)
+ eq_(sctp.cause_no_userdata.cause_code(), res9[0])
+ eq_(8, res9[1])
+ eq_(b'\x00\x01\xe2\x40',
+ buf[sctp.cause_no_userdata._MIN_LEN:
+ sctp.cause_no_userdata._MIN_LEN + 4])
+
+ buf = buf[8:]
+ res10 = struct.unpack_from(
+ sctp.cause_cookie_while_shutdown._PACK_STR, buf)
+ eq_(sctp.cause_cookie_while_shutdown.cause_code(), res10[0])
+ eq_(4, res10[1])
+
+ buf = buf[4:]
+ res11 = struct.unpack_from(
+ sctp.cause_restart_with_new_addr._PACK_STR, buf)
+ eq_(sctp.cause_restart_with_new_addr.cause_code(), res11[0])
+ eq_(12, res11[1])
+ eq_(b'\x00\x05\x00\x08\xc0\xa8\x01\x01',
+ buf[sctp.cause_restart_with_new_addr._MIN_LEN:
+ sctp.cause_restart_with_new_addr._MIN_LEN + 8])
+
+ buf = buf[12:]
+ res12 = struct.unpack_from(
+ sctp.cause_user_initiated_abort._PACK_STR, buf)
+ eq_(sctp.cause_user_initiated_abort.cause_code(), res12[0])
+ eq_(19, res12[1])
+ eq_(b'Key Interrupt.\x00',
+ buf[sctp.cause_user_initiated_abort._MIN_LEN:
+ sctp.cause_user_initiated_abort._MIN_LEN + 15])
+
+ buf = buf[20:]
+ res13 = struct.unpack_from(
+ sctp.cause_protocol_violation._PACK_STR, buf)
+ eq_(sctp.cause_protocol_violation.cause_code(), res13[0])
+ eq_(20, res13[1])
+ eq_(b'Unknown reason.\x00',
+ buf[sctp.cause_protocol_violation._MIN_LEN:
+ sctp.cause_protocol_violation._MIN_LEN + 16])
+
+ def test_serialize_with_cookie_echo(self):
+ self.setUp_with_cookie_echo()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_cookie_echo._PACK_STR, buf)
+ eq_(sctp.chunk_cookie_echo.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+ eq_(self.cookie,
+ buf[sctp.chunk_cookie_echo._MIN_LEN:
+ sctp.chunk_cookie_echo._MIN_LEN + 4])
+
+ def test_serialize_with_cookie_ack(self):
+ self.setUp_with_cookie_ack()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_cookie_ack._PACK_STR, buf)
+ eq_(sctp.chunk_cookie_ack.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+
+ def test_serialize_with_ecn_echo(self):
+ self.setUp_with_ecn_echo()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_ecn_echo._PACK_STR, buf)
+ eq_(sctp.chunk_ecn_echo.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+ eq_(self.low_tsn, res[3])
+
+ def test_serialize_with_cwr(self):
+ self.setUp_with_cwr()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_cwr._PACK_STR, buf)
+ eq_(sctp.chunk_cwr.chunk_type(), res[0])
+ eq_(self.flags, res[1])
+ eq_(self.length, res[2])
+ eq_(self.low_tsn, res[3])
+
+ def test_serialize_with_shutdown_complete(self):
+ self.setUp_with_shutdown_complete()
+ buf = self._test_serialize()
+ res = struct.unpack_from(
+ sctp.chunk_shutdown_complete._PACK_STR, buf)
+ eq_(sctp.chunk_shutdown_complete.chunk_type(), res[0])
+ flags = self.tflag << 0
+ eq_(flags, res[1])
+ eq_(self.length, res[2])
+
+ def test_serialize_with_multi_chunks(self):
+ self.setUp_with_multi_chunks()
+ buf = self._test_serialize()
+ res = struct.unpack_from(sctp.chunk_sack._PACK_STR, buf)
+ eq_(sctp.chunk_sack.chunk_type(), res[0])
+ eq_(self.s_flags, res[1])
+ eq_(self.s_length, res[2])
+ eq_(self.s_tsn_ack, res[3])
+ eq_(self.s_a_rwnd, res[4])
+ eq_(self.s_gapack_num, res[5])
+ eq_(self.s_duptsn_num, res[6])
+
+ buf = buf[self.s_length:]
+ res = struct.unpack_from(sctp.chunk_data._PACK_STR, buf)
+ eq_(sctp.chunk_data.chunk_type(), res[0])
+ d1_flags = (
+ (self.d1_unordered << 2) |
+ (self.d1_begin << 1) |
+ (self.d1_end << 0))
+ eq_(d1_flags, res[1])
+ eq_(self.d1_length, res[2])
+ eq_(self.d1_tsn, res[3])
+ eq_(self.d1_sid, res[4])
+ eq_(self.d1_seq, res[5])
+ eq_(self.d1_payload_id, res[6])
+ eq_(self.d1_payload_data,
+ buf[sctp.chunk_data._MIN_LEN:
+ sctp.chunk_data._MIN_LEN + 10])
+
+ buf = buf[self.d1_length:]
+ res = struct.unpack_from(sctp.chunk_data._PACK_STR, buf)
+ eq_(sctp.chunk_data.chunk_type(), res[0])
+ d2_flags = (
+ (self.d2_unordered << 2) |
+ (self.d2_begin << 1) |
+ (self.d2_end << 0))
+ eq_(d2_flags, res[1])
+ eq_(self.d2_length, res[2])
+ eq_(self.d2_tsn, res[3])
+ eq_(self.d2_sid, res[4])
+ eq_(self.d2_seq, res[5])
+ eq_(self.d2_payload_id, res[6])
+ eq_(self.d2_payload_data,
+ buf[sctp.chunk_data._MIN_LEN:
+ sctp.chunk_data._MIN_LEN + 10])
+
+ def test_build_sctp(self):
+ eth = ethernet.ethernet('00:aa:aa:aa:aa:aa', '00:bb:bb:bb:bb:bb',
+ ether.ETH_TYPE_IP)
+ ip4 = ipv4.ipv4(4, 5, 16, 0, 0, 2, 0, 64, inet.IPPROTO_SCTP, 0,
+ '192.168.1.1', '10.144.1.1')
+ pkt = eth / ip4 / self.sc
+
+ eth = pkt.get_protocol(ethernet.ethernet)
+ ok_(eth)
+ eq_(eth.ethertype, ether.ETH_TYPE_IP)
+
+ ip4 = pkt.get_protocol(ipv4.ipv4)
+ ok_(ip4)
+ eq_(ip4.proto, inet.IPPROTO_SCTP)
+
+ sc = pkt.get_protocol(sctp.sctp)
+ ok_(sc)
+ eq_(sc, self.sc)
+
+ def test_build_sctp_with_data(self):
+ self.setUp_with_data()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_init(self):
+ self.setUp_with_init()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_init_ack(self):
+ self.setUp_with_init_ack()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_sack(self):
+ self.setUp_with_sack()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_heartbeat(self):
+ self.setUp_with_heartbeat()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_heartbeat_ack(self):
+ self.setUp_with_heartbeat_ack()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_abort(self):
+ self.setUp_with_abort()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_shutdown(self):
+ self.setUp_with_shutdown()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_shutdown_ack(self):
+ self.setUp_with_shutdown_ack()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_error(self):
+ self.setUp_with_error()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_cookie_echo(self):
+ self.setUp_with_cookie_echo()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_cookie_ack(self):
+ self.setUp_with_cookie_ack()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_ecn_echo(self):
+ self.setUp_with_ecn_echo()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_cwr(self):
+ self.setUp_with_cwr()
+ self.test_build_sctp()
+
+ def test_build_sctp_with_shutdown_complete(self):
+ self.setUp_with_shutdown_complete()
+ self.test_build_sctp()
+
+ def tset_build_sctp_with_multi_chunks(self):
+ self.setUp_with_multi_chunks()
+ self.test_build_sctp()
+
+ def test_to_string(self):
+ sctp_values = {'src_port': self.src_port,
+ 'dst_port': self.dst_port,
+ 'vtag': self.vtag,
+ 'csum': self.csum,
+ 'chunks': self.chunks}
+ _sctp_str = ','.join(['%s=%s' % (k, sctp_values[k])
+ for k, _ in inspect.getmembers(self.sc)
+ if k in sctp_values])
+ sctp_str = '%s(%s)' % (sctp.sctp.__name__, _sctp_str)
+
+ eq_(str(self.sc), sctp_str)
+ eq_(repr(self.sc), sctp_str)
+
+ def test_to_string_with_data(self):
+ self.setUp_with_data()
+ self.test_to_string()
+
+ def test_to_string_with_init(self):
+ self.setUp_with_init()
+ self.test_to_string()
+
+ def test_to_string_with_init_ack(self):
+ self.setUp_with_init_ack()
+ self.test_to_string()
+
+ def test_to_string_with_sack(self):
+ self.setUp_with_sack()
+ self.test_to_string()
+
+ def test_to_string_with_heartbeat(self):
+ self.setUp_with_heartbeat()
+ self.test_to_string()
+
+ def test_to_string_with_heartbeat_ack(self):
+ self.setUp_with_heartbeat_ack()
+ self.test_to_string()
+
+ def test_to_string_with_abort(self):
+ self.setUp_with_abort()
+ self.test_to_string()
+
+ def test_to_string_with_shutdown(self):
+ self.setUp_with_shutdown()
+ self.test_to_string()
+
+ def test_to_string_with_shutdown_ack(self):
+ self.setUp_with_shutdown_ack()
+ self.test_to_string()
+
+ def test_to_string_with_error(self):
+ self.setUp_with_error()
+ self.test_to_string()
+
+ def test_to_string_with_cookie_echo(self):
+ self.setUp_with_cookie_echo()
+ self.test_to_string()
+
+ def test_to_string_with_cookie_ack(self):
+ self.setUp_with_cookie_ack()
+ self.test_to_string()
+
+ def test_to_string_with_ecn_echo(self):
+ self.setUp_with_ecn_echo()
+ self.test_to_string()
+
+ def test_to_string_with_cwr(self):
+ self.setUp_with_cwr()
+ self.test_to_string()
+
+ def test_to_string_with_shutdown_complete(self):
+ self.setUp_with_shutdown_complete()
+ self.test_to_string()
+
+ def test_to_string_with_multi_chunks(self):
+ self.setUp_with_multi_chunks()
+ self.test_to_string()
+
+ def test_json(self):
+ jsondict = self.sc.to_jsondict()
+ sc = sctp.sctp.from_jsondict(jsondict['sctp'])
+ eq_(str(self.sc), str(sc))
+
+ def test_json_with_data(self):
+ self.setUp_with_data()
+ self.test_json()
+
+ def test_json_with_init(self):
+ self.setUp_with_init()
+ self.test_json()
+
+ def test_json_with_init_ack(self):
+ self.setUp_with_init_ack()
+ self.test_json()
+
+ def test_json_with_sack(self):
+ self.setUp_with_sack()
+ self.test_json()
+
+ def test_json_with_heartbeat(self):
+ self.setUp_with_heartbeat()
+ self.test_json()
+
+ def test_json_with_heartbeat_ack(self):
+ self.setUp_with_heartbeat_ack()
+ self.test_json()
+
+ def test_json_with_abort(self):
+ self.setUp_with_abort()
+ self.test_json()
+
+ def test_json_with_shutdown(self):
+ self.setUp_with_shutdown()
+ self.test_json()
+
+ def test_json_with_shutdown_ack(self):
+ self.setUp_with_shutdown_ack()
+ self.test_json()
+
+ def test_json_with_error(self):
+ self.setUp_with_error()
+ self.test_json()
+
+ def test_json_with_cookie_echo(self):
+ self.setUp_with_cookie_echo()
+ self.test_json()
+
+ def test_json_with_cookie_ack(self):
+ self.setUp_with_cookie_ack()
+ self.test_json()
+
+ def test_json_with_ecn_echo(self):
+ self.setUp_with_ecn_echo()
+ self.test_json()
+
+ def test_json_with_cwr(self):
+ self.setUp_with_cwr()
+ self.test_json()
+
+ def test_json_with_shutdown_complete(self):
+ self.setUp_with_shutdown_complete()
+ self.test_json()
+
+ def test_json_with_multi_chunks(self):
+ self.setUp_with_multi_chunks()
+ self.test_json()
diff --git a/tests/unit/packet/test_slow.py b/tests/unit/packet/test_slow.py
new file mode 100644
index 00000000..9e077fd2
--- /dev/null
+++ b/tests/unit/packet/test_slow.py
@@ -0,0 +1,1104 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import copy
+import logging
+from struct import pack, unpack_from
+import unittest
+
+from nose.tools import ok_, eq_, raises
+from ryu.ofproto import ether
+from ryu.lib.packet.ethernet import ethernet
+from ryu.lib.packet.packet import Packet
+from ryu.lib import addrconv
+from ryu.lib.packet.slow import slow, lacp
+from ryu.lib.packet.slow import SLOW_PROTOCOL_MULTICAST
+from ryu.lib.packet.slow import SLOW_SUBTYPE_LACP
+from ryu.lib.packet.slow import SLOW_SUBTYPE_MARKER
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_slow(unittest.TestCase):
+ """ Test case for Slow Protocol
+ """
+ def setUp(self):
+ self.subtype = SLOW_SUBTYPE_LACP
+ self.version = lacp.LACP_VERSION_NUMBER
+ self.actor_tag = lacp.LACP_TLV_TYPE_ACTOR
+ self.actor_length = 20
+ self.actor_system_priority = 65534
+ self.actor_system = '00:07:0d:af:f4:54'
+ self.actor_key = 1
+ self.actor_port_priority = 65535
+ self.actor_port = 1
+ self.actor_state_activity = lacp.LACP_STATE_ACTIVE
+ self.actor_state_timeout = lacp.LACP_STATE_LONG_TIMEOUT
+ self.actor_state_aggregation = lacp.LACP_STATE_AGGREGATEABLE
+ self.actor_state_synchronization = lacp.LACP_STATE_IN_SYNC
+ self.actor_state_collecting = lacp.LACP_STATE_COLLECTING_ENABLED
+ self.actor_state_distributing = lacp.LACP_STATE_DISTRIBUTING_ENABLED
+ self.actor_state_defaulted = lacp.LACP_STATE_OPERATIONAL_PARTNER
+ self.actor_state_expired = lacp.LACP_STATE_EXPIRED
+ self.actor_state = (
+ (self.actor_state_activity << 0) |
+ (self.actor_state_timeout << 1) |
+ (self.actor_state_aggregation << 2) |
+ (self.actor_state_synchronization << 3) |
+ (self.actor_state_collecting << 4) |
+ (self.actor_state_distributing << 5) |
+ (self.actor_state_defaulted << 6) |
+ (self.actor_state_expired << 7))
+ self.partner_tag = lacp.LACP_TLV_TYPE_PARTNER
+ self.partner_length = 20
+ self.partner_system_priority = 0
+ self.partner_system = '00:00:00:00:00:00'
+ self.partner_key = 0
+ self.partner_port_priority = 0
+ self.partner_port = 0
+ self.partner_state_activity = 0
+ self.partner_state_timeout = lacp.LACP_STATE_SHORT_TIMEOUT
+ self.partner_state_aggregation = 0
+ self.partner_state_synchronization = 0
+ self.partner_state_collecting = 0
+ self.partner_state_distributing = 0
+ self.partner_state_defaulted = 0
+ self.partner_state_expired = 0
+ self.partner_state = (
+ (self.partner_state_activity << 0) |
+ (self.partner_state_timeout << 1) |
+ (self.partner_state_aggregation << 2) |
+ (self.partner_state_synchronization << 3) |
+ (self.partner_state_collecting << 4) |
+ (self.partner_state_distributing << 5) |
+ (self.partner_state_defaulted << 6) |
+ (self.partner_state_expired << 7))
+ self.collector_tag = lacp.LACP_TLV_TYPE_COLLECTOR
+ self.collector_length = 16
+ self.collector_max_delay = 0
+ self.terminator_tag = lacp.LACP_TLV_TYPE_TERMINATOR
+ self.terminator_length = 0
+
+ self.head_fmt = lacp._HLEN_PACK_STR
+ self.head_len = lacp._HLEN_PACK_LEN
+ self.act_fmt = lacp._ACTPRT_INFO_PACK_STR
+ self.act_len = lacp._ACTPRT_INFO_PACK_LEN
+ self.prt_fmt = lacp._ACTPRT_INFO_PACK_STR
+ self.prt_len = lacp._ACTPRT_INFO_PACK_LEN
+ self.col_fmt = lacp._COL_INFO_PACK_STR
+ self.col_len = lacp._COL_INFO_PACK_LEN
+ self.trm_fmt = lacp._TRM_PACK_STR
+ self.trm_len = lacp._TRM_PACK_LEN
+ self.length = lacp._ALL_PACK_LEN
+
+ self.head_buf = pack(self.head_fmt,
+ self.subtype,
+ self.version)
+ self.act_buf = pack(self.act_fmt,
+ self.actor_tag,
+ self.actor_length,
+ self.actor_system_priority,
+ addrconv.mac.text_to_bin(self.actor_system),
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state)
+ self.prt_buf = pack(self.prt_fmt,
+ self.partner_tag,
+ self.partner_length,
+ self.partner_system_priority,
+ addrconv.mac.text_to_bin(self.partner_system),
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state)
+ self.col_buf = pack(self.col_fmt,
+ self.collector_tag,
+ self.collector_length,
+ self.collector_max_delay)
+ self.trm_buf = pack(self.trm_fmt,
+ self.terminator_tag,
+ self.terminator_length)
+
+ self.buf = self.head_buf + self.act_buf + self.prt_buf + \
+ self.col_buf + self.trm_buf
+
+ def tearDown(self):
+ pass
+
+ def test_parser(self):
+ slow.parser(self.buf)
+
+ def test_not_implemented_subtype(self):
+ not_implemented_buf = pack(
+ slow._PACK_STR, SLOW_SUBTYPE_MARKER) + self.buf[1:]
+ (instance, nexttype, last) = slow.parser(not_implemented_buf)
+ assert None == instance
+ assert None == nexttype
+ assert None != last
+
+ def test_invalid_subtype(self):
+ invalid_buf = b'\xff' + self.buf[1:]
+ (instance, nexttype, last) = slow.parser(invalid_buf)
+ assert None == instance
+ assert None == nexttype
+ assert None != last
+
+
+class Test_lacp(unittest.TestCase):
+ """ Test case for lacp
+ """
+
+ def setUp(self):
+ self.subtype = SLOW_SUBTYPE_LACP
+ self.version = lacp.LACP_VERSION_NUMBER
+ self.actor_tag = lacp.LACP_TLV_TYPE_ACTOR
+ self.actor_length = 20
+ self.actor_system_priority = 65534
+ self.actor_system = '00:07:0d:af:f4:54'
+ self.actor_key = 1
+ self.actor_port_priority = 65535
+ self.actor_port = 1
+ self.actor_state_activity = lacp.LACP_STATE_ACTIVE
+ self.actor_state_timeout = lacp.LACP_STATE_LONG_TIMEOUT
+ self.actor_state_aggregation = lacp.LACP_STATE_AGGREGATEABLE
+ self.actor_state_synchronization = lacp.LACP_STATE_IN_SYNC
+ self.actor_state_collecting = lacp.LACP_STATE_COLLECTING_ENABLED
+ self.actor_state_distributing = lacp.LACP_STATE_DISTRIBUTING_ENABLED
+ self.actor_state_defaulted = lacp.LACP_STATE_OPERATIONAL_PARTNER
+ self.actor_state_expired = lacp.LACP_STATE_EXPIRED
+ self.actor_state = (
+ (self.actor_state_activity << 0) |
+ (self.actor_state_timeout << 1) |
+ (self.actor_state_aggregation << 2) |
+ (self.actor_state_synchronization << 3) |
+ (self.actor_state_collecting << 4) |
+ (self.actor_state_distributing << 5) |
+ (self.actor_state_defaulted << 6) |
+ (self.actor_state_expired << 7))
+ self.partner_tag = lacp.LACP_TLV_TYPE_PARTNER
+ self.partner_length = 20
+ self.partner_system_priority = 0
+ self.partner_system = '00:00:00:00:00:00'
+ self.partner_key = 0
+ self.partner_port_priority = 0
+ self.partner_port = 0
+ self.partner_state_activity = 0
+ self.partner_state_timeout = lacp.LACP_STATE_SHORT_TIMEOUT
+ self.partner_state_aggregation = 0
+ self.partner_state_synchronization = 0
+ self.partner_state_collecting = 0
+ self.partner_state_distributing = 0
+ self.partner_state_defaulted = 0
+ self.partner_state_expired = 0
+ self.partner_state = (
+ (self.partner_state_activity << 0) |
+ (self.partner_state_timeout << 1) |
+ (self.partner_state_aggregation << 2) |
+ (self.partner_state_synchronization << 3) |
+ (self.partner_state_collecting << 4) |
+ (self.partner_state_distributing << 5) |
+ (self.partner_state_defaulted << 6) |
+ (self.partner_state_expired << 7))
+ self.collector_tag = lacp.LACP_TLV_TYPE_COLLECTOR
+ self.collector_length = 16
+ self.collector_max_delay = 0
+ self.terminator_tag = lacp.LACP_TLV_TYPE_TERMINATOR
+ self.terminator_length = 0
+
+ self.head_fmt = lacp._HLEN_PACK_STR
+ self.head_len = lacp._HLEN_PACK_LEN
+ self.act_fmt = lacp._ACTPRT_INFO_PACK_STR
+ self.act_len = lacp._ACTPRT_INFO_PACK_LEN
+ self.prt_fmt = lacp._ACTPRT_INFO_PACK_STR
+ self.prt_len = lacp._ACTPRT_INFO_PACK_LEN
+ self.col_fmt = lacp._COL_INFO_PACK_STR
+ self.col_len = lacp._COL_INFO_PACK_LEN
+ self.trm_fmt = lacp._TRM_PACK_STR
+ self.trm_len = lacp._TRM_PACK_LEN
+ self.length = lacp._ALL_PACK_LEN
+
+ self.head_buf = pack(self.head_fmt,
+ self.subtype,
+ self.version)
+ self.act_buf = pack(self.act_fmt,
+ self.actor_tag,
+ self.actor_length,
+ self.actor_system_priority,
+ addrconv.mac.text_to_bin(self.actor_system),
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state)
+ self.prt_buf = pack(self.prt_fmt,
+ self.partner_tag,
+ self.partner_length,
+ self.partner_system_priority,
+ addrconv.mac.text_to_bin(self.partner_system),
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state)
+ self.col_buf = pack(self.col_fmt,
+ self.collector_tag,
+ self.collector_length,
+ self.collector_max_delay)
+ self.trm_buf = pack(self.trm_fmt,
+ self.terminator_tag,
+ self.terminator_length)
+
+ self.buf = self.head_buf + self.act_buf + self.prt_buf + \
+ self.col_buf + self.trm_buf
+
+ self.l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+
+ def tearDown(self):
+ pass
+
+ def find_protocol(self, pkt, name):
+ for p in pkt.protocols:
+ if p.protocol_name == name:
+ return p
+
+ def test_init(self):
+ eq_(self.subtype, self.l._subtype)
+ eq_(self.version, self.l.version)
+ eq_(self.actor_tag, self.l._actor_tag)
+ eq_(self.actor_length, self.l._actor_length)
+ eq_(self.actor_system_priority, self.l.actor_system_priority)
+ eq_(self.actor_system, self.l.actor_system)
+ eq_(self.actor_key, self.l.actor_key)
+ eq_(self.actor_port_priority, self.l.actor_port_priority)
+ eq_(self.actor_port, self.l.actor_port)
+ eq_(self.actor_state_activity, self.l.actor_state_activity)
+ eq_(self.actor_state_timeout, self.l.actor_state_timeout)
+ eq_(self.actor_state_aggregation,
+ self.l.actor_state_aggregation)
+ eq_(self.actor_state_synchronization,
+ self.l.actor_state_synchronization)
+ eq_(self.actor_state_collecting,
+ self.l.actor_state_collecting)
+ eq_(self.actor_state_distributing,
+ self.l.actor_state_distributing)
+ eq_(self.actor_state_defaulted, self.l.actor_state_defaulted)
+ eq_(self.actor_state_expired, self.l.actor_state_expired)
+ eq_(self.actor_state, self.l._actor_state)
+ eq_(self.partner_tag, self.l._partner_tag)
+ eq_(self.partner_length, self.l._partner_length)
+ eq_(self.partner_system_priority,
+ self.l.partner_system_priority)
+ eq_(self.partner_system, self.l.partner_system)
+ eq_(self.partner_key, self.l.partner_key)
+ eq_(self.partner_port_priority, self.l.partner_port_priority)
+ eq_(self.partner_port, self.l.partner_port)
+ eq_(self.partner_state_activity, self.l.partner_state_activity)
+ eq_(self.partner_state_timeout, self.l.partner_state_timeout)
+ eq_(self.partner_state_aggregation,
+ self.l.partner_state_aggregation)
+ eq_(self.partner_state_synchronization,
+ self.l.partner_state_synchronization)
+ eq_(self.partner_state_collecting,
+ self.l.partner_state_collecting)
+ eq_(self.partner_state_distributing,
+ self.l.partner_state_distributing)
+ eq_(self.partner_state_defaulted,
+ self.l.partner_state_defaulted)
+ eq_(self.partner_state_expired, self.l.partner_state_expired)
+ eq_(self.partner_state, self.l._partner_state)
+ eq_(self.collector_tag, self.l._collector_tag)
+ eq_(self.collector_length, self.l._collector_length)
+ eq_(self.collector_max_delay, self.l.collector_max_delay)
+ eq_(self.terminator_tag, self.l._terminator_tag)
+ eq_(self.terminator_length, self.l._terminator_length)
+
+ def test_parser(self):
+ _res = self.l.parser(self.buf)
+ if type(_res) is tuple:
+ res = _res[0]
+ else:
+ res = _res
+
+ eq_(res._subtype, self.subtype)
+ eq_(res.version, self.version)
+ eq_(res._actor_tag, self.actor_tag)
+ eq_(res._actor_length, self.actor_length)
+ eq_(res.actor_system_priority, self.actor_system_priority)
+ eq_(res.actor_system, self.actor_system)
+ eq_(res.actor_key, self.actor_key)
+ eq_(res.actor_port_priority, self.actor_port_priority)
+ eq_(res.actor_port, self.actor_port)
+ eq_(res.actor_state_activity, self.actor_state_activity)
+ eq_(res.actor_state_timeout, self.actor_state_timeout)
+ eq_(res.actor_state_aggregation, self.actor_state_aggregation)
+ eq_(res.actor_state_synchronization,
+ self.actor_state_synchronization)
+ eq_(res.actor_state_collecting, self.actor_state_collecting)
+ eq_(res.actor_state_distributing, self.actor_state_distributing)
+ eq_(res.actor_state_defaulted, self.actor_state_defaulted)
+ eq_(res.actor_state_expired, self.actor_state_expired)
+ eq_(res._actor_state, self.actor_state)
+ eq_(res._partner_tag, self.partner_tag)
+ eq_(res._partner_length, self.partner_length)
+ eq_(res.partner_system_priority, self.partner_system_priority)
+ eq_(res.partner_system, self.partner_system)
+ eq_(res.partner_key, self.partner_key)
+ eq_(res.partner_port_priority, self.partner_port_priority)
+ eq_(res.partner_port, self.partner_port)
+ eq_(res.partner_state_activity, self.partner_state_activity)
+ eq_(res.partner_state_timeout, self.partner_state_timeout)
+ eq_(res.partner_state_aggregation,
+ self.partner_state_aggregation)
+ eq_(res.partner_state_synchronization,
+ self.partner_state_synchronization)
+ eq_(res.partner_state_collecting, self.partner_state_collecting)
+ eq_(res.partner_state_distributing,
+ self.partner_state_distributing)
+ eq_(res.partner_state_defaulted, self.partner_state_defaulted)
+ eq_(res.partner_state_expired, self.partner_state_expired)
+ eq_(res._partner_state, self.partner_state)
+ eq_(res._collector_tag, self.collector_tag)
+ eq_(res._collector_length, self.collector_length)
+ eq_(res.collector_max_delay, self.collector_max_delay)
+ eq_(res._terminator_tag, self.terminator_tag)
+ eq_(res._terminator_length, self.terminator_length)
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.l.serialize(data, prev)
+
+ offset = 0
+ head_res = unpack_from(self.head_fmt, buf, offset)
+ offset += self.head_len
+ act_res = unpack_from(self.act_fmt, buf, offset)
+ offset += self.act_len
+ prt_res = unpack_from(self.prt_fmt, buf, offset)
+ offset += self.prt_len
+ col_res = unpack_from(self.col_fmt, buf, offset)
+ offset += self.col_len
+ trm_res = unpack_from(self.trm_fmt, buf, offset)
+
+ eq_(head_res[0], self.subtype)
+ eq_(head_res[1], self.version)
+
+ eq_(act_res[0], self.actor_tag)
+ eq_(act_res[1], self.actor_length)
+ eq_(act_res[2], self.actor_system_priority)
+ eq_(act_res[3], addrconv.mac.text_to_bin(self.actor_system))
+ eq_(act_res[4], self.actor_key)
+ eq_(act_res[5], self.actor_port_priority)
+ eq_(act_res[6], self.actor_port)
+ eq_(act_res[7], self.actor_state)
+
+ eq_(prt_res[0], self.partner_tag)
+ eq_(prt_res[1], self.partner_length)
+ eq_(prt_res[2], self.partner_system_priority)
+ eq_(prt_res[3], addrconv.mac.text_to_bin(self.partner_system))
+ eq_(prt_res[4], self.partner_key)
+ eq_(prt_res[5], self.partner_port_priority)
+ eq_(prt_res[6], self.partner_port)
+ eq_(prt_res[7], self.partner_state)
+
+ eq_(col_res[0], self.collector_tag)
+ eq_(col_res[1], self.collector_length)
+ eq_(col_res[2], self.collector_max_delay)
+
+ eq_(trm_res[0], self.terminator_tag)
+ eq_(trm_res[1], self.terminator_length)
+
+ def _build_lacp(self):
+ ethertype = ether.ETH_TYPE_SLOW
+ dst = SLOW_PROTOCOL_MULTICAST
+ e = ethernet(dst, self.actor_system, ethertype)
+ p = Packet()
+
+ p.add_protocol(e)
+ p.add_protocol(self.l)
+ p.serialize()
+ return p
+
+ def test_build_lacp(self):
+ p = self._build_lacp()
+
+ e = self.find_protocol(p, "ethernet")
+ ok_(e)
+ eq_(e.ethertype, ether.ETH_TYPE_SLOW)
+
+ l = self.find_protocol(p, "lacp")
+ ok_(l)
+
+ eq_(l._subtype, self.subtype)
+ eq_(l.version, self.version)
+ eq_(l._actor_tag, self.actor_tag)
+ eq_(l._actor_length, self.actor_length)
+ eq_(l.actor_system_priority, self.actor_system_priority)
+ eq_(l.actor_system, self.actor_system)
+ eq_(l.actor_key, self.actor_key)
+ eq_(l.actor_port_priority, self.actor_port_priority)
+ eq_(l.actor_port, self.actor_port)
+ eq_(l.actor_state_activity, self.actor_state_activity)
+ eq_(l.actor_state_timeout, self.actor_state_timeout)
+ eq_(l.actor_state_aggregation, self.actor_state_aggregation)
+ eq_(l.actor_state_synchronization,
+ self.actor_state_synchronization)
+ eq_(l.actor_state_collecting, self.actor_state_collecting)
+ eq_(l.actor_state_distributing, self.actor_state_distributing)
+ eq_(l.actor_state_defaulted, self.actor_state_defaulted)
+ eq_(l.actor_state_expired, self.actor_state_expired)
+ eq_(l._actor_state, self.actor_state)
+ eq_(l._partner_tag, self.partner_tag)
+ eq_(l._partner_length, self.partner_length)
+ eq_(l.partner_system_priority, self.partner_system_priority)
+ eq_(l.partner_system, self.partner_system)
+ eq_(l.partner_key, self.partner_key)
+ eq_(l.partner_port_priority, self.partner_port_priority)
+ eq_(l.partner_port, self.partner_port)
+ eq_(l.partner_state_activity, self.partner_state_activity)
+ eq_(l.partner_state_timeout, self.partner_state_timeout)
+ eq_(l.partner_state_aggregation, self.partner_state_aggregation)
+ eq_(l.partner_state_synchronization,
+ self.partner_state_synchronization)
+ eq_(l.partner_state_collecting, self.partner_state_collecting)
+ eq_(l.partner_state_distributing,
+ self.partner_state_distributing)
+ eq_(l.partner_state_defaulted, self.partner_state_defaulted)
+ eq_(l.partner_state_expired, self.partner_state_expired)
+ eq_(l._partner_state, self.partner_state)
+ eq_(l._collector_tag, self.collector_tag)
+ eq_(l._collector_length, self.collector_length)
+ eq_(l.collector_max_delay, self.collector_max_delay)
+ eq_(l._terminator_tag, self.terminator_tag)
+ eq_(l._terminator_length, self.terminator_length)
+
+ @raises(Exception)
+ def test_malformed_lacp(self):
+ m_short_buf = self.buf[1:self.length]
+ slow.parser(m_short_buf)
+
+ @raises(Exception)
+ def test_invalid_subtype(self):
+ invalid_lacv = copy.deepcopy(self.l)
+ invalid_lacv.subtype = 0xff
+ invalid_buf = invalid_lacv.serialize()
+ slow.parser(invalid_buf)
+
+ @raises(Exception)
+ def test_invalid_version(self):
+ invalid_lacv = copy.deepcopy(self.l)
+ invalid_lacv.version = 0xff
+ invalid_buf = invalid_lacv.serialize()
+ slow.parser(invalid_buf)
+
+ @raises(Exception)
+ def test_invalid_actor_tag(self):
+ invalid_lacv = copy.deepcopy(self.l)
+ invalid_lacv.actor_tag = 0x04
+ invalid_buf = invalid_lacv.serialize()
+ slow.parser(invalid_buf)
+
+ @raises(Exception)
+ def test_invalid_actor_length(self):
+ invalid_lacv = copy.deepcopy(self.l)
+ invalid_lacv.actor_length = 50
+ invalid_buf = invalid_lacv.serialize()
+ slow.parser(invalid_buf)
+
+ @raises(Exception)
+ def test_invalid_partner_tag(self):
+ invalid_lacv = copy.deepcopy(self.l)
+ invalid_lacv.partner_tag = 0x01
+ invalid_buf = invalid_lacv.serialize()
+ slow.parser(invalid_buf)
+
+ @raises(Exception)
+ def test_invalid_partner_length(self):
+ invalid_lacv = copy.deepcopy(self.l)
+ invalid_lacv.partner_length = 0
+ invalid_buf = invalid_lacv.serialize()
+ slow.parser(invalid_buf)
+
+ @raises(Exception)
+ def test_invalid_collector_tag(self):
+ invalid_lacv = copy.deepcopy(self.l)
+ invalid_lacv.collector_tag = 0x00
+ invalid_buf = invalid_lacv.serialize()
+ slow.parser(invalid_buf)
+
+ @raises(Exception)
+ def test_invalid_collector_length(self):
+ invalid_lacv = copy.deepcopy(self.l)
+ invalid_lacv.collector_length = 20
+ invalid_buf = invalid_lacv.serialize()
+ slow.parser(invalid_buf)
+
+ @raises(Exception)
+ def test_invalid_terminator_tag(self):
+ invalid_lacv = copy.deepcopy(self.l)
+ invalid_lacv.terminator_tag = 0x04
+ invalid_buf = invalid_lacv.serialize()
+ slow.parser(invalid_buf)
+
+ @raises(Exception)
+ def test_invalid_terminator_length(self):
+ invalid_lacv = copy.deepcopy(self.l)
+ invalid_lacv.terminator_length = self.trm_len
+ invalid_buf = invalid_lacv.serialize()
+ slow.parser(invalid_buf)
+
+ @raises(Exception)
+ def test_invalid_actor_state_activity(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ 2,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_actor_state_timeout(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ 2,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_actor_state_aggregation(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ 2,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_actor_state_synchronization(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ 2,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_actor_state_collecting(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ 2,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_actor_state_distributing(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ 2,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_actor_state_defaulted(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ 2,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_actor_state_expired(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ 2,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_partner_state_activity(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ -1,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_partner_state_timeout(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ -1,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_partner_state_aggregation(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ -1,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_partner_state_synchronization(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ -1,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_partner_state_collecting(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ -1,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_partner_state_distributing(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ -1,
+ self.partner_state_defaulted,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_partner_state_defaulted(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ -1,
+ self.partner_state_expired,
+ self.collector_max_delay)
+ l.serialize()
+
+ @raises(Exception)
+ def test_invalid_partner_state_expired(self):
+ l = lacp(self.version,
+ self.actor_system_priority,
+ self.actor_system,
+ self.actor_key,
+ self.actor_port_priority,
+ self.actor_port,
+ self.actor_state_activity,
+ self.actor_state_timeout,
+ self.actor_state_aggregation,
+ self.actor_state_synchronization,
+ self.actor_state_collecting,
+ self.actor_state_distributing,
+ self.actor_state_defaulted,
+ self.actor_state_expired,
+ self.partner_system_priority,
+ self.partner_system,
+ self.partner_key,
+ self.partner_port_priority,
+ self.partner_port,
+ self.partner_state_activity,
+ self.partner_state_timeout,
+ self.partner_state_aggregation,
+ self.partner_state_synchronization,
+ self.partner_state_collecting,
+ self.partner_state_distributing,
+ self.partner_state_defaulted,
+ -1,
+ self.collector_max_delay)
+ l.serialize()
+
+ def test_json(self):
+ jsondict = self.l.to_jsondict()
+ l = lacp.from_jsondict(jsondict['lacp'])
+ eq_(str(self.l), str(l))
diff --git a/tests/unit/packet/test_tcp.py b/tests/unit/packet/test_tcp.py
new file mode 100644
index 00000000..7224df0e
--- /dev/null
+++ b/tests/unit/packet/test_tcp.py
@@ -0,0 +1,267 @@
+# Copyright (C) 2012-2015 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import six
+import struct
+from struct import *
+from nose.tools import *
+from ryu.ofproto import inet
+from ryu.lib.packet import tcp
+from ryu.lib.packet.ipv4 import ipv4
+from ryu.lib.packet import packet_utils
+from ryu.lib import addrconv
+
+
+LOG = logging.getLogger('test_tcp')
+
+
+class Test_tcp(unittest.TestCase):
+ """ Test case for tcp
+ """
+ src_port = 6431
+ dst_port = 8080
+ seq = 5
+ ack = 1
+ offset = 6
+ bits = 0b101010
+ window_size = 2048
+ csum = 12345
+ urgent = 128
+ option = b'\x01\x02\x03\x04'
+
+ t = tcp.tcp(src_port, dst_port, seq, ack, offset, bits,
+ window_size, csum, urgent, option)
+
+ buf = pack(tcp.tcp._PACK_STR, src_port, dst_port, seq, ack,
+ offset << 4, bits, window_size, csum, urgent)
+ buf += option
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.src_port, self.t.src_port)
+ eq_(self.dst_port, self.t.dst_port)
+ eq_(self.seq, self.t.seq)
+ eq_(self.ack, self.t.ack)
+ eq_(self.offset, self.t.offset)
+ eq_(self.bits, self.t.bits)
+ eq_(self.window_size, self.t.window_size)
+ eq_(self.csum, self.t.csum)
+ eq_(self.urgent, self.t.urgent)
+ eq_(self.option, self.t.option)
+
+ def test_parser(self):
+ r1, r2, _ = self.t.parser(self.buf)
+
+ eq_(self.src_port, r1.src_port)
+ eq_(self.dst_port, r1.dst_port)
+ eq_(self.seq, r1.seq)
+ eq_(self.ack, r1.ack)
+ eq_(self.offset, r1.offset)
+ eq_(self.bits, r1.bits)
+ eq_(self.window_size, r1.window_size)
+ eq_(self.csum, r1.csum)
+ eq_(self.urgent, r1.urgent)
+ eq_(self.option, r1.option)
+ eq_(None, r2)
+
+ def test_serialize(self):
+ offset = 5
+ csum = 0
+
+ src_ip = '192.168.10.1'
+ dst_ip = '192.168.100.1'
+ prev = ipv4(4, 5, 0, 0, 0, 0, 0, 64,
+ inet.IPPROTO_TCP, 0, src_ip, dst_ip)
+
+ t = tcp.tcp(self.src_port, self.dst_port, self.seq, self.ack,
+ offset, self.bits, self.window_size, csum, self.urgent)
+ buf = t.serialize(bytearray(), prev)
+ res = struct.unpack(tcp.tcp._PACK_STR, six.binary_type(buf))
+
+ eq_(res[0], self.src_port)
+ eq_(res[1], self.dst_port)
+ eq_(res[2], self.seq)
+ eq_(res[3], self.ack)
+ eq_(res[4], offset << 4)
+ eq_(res[5], self.bits)
+ eq_(res[6], self.window_size)
+ eq_(res[8], self.urgent)
+
+ # test __len__
+ # offset indicates the number of 32 bit (= 4 bytes)
+ # words in the TCP Header.
+ # So, we compare len(tcp) with offset * 4, here.
+ eq_(offset * 4, len(t))
+
+ # checksum
+ ph = struct.pack('!4s4sBBH',
+ addrconv.ipv4.text_to_bin(src_ip),
+ addrconv.ipv4.text_to_bin(dst_ip), 0, 6, offset * 4)
+ d = ph + buf
+ s = packet_utils.checksum(d)
+ eq_(0, s)
+
+ def test_serialize_option(self):
+ # prepare test data
+ offset = 0
+ csum = 0
+ option = [
+ tcp.TCPOptionMaximumSegmentSize(max_seg_size=1460),
+ tcp.TCPOptionSACKPermitted(),
+ tcp.TCPOptionTimestamps(ts_val=287454020, ts_ecr=1432778632),
+ tcp.TCPOptionNoOperation(),
+ tcp.TCPOptionWindowScale(shift_cnt=9),
+ ]
+ option_buf = (
+ b'\x02\x04\x05\xb4'
+ b'\x04\x02'
+ b'\x08\x0a\x11\x22\x33\x44\x55\x66\x77\x88'
+ b'\x01'
+ b'\x03\x03\x09'
+ )
+ prev = ipv4(4, 5, 0, 0, 0, 0, 0, 64,
+ inet.IPPROTO_TCP, 0, '192.168.10.1', '192.168.100.1')
+
+ # test serializer
+ t = tcp.tcp(self.src_port, self.dst_port, self.seq, self.ack,
+ offset, self.bits, self.window_size, csum, self.urgent,
+ option)
+ buf = t.serialize(bytearray(), prev)
+ r_option_buf = buf[tcp.tcp._MIN_LEN:tcp.tcp._MIN_LEN + len(option_buf)]
+ eq_(option_buf, r_option_buf)
+
+ # test parser
+ (r_tcp, _, _) = tcp.tcp.parser(buf)
+ eq_(str(option), str(r_tcp.option))
+
+ @raises(Exception)
+ def test_malformed_tcp(self):
+ m_short_buf = self.buf[1:tcp.tcp._MIN_LEN]
+ tcp.tcp.parser(m_short_buf)
+
+ def test_default_args(self):
+ prev = ipv4(proto=inet.IPPROTO_TCP)
+ t = tcp.tcp()
+ buf = t.serialize(bytearray(), prev)
+ res = struct.unpack(tcp.tcp._PACK_STR, buf)
+
+ eq_(res[0], 1)
+ eq_(res[1], 1)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 5 << 4)
+ eq_(res[5], 0)
+ eq_(res[6], 0)
+ eq_(res[8], 0)
+
+ # with option, without offset
+ t = tcp.tcp(option=[tcp.TCPOptionMaximumSegmentSize(1460)])
+ buf = t.serialize(bytearray(), prev)
+ res = struct.unpack(tcp.tcp._PACK_STR + '4s', buf)
+
+ eq_(res[0], 1)
+ eq_(res[1], 1)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 6 << 4)
+ eq_(res[5], 0)
+ eq_(res[6], 0)
+ eq_(res[8], 0)
+ eq_(res[9], b'\x02\x04\x05\xb4')
+
+ # with option, with long offset
+ t = tcp.tcp(offset=7, option=[tcp.TCPOptionWindowScale(shift_cnt=9)])
+ buf = t.serialize(bytearray(), prev)
+ res = struct.unpack(tcp.tcp._PACK_STR + '8s', buf)
+
+ eq_(res[0], 1)
+ eq_(res[1], 1)
+ eq_(res[2], 0)
+ eq_(res[3], 0)
+ eq_(res[4], 7 << 4)
+ eq_(res[5], 0)
+ eq_(res[6], 0)
+ eq_(res[8], 0)
+ eq_(res[9], b'\x03\x03\x09\x00\x00\x00\x00\x00')
+
+ def test_json(self):
+ jsondict = self.t.to_jsondict()
+ t = tcp.tcp.from_jsondict(jsondict['tcp'])
+ eq_(str(self.t), str(t))
+
+
+class Test_TCPOption(unittest.TestCase):
+ # prepare test data
+ input_options = [
+ tcp.TCPOptionEndOfOptionList(),
+ tcp.TCPOptionNoOperation(),
+ tcp.TCPOptionMaximumSegmentSize(max_seg_size=1460),
+ tcp.TCPOptionWindowScale(shift_cnt=9),
+ tcp.TCPOptionSACKPermitted(),
+ tcp.TCPOptionSACK(blocks=[(1, 2), (3, 4)], length=18),
+ tcp.TCPOptionTimestamps(ts_val=287454020, ts_ecr=1432778632),
+ tcp.TCPOptionUserTimeout(granularity=1, user_timeout=564),
+ tcp.TCPOptionAuthentication(
+ key_id=1, r_next_key_id=2,
+ mac=b'abcdefghijkl', length=16),
+ tcp.TCPOptionUnknown(value=b'foobar', kind=255, length=8),
+ tcp.TCPOptionUnknown(value=b'', kind=255, length=2),
+ ]
+ input_buf = (
+ b'\x00' # End of Option List
+ b'\x01' # No-Operation
+ b'\x02\x04\x05\xb4' # Maximum Segment Size
+ b'\x03\x03\x09' # Window Scale
+ b'\x04\x02' # SACK Permitted
+ b'\x05\x12' # SACK
+ b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04'
+ b'\x08\x0a' # Timestamps
+ b'\x11\x22\x33\x44\x55\x66\x77\x88'
+ b'\x1c\x04\x82\x34' # User Timeout Option
+ b'\x1d\x10\x01\x02' # TCP Authentication Option (TCP-AO)
+ b'abcdefghijkl'
+ b'\xff\x08' # Unknown with body
+ b'foobar'
+ b'\xff\x02' # Unknown
+ )
+
+ def test_serialize(self):
+ output_buf = bytearray()
+ for option in self.input_options:
+ output_buf += option.serialize()
+ eq_(self.input_buf, output_buf)
+
+ def test_parser(self):
+ buf = self.input_buf
+ output_options = []
+ while buf:
+ opt, buf = tcp.TCPOption.parser(buf)
+ output_options.append(opt)
+ eq_(str(self.input_options), str(output_options))
+
+ def test_json(self):
+ for option in self.input_options:
+ json_dict = option.to_jsondict()[option.__class__.__name__]
+ output_option = option.__class__.from_jsondict(json_dict)
+ eq_(str(option), str(output_option))
diff --git a/tests/unit/packet/test_udp.py b/tests/unit/packet/test_udp.py
new file mode 100644
index 00000000..0d7d0aa9
--- /dev/null
+++ b/tests/unit/packet/test_udp.py
@@ -0,0 +1,110 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import struct
+from struct import *
+from nose.tools import *
+from ryu.ofproto import ether, inet
+from ryu.lib.packet.packet import Packet
+from ryu.lib.packet.udp import udp
+from ryu.lib.packet.ipv4 import ipv4
+from ryu.lib.packet import packet_utils
+from ryu.lib import addrconv
+
+
+LOG = logging.getLogger('test_udp')
+
+
+class Test_udp(unittest.TestCase):
+ """ Test case for udp
+ """
+ src_port = 6431
+ dst_port = 8080
+ total_length = 65507
+ csum = 12345
+ u = udp(src_port, dst_port, total_length, csum)
+ buf = pack(udp._PACK_STR, src_port, dst_port, total_length, csum)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.src_port, self.u.src_port)
+ eq_(self.dst_port, self.u.dst_port)
+ eq_(self.total_length, self.u.total_length)
+ eq_(self.csum, self.u.csum)
+
+ def test_parser(self):
+ r1, r2, _ = self.u.parser(self.buf)
+
+ eq_(self.src_port, r1.src_port)
+ eq_(self.dst_port, r1.dst_port)
+ eq_(self.total_length, r1.total_length)
+ eq_(self.csum, r1.csum)
+ eq_(None, r2)
+
+ def test_serialize(self):
+ src_port = 6431
+ dst_port = 8080
+ total_length = 0
+ csum = 0
+
+ src_ip = '192.168.10.1'
+ dst_ip = '192.168.100.1'
+ prev = ipv4(4, 5, 0, 0, 0, 0, 0, 64,
+ inet.IPPROTO_UDP, 0, src_ip, dst_ip)
+
+ u = udp(src_port, dst_port, total_length, csum)
+ buf = u.serialize(bytearray(), prev)
+ res = struct.unpack(udp._PACK_STR, buf)
+
+ eq_(res[0], src_port)
+ eq_(res[1], dst_port)
+ eq_(res[2], struct.calcsize(udp._PACK_STR))
+
+ # checksum
+ ph = struct.pack('!4s4sBBH',
+ addrconv.ipv4.text_to_bin(src_ip),
+ addrconv.ipv4.text_to_bin(dst_ip), 0, 17, res[2])
+ d = ph + buf + bytearray()
+ s = packet_utils.checksum(d)
+ eq_(0, s)
+
+ @raises(Exception)
+ def test_malformed_udp(self):
+ m_short_buf = self.buf[1:udp._MIN_LEN]
+ udp.parser(m_short_buf)
+
+ def test_default_args(self):
+ prev = ipv4(proto=inet.IPPROTO_UDP)
+ u = udp()
+ buf = u.serialize(bytearray(), prev)
+ res = struct.unpack(udp._PACK_STR, buf)
+
+ eq_(res[0], 1)
+ eq_(res[1], 1)
+ eq_(res[2], udp._MIN_LEN)
+
+ def test_json(self):
+ jsondict = self.u.to_jsondict()
+ u = udp.from_jsondict(jsondict['udp'])
+ eq_(str(self.u), str(u))
diff --git a/tests/unit/packet/test_vlan.py b/tests/unit/packet/test_vlan.py
new file mode 100644
index 00000000..b8e3a048
--- /dev/null
+++ b/tests/unit/packet/test_vlan.py
@@ -0,0 +1,265 @@
+# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+import logging
+import struct
+from struct import *
+from nose.tools import *
+from ryu.ofproto import ether, inet
+from ryu.lib.packet.ethernet import ethernet
+from ryu.lib.packet.packet import Packet
+from ryu.lib.packet.ipv4 import ipv4
+from ryu.lib.packet.vlan import vlan
+from ryu.lib.packet.vlan import svlan
+
+
+LOG = logging.getLogger('test_vlan')
+
+
+class Test_vlan(unittest.TestCase):
+ """ Test case for vlan
+ """
+
+ pcp = 0
+ cfi = 0
+ vid = 32
+ tci = pcp << 15 | cfi << 12 | vid
+ ethertype = ether.ETH_TYPE_IP
+
+ buf = pack(vlan._PACK_STR, tci, ethertype)
+
+ v = vlan(pcp, cfi, vid, ethertype)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def find_protocol(self, pkt, name):
+ for p in pkt.protocols:
+ if p.protocol_name == name:
+ return p
+
+ def test_init(self):
+ eq_(self.pcp, self.v.pcp)
+ eq_(self.cfi, self.v.cfi)
+ eq_(self.vid, self.v.vid)
+ eq_(self.ethertype, self.v.ethertype)
+
+ def test_parser(self):
+ res, ptype, _ = self.v.parser(self.buf)
+
+ eq_(res.pcp, self.pcp)
+ eq_(res.cfi, self.cfi)
+ eq_(res.vid, self.vid)
+ eq_(res.ethertype, self.ethertype)
+ eq_(ptype, ipv4)
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.v.serialize(data, prev)
+
+ fmt = vlan._PACK_STR
+ res = struct.unpack(fmt, buf)
+
+ eq_(res[0], self.tci)
+ eq_(res[1], self.ethertype)
+
+ def _build_vlan(self):
+ src_mac = '00:07:0d:af:f4:54'
+ dst_mac = '00:00:00:00:00:00'
+ ethertype = ether.ETH_TYPE_8021Q
+ e = ethernet(dst_mac, src_mac, ethertype)
+
+ version = 4
+ header_length = 20
+ tos = 0
+ total_length = 24
+ identification = 0x8a5d
+ flags = 0
+ offset = 1480
+ ttl = 64
+ proto = inet.IPPROTO_ICMP
+ csum = 0xa7f2
+ src = '131.151.32.21'
+ dst = '131.151.32.129'
+ option = b'TEST'
+ ip = ipv4(version, header_length, tos, total_length, identification,
+ flags, offset, ttl, proto, csum, src, dst, option)
+
+ p = Packet()
+
+ p.add_protocol(e)
+ p.add_protocol(self.v)
+ p.add_protocol(ip)
+ p.serialize()
+
+ return p
+
+ def test_build_vlan(self):
+ p = self._build_vlan()
+
+ e = self.find_protocol(p, "ethernet")
+ ok_(e)
+ eq_(e.ethertype, ether.ETH_TYPE_8021Q)
+
+ v = self.find_protocol(p, "vlan")
+ ok_(v)
+ eq_(v.ethertype, ether.ETH_TYPE_IP)
+
+ ip = self.find_protocol(p, "ipv4")
+ ok_(ip)
+
+ eq_(v.pcp, self.pcp)
+ eq_(v.cfi, self.cfi)
+ eq_(v.vid, self.vid)
+ eq_(v.ethertype, self.ethertype)
+
+ @raises(Exception)
+ def test_malformed_vlan(self):
+ m_short_buf = self.buf[1:vlan._MIN_LEN]
+ vlan.parser(m_short_buf)
+
+ def test_json(self):
+ jsondict = self.v.to_jsondict()
+ v = vlan.from_jsondict(jsondict['vlan'])
+ eq_(str(self.v), str(v))
+
+
+class Test_svlan(unittest.TestCase):
+
+ pcp = 0
+ cfi = 0
+ vid = 32
+ tci = pcp << 15 | cfi << 12 | vid
+ ethertype = ether.ETH_TYPE_8021Q
+
+ buf = pack(svlan._PACK_STR, tci, ethertype)
+
+ sv = svlan(pcp, cfi, vid, ethertype)
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def find_protocol(self, pkt, name):
+ for p in pkt.protocols:
+ if p.protocol_name == name:
+ return p
+
+ def test_init(self):
+ eq_(self.pcp, self.sv.pcp)
+ eq_(self.cfi, self.sv.cfi)
+ eq_(self.vid, self.sv.vid)
+ eq_(self.ethertype, self.sv.ethertype)
+
+ def test_parser(self):
+ res, ptype, _ = self.sv.parser(self.buf)
+
+ eq_(res.pcp, self.pcp)
+ eq_(res.cfi, self.cfi)
+ eq_(res.vid, self.vid)
+ eq_(res.ethertype, self.ethertype)
+ eq_(ptype, vlan)
+
+ def test_serialize(self):
+ data = bytearray()
+ prev = None
+ buf = self.sv.serialize(data, prev)
+
+ fmt = svlan._PACK_STR
+ res = struct.unpack(fmt, buf)
+
+ eq_(res[0], self.tci)
+ eq_(res[1], self.ethertype)
+
+ def _build_svlan(self):
+ src_mac = '00:07:0d:af:f4:54'
+ dst_mac = '00:00:00:00:00:00'
+ ethertype = ether.ETH_TYPE_8021AD
+ e = ethernet(dst_mac, src_mac, ethertype)
+
+ pcp = 0
+ cfi = 0
+ vid = 32
+ tci = pcp << 15 | cfi << 12 | vid
+ ethertype = ether.ETH_TYPE_IP
+ v = vlan(pcp, cfi, vid, ethertype)
+
+ version = 4
+ header_length = 20
+ tos = 0
+ total_length = 24
+ identification = 0x8a5d
+ flags = 0
+ offset = 1480
+ ttl = 64
+ proto = inet.IPPROTO_ICMP
+ csum = 0xa7f2
+ src = '131.151.32.21'
+ dst = '131.151.32.129'
+ option = b'TEST'
+ ip = ipv4(version, header_length, tos, total_length, identification,
+ flags, offset, ttl, proto, csum, src, dst, option)
+
+ p = Packet()
+
+ p.add_protocol(e)
+ p.add_protocol(self.sv)
+ p.add_protocol(v)
+ p.add_protocol(ip)
+ p.serialize()
+
+ return p
+
+ def test_build_svlan(self):
+ p = self._build_svlan()
+
+ e = self.find_protocol(p, "ethernet")
+ ok_(e)
+ eq_(e.ethertype, ether.ETH_TYPE_8021AD)
+
+ sv = self.find_protocol(p, "svlan")
+ ok_(sv)
+ eq_(sv.ethertype, ether.ETH_TYPE_8021Q)
+
+ v = self.find_protocol(p, "vlan")
+ ok_(v)
+ eq_(v.ethertype, ether.ETH_TYPE_IP)
+
+ ip = self.find_protocol(p, "ipv4")
+ ok_(ip)
+
+ eq_(sv.pcp, self.pcp)
+ eq_(sv.cfi, self.cfi)
+ eq_(sv.vid, self.vid)
+ eq_(sv.ethertype, self.ethertype)
+
+ @raises(Exception)
+ def test_malformed_svlan(self):
+ m_short_buf = self.buf[1:svlan._MIN_LEN]
+ svlan.parser(m_short_buf)
+
+ def test_json(self):
+ jsondict = self.sv.to_jsondict()
+ sv = svlan.from_jsondict(jsondict['svlan'])
+ eq_(str(self.sv), str(sv))
diff --git a/tests/unit/packet/test_vrrp.py b/tests/unit/packet/test_vrrp.py
new file mode 100644
index 00000000..71c52500
--- /dev/null
+++ b/tests/unit/packet/test_vrrp.py
@@ -0,0 +1,496 @@
+# Copyright (C) 2013 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2013 Isaku Yamahata <yamahata at private email ne jp>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+from __future__ import print_function
+
+import unittest
+import logging
+import six
+import struct
+import inspect
+
+from nose.tools import eq_, ok_
+from nose.tools import raises
+
+from ryu.ofproto import inet
+from ryu.lib.packet import ipv4
+from ryu.lib.packet import ipv6
+from ryu.lib.packet import packet
+from ryu.lib.packet import packet_utils
+from ryu.lib.packet import vrrp
+from ryu.lib import addrconv
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_vrrpv2(unittest.TestCase):
+ """ Test case for vrrp v2
+ """
+ version = vrrp.VRRP_VERSION_V2
+ type_ = vrrp.VRRP_TYPE_ADVERTISEMENT
+ vrid = 128
+ priority = 100
+ count_ip = 1
+ auth_type = vrrp.VRRP_AUTH_NO_AUTH
+ max_adver_int = 100
+ checksum = 0
+ ip_address = '192.168.0.1'
+ auth_data = (0, 0)
+ vrrpv2 = vrrp.vrrpv2.create(type_, vrid, priority, max_adver_int,
+ [ip_address])
+ buf = struct.pack(vrrp.vrrpv2._PACK_STR + '4sII',
+ vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V2, type_),
+ vrid, priority, count_ip,
+ auth_type, max_adver_int, checksum,
+ addrconv.ipv4.text_to_bin(ip_address),
+ auth_data[0], auth_data[1])
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.type_, self.vrrpv2.type)
+ eq_(self.vrid, self.vrrpv2.vrid)
+ eq_(self.priority, self.vrrpv2.priority)
+ eq_(self.count_ip, self.vrrpv2.count_ip)
+ eq_(self.auth_type, self.vrrpv2.auth_type)
+ eq_(1, len(self.vrrpv2.ip_addresses))
+ eq_(self.ip_address, self.vrrpv2.ip_addresses[0])
+ eq_(self.auth_data, self.vrrpv2.auth_data)
+
+ def test_parser(self):
+ vrrpv2, _cls, _ = self.vrrpv2.parser(self.buf)
+
+ eq_(self.version, vrrpv2.version)
+ eq_(self.type_, vrrpv2.type)
+ eq_(self.vrid, vrrpv2.vrid)
+ eq_(self.priority, vrrpv2.priority)
+ eq_(self.count_ip, vrrpv2.count_ip)
+ eq_(self.auth_type, vrrpv2.auth_type)
+ eq_(self.max_adver_int, vrrpv2.max_adver_int)
+ eq_(self.checksum, vrrpv2.checksum)
+ eq_(1, len(vrrpv2.ip_addresses))
+ eq_(str, type(vrrpv2.ip_addresses[0]))
+ eq_(self.ip_address, vrrpv2.ip_addresses[0])
+ eq_(self.auth_data, vrrpv2.auth_data)
+
+ def test_serialize(self):
+ src_ip = '192.168.0.1'
+ dst_ip = vrrp.VRRP_IPV4_DST_ADDRESS
+ prev = ipv4.ipv4(4, 5, 0, 0, 0, 0, 0, vrrp.VRRP_IPV4_TTL,
+ inet.IPPROTO_VRRP, 0, src_ip, dst_ip)
+
+ type_ = vrrp.VRRP_TYPE_ADVERTISEMENT
+ vrid = 5
+ priority = 10
+ max_adver_int = 30
+ ip_address = '192.168.0.2'
+ ip_addresses = [ip_address]
+
+ vrrp_ = vrrp.vrrpv2.create(
+ type_, vrid, priority, max_adver_int, ip_addresses)
+
+ buf = vrrp_.serialize(bytearray(), prev)
+ pack_str = vrrp.vrrpv2._PACK_STR + '4sII'
+ pack_len = struct.calcsize(pack_str)
+ res = struct.unpack(pack_str, six.binary_type(buf))
+ eq_(res[0], vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V2, type_))
+ eq_(res[1], vrid)
+ eq_(res[2], priority)
+ eq_(res[3], len(ip_addresses))
+ eq_(res[4], vrrp.VRRP_AUTH_NO_AUTH)
+ eq_(res[5], max_adver_int)
+ # res[6] is checksum
+ eq_(res[7], addrconv.ipv4.text_to_bin(ip_address))
+ eq_(res[8], 0)
+ eq_(res[9], 0)
+ eq_(len(buf), pack_len)
+
+ # checksum
+ s = packet_utils.checksum(buf)
+ eq_(0, s)
+
+ @raises(Exception)
+ def test_malformed_vrrpv2(self):
+ m_short_buf = self.buf[1:vrrp.vrrpv2._MIN_LEN]
+ vrrp.vrrp.parser(m_short_buf)
+
+ def test_create_packet(self):
+ primary_ip = '192.168.0.2'
+ p0 = self.vrrpv2.create_packet(primary_ip)
+ p0.serialize()
+ p1 = packet.Packet(six.binary_type(p0.data))
+ p1.serialize()
+ eq_(p0.data, p1.data)
+
+ def _test_is_valid(self, type_=None, vrid=None, priority=None,
+ max_adver_int=None):
+ if type_ is None:
+ type_ = self.type_
+ if vrid is None:
+ vrid = self.vrid
+ if priority is None:
+ priority = self.priority
+ if max_adver_int is None:
+ max_adver_int = self.max_adver_int
+
+ vrrp_ = vrrp.vrrpv2.create(type_, vrid, priority, max_adver_int,
+ [self.ip_address])
+ return vrrp_.is_valid()
+
+ def test_is_valid_ok(self):
+ ok_(self._test_is_valid())
+
+ def test_is_valid_ng_type(self):
+ ok_(not self._test_is_valid(type_=15))
+
+ def test_is_valid_ng_vrid_min(self):
+ vrid = vrrp.VRRP_VRID_MIN - 1
+ ok_(not self._test_is_valid(vrid=vrid))
+
+ def test_is_valid_ng_vrid_max(self):
+ vrid = vrrp.VRRP_VRID_MAX + 1
+ ok_(not self._test_is_valid(vrid=vrid))
+
+ def test_is_valid_ng_priority_min(self):
+ priority = vrrp.VRRP_PRIORITY_MIN - 1
+ ok_(not self._test_is_valid(priority=priority))
+
+ def test_is_valid_ng_priority_max(self):
+ priority = vrrp.VRRP_PRIORITY_MAX + 1
+ ok_(not self._test_is_valid(priority=priority))
+
+ def test_is_valid_ng_adver_min(self):
+ max_adver_int = vrrp.VRRP_V2_MAX_ADVER_INT_MIN - 1
+ ok_(not self._test_is_valid(max_adver_int=max_adver_int))
+
+ def test_is_valid_ng_adver_max(self):
+ max_adver_int = vrrp.VRRP_V2_MAX_ADVER_INT_MAX + 1
+ ok_(not self._test_is_valid(max_adver_int=max_adver_int))
+
+ def test_to_string(self):
+ vrrpv2_values = {'version': self.version,
+ 'type': self.type_,
+ 'vrid': self.vrid,
+ 'priority': self.priority,
+ 'count_ip': self.count_ip,
+ 'max_adver_int': self.max_adver_int,
+ 'checksum': self.vrrpv2.checksum,
+ 'ip_addresses': [self.ip_address],
+ 'auth_type': self.auth_type,
+ 'auth_data': self.auth_data,
+ 'identification': self.vrrpv2.identification}
+ _vrrpv2_str = ','.join(['%s=%s' % (k, repr(vrrpv2_values[k]))
+ for k, v in inspect.getmembers(self.vrrpv2)
+ if k in vrrpv2_values])
+ vrrpv2_str = '%s(%s)' % (vrrp.vrrpv2.__name__, _vrrpv2_str)
+
+ eq_(str(self.vrrpv2), vrrpv2_str)
+ eq_(repr(self.vrrpv2), vrrpv2_str)
+
+
+class Test_vrrpv3_ipv4(unittest.TestCase):
+ """ Test case for vrrp v3 IPv4
+ """
+ version = vrrp.VRRP_VERSION_V3
+ type_ = vrrp.VRRP_TYPE_ADVERTISEMENT
+ vrid = 128
+ priority = 99
+ count_ip = 1
+ max_adver_int = 111
+ checksum = 0
+ ip_address = '192.168.0.1'
+ vrrpv3 = vrrp.vrrpv3.create(type_, vrid, priority, max_adver_int,
+ [ip_address])
+ buf = struct.pack(vrrp.vrrpv3._PACK_STR + '4s',
+ vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V3, type_),
+ vrid, priority, count_ip,
+ max_adver_int, checksum,
+ addrconv.ipv4.text_to_bin(ip_address))
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.type_, self.vrrpv3.type)
+ eq_(self.vrid, self.vrrpv3.vrid)
+ eq_(self.priority, self.vrrpv3.priority)
+ eq_(self.count_ip, self.vrrpv3.count_ip)
+ eq_(1, len(self.vrrpv3.ip_addresses))
+ eq_(self.ip_address, self.vrrpv3.ip_addresses[0])
+
+ def test_parser(self):
+ vrrpv3, _cls, _ = self.vrrpv3.parser(self.buf)
+
+ eq_(self.version, vrrpv3.version)
+ eq_(self.type_, vrrpv3.type)
+ eq_(self.vrid, vrrpv3.vrid)
+ eq_(self.priority, vrrpv3.priority)
+ eq_(self.count_ip, vrrpv3.count_ip)
+ eq_(self.max_adver_int, vrrpv3.max_adver_int)
+ eq_(self.checksum, vrrpv3.checksum)
+ eq_(1, len(vrrpv3.ip_addresses))
+ eq_(str, type(vrrpv3.ip_addresses[0]))
+ eq_(self.ip_address, vrrpv3.ip_addresses[0])
+
+ def test_serialize(self):
+ src_ip = '192.168.0.1'
+ dst_ip = vrrp.VRRP_IPV4_DST_ADDRESS
+ prev = ipv4.ipv4(4, 5, 0, 0, 0, 0, 0, vrrp.VRRP_IPV4_TTL,
+ inet.IPPROTO_VRRP, 0, src_ip, dst_ip)
+
+ type_ = vrrp.VRRP_TYPE_ADVERTISEMENT
+ vrid = 5
+ priority = 10
+ max_adver_int = 30
+ ip_address = '192.168.0.2'
+ ip_addresses = [ip_address]
+
+ vrrp_ = vrrp.vrrpv3.create(
+ type_, vrid, priority, max_adver_int, ip_addresses)
+
+ buf = vrrp_.serialize(bytearray(), prev)
+ print(len(buf), type(buf), buf)
+ pack_str = vrrp.vrrpv3._PACK_STR + '4s'
+ pack_len = struct.calcsize(pack_str)
+ res = struct.unpack(pack_str, six.binary_type(buf))
+ eq_(res[0], vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V3, type_))
+ eq_(res[1], vrid)
+ eq_(res[2], priority)
+ eq_(res[3], len(ip_addresses))
+ eq_(res[4], max_adver_int)
+ # res[5] is checksum
+ eq_(res[6], addrconv.ipv4.text_to_bin(ip_address))
+ eq_(len(buf), pack_len)
+ print(res)
+
+ # checksum
+ ph = struct.pack('!4s4sxBH',
+ addrconv.ipv4.text_to_bin(src_ip),
+ addrconv.ipv4.text_to_bin(dst_ip),
+ inet.IPPROTO_VRRP, pack_len)
+ s = packet_utils.checksum(ph + buf)
+ eq_(0, s)
+
+ @raises(Exception)
+ def test_malformed_vrrpv3(self):
+ m_short_buf = self.buf[1:vrrp.vrrpv3._MIN_LEN]
+ vrrp.vrrp.parser(m_short_buf)
+
+ def test_create_packet(self):
+ primary_ip = '192.168.0.2'
+ p0 = self.vrrpv3.create_packet(primary_ip)
+ p0.serialize()
+ p1 = packet.Packet(six.binary_type(p0.data))
+ p1.serialize()
+ eq_(p0.data, p1.data)
+
+ def _test_is_valid(self, type_=None, vrid=None, priority=None,
+ max_adver_int=None):
+ if type_ is None:
+ type_ = self.type_
+ if vrid is None:
+ vrid = self.vrid
+ if priority is None:
+ priority = self.priority
+ if max_adver_int is None:
+ max_adver_int = self.max_adver_int
+
+ vrrp_ = vrrp.vrrpv3.create(type_, vrid, priority, max_adver_int,
+ [self.ip_address])
+ return vrrp_.is_valid()
+
+ def test_is_valid_ok(self):
+ ok_(self._test_is_valid())
+
+ def test_is_valid_ng_type(self):
+ ok_(not self._test_is_valid(type_=15))
+
+ def test_is_valid_ng_vrid_min(self):
+ vrid = vrrp.VRRP_VRID_MIN - 1
+ ok_(not self._test_is_valid(vrid=vrid))
+
+ def test_is_valid_ng_vrid_max(self):
+ vrid = vrrp.VRRP_VRID_MAX + 1
+ ok_(not self._test_is_valid(vrid=vrid))
+
+ def test_is_valid_ng_priority_min(self):
+ priority = vrrp.VRRP_PRIORITY_MIN - 1
+ ok_(not self._test_is_valid(priority=priority))
+
+ def test_is_valid_ng_priority_max(self):
+ priority = vrrp.VRRP_PRIORITY_MAX + 1
+ ok_(not self._test_is_valid(priority=priority))
+
+ def test_is_valid_ng_adver_min(self):
+ max_adver_int = vrrp.VRRP_V3_MAX_ADVER_INT_MIN - 1
+ ok_(not self._test_is_valid(max_adver_int=max_adver_int))
+
+ def test_is_valid_ng_adver_max(self):
+ max_adver_int = vrrp.VRRP_V3_MAX_ADVER_INT_MAX + 1
+ ok_(not self._test_is_valid(max_adver_int=max_adver_int))
+
+ def test_to_string(self):
+ vrrpv3_values = {'version': self.version,
+ 'type': self.type_,
+ 'vrid': self.vrid,
+ 'priority': self.priority,
+ 'count_ip': self.count_ip,
+ 'max_adver_int': self.max_adver_int,
+ 'checksum': self.vrrpv3.checksum,
+ 'ip_addresses': [self.ip_address],
+ 'auth_type': None,
+ 'auth_data': None,
+ 'identification': self.vrrpv3.identification}
+ _vrrpv3_str = ','.join(['%s=%s' % (k, repr(vrrpv3_values[k]))
+ for k, v in inspect.getmembers(self.vrrpv3)
+ if k in vrrpv3_values])
+ vrrpv3_str = '%s(%s)' % (vrrp.vrrpv3.__name__, _vrrpv3_str)
+
+ eq_(str(self.vrrpv3), vrrpv3_str)
+ eq_(repr(self.vrrpv3), vrrpv3_str)
+
+
+class Test_vrrpv3_ipv6(unittest.TestCase):
+ """ Test case for vrrp v3 IPv6
+ """
+ version = vrrp.VRRP_VERSION_V3
+ type_ = vrrp.VRRP_TYPE_ADVERTISEMENT
+ vrid = 128
+ priority = 99
+ count_ip = 1
+ max_adver_int = 111
+ checksum = 0
+ ip_address = '2001:db8:2000::1'
+ vrrpv3 = vrrp.vrrpv3.create(type_, vrid, priority, max_adver_int,
+ [ip_address])
+ buf = struct.pack(vrrp.vrrpv3._PACK_STR + '16s',
+ vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V3, type_),
+ vrid, priority, count_ip,
+ max_adver_int, checksum,
+ addrconv.ipv6.text_to_bin(ip_address))
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_init(self):
+ eq_(self.type_, self.vrrpv3.type)
+ eq_(self.vrid, self.vrrpv3.vrid)
+ eq_(self.priority, self.vrrpv3.priority)
+ eq_(self.count_ip, self.vrrpv3.count_ip)
+ eq_(1, len(self.vrrpv3.ip_addresses))
+ eq_(self.ip_address, self.vrrpv3.ip_addresses[0])
+
+ def test_parser(self):
+ vrrpv3, _cls, _ = self.vrrpv3.parser(self.buf)
+
+ eq_(self.version, vrrpv3.version)
+ eq_(self.type_, vrrpv3.type)
+ eq_(self.vrid, vrrpv3.vrid)
+ eq_(self.priority, vrrpv3.priority)
+ eq_(self.count_ip, vrrpv3.count_ip)
+ eq_(self.max_adver_int, vrrpv3.max_adver_int)
+ eq_(self.checksum, vrrpv3.checksum)
+ eq_(1, len(vrrpv3.ip_addresses))
+ eq_(str, type(vrrpv3.ip_addresses[0]))
+ eq_(self.ip_address, vrrpv3.ip_addresses[0])
+
+ def test_serialize(self):
+ src_ip = '2001:db8:2000::1'
+ dst_ip = vrrp.VRRP_IPV6_DST_ADDRESS
+ prev = ipv6.ipv6(6, 0, 0, 0, inet.IPPROTO_VRRP,
+ vrrp.VRRP_IPV6_HOP_LIMIT, src_ip, dst_ip)
+
+ type_ = vrrp.VRRP_TYPE_ADVERTISEMENT
+ vrid = 5
+ priority = 10
+ max_adver_int = 30
+ ip_address = '2001:db8:2000::2'
+ ip_addresses = [ip_address]
+
+ vrrp_ = vrrp.vrrpv3.create(
+ type_, vrid, priority, max_adver_int, ip_addresses)
+
+ buf = vrrp_.serialize(bytearray(), prev)
+ print(len(buf), type(buf), buf)
+ pack_str = vrrp.vrrpv3._PACK_STR + '16s'
+ pack_len = struct.calcsize(pack_str)
+ res = struct.unpack(pack_str, six.binary_type(buf))
+ eq_(res[0], vrrp.vrrp_to_version_type(vrrp.VRRP_VERSION_V3, type_))
+ eq_(res[1], vrid)
+ eq_(res[2], priority)
+ eq_(res[3], len(ip_addresses))
+ eq_(res[4], max_adver_int)
+ # res[5] is checksum
+ eq_(res[6], addrconv.ipv6.text_to_bin(ip_address))
+ eq_(len(buf), pack_len)
+ print(res)
+
+ # checksum
+ ph = struct.pack('!16s16sI3xB',
+ addrconv.ipv6.text_to_bin(src_ip),
+ addrconv.ipv6.text_to_bin(dst_ip),
+ pack_len, inet.IPPROTO_VRRP)
+ s = packet_utils.checksum(ph + buf)
+ eq_(0, s)
+
+ @raises(Exception)
+ def test_malformed_vrrpv3(self):
+ m_short_buf = self.buf[1:vrrp.vrrpv3._MIN_LEN]
+ vrrp.vrrp.parser(m_short_buf)
+
+ def test_create_packet(self):
+ primary_ip = '2001:db8:2000::3'
+ p0 = self.vrrpv3.create_packet(primary_ip)
+ p0.serialize()
+ print(len(p0.data), p0.data)
+ p1 = packet.Packet(six.binary_type(p0.data))
+ p1.serialize()
+ print(len(p0.data), p0.data)
+ print(len(p1.data), p1.data)
+ eq_(p0.data, p1.data)
+
+ def test_to_string(self):
+ vrrpv3_values = {'version': self.version,
+ 'type': self.type_,
+ 'vrid': self.vrid,
+ 'priority': self.priority,
+ 'count_ip': self.count_ip,
+ 'max_adver_int': self.max_adver_int,
+ 'checksum': self.vrrpv3.checksum,
+ 'ip_addresses': [self.ip_address],
+ 'auth_type': None,
+ 'auth_data': None,
+ 'identification': self.vrrpv3.identification}
+ _vrrpv3_str = ','.join(['%s=%s' % (k, repr(vrrpv3_values[k]))
+ for k, v in inspect.getmembers(self.vrrpv3)
+ if k in vrrpv3_values])
+ vrrpv3_str = '%s(%s)' % (vrrp.vrrpv3.__name__, _vrrpv3_str)
+
+ eq_(str(self.vrrpv3), vrrpv3_str)
+ eq_(repr(self.vrrpv3), vrrpv3_str)
diff --git a/tests/unit/packet/test_vxlan.py b/tests/unit/packet/test_vxlan.py
new file mode 100644
index 00000000..8cace581
--- /dev/null
+++ b/tests/unit/packet/test_vxlan.py
@@ -0,0 +1,82 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import unittest
+
+from nose.tools import eq_
+from nose.tools import raises
+
+from ryu.lib.packet import ethernet
+from ryu.lib.packet import vxlan
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_vxlan(unittest.TestCase):
+ """
+ Test case for VXLAN (RFC 7348) header encoder/decoder class.
+ """
+
+ vni = 0x123456
+ buf = (
+ b'\x08\x00\x00\x00' # flags = R|R|R|R|I|R|R|R (8 bits)
+ b'\x12\x34\x56\x00' # vni = 0x123456 (24 bits)
+ b'test_payload' # for test
+ )
+ pkt = vxlan.vxlan(vni)
+ jsondict = {
+ 'vxlan': {
+ 'vni': vni
+ }
+ }
+
+ def test_init(self):
+ eq_(self.vni, self.pkt.vni)
+
+ def test_parser(self):
+ parsed_pkt, next_proto_cls, rest_buf = vxlan.vxlan.parser(self.buf)
+ eq_(self.vni, parsed_pkt.vni)
+ eq_(ethernet.ethernet, next_proto_cls)
+ eq_(b'test_payload', rest_buf)
+
+ @raises(AssertionError)
+ def test_invalid_flags(self):
+ invalid_flags_bug = (
+ b'\x00\x00\x00\x00' # all bits are set to zero
+ b'\x12\x34\x56\x00' # vni = 0x123456 (24 bits)
+ )
+ vxlan.vxlan.parser(invalid_flags_bug)
+
+ def test_serialize(self):
+ serialized_buf = self.pkt.serialize(payload=None, prev=None)
+ eq_(self.buf[:vxlan.vxlan._MIN_LEN], serialized_buf)
+
+ def test_from_jsondict(self):
+ pkt_from_json = vxlan.vxlan.from_jsondict(
+ self.jsondict[vxlan.vxlan.__name__])
+ eq_(self.vni, pkt_from_json.vni)
+
+ def test_to_jsondict(self):
+ jsondict_from_pkt = self.pkt.to_jsondict()
+ eq_(self.jsondict, jsondict_from_pkt)
+
+ def test_vni_from_bin(self):
+ vni = vxlan.vni_from_bin(b'\x12\x34\x56')
+ eq_(self.vni, vni)
+
+ def test_vni_to_bin(self):
+ eq_(b'\x12\x34\x56', vxlan.vni_to_bin(self.vni))
diff --git a/tests/unit/packet/test_zebra.py b/tests/unit/packet/test_zebra.py
new file mode 100644
index 00000000..19ff88de
--- /dev/null
+++ b/tests/unit/packet/test_zebra.py
@@ -0,0 +1,66 @@
+# Copyright (C) 2017 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import os
+import sys
+import unittest
+
+from nose.tools import eq_
+from nose.tools import ok_
+import six
+
+from ryu.lib import pcaplib
+from ryu.lib.packet import packet
+from ryu.lib.packet import zebra
+from ryu.utils import binary_str
+
+
+PCAP_DATA_DIR = os.path.join(
+ os.path.dirname(sys.modules[__name__].__file__),
+ '../../packet_data/pcap/')
+
+
+class Test_zebra(unittest.TestCase):
+ """
+ Test case for ryu.lib.packet.zebra.
+ """
+
+ def test_pcap(self):
+ files = [
+ 'zebra_v2',
+ 'zebra_v3',
+ ]
+
+ for f in files:
+ zebra_pcap_file = os.path.join(PCAP_DATA_DIR, f + '.pcap')
+ # print('*** testing %s' % zebra_pcap_file)
+
+ for _, buf in pcaplib.Reader(open(zebra_pcap_file, 'rb')):
+ # Checks if Zebra message can be parsed as expected.
+ pkt = packet.Packet(buf)
+ zebra_pkts = pkt.get_protocols(zebra.ZebraMessage)
+ for zebra_pkt in zebra_pkts:
+ ok_(isinstance(zebra_pkt, zebra.ZebraMessage),
+ 'Failed to parse Zebra message: %s' % pkt)
+ ok_(not isinstance(pkt.protocols[-1],
+ (six.binary_type, bytearray)),
+ 'Some messages could not be parsed: %s' % pkt)
+
+ # Checks if Zebra message can be serialized as expected.
+ pkt.serialize()
+ eq_(buf, pkt.data,
+ "b'%s' != b'%s'" % (binary_str(buf), binary_str(pkt.data)))
diff --git a/tests/unit/sample/__init__.py b/tests/unit/sample/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/sample/__init__.py
diff --git a/tests/unit/sample/test_sample1.py b/tests/unit/sample/test_sample1.py
new file mode 100644
index 00000000..b4963556
--- /dev/null
+++ b/tests/unit/sample/test_sample1.py
@@ -0,0 +1,20 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+from nose.tools import ok_, eq_
+# from ryu.app.simple_switch import SimpleSwitch
+
+import logging
+
+
+LOG = logging.getLogger('tests.test_sample1')
+
+
+class TestSample1(unittest.TestCase):
+
+ def testS1Func1(self):
+ LOG.debug('testS1Func1 - START')
+ ok_(True)
+
+ def testS1Func2(self):
+ ok_(True)
diff --git a/tests/unit/sample/test_sample2.py b/tests/unit/sample/test_sample2.py
new file mode 100644
index 00000000..9c21a42a
--- /dev/null
+++ b/tests/unit/sample/test_sample2.py
@@ -0,0 +1,14 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+import unittest
+from nose.tools import ok_, eq_
+# from ryu.app.simple_switch import SimpleSwitch
+
+
+class TestSample2(unittest.TestCase):
+
+ def testS2Func1(self):
+ ok_(True)
+
+ def testS2Func2(self):
+ ok_(True)
diff --git a/tests/unit/services/__init__.py b/tests/unit/services/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/services/__init__.py
diff --git a/tests/unit/services/protocols/__init__.py b/tests/unit/services/protocols/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/services/protocols/__init__.py
diff --git a/tests/unit/services/protocols/bgp/__init__.py b/tests/unit/services/protocols/bgp/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/services/protocols/bgp/__init__.py
diff --git a/tests/unit/services/protocols/bgp/core_managers/__init__.py b/tests/unit/services/protocols/bgp/core_managers/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/services/protocols/bgp/core_managers/__init__.py
diff --git a/tests/unit/services/protocols/bgp/core_managers/test_table_manager.py b/tests/unit/services/protocols/bgp/core_managers/test_table_manager.py
new file mode 100644
index 00000000..c9c9f55e
--- /dev/null
+++ b/tests/unit/services/protocols/bgp/core_managers/test_table_manager.py
@@ -0,0 +1,937 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from collections import OrderedDict
+import unittest
+import logging
+try:
+ import mock # Python 2
+except ImportError:
+ from unittest import mock # Python 3
+
+from nose.tools import ok_, eq_, raises
+
+from ryu.lib.packet.bgp import BGPPathAttributeOrigin
+from ryu.lib.packet.bgp import BGPPathAttributeAsPath
+from ryu.lib.packet.bgp import BGP_ATTR_ORIGIN_IGP
+from ryu.lib.packet.bgp import BGP_ATTR_TYPE_ORIGIN
+from ryu.lib.packet.bgp import BGP_ATTR_TYPE_AS_PATH
+from ryu.lib.packet.bgp import BGP_ATTR_TYPE_EXTENDED_COMMUNITIES
+from ryu.lib.packet.bgp import IPAddrPrefix
+from ryu.lib.packet.bgp import IP6AddrPrefix
+from ryu.lib.packet.bgp import EvpnArbitraryEsi
+from ryu.lib.packet.bgp import EvpnLACPEsi
+from ryu.lib.packet.bgp import EvpnEthernetAutoDiscoveryNLRI
+from ryu.lib.packet.bgp import EvpnMacIPAdvertisementNLRI
+from ryu.lib.packet.bgp import EvpnInclusiveMulticastEthernetTagNLRI
+from ryu.lib.packet.bgp import FlowSpecIPv4NLRI
+from ryu.lib.packet.bgp import BGPPathAttributeExtendedCommunities
+from ryu.services.protocols.bgp.bgpspeaker import EVPN_MAX_ET
+from ryu.services.protocols.bgp.bgpspeaker import ESI_TYPE_LACP
+from ryu.services.protocols.bgp.bgpspeaker import FLOWSPEC_FAMILY_IPV4
+from ryu.services.protocols.bgp.bgpspeaker import FLOWSPEC_FAMILY_VPNV4
+from ryu.services.protocols.bgp.bgpspeaker import FLOWSPEC_TA_SAMPLE
+from ryu.services.protocols.bgp.bgpspeaker import FLOWSPEC_TA_TERMINAL
+from ryu.services.protocols.bgp.core import BgpCoreError
+from ryu.services.protocols.bgp.core_managers import table_manager
+from ryu.services.protocols.bgp.rtconf.vrfs import VRF_RF_IPV4
+from ryu.services.protocols.bgp.rtconf.vrfs import VRF_RF_IPV6
+from ryu.services.protocols.bgp.rtconf.vrfs import VRF_RF_L2_EVPN
+from ryu.services.protocols.bgp.rtconf.vrfs import VRF_RF_IPV4_FLOWSPEC
+from ryu.services.protocols.bgp.utils.bgp import create_v4flowspec_actions
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_TableCoreManager(unittest.TestCase):
+ """
+ Test case for bgp.core_managers.table_manager.TableCoreManager
+ """
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.core_managers.TableCoreManager.__init__',
+ mock.MagicMock(return_value=None))
+ def _test_update_vrf_table(self, prefix_inst, route_dist, prefix_str,
+ next_hop, route_family, route_type,
+ is_withdraw=False, **kwargs):
+ # Instantiate TableCoreManager
+ tbl_mng = table_manager.TableCoreManager(None, None)
+ vrf_table_mock = mock.MagicMock()
+ tbl_mng._tables = {(route_dist, route_family): vrf_table_mock}
+
+ # Test
+ tbl_mng.update_vrf_table(
+ route_dist=route_dist,
+ prefix=prefix_str,
+ next_hop=next_hop,
+ route_family=route_family,
+ route_type=route_type,
+ is_withdraw=is_withdraw,
+ **kwargs)
+
+ # Check
+ call_args_list = vrf_table_mock.insert_vrf_path.call_args_list
+ ok_(len(call_args_list) == 1) # insert_vrf_path should be called once
+ args, kwargs = call_args_list[0]
+ ok_(len(args) == 0) # no positional argument
+ eq_(str(prefix_inst), str(kwargs['nlri']))
+ eq_(is_withdraw, kwargs['is_withdraw'])
+ if is_withdraw:
+ eq_(None, kwargs['next_hop'])
+ eq_(False, kwargs['gen_lbl'])
+ else:
+ eq_(next_hop, kwargs['next_hop'])
+ eq_(True, kwargs['gen_lbl'])
+
+ def test_update_vrf_table_ipv4(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ ip_network = '192.168.0.0'
+ ip_prefix_len = 24
+ prefix_str = '%s/%d' % (ip_network, ip_prefix_len)
+ prefix_inst = IPAddrPrefix(ip_prefix_len, ip_network)
+ next_hop = '10.0.0.1'
+ route_family = VRF_RF_IPV4
+ route_type = None # should be ignored
+ kwargs = {} # should be ignored
+
+ self._test_update_vrf_table(prefix_inst, route_dist, prefix_str,
+ next_hop, route_family, route_type,
+ **kwargs)
+
+ def test_update_vrf_table_ipv6(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ ip_network = 'fe80::'
+ ip_prefix_len = 64
+ prefix_str = '%s/%d' % (ip_network, ip_prefix_len)
+ prefix_inst = IP6AddrPrefix(ip_prefix_len, ip_network)
+ next_hop = 'fe80::0011:aabb:ccdd:eeff'
+ route_family = VRF_RF_IPV6
+ route_type = None # should be ignored
+ kwargs = {} # should be ignored
+
+ self._test_update_vrf_table(prefix_inst, route_dist, prefix_str,
+ next_hop, route_family, route_type,
+ **kwargs)
+
+ def test_update_vrf_table_l2_evpn_with_esi_int(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ prefix_str = None # should be ignored
+ kwargs = {
+ 'ethernet_tag_id': 100,
+ 'mac_addr': 'aa:bb:cc:dd:ee:ff',
+ 'ip_addr': '192.168.0.1',
+ 'mpls_labels': [], # not be used
+ }
+ esi = EvpnArbitraryEsi(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+ prefix_inst = EvpnMacIPAdvertisementNLRI(
+ route_dist=route_dist,
+ esi=esi,
+ **kwargs)
+ next_hop = '10.0.0.1'
+ route_family = VRF_RF_L2_EVPN
+ route_type = EvpnMacIPAdvertisementNLRI.ROUTE_TYPE_NAME
+ kwargs['esi'] = 0
+
+ self._test_update_vrf_table(prefix_inst, route_dist, prefix_str,
+ next_hop, route_family, route_type,
+ **kwargs)
+
+ def test_update_vrf_table_l2_evpn_with_esi_dict(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ prefix_str = None # should be ignored
+ kwargs = {
+ 'ethernet_tag_id': EVPN_MAX_ET,
+ }
+ esi = EvpnLACPEsi(mac_addr='aa:bb:cc:dd:ee:ff', port_key=100)
+ prefix_inst = EvpnEthernetAutoDiscoveryNLRI(
+ route_dist=route_dist,
+ esi=esi,
+ **kwargs)
+ next_hop = '0.0.0.0'
+ route_family = VRF_RF_L2_EVPN
+ route_type = EvpnEthernetAutoDiscoveryNLRI.ROUTE_TYPE_NAME
+ kwargs['esi'] = {
+ 'type': ESI_TYPE_LACP,
+ 'mac_addr': 'aa:bb:cc:dd:ee:ff',
+ 'port_key': 100,
+ }
+
+ self._test_update_vrf_table(prefix_inst, route_dist, prefix_str,
+ next_hop, route_family, route_type,
+ **kwargs)
+
+ def test_update_vrf_table_l2_evpn_without_esi(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ prefix_str = None # should be ignored
+ kwargs = {
+ 'ethernet_tag_id': 100,
+ 'ip_addr': '192.168.0.1',
+ }
+ prefix_inst = EvpnInclusiveMulticastEthernetTagNLRI(
+ route_dist=route_dist, **kwargs)
+ next_hop = '10.0.0.1'
+ route_family = VRF_RF_L2_EVPN
+ route_type = EvpnInclusiveMulticastEthernetTagNLRI.ROUTE_TYPE_NAME
+
+ self._test_update_vrf_table(prefix_inst, route_dist, prefix_str,
+ next_hop, route_family, route_type,
+ **kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.core_managers.TableCoreManager.__init__',
+ mock.MagicMock(return_value=None))
+ def test_update_vrf_table_l2_evpn_with_vni(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ prefix_str = None # should be ignored
+ kwargs = {
+ 'ethernet_tag_id': 100,
+ 'mac_addr': 'aa:bb:cc:dd:ee:ff',
+ 'ip_addr': '192.168.0.1',
+ 'vni': 500,
+ }
+ esi = EvpnArbitraryEsi(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00')
+ prefix_inst = EvpnMacIPAdvertisementNLRI(
+ route_dist=route_dist,
+ esi=esi,
+ **kwargs)
+ next_hop = '10.0.0.1'
+ route_family = VRF_RF_L2_EVPN
+ route_type = EvpnMacIPAdvertisementNLRI.ROUTE_TYPE_NAME
+ tunnel_type = 'vxlan'
+ kwargs['esi'] = 0
+
+ # Instantiate TableCoreManager
+ tbl_mng = table_manager.TableCoreManager(None, None)
+ vrf_table_mock = mock.MagicMock()
+ tbl_mng._tables = {(route_dist, route_family): vrf_table_mock}
+
+ # Test
+ tbl_mng.update_vrf_table(
+ route_dist=route_dist,
+ prefix=prefix_str,
+ next_hop=next_hop,
+ route_family=route_family,
+ route_type=route_type,
+ tunnel_type=tunnel_type,
+ **kwargs)
+
+ # Check
+ call_args_list = vrf_table_mock.insert_vrf_path.call_args_list
+ ok_(len(call_args_list) == 1) # insert_vrf_path should be called once
+ args, kwargs = call_args_list[0]
+ ok_(len(args) == 0) # no positional argument
+ eq_(str(prefix_inst), str(kwargs['nlri']))
+ eq_(next_hop, kwargs['next_hop'])
+ eq_(False, kwargs['gen_lbl']) # should not generate MPLS labels
+ eq_(tunnel_type, kwargs['tunnel_type'])
+
+ def test_update_vrf_table_ipv4_withdraw(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ ip_network = '192.168.0.0'
+ ip_prefix_len = 24
+ prefix_str = '%s/%d' % (ip_network, ip_prefix_len)
+ prefix_inst = IPAddrPrefix(ip_prefix_len, ip_network)
+ next_hop = '10.0.0.1'
+ route_family = VRF_RF_IPV4
+ route_type = None # should be ignored
+ kwargs = {} # should be ignored
+
+ self._test_update_vrf_table(prefix_inst, route_dist, prefix_str,
+ next_hop, route_family, route_type,
+ is_withdraw=True, **kwargs)
+
+ @raises(BgpCoreError)
+ @mock.patch(
+ 'ryu.services.protocols.bgp.core_managers.TableCoreManager.__init__',
+ mock.MagicMock(return_value=None))
+ def test_update_vrf_table_no_vrf(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ ip_network = '192.168.0.0'
+ ip_prefix_len = 24
+ prefix_str = '%s/%d' % (ip_network, ip_prefix_len)
+ next_hop = '10.0.0.1'
+ route_family = VRF_RF_IPV4
+ route_type = None # should be ignored
+ kwargs = {} # should be ignored
+
+ # Instantiate TableCoreManager
+ tbl_mng = table_manager.TableCoreManager(None, None)
+ tbl_mng._tables = {} # no table
+
+ # Test
+ tbl_mng.update_vrf_table(
+ route_dist=route_dist,
+ prefix=prefix_str,
+ next_hop=next_hop,
+ route_family=route_family,
+ route_type=route_type,
+ **kwargs)
+
+ @raises(BgpCoreError)
+ def test_update_vrf_table_invalid_next_hop(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ ip_network = '192.168.0.0'
+ ip_prefix_len = 24
+ prefix_str = '%s/%d' % (ip_network, ip_prefix_len)
+ prefix_inst = IPAddrPrefix(ip_prefix_len, ip_network)
+ next_hop = 'xxx.xxx.xxx.xxx' # invalid
+ route_family = VRF_RF_IPV4
+ route_type = None # should be ignored
+ kwargs = {} # should be ignored
+
+ self._test_update_vrf_table(prefix_inst, route_dist, prefix_str,
+ next_hop, route_family, route_type,
+ **kwargs)
+
+ @raises(BgpCoreError)
+ def test_update_vrf_table_invalid_ipv4_prefix(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ ip_network = 'xxx.xxx.xxx.xxx' # invalid
+ ip_prefix_len = 24
+ prefix_str = '%s/%d' % (ip_network, ip_prefix_len)
+ prefix_inst = IPAddrPrefix(ip_prefix_len, ip_network)
+ next_hop = '10.0.0.1'
+ route_family = VRF_RF_IPV4
+ route_type = None # should be ignored
+ kwargs = {} # should be ignored
+
+ self._test_update_vrf_table(prefix_inst, route_dist, prefix_str,
+ next_hop, route_family, route_type,
+ **kwargs)
+
+ @raises(BgpCoreError)
+ def test_update_vrf_table_invalid_ipv6_prefix(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ ip_network = 'xxxx::' # invalid
+ ip_prefix_len = 64
+ prefix_str = '%s/%d' % (ip_network, ip_prefix_len)
+ prefix_inst = IP6AddrPrefix(ip_prefix_len, ip_network)
+ next_hop = 'fe80::0011:aabb:ccdd:eeff'
+ route_family = VRF_RF_IPV6
+ route_type = None # should be ignored
+ kwargs = {} # should be ignored
+
+ self._test_update_vrf_table(prefix_inst, route_dist, prefix_str,
+ next_hop, route_family, route_type,
+ **kwargs)
+
+ @raises(BgpCoreError)
+ def test_update_vrf_table_invalid_route_family(self):
+ # Prepare test data
+ route_dist = '65000:100'
+ ip_network = '192.168.0.0'
+ ip_prefix_len = 24
+ prefix_str = '%s/%d' % (ip_network, ip_prefix_len)
+ prefix_inst = IPAddrPrefix(ip_prefix_len, ip_network)
+ next_hop = '10.0.0.1'
+ route_family = 'foobar' # invalid
+ route_type = None # should be ignored
+ kwargs = {} # should be ignored
+
+ self._test_update_vrf_table(prefix_inst, route_dist, prefix_str,
+ next_hop, route_family, route_type,
+ **kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.core_managers.TableCoreManager.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch(
+ 'ryu.services.protocols.bgp.core_managers.TableCoreManager.learn_path')
+ def _test_update_global_table(self, learn_path_mock, prefix, next_hop,
+ is_withdraw, expected_next_hop):
+ # Prepare test data
+ origin = BGPPathAttributeOrigin(BGP_ATTR_ORIGIN_IGP)
+ aspath = BGPPathAttributeAsPath([[]])
+ pathattrs = OrderedDict()
+ pathattrs[BGP_ATTR_TYPE_ORIGIN] = origin
+ pathattrs[BGP_ATTR_TYPE_AS_PATH] = aspath
+ pathattrs = str(pathattrs)
+
+ # Instantiate TableCoreManager
+ tbl_mng = table_manager.TableCoreManager(None, None)
+
+ # Test
+ tbl_mng.update_global_table(
+ prefix=prefix,
+ next_hop=next_hop,
+ is_withdraw=is_withdraw,
+ )
+
+ # Check
+ call_args_list = learn_path_mock.call_args_list
+ ok_(len(call_args_list) == 1) # learn_path should be called once
+ args, kwargs = call_args_list[0]
+ ok_(len(kwargs) == 0) # no keyword argument
+ output_path = args[0]
+ eq_(None, output_path.source)
+ eq_(prefix, output_path.nlri.prefix)
+ eq_(pathattrs, str(output_path.pathattr_map))
+ eq_(expected_next_hop, output_path.nexthop)
+ eq_(is_withdraw, output_path.is_withdraw)
+
+ def test_update_global_table_ipv4(self):
+ self._test_update_global_table(
+ prefix='192.168.0.0/24',
+ next_hop='10.0.0.1',
+ is_withdraw=False,
+ expected_next_hop='10.0.0.1',
+ )
+
+ def test_update_global_table_ipv4_withdraw(self):
+ self._test_update_global_table(
+ prefix='192.168.0.0/24',
+ next_hop='10.0.0.1',
+ is_withdraw=True,
+ expected_next_hop='10.0.0.1',
+ )
+
+ def test_update_global_table_ipv4_no_next_hop(self):
+ self._test_update_global_table(
+ prefix='192.168.0.0/24',
+ next_hop=None,
+ is_withdraw=True,
+ expected_next_hop='0.0.0.0',
+ )
+
+ def test_update_global_table_ipv6(self):
+ self._test_update_global_table(
+ prefix='fe80::/64',
+ next_hop='fe80::0011:aabb:ccdd:eeff',
+ is_withdraw=False,
+ expected_next_hop='fe80::0011:aabb:ccdd:eeff',
+ )
+
+ def test_update_global_table_ipv6_withdraw(self):
+ self._test_update_global_table(
+ prefix='fe80::/64',
+ next_hop='fe80::0011:aabb:ccdd:eeff',
+ is_withdraw=True,
+ expected_next_hop='fe80::0011:aabb:ccdd:eeff',
+ )
+
+ def test_update_global_table_ipv6_no_next_hop(self):
+ self._test_update_global_table(
+ prefix='fe80::/64',
+ next_hop=None,
+ is_withdraw=True,
+ expected_next_hop='::',
+ )
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.core_managers.TableCoreManager.__init__',
+ mock.MagicMock(return_value=None))
+ def _test_update_flowspec_vrf_table(self, flowspec_family, route_family,
+ route_dist, rules, prefix,
+ is_withdraw, actions=None):
+ # Instantiate TableCoreManager
+ tbl_mng = table_manager.TableCoreManager(None, None)
+ vrf_table_mock = mock.MagicMock()
+ tbl_mng._tables = {(route_dist, route_family): vrf_table_mock}
+
+ # Test
+ tbl_mng.update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_dist=route_dist,
+ rules=rules,
+ actions=actions,
+ is_withdraw=is_withdraw,
+ )
+
+ # Check
+ call_args_list = vrf_table_mock.insert_vrffs_path.call_args_list
+ ok_(len(
+ call_args_list) == 1) # insert_vrffs_path should be called once
+ args, kwargs = call_args_list[0]
+ ok_(len(args) == 0) # no positional argument
+ eq_(prefix, kwargs['nlri'].prefix)
+ eq_(is_withdraw, kwargs['is_withdraw'])
+
+ def test_update_flowspec_vrf_table_vpnv4(self):
+ flowspec_family = 'vpnv4fs'
+ route_family = 'ipv4fs'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '10.70.1.0/24',
+ }
+ actions = {
+ 'traffic_rate': {
+ 'as_number': 0,
+ 'rate_info': 100.0,
+ },
+ }
+ prefix = 'ipv4fs(dst_prefix:10.70.1.0/24)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ def test_update_flowspec_vrf_table_vpnv4_without_actions(self):
+ flowspec_family = 'vpnv4fs'
+ route_family = 'ipv4fs'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '10.70.1.0/24',
+ }
+ prefix = 'ipv4fs(dst_prefix:10.70.1.0/24)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ )
+
+ @raises(BgpCoreError)
+ def test_update_flowspec_vrf_table_vpnv4_invalid_actions(self):
+ flowspec_family = 'vpnv4fs'
+ route_family = 'ipv4fs'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '10.70.1.0/24',
+ }
+ actions = {
+ 'invalid_actions': {
+ 'invalid_param': 10,
+ },
+ }
+ prefix = 'ipv4fs(dst_prefix:10.70.1.0/24)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ @raises(BgpCoreError)
+ def test_update_flowspec_vrf_table_vpnv4_invalid_flowspec_family(self):
+ flowspec_family = 'invalid'
+ route_family = 'ipv4fs'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '10.70.1.0/24',
+ }
+ prefix = 'ipv4fs(dst_prefix:10.70.1.0/24)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ )
+
+ @raises(BgpCoreError)
+ def test_update_flowspec_vrf_table_vpnv4_invalid_route_family(self):
+ flowspec_family = 'vpnv4fs'
+ route_family = 'invalid'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '10.70.1.0/24',
+ }
+ prefix = 'ipv4fs(dst_prefix:10.70.1.0/24)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ )
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.core_managers.TableCoreManager.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch(
+ 'ryu.services.protocols.bgp.core_managers.TableCoreManager.learn_path')
+ def _test_update_flowspec_global_table(self, learn_path_mock,
+ flowspec_family, rules, prefix,
+ is_withdraw, actions=None):
+ # Instantiate TableCoreManager
+ tbl_mng = table_manager.TableCoreManager(None, None)
+
+ # Test
+ tbl_mng.update_flowspec_global_table(
+ flowspec_family=flowspec_family,
+ rules=rules,
+ actions=actions,
+ is_withdraw=is_withdraw,
+ )
+
+ # Check
+ call_args_list = learn_path_mock.call_args_list
+ ok_(len(call_args_list) == 1) # learn_path should be called once
+ args, kwargs = call_args_list[0]
+ ok_(len(kwargs) == 0) # no keyword argument
+ output_path = args[0]
+ eq_(None, output_path.source)
+ eq_(prefix, output_path.nlri.prefix)
+ eq_(None, output_path.nexthop)
+ eq_(is_withdraw, output_path.is_withdraw)
+
+ def test_update_flowspec_global_table_ipv4(self):
+ flowspec_family = 'ipv4fs'
+ rules = {
+ 'dst_prefix': '10.60.1.0/24',
+ }
+ actions = {
+ 'traffic_rate': {
+ 'as_number': 0,
+ 'rate_info': 100.0,
+ },
+ }
+ prefix = 'ipv4fs(dst_prefix:10.60.1.0/24)'
+
+ self._test_update_flowspec_global_table(
+ flowspec_family=flowspec_family,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ def test_update_flowspec_global_table_ipv4_without_actions(self):
+ flowspec_family = 'ipv4fs'
+ rules = {
+ 'dst_prefix': '10.60.1.0/24',
+ }
+ prefix = 'ipv4fs(dst_prefix:10.60.1.0/24)'
+
+ self._test_update_flowspec_global_table(
+ flowspec_family=flowspec_family,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ )
+
+ @raises(BgpCoreError)
+ def test_update_flowspec_global_table_ipv4_invalid_actions(self):
+ flowspec_family = 'ipv4fs'
+ rules = {
+ 'dst_prefix': '10.60.1.0/24',
+ }
+ actions = {
+ 'invalid_actions': {
+ 'invalid_param': 10,
+ },
+ }
+ prefix = 'ipv4fs(dst_prefix:10.60.1.0/24)'
+
+ self._test_update_flowspec_global_table(
+ flowspec_family=flowspec_family,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ @raises(BgpCoreError)
+ def test_update_flowspec_global_table_ipv4_invalid_flowspec_family(self):
+ flowspec_family = 'invalid'
+ rules = {
+ 'dst_prefix': '10.60.1.0/24',
+ }
+ actions = {
+ 'traffic_rate': {
+ 'as_number': 0,
+ 'rate_info': 100.0,
+ },
+ }
+ prefix = 'ipv4fs(dst_prefix:10.60.1.0/24)'
+
+ self._test_update_flowspec_global_table(
+ flowspec_family=flowspec_family,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ def test_update_flowspec_global_table_ipv6(self):
+ flowspec_family = 'ipv6fs'
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+ actions = {
+ 'traffic_rate': {
+ 'as_number': 0,
+ 'rate_info': 100.0,
+ },
+ }
+ prefix = 'ipv6fs(dst_prefix:2001::3/128/32)'
+
+ self._test_update_flowspec_global_table(
+ flowspec_family=flowspec_family,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ def test_update_flowspec_global_table_ipv6_without_actions(self):
+ flowspec_family = 'ipv6fs'
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+ prefix = 'ipv6fs(dst_prefix:2001::3/128/32)'
+
+ self._test_update_flowspec_global_table(
+ flowspec_family=flowspec_family,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ )
+
+ @raises(BgpCoreError)
+ def test_update_flowspec_global_table_ipv6_invalid_actions(self):
+ flowspec_family = 'ipv6fs'
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+ actions = {
+ 'invalid_actions': {
+ 'invalid_param': 10,
+ },
+ }
+ prefix = 'ipv4fs(dst_prefix:2001::3/128/32)'
+
+ self._test_update_flowspec_global_table(
+ flowspec_family=flowspec_family,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ @raises(BgpCoreError)
+ def test_update_flowspec_global_table_ipv6_invalid_flowspec_family(self):
+ flowspec_family = 'invalid'
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+ actions = {
+ 'traffic_rate': {
+ 'as_number': 0,
+ 'rate_info': 100.0,
+ },
+ }
+ prefix = 'ipv4fs(dst_prefix:2001::3/128/32)'
+
+ self._test_update_flowspec_global_table(
+ flowspec_family=flowspec_family,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ def test_update_flowspec_vrf_table_vpnv6(self):
+ flowspec_family = 'vpnv6fs'
+ route_family = 'ipv6fs'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+ actions = {
+ 'traffic_rate': {
+ 'as_number': 0,
+ 'rate_info': 100.0,
+ },
+ }
+ prefix = 'ipv6fs(dst_prefix:2001::3/128/32)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ def test_update_flowspec_vrf_table_vpnv6_without_actions(self):
+ flowspec_family = 'vpnv6fs'
+ route_family = 'ipv6fs'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+ prefix = 'ipv6fs(dst_prefix:2001::3/128/32)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ )
+
+ @raises(BgpCoreError)
+ def test_update_flowspec_vrf_table_vpnv6_invalid_actions(self):
+ flowspec_family = 'vpnv6fs'
+ route_family = 'ipv6fs'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+ actions = {
+ 'invalid_actions': {
+ 'invalid_param': 10,
+ },
+ }
+ prefix = 'ipv6fs(dst_prefix:2001::3/128/32)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ @raises(BgpCoreError)
+ def test_update_flowspec_vrf_table_vpnv6_invalid_route_family(self):
+ flowspec_family = 'vpnv6fs'
+ route_family = 'invalid'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+ prefix = 'ipv4fs(dst_prefix:2001::3/128/32)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ )
+
+ def test_update_flowspec_vrf_table_l2vpn(self):
+ flowspec_family = 'l2vpnfs'
+ route_family = 'l2vpnfs'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_mac': '12:34:56:78:9a:bc',
+ }
+ actions = {
+ 'traffic_rate': {
+ 'as_number': 0,
+ 'rate_info': 100.0,
+ },
+ }
+ prefix = 'l2vpnfs(dst_mac:12:34:56:78:9a:bc)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ def test_update_flowspec_vrf_table_l2vpn_without_actions(self):
+ flowspec_family = 'l2vpnfs'
+ route_family = 'l2vpnfs'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_mac': '12:34:56:78:9a:bc',
+ }
+ prefix = 'l2vpnfs(dst_mac:12:34:56:78:9a:bc)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ )
+
+ @raises(BgpCoreError)
+ def test_update_flowspec_vrf_table_l2vpn_invalid_actions(self):
+ flowspec_family = 'l2vpnfs'
+ route_family = 'l2vpnfs'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_mac': '12:34:56:78:9a:bc',
+ }
+ actions = {
+ 'invalid_actions': {
+ 'invalid_param': 10,
+ },
+ }
+ prefix = 'l2vpnfs(dst_mac:12:34:56:78:9a:bc)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ actions=actions,
+ )
+
+ @raises(BgpCoreError)
+ def test_update_flowspec_vrf_table_l2vpn_invalid_route_family(self):
+ flowspec_family = 'l2vpnfs'
+ route_family = 'invalid'
+ route_dist = '65001:100'
+ rules = {
+ 'dst_mac': '12:34:56:78:9a:bc',
+ }
+ prefix = 'l2vpnfs(dst_mac:12:34:56:78:9a:bc)'
+
+ self._test_update_flowspec_vrf_table(
+ flowspec_family=flowspec_family,
+ route_family=route_family,
+ route_dist=route_dist,
+ rules=rules,
+ prefix=prefix,
+ is_withdraw=False,
+ )
diff --git a/tests/unit/services/protocols/bgp/test_bgpspeaker.py b/tests/unit/services/protocols/bgp/test_bgpspeaker.py
new file mode 100644
index 00000000..81a8bb3b
--- /dev/null
+++ b/tests/unit/services/protocols/bgp/test_bgpspeaker.py
@@ -0,0 +1,1088 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+import logging
+try:
+ import mock # Python 2
+except ImportError:
+ from unittest import mock # Python 3
+
+from nose.tools import raises
+
+from ryu.services.protocols.bgp import bgpspeaker
+from ryu.services.protocols.bgp.bgpspeaker import EVPN_MAX_ET
+from ryu.services.protocols.bgp.bgpspeaker import ESI_TYPE_LACP
+from ryu.services.protocols.bgp.api.prefix import ESI_TYPE_L2_BRIDGE
+from ryu.services.protocols.bgp.bgpspeaker import ESI_TYPE_MAC_BASED
+from ryu.services.protocols.bgp.api.prefix import REDUNDANCY_MODE_ALL_ACTIVE
+from ryu.services.protocols.bgp.api.prefix import REDUNDANCY_MODE_SINGLE_ACTIVE
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_BGPSpeaker(unittest.TestCase):
+ """
+ Test case for bgp.bgpspeaker.BGPSpeaker
+ """
+
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_eth_auto_discovery(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_ETH_AUTO_DISCOVERY
+ route_dist = '65000:100'
+ esi = {
+ 'type': ESI_TYPE_LACP,
+ 'mac_addr': 'aa:bb:cc:dd:ee:ff',
+ 'port_key': 100,
+ }
+ ethernet_tag_id = EVPN_MAX_ET
+ redundancy_mode = REDUNDANCY_MODE_ALL_ACTIVE
+ next_hop = '0.0.0.0'
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'esi': esi,
+ 'ethernet_tag_id': ethernet_tag_id,
+ 'redundancy_mode': redundancy_mode,
+ 'next_hop': next_hop,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ redundancy_mode=redundancy_mode,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_eth_auto_discovery_vni(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_ETH_AUTO_DISCOVERY
+ route_dist = '65000:100'
+ esi = {
+ 'type': ESI_TYPE_L2_BRIDGE,
+ 'mac_addr': 'aa:bb:cc:dd:ee:ff',
+ 'priority': 100,
+ }
+ ethernet_tag_id = EVPN_MAX_ET
+ redundancy_mode = REDUNDANCY_MODE_SINGLE_ACTIVE
+ vni = 500
+ next_hop = '0.0.0.0'
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'esi': esi,
+ 'ethernet_tag_id': ethernet_tag_id,
+ 'redundancy_mode': redundancy_mode,
+ 'vni': vni,
+ 'next_hop': next_hop,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ redundancy_mode=redundancy_mode,
+ vni=vni
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', **expected_kwargs)
+
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_mac_ip_adv(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_MAC_IP_ADV_ROUTE
+ route_dist = '65000:100'
+ esi = 0 # denotes single-homed
+ ethernet_tag_id = 200
+ mac_addr = 'aa:bb:cc:dd:ee:ff'
+ ip_addr = '192.168.0.1'
+ next_hop = '10.0.0.1'
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'esi': esi,
+ 'ethernet_tag_id': ethernet_tag_id,
+ 'mac_addr': mac_addr,
+ 'ip_addr': ip_addr,
+ 'next_hop': next_hop,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ mac_addr=mac_addr,
+ ip_addr=ip_addr,
+ next_hop=next_hop,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', **expected_kwargs)
+
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_mac_ip_adv_vni(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_MAC_IP_ADV_ROUTE
+ route_dist = '65000:100'
+ esi = 0 # denotes single-homed
+ ethernet_tag_id = 200
+ mac_addr = 'aa:bb:cc:dd:ee:ff'
+ ip_addr = '192.168.0.1'
+ vni = 500
+ next_hop = '10.0.0.1'
+ tunnel_type = bgpspeaker.TUNNEL_TYPE_VXLAN
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'esi': esi,
+ 'ethernet_tag_id': ethernet_tag_id,
+ 'mac_addr': mac_addr,
+ 'ip_addr': ip_addr,
+ 'vni': vni,
+ 'next_hop': next_hop,
+ 'tunnel_type': tunnel_type,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ mac_addr=mac_addr,
+ ip_addr=ip_addr,
+ vni=vni,
+ next_hop=next_hop,
+ tunnel_type=tunnel_type,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', **expected_kwargs)
+
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_multicast_etag(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
+ route_dist = '65000:100'
+ esi = 0 # denotes single-homed
+ ethernet_tag_id = 200
+ mac_addr = 'aa:bb:cc:dd:ee:ff'
+ ip_addr = '192.168.0.1'
+ next_hop = '10.0.0.1'
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ # 'esi': esi, # should be ignored
+ 'ethernet_tag_id': ethernet_tag_id,
+ # 'mac_addr': mac_addr, # should be ignored
+ 'ip_addr': ip_addr,
+ 'next_hop': next_hop,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ mac_addr=mac_addr,
+ ip_addr=ip_addr,
+ next_hop=next_hop,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', **expected_kwargs)
+
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_multicast_etag_no_next_hop(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
+ route_dist = '65000:100'
+ esi = 0 # denotes single-homed
+ ethernet_tag_id = 200
+ mac_addr = 'aa:bb:cc:dd:ee:ff'
+ ip_addr = '192.168.0.1'
+ next_hop = '0.0.0.0' # the default value
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ # 'esi': esi, # should be ignored
+ 'ethernet_tag_id': ethernet_tag_id,
+ # 'mac_addr': mac_addr, # should be ignored
+ 'ip_addr': ip_addr,
+ 'next_hop': next_hop,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ mac_addr=mac_addr,
+ ip_addr=ip_addr,
+ # next_hop=next_hop, # omitted
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_eth_segment(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_ETH_SEGMENT
+ route_dist = '65000:100'
+ esi = {
+ 'type': ESI_TYPE_MAC_BASED,
+ 'mac_addr': 'aa:bb:cc:dd:ee:ff',
+ 'local_disc': 100,
+ }
+ ip_addr = '192.168.0.1'
+ next_hop = '0.0.0.0'
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'esi': esi,
+ 'ip_addr': ip_addr,
+ 'next_hop': next_hop,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ip_addr=ip_addr,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_ip_prefix_route(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_IP_PREFIX_ROUTE
+ route_dist = '65000:100'
+ esi = 0 # denotes single-homed
+ ethernet_tag_id = 200
+ ip_prefix = '192.168.0.0/24'
+ gw_ip_addr = '172.16.0.1'
+ next_hop = '0.0.0.0'
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'esi': esi,
+ 'ethernet_tag_id': ethernet_tag_id,
+ 'ip_prefix': ip_prefix,
+ 'gw_ip_addr': gw_ip_addr,
+ 'next_hop': next_hop,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ ip_prefix=ip_prefix,
+ gw_ip_addr=gw_ip_addr,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_ip_prefix_route_vni(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_IP_PREFIX_ROUTE
+ route_dist = '65000:100'
+ esi = 0 # denotes single-homed
+ ethernet_tag_id = 200
+ ip_prefix = '192.168.0.0/24'
+ gw_ip_addr = '172.16.0.1'
+ vni = 500
+ tunnel_type = bgpspeaker.TUNNEL_TYPE_VXLAN
+ next_hop = '0.0.0.0'
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'esi': esi,
+ 'ethernet_tag_id': ethernet_tag_id,
+ 'ip_prefix': ip_prefix,
+ 'gw_ip_addr': gw_ip_addr,
+ 'tunnel_type': tunnel_type,
+ 'vni': vni,
+ 'next_hop': next_hop,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ ip_prefix=ip_prefix,
+ gw_ip_addr=gw_ip_addr,
+ tunnel_type=tunnel_type,
+ vni=vni,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', **expected_kwargs)
+
+ @raises(ValueError)
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_invalid_route_type(self, mock_call):
+ # Prepare test data
+ route_type = 'foobar' # Invalid EVPN route type
+ route_dist = '65000:100'
+ esi = 0 # denotes single-homed
+ ethernet_tag_id = 200
+ mac_addr = 'aa:bb:cc:dd:ee:ff'
+ ip_addr = '192.168.0.1'
+ next_hop = '10.0.0.1'
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ mac_addr=mac_addr,
+ ip_addr=ip_addr,
+ next_hop=next_hop,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', 'Invalid arguments detected')
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_del_auto_discovery(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_ETH_AUTO_DISCOVERY
+ route_dist = '65000:100'
+ esi = {
+ 'type': ESI_TYPE_LACP,
+ 'mac_addr': 'aa:bb:cc:dd:ee:ff',
+ 'port_key': 100,
+ }
+ ethernet_tag_id = EVPN_MAX_ET
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'esi': esi,
+ 'ethernet_tag_id': ethernet_tag_id,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_del(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.delete_local', **expected_kwargs)
+
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_del_mac_ip_adv(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_MAC_IP_ADV_ROUTE
+ route_dist = '65000:100'
+ ethernet_tag_id = 200
+ mac_addr = 'aa:bb:cc:dd:ee:ff'
+ ip_addr = '192.168.0.1'
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'ethernet_tag_id': ethernet_tag_id,
+ 'mac_addr': mac_addr,
+ 'ip_addr': ip_addr,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_del(
+ route_type=route_type,
+ route_dist=route_dist,
+ ethernet_tag_id=ethernet_tag_id,
+ mac_addr=mac_addr,
+ ip_addr=ip_addr,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.delete_local', **expected_kwargs)
+
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_del_multicast_etag(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
+ route_dist = '65000:100'
+ esi = 0 # denotes single-homed
+ ethernet_tag_id = 200
+ mac_addr = 'aa:bb:cc:dd:ee:ff'
+ ip_addr = '192.168.0.1'
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ # 'esi': esi, # should be ignored
+ 'ethernet_tag_id': ethernet_tag_id,
+ # 'mac_addr': mac_addr, # should be ignored
+ 'ip_addr': ip_addr,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_del(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ mac_addr=mac_addr,
+ ip_addr=ip_addr,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.delete_local', **expected_kwargs)
+
+ @raises(ValueError)
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_del_invalid_route_type(self, mock_call):
+ # Prepare test data
+ route_type = 'foobar' # Invalid EVPN route type
+ route_dist = '65000:100'
+ esi = 0 # denotes single-homed
+ ethernet_tag_id = 200
+ mac_addr = 'aa:bb:cc:dd:ee:ff'
+ ip_addr = '192.168.0.1'
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_del(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ethernet_tag_id=ethernet_tag_id,
+ mac_addr=mac_addr,
+ ip_addr=ip_addr,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.delete_local', 'Invalid arguments detected')
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_del_eth_segment(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_ETH_SEGMENT
+ route_dist = '65000:100'
+ esi = {
+ 'esi_type': ESI_TYPE_MAC_BASED,
+ 'mac_addr': 'aa:bb:cc:dd:ee:ff',
+ 'local_disc': 100,
+ }
+ ip_addr = '192.168.0.1'
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'esi': esi,
+ 'ip_addr': ip_addr,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_del(
+ route_type=route_type,
+ route_dist=route_dist,
+ esi=esi,
+ ip_addr=ip_addr,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.delete_local', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_del_ip_prefix_route(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_IP_PREFIX_ROUTE
+ route_dist = '65000:100'
+ ethernet_tag_id = 200
+ ip_prefix = '192.168.0.0/24'
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'ethernet_tag_id': ethernet_tag_id,
+ 'ip_prefix': ip_prefix,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_del(
+ route_type=route_type,
+ route_dist=route_dist,
+ ethernet_tag_id=ethernet_tag_id,
+ ip_prefix=ip_prefix,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.delete_local', **expected_kwargs)
+
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_pmsi_no_tunnel_info(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
+ route_dist = '65000:100'
+ ethernet_tag_id = 200
+ next_hop = '0.0.0.0'
+ ip_addr = '192.168.0.1'
+ pmsi_tunnel_type = bgpspeaker.PMSI_TYPE_NO_TUNNEL_INFO
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'ethernet_tag_id': ethernet_tag_id,
+ 'next_hop': next_hop,
+ 'ip_addr': ip_addr,
+ 'pmsi_tunnel_type': pmsi_tunnel_type,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ ethernet_tag_id=ethernet_tag_id,
+ ip_addr=ip_addr,
+ pmsi_tunnel_type=pmsi_tunnel_type,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_pmsi_ingress_rep(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
+ route_dist = '65000:100'
+ ethernet_tag_id = 200
+ next_hop = '0.0.0.0'
+ ip_addr = '192.168.0.1'
+ pmsi_tunnel_type = bgpspeaker.PMSI_TYPE_INGRESS_REP
+ expected_kwargs = {
+ 'route_type': route_type,
+ 'route_dist': route_dist,
+ 'ethernet_tag_id': ethernet_tag_id,
+ 'next_hop': next_hop,
+ 'ip_addr': ip_addr,
+ 'pmsi_tunnel_type': pmsi_tunnel_type,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ ethernet_tag_id=ethernet_tag_id,
+ ip_addr=ip_addr,
+ pmsi_tunnel_type=pmsi_tunnel_type,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', **expected_kwargs)
+
+ @raises(ValueError)
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_evpn_prefix_add_invalid_pmsi_tunnel_type(self, mock_call):
+ # Prepare test data
+ route_type = bgpspeaker.EVPN_MULTICAST_ETAG_ROUTE
+ route_dist = '65000:100'
+ ethernet_tag_id = 200
+ next_hop = '0.0.0.0'
+ ip_addr = '192.168.0.1'
+ pmsi_tunnel_type = 1
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.evpn_prefix_add(
+ route_type=route_type,
+ route_dist=route_dist,
+ ethernet_tag_id=ethernet_tag_id,
+ ip_addr=ip_addr,
+ pmsi_tunnel_type=pmsi_tunnel_type,
+ )
+
+ # Check
+ mock_call.assert_called_with(
+ 'evpn_prefix.add_local', 'Invalid arguments detected')
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_add_ipv4(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV4
+ rules = {
+ 'dst_prefix': '10.60.1.0/24',
+ }
+
+ actions = {
+ 'traffic_marking': {
+ 'dscp': 24,
+ }
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'rules': rules,
+ 'actions': actions,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_add(
+ flowspec_family=flowspec_family,
+ rules=rules,
+ actions=actions)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.add', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_add_ipv4_without_actions(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV4
+ rules = {
+ 'dst_prefix': '10.60.1.0/24',
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'rules': rules,
+ 'actions': {},
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_add(
+ flowspec_family=flowspec_family,
+ rules=rules)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.add', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_del_ipv4(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV4
+ rules = {
+ 'dst_prefix': '10.60.1.0/24',
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'rules': rules,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_del(
+ flowspec_family=flowspec_family,
+ rules=rules)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.del', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_add_vpnv4(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_VPNV4
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '10.70.1.0/24',
+ }
+
+ actions = {
+ 'traffic_marking': {
+ 'dscp': 24,
+ }
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'route_dist': route_dist,
+ 'rules': rules,
+ 'actions': actions,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_add(
+ flowspec_family=flowspec_family,
+ route_dist=route_dist,
+ rules=rules,
+ actions=actions)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.add_local', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_del_vpnv4(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_VPNV4
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '10.70.1.0/24',
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'route_dist': route_dist,
+ 'rules': rules,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_del(
+ flowspec_family=flowspec_family,
+ route_dist=route_dist,
+ rules=rules)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.del_local', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_add_ipv6(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV6
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+
+ actions = {
+ 'traffic_marking': {
+ 'dscp': 24,
+ }
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'rules': rules,
+ 'actions': actions,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_add(
+ flowspec_family=flowspec_family,
+ rules=rules,
+ actions=actions)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.add', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_add_ipv6_without_actions(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV6
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'rules': rules,
+ 'actions': {},
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_add(
+ flowspec_family=flowspec_family,
+ rules=rules)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.add', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_del_ipv6(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_IPV6
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'rules': rules,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_del(
+ flowspec_family=flowspec_family,
+ rules=rules)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.del', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_add_vpnv6(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_VPNV6
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+
+ actions = {
+ 'traffic_marking': {
+ 'dscp': 24,
+ }
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'route_dist': route_dist,
+ 'rules': rules,
+ 'actions': actions,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_add(
+ flowspec_family=flowspec_family,
+ route_dist=route_dist,
+ rules=rules,
+ actions=actions)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.add_local', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_del_vpnv6(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_VPNV6
+ route_dist = '65001:100'
+ rules = {
+ 'dst_prefix': '2001::3/128/32',
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'route_dist': route_dist,
+ 'rules': rules,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_del(
+ flowspec_family=flowspec_family,
+ route_dist=route_dist,
+ rules=rules)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.del_local', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_add_l2vpn(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_L2VPN
+ route_dist = '65001:100'
+ rules = {
+ 'dst_mac': '12:34:56:78:9a:bc',
+ }
+
+ actions = {
+ 'traffic_marking': {
+ 'dscp': 24,
+ }
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'route_dist': route_dist,
+ 'rules': rules,
+ 'actions': actions,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_add(
+ flowspec_family=flowspec_family,
+ route_dist=route_dist,
+ rules=rules,
+ actions=actions)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.add_local', **expected_kwargs)
+
+ @mock.patch(
+ 'ryu.services.protocols.bgp.bgpspeaker.BGPSpeaker.__init__',
+ mock.MagicMock(return_value=None))
+ @mock.patch('ryu.services.protocols.bgp.bgpspeaker.call')
+ def test_flowspec_prefix_del_l2vpn(self, mock_call):
+ # Prepare test data
+ flowspec_family = bgpspeaker.FLOWSPEC_FAMILY_L2VPN
+ route_dist = '65001:100'
+ rules = {
+ 'dst_mac': '12:34:56:78:9a:bc',
+ }
+
+ expected_kwargs = {
+ 'flowspec_family': flowspec_family,
+ 'route_dist': route_dist,
+ 'rules': rules,
+ }
+
+ # Test
+ speaker = bgpspeaker.BGPSpeaker(65000, '10.0.0.1')
+ speaker.flowspec_prefix_del(
+ flowspec_family=flowspec_family,
+ route_dist=route_dist,
+ rules=rules)
+
+ # Check
+ mock_call.assert_called_with(
+ 'flowspec.del_local', **expected_kwargs)
diff --git a/tests/unit/services/protocols/bgp/test_peer.py b/tests/unit/services/protocols/bgp/test_peer.py
new file mode 100644
index 00000000..1597efdb
--- /dev/null
+++ b/tests/unit/services/protocols/bgp/test_peer.py
@@ -0,0 +1,375 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+import logging
+try:
+ import mock # Python 2
+except ImportError:
+ from unittest import mock # Python 3
+
+from nose.tools import eq_
+
+from ryu.lib.packet import bgp
+from ryu.services.protocols.bgp import peer
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_Peer(unittest.TestCase):
+ """
+ Test case for peer.Peer
+ """
+
+ @mock.patch.object(
+ peer.Peer, '__init__', mock.MagicMock(return_value=None))
+ def _test_construct_as_path_attr(
+ self, input_as_path, input_as4_path, expected_as_path):
+ # Prepare input data
+ input_as_path_attr = bgp.BGPPathAttributeAsPath(input_as_path)
+ input_as4_path_attr = bgp.BGPPathAttributeAs4Path(input_as4_path)
+ _peer = peer.Peer(None, None, None, None, None)
+
+ # TEST
+ output_as_path_attr = _peer._construct_as_path_attr(
+ input_as_path_attr, input_as4_path_attr)
+
+ eq_(bgp.BGP_ATTR_TYPE_AS_PATH, output_as_path_attr.type)
+ eq_(expected_as_path, output_as_path_attr.path_seg_list)
+
+ def test_construct_as_path_attr_sequence_only(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000, 23456, 23456, 40001]]
+ input_as4_path = [[400000, 300000, 40001]]
+ # Expected:
+ expected_as_path = [[65000, 4000, 400000, 300000, 40001]]
+
+ self._test_construct_as_path_attr(
+ input_as_path, input_as4_path, expected_as_path)
+
+ def test_construct_as_path_attr_aggregated_as_path_1(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000], {10, 20, 30}, [23456, 23456, 40001]]
+ input_as4_path = [[400000, 300000, 40001]]
+ # Expected:
+ expected_as_path = [[65000, 4000], {10, 20, 30}, [400000, 300000, 40001]]
+
+ self._test_construct_as_path_attr(
+ input_as_path, input_as4_path, expected_as_path)
+
+ def test_construct_as_path_attr_aggregated_as_path_2(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000], {10, 20, 30}, [23456, 23456, 40001]]
+ input_as4_path = [[3000, 400000, 300000, 40001]]
+ # Expected:
+ expected_as_path = [[65000, 4000, 3000, 400000, 300000, 40001]]
+
+ self._test_construct_as_path_attr(
+ input_as_path, input_as4_path, expected_as_path)
+
+ def test_construct_as_path_attr_aggregated_path_3(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000, 23456, 23456, 40001]]
+ input_as4_path = [[400000, 300000, 40001], {10, 20, 30}]
+ # Expected:
+ expected_as_path = [[65000, 400000, 300000, 40001], {10, 20, 30}]
+
+ self._test_construct_as_path_attr(
+ input_as_path, input_as4_path, expected_as_path)
+
+ def test_construct_as_path_attr_aggregated_as4_path(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000, 23456, 23456, 40001]]
+ input_as4_path = [{10, 20, 30}, [400000, 300000, 40001]]
+ # Expected:
+ expected_as_path = [[65000], {10, 20, 30}, [400000, 300000, 40001]]
+
+ self._test_construct_as_path_attr(
+ input_as_path, input_as4_path, expected_as_path)
+
+ def test_construct_as_path_attr_too_short_as_path(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000, 23456, 23456, 40001]]
+ input_as4_path = [[100000, 65000, 4000, 400000, 300000, 40001]]
+ # Expected:
+ expected_as_path = [[65000, 4000, 23456, 23456, 40001]]
+
+ self._test_construct_as_path_attr(
+ input_as_path, input_as4_path, expected_as_path)
+
+ def test_construct_as_path_attr_too_short_as4_path(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000, 23456, 23456, 40001]]
+ input_as4_path = [[300000, 40001]]
+ # Expected:
+ expected_as_path = [[65000, 4000, 23456, 300000, 40001]]
+
+ self._test_construct_as_path_attr(
+ input_as_path, input_as4_path, expected_as_path)
+
+ def test_construct_as_path_attr_empty_as4_path(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000, 23456, 23456, 40001]]
+ input_as4_path = [[]]
+ # Expected:
+ expected_as_path = [[65000, 4000, 23456, 23456, 40001]]
+
+ self._test_construct_as_path_attr(
+ input_as_path, input_as4_path, expected_as_path)
+
+ @mock.patch.object(
+ peer.Peer, '__init__', mock.MagicMock(return_value=None))
+ def test_construct_as_path_attr_as4_path_None(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000, 23456, 23456, 40001]]
+ # input_as4_path = None
+ # Expected:
+ expected_as_path = [[65000, 4000, 23456, 23456, 40001]]
+
+ # Prepare input data
+ input_as_path_attr = bgp.BGPPathAttributeAsPath(input_as_path)
+ input_as4_path_attr = None
+ _peer = peer.Peer(None, None, None, None, None)
+
+ # TEST
+ output_as_path_attr = _peer._construct_as_path_attr(
+ input_as_path_attr, input_as4_path_attr)
+
+ eq_(bgp.BGP_ATTR_TYPE_AS_PATH, output_as_path_attr.type)
+ eq_(expected_as_path, output_as_path_attr.path_seg_list)
+
+ @mock.patch.object(
+ peer.Peer, '__init__', mock.MagicMock(return_value=None))
+ def _test_trans_as_path(
+ self, input_as_path, expected_as_path, expected_as4_path):
+ # Prepare input data
+ _peer = peer.Peer(None, None, None, None, None)
+
+ # TEST
+ output_as_path, output_as4_path = _peer._trans_as_path(input_as_path)
+
+ eq_(expected_as_path, output_as_path)
+ eq_(expected_as4_path, output_as4_path)
+
+ @mock.patch.object(
+ peer.Peer, 'is_four_octet_as_number_cap_valid',
+ mock.MagicMock(return_value=True))
+ def test_trans_as_path_as4_path_is_supported(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000, 400000, 300000, 40001]]
+ # Expected:
+ expected_as_path = [[65000, 4000, 400000, 300000, 40001]]
+ expected_as4_path = None
+
+ self._test_trans_as_path(
+ input_as_path, expected_as_path, expected_as4_path)
+
+ @mock.patch.object(
+ peer.Peer, 'is_four_octet_as_number_cap_valid',
+ mock.MagicMock(return_value=False))
+ def test_trans_as_path_sequence_only(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000, 400000, 300000, 40001]]
+ # Expected:
+ expected_as_path = [[65000, 4000, 23456, 23456, 40001]]
+ expected_as4_path = [[65000, 4000, 400000, 300000, 40001]]
+
+ self._test_trans_as_path(
+ input_as_path, expected_as_path, expected_as4_path)
+
+ @mock.patch.object(
+ peer.Peer, 'is_four_octet_as_number_cap_valid',
+ mock.MagicMock(return_value=False))
+ def test_trans_as_path_no_trans(self):
+ # Test Data
+ # Input:
+ input_as_path = [[65000, 4000, 40000, 30000, 40001]]
+ # Expected:
+ expected_as_path = [[65000, 4000, 40000, 30000, 40001]]
+ expected_as4_path = None
+
+ self._test_trans_as_path(
+ input_as_path, expected_as_path, expected_as4_path)
+
+ @mock.patch.object(
+ peer.Peer, '__init__', mock.MagicMock(return_value=None))
+ def _test_extract_and_reconstruct_as_path(
+ self, path_attributes, ex_as_path_value,
+ ex_aggregator_as_number, ex_aggregator_addr):
+ # Prepare test data
+ update_msg = bgp.BGPUpdate(path_attributes=path_attributes)
+ _peer = peer.Peer(None, None, None, None, None)
+
+ # Test
+ _peer._extract_and_reconstruct_as_path(update_msg)
+
+ umsg_pattrs = update_msg.pathattr_map
+ as_path_attr = umsg_pattrs.get(
+ bgp.BGP_ATTR_TYPE_AS_PATH, None)
+ as4_path_attr = umsg_pattrs.get(
+ bgp.BGP_ATTR_TYPE_AS4_PATH, None)
+ aggregator_attr = umsg_pattrs.get(
+ bgp.BGP_ATTR_TYPE_AGGREGATOR, None)
+ as4_aggregator_attr = umsg_pattrs.get(
+ bgp.BGP_ATTR_TYPE_AS4_AGGREGATOR, None)
+
+ eq_(ex_as_path_value, as_path_attr.value)
+ eq_(None, as4_path_attr)
+ eq_(ex_aggregator_as_number, aggregator_attr.as_number)
+ eq_(ex_aggregator_addr, aggregator_attr.addr)
+ eq_(None, as4_aggregator_attr)
+
+ @mock.patch.object(
+ peer.Peer, '__init__', mock.MagicMock(return_value=None))
+ def test_extract_and_reconstruct_as_path_with_no_as4_attr(self):
+ # Input values
+ in_as_path_value = [[1000, 2000, 3000]]
+ # in_as4_path_value
+ in_aggregator_as_number = 4000
+ in_aggregator_addr = '10.0.0.1'
+ # in_as4_aggregator_as_number
+ # in_as4_aggregator_addr
+
+ # Expected values
+ ex_as_path_value = [[1000, 2000, 3000]]
+ ex_aggregator_as_number = 4000
+ ex_aggregator_addr = '10.0.0.1'
+
+ # Prepare test data
+ path_attributes = [
+ bgp.BGPPathAttributeAsPath(
+ value=in_as_path_value),
+ bgp.BGPPathAttributeAggregator(
+ as_number=in_aggregator_as_number, addr=in_aggregator_addr),
+ ]
+
+ # Test
+ self._test_extract_and_reconstruct_as_path(
+ path_attributes, ex_as_path_value,
+ ex_aggregator_as_number, ex_aggregator_addr)
+
+ @mock.patch.object(
+ peer.Peer, '__init__', mock.MagicMock(return_value=None))
+ def test_extract_and_reconstruct_as_path_with_as4_attr(self):
+ # Input values
+ in_as_path_value = [[1000, 23456, 3000]]
+ in_as4_path_value = [[2000, 3000]]
+ in_aggregator_as_number = 23456
+ in_aggregator_addr = '10.0.0.1'
+ in_as4_aggregator_as_number = 4000
+ in_as4_aggregator_addr = '10.0.0.1'
+
+ # Expected values
+ ex_as_path_value = [[1000, 2000, 3000]]
+ ex_aggregator_as_number = 4000
+ ex_aggregator_addr = '10.0.0.1'
+
+ # Prepare test data
+ path_attributes = [
+ bgp.BGPPathAttributeAsPath(
+ value=in_as_path_value),
+ bgp.BGPPathAttributeAs4Path(
+ value=in_as4_path_value),
+ bgp.BGPPathAttributeAggregator(
+ as_number=in_aggregator_as_number,
+ addr=in_aggregator_addr),
+ bgp.BGPPathAttributeAs4Aggregator(
+ as_number=in_as4_aggregator_as_number,
+ addr=in_as4_aggregator_addr),
+ ]
+
+ # Test
+ self._test_extract_and_reconstruct_as_path(
+ path_attributes, ex_as_path_value,
+ ex_aggregator_as_number, ex_aggregator_addr)
+
+ @mock.patch.object(
+ peer.Peer, '__init__', mock.MagicMock(return_value=None))
+ def test_extract_and_reconstruct_as_path_with_not_trans_as_aggr(self):
+ # Input values
+ in_as_path_value = [[1000, 23456, 3000]]
+ in_as4_path_value = [[2000, 3000]]
+ in_aggregator_as_number = 4000 # not AS_TRANS
+ in_aggregator_addr = '10.0.0.1'
+ in_as4_aggregator_as_number = 4000
+ in_as4_aggregator_addr = '10.0.0.1'
+
+ # Expected values
+ ex_as_path_value = [[1000, 23456, 3000]]
+ ex_aggregator_as_number = 4000
+ ex_aggregator_addr = '10.0.0.1'
+
+ # Prepare test data
+ path_attributes = [
+ bgp.BGPPathAttributeAsPath(
+ value=in_as_path_value),
+ bgp.BGPPathAttributeAs4Path(
+ value=in_as4_path_value),
+ bgp.BGPPathAttributeAggregator(
+ as_number=in_aggregator_as_number,
+ addr=in_aggregator_addr),
+ bgp.BGPPathAttributeAs4Aggregator(
+ as_number=in_as4_aggregator_as_number,
+ addr=in_as4_aggregator_addr),
+ ]
+
+ # Test
+ self._test_extract_and_reconstruct_as_path(
+ path_attributes, ex_as_path_value,
+ ex_aggregator_as_number, ex_aggregator_addr)
+
+ @mock.patch.object(
+ peer.Peer, '__init__', mock.MagicMock(return_value=None))
+ def test_extract_and_reconstruct_as_path_with_short_as_path(self):
+ # Input values
+ in_as_path_value = [[1000, 23456, 3000]]
+ in_as4_path_value = [[2000, 3000, 4000, 5000]] # longer than AS_PATH
+ in_aggregator_as_number = 4000
+ in_aggregator_addr = '10.0.0.1'
+ # in_as4_aggregator_as_number
+ # in_as4_aggregator_addr
+
+ # Expected values
+ ex_as_path_value = [[1000, 23456, 3000]]
+ ex_aggregator_as_number = 4000
+ ex_aggregator_addr = '10.0.0.1'
+
+ # Prepare test data
+ path_attributes = [
+ bgp.BGPPathAttributeAsPath(
+ value=in_as_path_value),
+ bgp.BGPPathAttributeAs4Path(
+ value=in_as4_path_value),
+ bgp.BGPPathAttributeAggregator(
+ as_number=in_aggregator_as_number,
+ addr=in_aggregator_addr),
+ ]
+
+ # Test
+ self._test_extract_and_reconstruct_as_path(
+ path_attributes, ex_as_path_value,
+ ex_aggregator_as_number, ex_aggregator_addr)
diff --git a/tests/unit/services/protocols/bgp/utils/__init__.py b/tests/unit/services/protocols/bgp/utils/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/unit/services/protocols/bgp/utils/__init__.py
diff --git a/tests/unit/services/protocols/bgp/utils/test_bgp.py b/tests/unit/services/protocols/bgp/utils/test_bgp.py
new file mode 100644
index 00000000..6933a28b
--- /dev/null
+++ b/tests/unit/services/protocols/bgp/utils/test_bgp.py
@@ -0,0 +1,211 @@
+# Copyright (C) 2017 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import logging
+import unittest
+
+from nose.tools import eq_, raises
+
+from ryu.lib.packet.bgp import (
+ BGPFlowSpecTrafficRateCommunity,
+ BGPFlowSpecTrafficActionCommunity,
+ BGPFlowSpecRedirectCommunity,
+ BGPFlowSpecTrafficMarkingCommunity,
+ BGPFlowSpecVlanActionCommunity,
+ BGPFlowSpecTPIDActionCommunity,
+)
+
+from ryu.services.protocols.bgp.core import BgpCoreError
+from ryu.services.protocols.bgp.utils.bgp import create_v4flowspec_actions
+from ryu.services.protocols.bgp.utils.bgp import create_v6flowspec_actions
+from ryu.services.protocols.bgp.utils.bgp import create_l2vpnflowspec_actions
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_Utils_BGP(unittest.TestCase):
+ """
+ Test case for ryu.services.protocols.bgp.utils.bgp
+ """
+
+ def _test_create_v4flowspec_actions(self, actions, expected_communities):
+ communities = create_v4flowspec_actions(actions)
+ expected_communities.sort(key=lambda x: x.subtype)
+ communities.sort(key=lambda x: x.subtype)
+ eq_(str(expected_communities), str(communities))
+
+ def test_create_v4flowspec_actions_all_actions(self):
+ actions = {
+ 'traffic_rate': {
+ 'as_number': 0,
+ 'rate_info': 100.0,
+ },
+ 'traffic_action': {
+ 'action': 3,
+ },
+ 'redirect': {
+ 'as_number': 10,
+ 'local_administrator': 10,
+ },
+ 'traffic_marking': {
+ 'dscp': 24,
+ }
+ }
+ expected_communities = [
+ BGPFlowSpecTrafficRateCommunity(as_number=0, rate_info=100.0),
+ BGPFlowSpecTrafficActionCommunity(action=3),
+ BGPFlowSpecRedirectCommunity(as_number=10, local_administrator=10),
+ BGPFlowSpecTrafficMarkingCommunity(dscp=24),
+ ]
+ self._test_create_v4flowspec_actions(actions, expected_communities)
+
+ def test_create_v4flowspec_actions_without_actions(self):
+ actions = None
+ expected_communities = []
+ self._test_create_v4flowspec_actions(actions, expected_communities)
+
+ @raises(ValueError)
+ def test_create_v4flowspec_actions_not_exist_actions(self):
+ actions = {
+ 'traffic_test': {
+ 'test': 10,
+ },
+ }
+ expected_communities = []
+ self._test_create_v4flowspec_actions(actions, expected_communities)
+
+ def _test_create_v6flowspec_actions(self, actions, expected_communities):
+ communities = create_v6flowspec_actions(actions)
+ expected_communities.sort(key=lambda x: x.subtype)
+ communities.sort(key=lambda x: x.subtype)
+ eq_(str(expected_communities), str(communities))
+
+ def test_create_v6flowspec_actions_all_actions(self):
+ actions = {
+ 'traffic_rate': {
+ 'as_number': 0,
+ 'rate_info': 100.0,
+ },
+ 'traffic_action': {
+ 'action': 3,
+ },
+ 'redirect': {
+ 'as_number': 10,
+ 'local_administrator': 10,
+ },
+ 'traffic_marking': {
+ 'dscp': 24,
+ }
+ }
+ expected_communities = [
+ BGPFlowSpecTrafficRateCommunity(as_number=0, rate_info=100.0),
+ BGPFlowSpecTrafficActionCommunity(action=3),
+ BGPFlowSpecRedirectCommunity(as_number=10, local_administrator=10),
+ BGPFlowSpecTrafficMarkingCommunity(dscp=24),
+ ]
+ self._test_create_v6flowspec_actions(actions, expected_communities)
+
+ def test_create_v6flowspec_actions_without_actions(self):
+ actions = None
+ expected_communities = []
+ self._test_create_v6flowspec_actions(actions, expected_communities)
+
+ @raises(ValueError)
+ def test_create_v6flowspec_actions_not_exist_actions(self):
+ actions = {
+ 'traffic_test': {
+ 'test': 10,
+ },
+ }
+ expected_communities = []
+ self._test_create_v6flowspec_actions(actions, expected_communities)
+
+ def _test_create_l2vpnflowspec_actions(self, actions, expected_communities):
+ communities = create_l2vpnflowspec_actions(actions)
+ expected_communities.sort(key=lambda x: x.subtype)
+ communities.sort(key=lambda x: x.subtype)
+ eq_(str(expected_communities), str(communities))
+
+ def test_create_l2vpnflowspec_actions_all_actions(self):
+ actions = {
+ 'traffic_rate': {
+ 'as_number': 0,
+ 'rate_info': 100.0,
+ },
+ 'traffic_action': {
+ 'action': 3,
+ },
+ 'redirect': {
+ 'as_number': 10,
+ 'local_administrator': 10,
+ },
+ 'traffic_marking': {
+ 'dscp': 24,
+ },
+ 'vlan_action': {
+ 'actions_1': (BGPFlowSpecVlanActionCommunity.POP |
+ BGPFlowSpecVlanActionCommunity.SWAP),
+ 'vlan_1': 3000,
+ 'cos_1': 3,
+ 'actions_2': BGPFlowSpecVlanActionCommunity.PUSH,
+ 'vlan_2': 4000,
+ 'cos_2': 2,
+ },
+ 'tpid_action': {
+ 'actions': (BGPFlowSpecTPIDActionCommunity.TI |
+ BGPFlowSpecTPIDActionCommunity.TO),
+ 'tpid_1': 5,
+ 'tpid_2': 6,
+ }
+ }
+ expected_communities = [
+ BGPFlowSpecTrafficRateCommunity(as_number=0, rate_info=100.0),
+ BGPFlowSpecTrafficActionCommunity(action=3),
+ BGPFlowSpecRedirectCommunity(as_number=10, local_administrator=10),
+ BGPFlowSpecTrafficMarkingCommunity(dscp=24),
+ BGPFlowSpecVlanActionCommunity(
+ actions_1=(BGPFlowSpecVlanActionCommunity.POP |
+ BGPFlowSpecVlanActionCommunity.SWAP),
+ vlan_1=3000,
+ cos_1=3,
+ actions_2=BGPFlowSpecVlanActionCommunity.PUSH,
+ vlan_2=4000,
+ cos_2=2,
+ ),
+ BGPFlowSpecTPIDActionCommunity(
+ actions=(BGPFlowSpecTPIDActionCommunity.TI |
+ BGPFlowSpecTPIDActionCommunity.TO),
+ tpid_1=5,
+ tpid_2=6,
+ ),
+ ]
+ self._test_create_l2vpnflowspec_actions(actions, expected_communities)
+
+ def test_create_l2vpnflowspec_actions_without_actions(self):
+ actions = None
+ expected_communities = []
+ self._test_create_l2vpnflowspec_actions(actions, expected_communities)
+
+ @raises(ValueError)
+ def test_create_l2vpnflowspec_actions_not_exist_actions(self):
+ actions = {
+ 'traffic_test': {
+ 'test': 10,
+ },
+ }
+ expected_communities = []
+ self._test_create_l2vpnflowspec_actions(actions, expected_communities)
diff --git a/tests/unit/services/protocols/bgp/utils/test_validation.py b/tests/unit/services/protocols/bgp/utils/test_validation.py
new file mode 100644
index 00000000..6d5f6ac3
--- /dev/null
+++ b/tests/unit/services/protocols/bgp/utils/test_validation.py
@@ -0,0 +1,215 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import unittest
+
+from nose.tools import eq_, ok_
+
+from ryu.services.protocols.bgp.utils import validation
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_Utils_Validation(unittest.TestCase):
+ """
+ Test case for ryu.services.protocols.bgp.utils.validation
+ """
+
+ def test_is_valid_mac(self):
+ ok_(validation.is_valid_mac('aa:bb:cc:dd:ee:ff'))
+
+ def test_is_valid_mac_hyphenation(self):
+ ok_(validation.is_valid_mac('aa-bb-cc-dd-ee-ff'))
+
+ def test_is_valid_mac_short(self):
+ eq_(False, validation.is_valid_mac('aa:bb:cc:dd:ee'))
+
+ def test_is_valid_ip_prefix(self):
+ ok_(validation.is_valid_ip_prefix(24, 32))
+
+ def test_is_valid_ip_prefix_str(self):
+ ok_(validation.is_valid_ip_prefix('24', 32))
+
+ def test_is_valid_ip_prefix_not_digit(self):
+ eq_(False, validation.is_valid_ip_prefix('foo', 32))
+
+ def test_is_valid_ip_prefix_over(self):
+ eq_(False, validation.is_valid_ip_prefix(100, 32))
+
+ def test_is_valid_ipv4(self):
+ ok_(validation.is_valid_ipv4('10.0.0.1'))
+
+ def test_is_valid_ipv4_not_dot(self):
+ eq_(False, validation.is_valid_ipv4('192:168:0:1'))
+
+ def test_is_valid_ipv4_prefix(self):
+ ok_(validation.is_valid_ipv4_prefix('10.0.0.1/24'))
+
+ def test_is_valid_ipv4_prefix_not_str(self):
+ eq_(False, validation.is_valid_ipv4_prefix(1234))
+
+ def test_is_valid_ipv4_prefix_without_prefix(self):
+ eq_(False, validation.is_valid_ipv4_prefix('10.0.0.1'))
+
+ def test_is_valid_ipv4_prefix_invalid_addr(self):
+ eq_(False, validation.is_valid_ipv4_prefix('xxx.xxx.xxx.xxx/24'))
+
+ def test_is_valid_ipv6(self):
+ ok_(validation.is_valid_ipv6('fe80::0011:aabb:ccdd:eeff'))
+
+ def test_is_valid_ipv6_not_colon(self):
+ eq_(False, validation.is_valid_ipv6('fe80--0011-aabb-ccdd-eeff'))
+
+ def test_is_valid_ipv6_prefix(self):
+ ok_(validation.is_valid_ipv6_prefix('fe80::0011:aabb:ccdd:eeff/64'))
+
+ def test_is_valid_ipv6_prefix_not_str(self):
+ eq_(False, validation.is_valid_ipv6_prefix(1234))
+
+ def test_is_valid_ipv6_prefix_without_prefix(self):
+ eq_(False,
+ validation.is_valid_ipv6_prefix('fe80::0011:aabb:ccdd:eeff'))
+
+ def test_is_valid_ipv6_prefix_invalid_addr(self):
+ eq_(False, validation.is_valid_ipv6_prefix('xxxx::xxxx/64'))
+
+ def test_is_valid_old_asn(self):
+ ok_(validation.is_valid_old_asn(65000))
+
+ def test_is_valid_old_asn_negative(self):
+ eq_(False, validation.is_valid_old_asn(-1))
+
+ def test_is_valid_old_asn_over(self):
+ eq_(False, validation.is_valid_old_asn(0xffff + 1))
+
+ def test_is_valid_asn(self):
+ ok_(validation.is_valid_asn(6553800))
+
+ def test_is_valid_asn_old(self):
+ ok_(validation.is_valid_asn(65000))
+
+ def test_is_valid_asn_negative(self):
+ eq_(False, validation.is_valid_asn(-1))
+
+ def test_is_valid_asn_over(self):
+ eq_(False, validation.is_valid_asn(0xffffffff + 1))
+
+ def test_is_valid_vpnv4_prefix(self):
+ ok_(validation.is_valid_vpnv4_prefix('100:200:10.0.0.1/24'))
+
+ def test_is_valid_vpnv4_prefix_not_str(self):
+ eq_(False, validation.is_valid_vpnv4_prefix(1234))
+
+ def test_is_valid_vpnv4_prefix_short_rd(self):
+ eq_(False, validation.is_valid_vpnv4_prefix('100:10.0.0.1/24'))
+
+ def test_is_valid_vpnv4_prefix_invalid_rd(self):
+ eq_(False, validation.is_valid_vpnv4_prefix('foo:bar:10.0.0.1/24'))
+
+ def test_is_valid_vpnv6_prefix(self):
+ ok_(validation.is_valid_vpnv6_prefix(
+ '100:200:fe80::0011:aabb:ccdd:eeff/64'))
+
+ def test_is_valid_vpnv6_prefix_not_str(self):
+ eq_(False, validation.is_valid_vpnv6_prefix(1234))
+
+ def test_is_valid_vpnv6_prefix_short_rd(self):
+ eq_(False, validation.is_valid_vpnv6_prefix('100:eeff/64'))
+
+ def test_is_valid_vpnv6_prefix_invalid_rd(self):
+ eq_(False, validation.is_valid_vpnv6_prefix('foo:bar:10.0.0.1/24'))
+
+ def test_is_valid_med(self):
+ ok_(validation.is_valid_med(100))
+
+ def test_is_valid_med_not_num(self):
+ eq_(False, validation.is_valid_med('foo'))
+
+ def test_is_valid_med_negative(self):
+ eq_(False, validation.is_valid_med(-1))
+
+ def test_is_valid_med_over(self):
+ eq_(False, validation.is_valid_med(0xffffffff + 1))
+
+ def test_is_valid_mpls_label(self):
+ ok_(validation.is_valid_mpls_label(100))
+
+ def test_is_valid_mpls_label_reserved(self):
+ eq_(False, validation.is_valid_mpls_label(4))
+
+ def test_is_valid_mpls_label_not_num(self):
+ eq_(False, validation.is_valid_mpls_label('foo'))
+
+ def test_is_valid_mpls_label_negative(self):
+ eq_(False, validation.is_valid_mpls_label(-1))
+
+ def test_is_valid_mpls_label_over(self):
+ eq_(False, validation.is_valid_mpls_label(0x100000 + 1))
+
+ def test_is_valid_mpls_labels(self):
+ ok_(validation.is_valid_mpls_labels([100, 200]))
+
+ def test_is_valid_mpls_labels_not_list(self):
+ eq_(False, validation.is_valid_mpls_labels(100))
+
+ def test_is_valid_mpls_labels_with_invalid_label(self):
+ eq_(False, validation.is_valid_mpls_labels(['foo', 200]))
+
+ def test_is_valid_route_dist(self):
+ ok_(validation.is_valid_route_dist('65000:222'))
+
+ def test_is_valid_route_dist_ipv4_based(self):
+ ok_(validation.is_valid_route_dist('10.0.0.1:333'))
+
+ def test_is_valid_route_not_str(self):
+ eq_(False, validation.is_valid_route_dist(65000))
+
+ def test_is_valid_route_dist_short(self):
+ eq_(False, validation.is_valid_route_dist('65000'))
+
+ def test_is_valid_route_dist_invalid_ipv4_addr(self):
+ eq_(False, validation.is_valid_route_dist('xxx.xxx.xxx.xxx:333'))
+
+ def test_is_valid_esi(self):
+ ok_(validation.is_valid_esi(100))
+
+ def test_is_valid_esi_not_int(self):
+ eq_(False, validation.is_valid_esi('foo'))
+
+ def test_is_valid_ethernet_tag_id(self):
+ ok_(validation.is_valid_ethernet_tag_id(100))
+
+ def test_is_valid_ethernet_tag_id_not_int(self):
+ eq_(False, validation.is_valid_ethernet_tag_id('foo'))
+
+ def test_is_valid_ethernet_tag_id_negative(self):
+ eq_(False, validation.is_valid_ethernet_tag_id(-1))
+
+ def test_is_valid_ethernet_tag_id_over(self):
+ eq_(False, validation.is_valid_ethernet_tag_id(0xffffffff + 1))
+
+ def test_is_valid_vni(self):
+ ok_(validation.is_valid_vni(100))
+
+ def test_is_valid_vni_not_int(self):
+ eq_(False, validation.is_valid_vni('foo'))
+
+ def test_is_valid_vni_negative(self):
+ eq_(False, validation.is_valid_vni(-1))
+
+ def test_is_valid_vni_over(self):
+ eq_(False, validation.is_valid_vni(0xffffff + 1))
diff --git a/tests/unit/test_requirements.py b/tests/unit/test_requirements.py
new file mode 100644
index 00000000..b31110b4
--- /dev/null
+++ b/tests/unit/test_requirements.py
@@ -0,0 +1,85 @@
+# Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import os
+import sys
+import unittest
+
+import pkg_resources
+from pip.req import parse_requirements
+from pip.download import PipSession
+from six.moves import urllib
+
+from nose.tools import ok_
+
+
+LOG = logging.getLogger(__name__)
+
+MOD_DIR = os.path.dirname(sys.modules[__name__].__file__)
+_RYU_REQUIREMENTS_FILES = [
+ '../../tools/pip-requires',
+ '../../tools/optional-requires',
+]
+RYU_REQUIREMENTS_FILES = [
+ os.path.join(MOD_DIR, f) for f in _RYU_REQUIREMENTS_FILES]
+
+OPENSTACK_REQUIREMENTS_REPO = 'https://github.com/openstack/requirements'
+OPENSTACK_REQUIREMENTS_URL = (
+ 'https://github.com/openstack/requirements/raw/master/')
+_OPENSTACK_REQUIREMENTS_FILES = [
+ 'requirements.txt',
+ 'global-requirements.txt',
+]
+OPENSTACK_REQUIREMENTS_FILES = [
+ urllib.parse.urljoin(OPENSTACK_REQUIREMENTS_URL, f)
+ for f in _OPENSTACK_REQUIREMENTS_FILES]
+
+
+def _get_requirements(files):
+ requirements = {}
+ for f in files:
+ req = parse_requirements(f, session=PipSession())
+ for r in req:
+ requirements[r.name] = str(r.req)
+
+ return requirements
+
+OPENSTACK_REQUIREMENTS = _get_requirements(OPENSTACK_REQUIREMENTS_FILES)
+RYU_REQUIREMENTS = _get_requirements(RYU_REQUIREMENTS_FILES)
+
+
+class TestRequirements(unittest.TestCase):
+ """
+ Test whether the requirements of Ryu has no conflict with that
+ of other projects.
+ """
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_with_openstack_requirements(self):
+ try:
+ for name, req in OPENSTACK_REQUIREMENTS.items():
+ if name in RYU_REQUIREMENTS:
+ ok_(pkg_resources.require(req))
+ except pkg_resources.VersionConflict as e:
+ LOG.exception(
+ 'Some requirements of Ryu are conflicting with that of '
+ 'OpenStack project: %s' % OPENSTACK_REQUIREMENTS_REPO)
+ raise e
diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py
new file mode 100644
index 00000000..165f8acc
--- /dev/null
+++ b/tests/unit/test_utils.py
@@ -0,0 +1,84 @@
+# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import unittest
+import logging
+import six
+from nose.tools import eq_
+
+from ryu import utils
+
+LOG = logging.getLogger(__name__)
+
+
+class Test_utils(unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_hex_array_string(self):
+ """
+ Test hex_array() with str type.
+ """
+ expected_result = '0x01 0x02 0x03 0x04'
+ data = b'\x01\x02\x03\x04'
+ eq_(expected_result, utils.hex_array(data))
+
+ def test_hex_array_bytearray(self):
+ """
+ Test hex_array() with bytearray type.
+ """
+ expected_result = '0x01 0x02 0x03 0x04'
+ data = bytearray(b'\x01\x02\x03\x04')
+ eq_(expected_result, utils.hex_array(data))
+
+ def test_hex_array_bytes(self):
+ """
+ Test hex_array() with bytes type. (Python3 only)
+ """
+ if six.PY2:
+ return
+ expected_result = '0x01 0x02 0x03 0x04'
+ data = bytes(b'\x01\x02\x03\x04')
+ eq_(expected_result, utils.hex_array(data))
+
+ def test_binary_str_string(self):
+ """
+ Test binary_str() with str type.
+ """
+ expected_result = '\\x01\\x02\\x03\\x04'
+ data = b'\x01\x02\x03\x04'
+ eq_(expected_result, utils.binary_str(data))
+
+ def test_binary_str_bytearray(self):
+ """
+ Test binary_str() with bytearray type.
+ """
+ expected_result = '\\x01\\x02\\x03\\x04'
+ data = bytearray(b'\x01\x02\x03\x04')
+ eq_(expected_result, utils.binary_str(data))
+
+ def test_binary_str_bytes(self):
+ """
+ Test binary_str() with bytes type. (Python3 only)
+ """
+ if six.PY2:
+ return
+ expected_result = '\\x01\\x02\\x03\\x04'
+ data = bytes(b'\x01\x02\x03\x04')
+ eq_(expected_result, utils.binary_str(data))