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;