Make the Basic pipeline more portable
This change makes the Basic pipeline compile better with different
compilers. One change is this: the type parameter for a v1model meter
instance cannot be a programmer-defined enum. This is because in P4_16,
enums don't necessarily have underlying bitstring types and the
language doesn't specify that enum members should be assigned a
numerical value in any given way.
Change-Id: Id2b758eb2b6e76aa708c2e03e7a001667efddb3d
diff --git a/pipelines/basic/src/main/resources/include/actions.p4 b/pipelines/basic/src/main/resources/include/actions.p4
index d1f83b8..9504879 100644
--- a/pipelines/basic/src/main/resources/include/actions.p4
+++ b/pipelines/basic/src/main/resources/include/actions.p4
@@ -20,14 +20,6 @@
#include "headers.p4"
#include "defines.p4"
-action send_to_cpu(inout standard_metadata_t standard_metadata) {
- standard_metadata.egress_spec = CPU_PORT;
-}
-
-action set_egress_port(inout standard_metadata_t standard_metadata, port_t port) {
- standard_metadata.egress_spec = port;
-}
-
action _drop() {
mark_to_drop();
}
diff --git a/pipelines/basic/src/main/resources/include/custom_headers.p4 b/pipelines/basic/src/main/resources/include/custom_headers.p4
index a57b076..9928412 100644
--- a/pipelines/basic/src/main/resources/include/custom_headers.p4
+++ b/pipelines/basic/src/main/resources/include/custom_headers.p4
@@ -29,7 +29,6 @@
bit<16> l4_src_port;
bit<16> l4_dst_port;
next_hop_id_t next_hop_id;
- bit<32> meter_tag;
}
#endif
diff --git a/pipelines/basic/src/main/resources/include/defines.p4 b/pipelines/basic/src/main/resources/include/defines.p4
index d9ec28d..ba5952e 100644
--- a/pipelines/basic/src/main/resources/include/defines.p4
+++ b/pipelines/basic/src/main/resources/include/defines.p4
@@ -27,5 +27,8 @@
const port_t CPU_PORT = 255;
-enum MeterColor_t {GREEN, YELLOW, RED};
+typedef bit<8> MeterColor;
+const MeterColor MeterColor_GREEN = 8w0;
+const MeterColor MeterColor_YELLOW = 8w1;
+const MeterColor MeterColor_RED = 8w2;
#endif
diff --git a/pipelines/basic/src/main/resources/include/headers.p4 b/pipelines/basic/src/main/resources/include/headers.p4
index e45c915..1676646 100644
--- a/pipelines/basic/src/main/resources/include/headers.p4
+++ b/pipelines/basic/src/main/resources/include/headers.p4
@@ -22,11 +22,13 @@
@controller_header("packet_in")
header packet_in_header_t {
bit<9> ingress_port;
+ bit<7> _padding;
}
@controller_header("packet_out")
header packet_out_header_t {
bit<9> egress_port;
+ bit<7> _padding;
}
header ethernet_t {
diff --git a/pipelines/basic/src/main/resources/include/host_meter_table.p4 b/pipelines/basic/src/main/resources/include/host_meter_table.p4
index 6f581e1..9aa2dfc 100644
--- a/pipelines/basic/src/main/resources/include/host_meter_table.p4
+++ b/pipelines/basic/src/main/resources/include/host_meter_table.p4
@@ -23,11 +23,11 @@
control host_meter_control(inout headers_t hdr,
inout local_metadata_t local_metadata,
inout standard_metadata_t standard_metadata) {
-
- direct_meter<bit<32>>(MeterType.bytes) host_meter;
+ MeterColor meter_tag = MeterColor_GREEN;
+ direct_meter<MeterColor>(MeterType.bytes) host_meter;
action read_meter() {
- host_meter.read(local_metadata.meter_tag);
+ host_meter.read(meter_tag);
}
table host_meter_table {
@@ -43,7 +43,8 @@
}
apply {
- if (host_meter_table.apply().hit && local_metadata.meter_tag == 2) {
+ host_meter_table.apply();
+ if (meter_tag == MeterColor_RED) {
mark_to_drop();
}
}
diff --git a/pipelines/basic/src/main/resources/include/port_meters.p4 b/pipelines/basic/src/main/resources/include/port_meters.p4
index 710d19a..b9cb2db 100644
--- a/pipelines/basic/src/main/resources/include/port_meters.p4
+++ b/pipelines/basic/src/main/resources/include/port_meters.p4
@@ -21,11 +21,11 @@
control port_meters_ingress(inout headers_t hdr,
inout standard_metadata_t standard_metadata) {
meter(MAX_PORTS, MeterType.bytes) ingress_port_meter;
- MeterColor_t ingress_color = MeterColor_t.GREEN;
+ MeterColor ingress_color = MeterColor_GREEN;
apply {
- ingress_port_meter.execute_meter<MeterColor_t>((bit<32>)standard_metadata.ingress_port, ingress_color);
- if (ingress_color == MeterColor_t.RED) {
+ ingress_port_meter.execute_meter<MeterColor>((bit<32>)standard_metadata.ingress_port, ingress_color);
+ if (ingress_color == MeterColor_RED) {
mark_to_drop();
}
}
@@ -35,11 +35,11 @@
inout standard_metadata_t standard_metadata) {
meter(MAX_PORTS, MeterType.bytes) egress_port_meter;
- MeterColor_t egress_color = MeterColor_t.GREEN;
+ MeterColor egress_color = MeterColor_GREEN;
apply {
- egress_port_meter.execute_meter<MeterColor_t>((bit<32>)standard_metadata.egress_port, egress_color);
- if (egress_color == MeterColor_t.RED) {
+ egress_port_meter.execute_meter<MeterColor>((bit<32>)standard_metadata.egress_port, egress_color);
+ if (egress_color == MeterColor_RED) {
mark_to_drop();
}
}
diff --git a/pipelines/basic/src/main/resources/include/table0.p4 b/pipelines/basic/src/main/resources/include/table0.p4
index a004fbb..27e1f8a 100644
--- a/pipelines/basic/src/main/resources/include/table0.p4
+++ b/pipelines/basic/src/main/resources/include/table0.p4
@@ -30,6 +30,14 @@
local_metadata.next_hop_id = next_hop_id;
}
+ action send_to_cpu() {
+ standard_metadata.egress_spec = CPU_PORT;
+ }
+
+ action set_egress_port(port_t port) {
+ standard_metadata.egress_spec = port;
+ }
+
table table0 {
key = {
standard_metadata.ingress_port : ternary;
@@ -43,10 +51,10 @@
local_metadata.l4_dst_port : ternary;
}
actions = {
- set_egress_port(standard_metadata);
- send_to_cpu(standard_metadata);
- set_next_hop_id();
- _drop();
+ set_egress_port;
+ send_to_cpu;
+ set_next_hop_id;
+ _drop;
}
const default_action = _drop();
counters = table0_counter;
diff --git a/pipelines/basic/src/main/resources/include/wcmp.p4 b/pipelines/basic/src/main/resources/include/wcmp.p4
index 9d6e00f..7bc5332 100644
--- a/pipelines/basic/src/main/resources/include/wcmp.p4
+++ b/pipelines/basic/src/main/resources/include/wcmp.p4
@@ -27,6 +27,10 @@
direct_counter(CounterType.packets_and_bytes) wcmp_table_counter;
action_selector(HashAlgorithm.crc16, 32w64, 32w16) wcmp_selector;
+ action set_egress_port(port_t port) {
+ standard_metadata.egress_spec = port;
+ }
+
table wcmp_table {
support_timeout = false;
key = {
@@ -38,7 +42,7 @@
local_metadata.l4_dst_port : selector;
}
actions = {
- set_egress_port(standard_metadata);
+ set_egress_port;
}
implementation = wcmp_selector;
counters = wcmp_table_counter;