ONOS-6769 Support for PacketMetadata in demo P4 programs

Change-Id: I9b3de719f9eb1c87d1df16a5ad0d08a83cebc8f6
diff --git a/tools/test/p4src/p4-16/include/actions.p4 b/tools/test/p4src/p4-16/include/actions.p4
index 0ef0533..87c1ed6 100644
--- a/tools/test/p4src/p4-16/include/actions.p4
+++ b/tools/test/p4src/p4-16/include/actions.p4
@@ -1,3 +1,5 @@
+#ifndef ACTIONS
+#define ACTIONS
 #include "defines.p4"
 #include "headers.p4"
 
@@ -5,10 +7,12 @@
     standard_metadata.egress_spec = CPU_PORT;
 }
 
-action set_egress_port(inout standard_metadata_t standard_metadata, Port port) {
+action set_egress_port(inout standard_metadata_t standard_metadata, port_t port) {
     standard_metadata.egress_spec = port;
 }
 
 action drop(inout standard_metadata_t standard_metadata) {
     standard_metadata.egress_spec = DROP_PORT;
 }
+
+#endif
\ No newline at end of file
diff --git a/tools/test/p4src/p4-16/include/checksums.p4 b/tools/test/p4src/p4-16/include/checksums.p4
index 09365dc..cb86f90 100644
--- a/tools/test/p4src/p4-16/include/checksums.p4
+++ b/tools/test/p4src/p4-16/include/checksums.p4
@@ -1,17 +1,18 @@
-#ifndef CHECK_SUMS
-#define CHECK_SUMS
+#ifndef CHECKSUMS
+#define CHECKSUMS
 #include "headers.p4"
 #include "metadata.p4"
 
-control verifyChecksum(in headers hdr, inout metadata meta) {
+control verifyChecksum(in headers_t hdr, inout metadata_t meta) {
     apply {
         // Nothing to do
     }
 }
 
-control computeChecksum(inout headers hdr, inout metadata meta) {
+control computeChecksum(inout headers_t hdr, inout metadata_t meta) {
     apply {
         // Nothing to do
     }
 }
+
 #endif
diff --git a/tools/test/p4src/p4-16/include/defines.p4 b/tools/test/p4src/p4-16/include/defines.p4
index 24974a1..ef258f6 100644
--- a/tools/test/p4src/p4-16/include/defines.p4
+++ b/tools/test/p4src/p4-16/include/defines.p4
@@ -1,10 +1,15 @@
 #ifndef DEFINES
 #define DEFINES
-// Logic ports as defined in the simple_switch target
+
 #define MAX_PORTS 254
 #define CPU_PORT 9w255
 #define DROP_PORT 9w511
-typedef bit<16> GroupId;
-typedef bit<8> GroupSize;
-typedef bit<9> Port;
+
+#define ETH_TYPE_IPV4 16w0x0800
+#define IP_TYPE_TCP 8w6
+#define IP_TYPE_UDP 8w17
+
+typedef bit<16> group_id_t;
+typedef bit<8> group_size_t;
+typedef bit<9> port_t;
 #endif
diff --git a/tools/test/p4src/p4-16/include/headers.p4 b/tools/test/p4src/p4-16/include/headers.p4
index d497370..aeca349 100644
--- a/tools/test/p4src/p4-16/include/headers.p4
+++ b/tools/test/p4src/p4-16/include/headers.p4
@@ -1,5 +1,16 @@
 #ifndef HEADERS
 #define HEADERS
+
+@controller_header("packet_in")
+header packet_in_header_t {
+    bit<9> ingress_port;
+}
+
+@controller_header("packet_out")
+header packet_out_header_t {
+    bit<9> egress_port;
+}
+
 struct intrinsic_metadata_t {
     bit<32> ingress_global_timestamp;
     bit<32> lf_field_list;
@@ -49,10 +60,12 @@
     bit<16> checksum;
 }
 
-struct headers {
+struct headers_t {
     ethernet_t ethernet;
     ipv4_t ipv4;
     tcp_t tcp;
     udp_t udp;
+    packet_out_header_t packet_out;
+    packet_in_header_t packet_in;
 }
 #endif
diff --git a/tools/test/p4src/p4-16/include/metadata.p4 b/tools/test/p4src/p4-16/include/metadata.p4
index e08057c..a026e2d 100644
--- a/tools/test/p4src/p4-16/include/metadata.p4
+++ b/tools/test/p4src/p4-16/include/metadata.p4
@@ -2,19 +2,19 @@
 #define METADATA
 
 struct ecmp_metadata_t {
-    bit<16> groupId;
+    bit<16> group_id;
     bit<16> selector;
 }
 
-struct wcmp_meta_t {
-    bit<16> groupId;
+struct wcmp_metadata_t {
+    bit<16> group_id;
     bit<8>  numBits;
     bit<64> selector;
 }
 
-struct metadata {
+struct metadata_t {
     ecmp_metadata_t ecmp_metadata;
-    wcmp_meta_t wcmp_meta;
+    wcmp_metadata_t wcmp_meta;
     intrinsic_metadata_t intrinsic_metadata;
 }
 #endif
diff --git a/tools/test/p4src/p4-16/include/packet_io.p4 b/tools/test/p4src/p4-16/include/packet_io.p4
new file mode 100644
index 0000000..6f02e28
--- /dev/null
+++ b/tools/test/p4src/p4-16/include/packet_io.p4
@@ -0,0 +1,22 @@
+#ifndef PACKET_IO
+#define PACKET_IO
+
+control PacketIoIngressControl(inout headers_t hdr, inout standard_metadata_t standard_metadata) {
+    apply {
+        if (hdr.packet_out.isValid()) {
+            standard_metadata.egress_spec = hdr.packet_out.egress_port;
+        }
+    }
+}
+
+control PacketIoEgressControl(inout headers_t hdr, inout standard_metadata_t standard_metadata) {
+    apply {
+        hdr.packet_out.setInvalid();
+        if (standard_metadata.egress_spec == CPU_PORT) {
+            hdr.packet_in.setValid();
+            hdr.packet_in.ingress_port = standard_metadata.ingress_port;
+        }
+    }
+}
+
+#endif
\ No newline at end of file
diff --git a/tools/test/p4src/p4-16/include/parsers.p4 b/tools/test/p4src/p4-16/include/parsers.p4
index e9fbc6f..68f3876 100644
--- a/tools/test/p4src/p4-16/include/parsers.p4
+++ b/tools/test/p4src/p4-16/include/parsers.p4
@@ -3,11 +3,14 @@
 #include "headers.p4"
 #include "metadata.p4"
 
-#define ETH_TYPE_IPV4 16w0x0800
-#define IP_TYPE_TCP 8w6
-#define IP_TYPE_UDP 8w17
+parser ParserImpl(packet_in packet, out headers_t hdr, inout metadata_t meta,
+                    inout standard_metadata_t standard_metadata) {
 
-parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    state parse_packet_out {
+        packet.extract(hdr.packet_out);
+        transition parse_ethernet;
+    }
+
     state parse_ethernet {
         packet.extract(hdr.ethernet);
         transition select(hdr.ethernet.etherType) {
@@ -36,12 +39,16 @@
     }
 
     state start {
-        transition parse_ethernet;
+        transition select(standard_metadata.ingress_port) {
+            CPU_PORT: parse_packet_out;
+            default: parse_ethernet;
+        }
     }
 }
 
-control DeparserImpl(packet_out packet, in headers hdr) {
+control DeparserImpl(packet_out packet, in headers_t hdr) {
     apply {
+        packet.emit(hdr.packet_in);
         packet.emit(hdr.ethernet);
         packet.emit(hdr.ipv4);
         packet.emit(hdr.udp);
diff --git a/tools/test/p4src/p4-16/include/port_counters.p4 b/tools/test/p4src/p4-16/include/port_counters.p4
index 90916ba..93d2b4d 100644
--- a/tools/test/p4src/p4-16/include/port_counters.p4
+++ b/tools/test/p4src/p4-16/include/port_counters.p4
@@ -2,7 +2,7 @@
 #define PORT_COUNTERS
 #include "defines.p4"
 
-control PortCountersControl(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+control PortCountersControl(inout headers_t hdr, inout metadata_t meta, inout standard_metadata_t standard_metadata) {
     counter(MAX_PORTS, CounterType.packets) egress_port_counter;
     counter(MAX_PORTS, CounterType.packets) ingress_port_counter;