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;