summaryrefslogtreecommitdiffhomepage
path: root/tests/unit/ofproto
diff options
context:
space:
mode:
authorIWASE Yusuke <iwase.yusuke0@gmail.com>2017-06-26 15:04:43 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2017-06-26 15:17:44 +0900
commita67ed2858417b9d795460f05126c01fb0cd344f9 (patch)
tree8171336c30668f8fce7d18125a591de86c322f40 /tests/unit/ofproto
parentd8ae9491dab0824eb88b7e8aad044302d1463f84 (diff)
tests: Separate test files from Ryu module
To prevent redundant files (e.g., pcap files, json files for tests, packet data generator) to be installed, this patch separates test directory from Ryu module. Signed-off-by: IWASE Yusuke <iwase.yusuke0@gmail.com> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Diffstat (limited to 'tests/unit/ofproto')
-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
353 files changed, 97823 insertions, 0 deletions
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()