Various BMv2 bugfixes
Change-Id: Ia5a2a1c86b8a90ad68ddb92980377f6308e200d2
diff --git a/apps/bmv2-demo/ecmp/src/main/resources/ecmp.json b/apps/bmv2-demo/ecmp/src/main/resources/ecmp.json
deleted file mode 120000
index acdff05..0000000
--- a/apps/bmv2-demo/ecmp/src/main/resources/ecmp.json
+++ /dev/null
@@ -1 +0,0 @@
-/Users/carmelo/workspace/onos-p4-dev/p4src/build/ecmp.json
\ No newline at end of file
diff --git a/apps/bmv2-demo/ecmp/src/main/resources/ecmp.json b/apps/bmv2-demo/ecmp/src/main/resources/ecmp.json
new file mode 100644
index 0000000..5bf2d4a
--- /dev/null
+++ b/apps/bmv2-demo/ecmp/src/main/resources/ecmp.json
@@ -0,0 +1,909 @@
+{
+ "header_types": [
+ {
+ "name": "standard_metadata_t",
+ "id": 0,
+ "fields": [
+ [
+ "ingress_port",
+ 9
+ ],
+ [
+ "packet_length",
+ 32
+ ],
+ [
+ "egress_spec",
+ 9
+ ],
+ [
+ "egress_port",
+ 9
+ ],
+ [
+ "egress_instance",
+ 32
+ ],
+ [
+ "instance_type",
+ 32
+ ],
+ [
+ "clone_spec",
+ 32
+ ],
+ [
+ "_padding",
+ 5
+ ]
+ ],
+ "length_exp": null,
+ "max_length": null
+ },
+ {
+ "name": "intrinsic_metadata_t",
+ "id": 1,
+ "fields": [
+ [
+ "ingress_global_timestamp",
+ 32
+ ],
+ [
+ "lf_field_list",
+ 32
+ ],
+ [
+ "mcast_grp",
+ 16
+ ],
+ [
+ "egress_rid",
+ 16
+ ]
+ ],
+ "length_exp": null,
+ "max_length": null
+ },
+ {
+ "name": "ethernet_t",
+ "id": 2,
+ "fields": [
+ [
+ "dstAddr",
+ 48
+ ],
+ [
+ "srcAddr",
+ 48
+ ],
+ [
+ "etherType",
+ 16
+ ]
+ ],
+ "length_exp": null,
+ "max_length": null
+ },
+ {
+ "name": "ipv4_t",
+ "id": 3,
+ "fields": [
+ [
+ "version",
+ 4
+ ],
+ [
+ "ihl",
+ 4
+ ],
+ [
+ "diffserv",
+ 8
+ ],
+ [
+ "totalLen",
+ 16
+ ],
+ [
+ "identification",
+ 16
+ ],
+ [
+ "flags",
+ 3
+ ],
+ [
+ "fragOffset",
+ 13
+ ],
+ [
+ "ttl",
+ 8
+ ],
+ [
+ "protocol",
+ 8
+ ],
+ [
+ "hdrChecksum",
+ 16
+ ],
+ [
+ "srcAddr",
+ 32
+ ],
+ [
+ "dstAddr",
+ 32
+ ]
+ ],
+ "length_exp": null,
+ "max_length": null
+ },
+ {
+ "name": "tcp_t",
+ "id": 4,
+ "fields": [
+ [
+ "srcPort",
+ 16
+ ],
+ [
+ "dstPort",
+ 16
+ ],
+ [
+ "seqNo",
+ 32
+ ],
+ [
+ "ackNo",
+ 32
+ ],
+ [
+ "dataOffset",
+ 4
+ ],
+ [
+ "res",
+ 3
+ ],
+ [
+ "ecn",
+ 3
+ ],
+ [
+ "ctrl",
+ 6
+ ],
+ [
+ "window",
+ 16
+ ],
+ [
+ "checksum",
+ 16
+ ],
+ [
+ "urgentPtr",
+ 16
+ ]
+ ],
+ "length_exp": null,
+ "max_length": null
+ },
+ {
+ "name": "udp_t",
+ "id": 5,
+ "fields": [
+ [
+ "srcPort",
+ 16
+ ],
+ [
+ "dstPort",
+ 16
+ ],
+ [
+ "length_",
+ 16
+ ],
+ [
+ "checksum",
+ 16
+ ]
+ ],
+ "length_exp": null,
+ "max_length": null
+ },
+ {
+ "name": "ecmp_metadata_t",
+ "id": 6,
+ "fields": [
+ [
+ "groupId",
+ 16
+ ],
+ [
+ "selector",
+ 16
+ ]
+ ],
+ "length_exp": null,
+ "max_length": null
+ }
+ ],
+ "headers": [
+ {
+ "name": "standard_metadata",
+ "id": 0,
+ "header_type": "standard_metadata_t",
+ "metadata": true
+ },
+ {
+ "name": "intrinsic_metadata",
+ "id": 1,
+ "header_type": "intrinsic_metadata_t",
+ "metadata": true
+ },
+ {
+ "name": "ethernet",
+ "id": 2,
+ "header_type": "ethernet_t",
+ "metadata": false
+ },
+ {
+ "name": "ipv4",
+ "id": 3,
+ "header_type": "ipv4_t",
+ "metadata": false
+ },
+ {
+ "name": "tcp",
+ "id": 4,
+ "header_type": "tcp_t",
+ "metadata": false
+ },
+ {
+ "name": "udp",
+ "id": 5,
+ "header_type": "udp_t",
+ "metadata": false
+ },
+ {
+ "name": "ecmp_metadata",
+ "id": 6,
+ "header_type": "ecmp_metadata_t",
+ "metadata": true
+ }
+ ],
+ "header_stacks": [],
+ "parsers": [
+ {
+ "name": "parser",
+ "id": 0,
+ "init_state": "start",
+ "parse_states": [
+ {
+ "name": "start",
+ "id": 0,
+ "parser_ops": [],
+ "transition_key": [],
+ "transitions": [
+ {
+ "value": "default",
+ "mask": null,
+ "next_state": "parse_ethernet"
+ }
+ ]
+ },
+ {
+ "name": "parse_ethernet",
+ "id": 1,
+ "parser_ops": [
+ {
+ "op": "extract",
+ "parameters": [
+ {
+ "type": "regular",
+ "value": "ethernet"
+ }
+ ]
+ }
+ ],
+ "transition_key": [
+ {
+ "type": "field",
+ "value": [
+ "ethernet",
+ "etherType"
+ ]
+ }
+ ],
+ "transitions": [
+ {
+ "value": "0x0800",
+ "mask": null,
+ "next_state": "parse_ipv4"
+ },
+ {
+ "value": "default",
+ "mask": null,
+ "next_state": null
+ }
+ ]
+ },
+ {
+ "name": "parse_ipv4",
+ "id": 2,
+ "parser_ops": [
+ {
+ "op": "extract",
+ "parameters": [
+ {
+ "type": "regular",
+ "value": "ipv4"
+ }
+ ]
+ }
+ ],
+ "transition_key": [
+ {
+ "type": "field",
+ "value": [
+ "ipv4",
+ "fragOffset"
+ ]
+ },
+ {
+ "type": "field",
+ "value": [
+ "ipv4",
+ "protocol"
+ ]
+ }
+ ],
+ "transitions": [
+ {
+ "value": "0x000006",
+ "mask": null,
+ "next_state": "parse_tcp"
+ },
+ {
+ "value": "0x000011",
+ "mask": null,
+ "next_state": "parse_udp"
+ },
+ {
+ "value": "default",
+ "mask": null,
+ "next_state": null
+ }
+ ]
+ },
+ {
+ "name": "parse_tcp",
+ "id": 3,
+ "parser_ops": [
+ {
+ "op": "extract",
+ "parameters": [
+ {
+ "type": "regular",
+ "value": "tcp"
+ }
+ ]
+ }
+ ],
+ "transition_key": [],
+ "transitions": [
+ {
+ "value": "default",
+ "mask": null,
+ "next_state": null
+ }
+ ]
+ },
+ {
+ "name": "parse_udp",
+ "id": 4,
+ "parser_ops": [
+ {
+ "op": "extract",
+ "parameters": [
+ {
+ "type": "regular",
+ "value": "udp"
+ }
+ ]
+ }
+ ],
+ "transition_key": [],
+ "transitions": [
+ {
+ "value": "default",
+ "mask": null,
+ "next_state": null
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "deparsers": [
+ {
+ "name": "deparser",
+ "id": 0,
+ "order": [
+ "ethernet",
+ "ipv4",
+ "udp",
+ "tcp"
+ ]
+ }
+ ],
+ "meter_arrays": [],
+ "actions": [
+ {
+ "name": "_drop",
+ "id": 0,
+ "runtime_data": [],
+ "primitives": [
+ {
+ "op": "modify_field",
+ "parameters": [
+ {
+ "type": "field",
+ "value": [
+ "standard_metadata",
+ "egress_spec"
+ ]
+ },
+ {
+ "type": "hexstr",
+ "value": "0x1ff"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "ecmp_group",
+ "id": 1,
+ "runtime_data": [
+ {
+ "name": "groupId",
+ "bitwidth": 16
+ },
+ {
+ "name": "groupSize",
+ "bitwidth": 16
+ }
+ ],
+ "primitives": [
+ {
+ "op": "modify_field",
+ "parameters": [
+ {
+ "type": "field",
+ "value": [
+ "ecmp_metadata",
+ "groupId"
+ ]
+ },
+ {
+ "type": "runtime_data",
+ "value": 0
+ }
+ ]
+ },
+ {
+ "op": "modify_field_with_hash_based_offset",
+ "parameters": [
+ {
+ "type": "field",
+ "value": [
+ "ecmp_metadata",
+ "selector"
+ ]
+ },
+ {
+ "type": "hexstr",
+ "value": "0x0"
+ },
+ {
+ "type": "calculation",
+ "value": "ecmp_hash"
+ },
+ {
+ "type": "runtime_data",
+ "value": 1
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "send_to_cpu",
+ "id": 2,
+ "runtime_data": [],
+ "primitives": [
+ {
+ "op": "modify_field",
+ "parameters": [
+ {
+ "type": "field",
+ "value": [
+ "standard_metadata",
+ "egress_spec"
+ ]
+ },
+ {
+ "type": "hexstr",
+ "value": "0xff"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "count_packet",
+ "id": 3,
+ "runtime_data": [],
+ "primitives": [
+ {
+ "op": "count",
+ "parameters": [
+ {
+ "type": "counter_array",
+ "value": "ingress_port_counter"
+ },
+ {
+ "type": "field",
+ "value": [
+ "standard_metadata",
+ "ingress_port"
+ ]
+ }
+ ]
+ },
+ {
+ "op": "count",
+ "parameters": [
+ {
+ "type": "counter_array",
+ "value": "egress_port_counter"
+ },
+ {
+ "type": "field",
+ "value": [
+ "standard_metadata",
+ "egress_spec"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "set_egress_port",
+ "id": 4,
+ "runtime_data": [
+ {
+ "name": "port",
+ "bitwidth": 9
+ }
+ ],
+ "primitives": [
+ {
+ "op": "modify_field",
+ "parameters": [
+ {
+ "type": "field",
+ "value": [
+ "standard_metadata",
+ "egress_spec"
+ ]
+ },
+ {
+ "type": "runtime_data",
+ "value": 0
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "pipelines": [
+ {
+ "name": "ingress",
+ "id": 0,
+ "init_table": "table0",
+ "tables": [
+ {
+ "name": "port_count_table",
+ "id": 0,
+ "match_type": "exact",
+ "type": "simple",
+ "max_size": 16384,
+ "with_counters": false,
+ "direct_meters": null,
+ "support_timeout": false,
+ "key": [],
+ "actions": [
+ "count_packet"
+ ],
+ "next_tables": {
+ "count_packet": null
+ },
+ "default_action": null,
+ "base_default_next": null
+ },
+ {
+ "name": "table0",
+ "id": 1,
+ "match_type": "ternary",
+ "type": "simple",
+ "max_size": 16384,
+ "with_counters": true,
+ "direct_meters": null,
+ "support_timeout": true,
+ "key": [
+ {
+ "match_type": "ternary",
+ "target": [
+ "standard_metadata",
+ "ingress_port"
+ ],
+ "mask": null
+ },
+ {
+ "match_type": "ternary",
+ "target": [
+ "ethernet",
+ "dstAddr"
+ ],
+ "mask": null
+ },
+ {
+ "match_type": "ternary",
+ "target": [
+ "ethernet",
+ "srcAddr"
+ ],
+ "mask": null
+ },
+ {
+ "match_type": "ternary",
+ "target": [
+ "ethernet",
+ "etherType"
+ ],
+ "mask": null
+ }
+ ],
+ "actions": [
+ "set_egress_port",
+ "ecmp_group",
+ "send_to_cpu",
+ "_drop"
+ ],
+ "next_tables": {
+ "set_egress_port": "_condition_0",
+ "ecmp_group": "ecmp_group_table",
+ "send_to_cpu": "_condition_0",
+ "_drop": "_condition_0"
+ },
+ "default_action": null,
+ "base_default_next": "_condition_0"
+ },
+ {
+ "name": "ecmp_group_table",
+ "id": 2,
+ "match_type": "exact",
+ "type": "simple",
+ "max_size": 16384,
+ "with_counters": true,
+ "direct_meters": null,
+ "support_timeout": false,
+ "key": [
+ {
+ "match_type": "exact",
+ "target": [
+ "ecmp_metadata",
+ "groupId"
+ ],
+ "mask": null
+ },
+ {
+ "match_type": "exact",
+ "target": [
+ "ecmp_metadata",
+ "selector"
+ ],
+ "mask": null
+ }
+ ],
+ "actions": [
+ "set_egress_port"
+ ],
+ "next_tables": {
+ "set_egress_port": "_condition_0"
+ },
+ "default_action": null,
+ "base_default_next": "_condition_0"
+ }
+ ],
+ "conditionals": [
+ {
+ "name": "_condition_0",
+ "id": 0,
+ "expression": {
+ "type": "expression",
+ "value": {
+ "op": "<",
+ "left": {
+ "type": "field",
+ "value": [
+ "standard_metadata",
+ "egress_spec"
+ ]
+ },
+ "right": {
+ "type": "hexstr",
+ "value": "0xfe"
+ }
+ }
+ },
+ "true_next": "port_count_table",
+ "false_next": null
+ }
+ ]
+ },
+ {
+ "name": "egress",
+ "id": 1,
+ "init_table": null,
+ "tables": [],
+ "conditionals": []
+ }
+ ],
+ "calculations": [
+ {
+ "name": "ecmp_hash",
+ "id": 0,
+ "input": [
+ {
+ "type": "field",
+ "value": [
+ "ipv4",
+ "srcAddr"
+ ]
+ },
+ {
+ "type": "field",
+ "value": [
+ "ipv4",
+ "dstAddr"
+ ]
+ },
+ {
+ "type": "field",
+ "value": [
+ "ipv4",
+ "protocol"
+ ]
+ },
+ {
+ "type": "field",
+ "value": [
+ "tcp",
+ "srcPort"
+ ]
+ },
+ {
+ "type": "field",
+ "value": [
+ "tcp",
+ "dstPort"
+ ]
+ },
+ {
+ "type": "field",
+ "value": [
+ "udp",
+ "srcPort"
+ ]
+ },
+ {
+ "type": "field",
+ "value": [
+ "udp",
+ "dstPort"
+ ]
+ }
+ ],
+ "algo": "bmv2_hash"
+ }
+ ],
+ "checksums": [],
+ "learn_lists": [],
+ "field_lists": [],
+ "counter_arrays": [
+ {
+ "name": "ingress_port_counter",
+ "id": 0,
+ "is_direct": false,
+ "size": 254
+ },
+ {
+ "name": "egress_port_counter",
+ "id": 1,
+ "is_direct": false,
+ "size": 254
+ },
+ {
+ "name": "table0_counter",
+ "id": 2,
+ "is_direct": true,
+ "binding": "table0"
+ },
+ {
+ "name": "ecmp_group_table_counter",
+ "id": 3,
+ "is_direct": true,
+ "binding": "ecmp_group_table"
+ }
+ ],
+ "register_arrays": [],
+ "force_arith": [
+ [
+ "standard_metadata",
+ "ingress_port"
+ ],
+ [
+ "standard_metadata",
+ "packet_length"
+ ],
+ [
+ "standard_metadata",
+ "egress_spec"
+ ],
+ [
+ "standard_metadata",
+ "egress_port"
+ ],
+ [
+ "standard_metadata",
+ "egress_instance"
+ ],
+ [
+ "standard_metadata",
+ "instance_type"
+ ],
+ [
+ "standard_metadata",
+ "clone_spec"
+ ],
+ [
+ "standard_metadata",
+ "_padding"
+ ],
+ [
+ "intrinsic_metadata",
+ "ingress_global_timestamp"
+ ],
+ [
+ "intrinsic_metadata",
+ "lf_field_list"
+ ],
+ [
+ "intrinsic_metadata",
+ "mcast_grp"
+ ],
+ [
+ "intrinsic_metadata",
+ "egress_rid"
+ ]
+ ]
+}
\ No newline at end of file