Skip to content

Commit

Permalink
Dpdk backend: optional and range match kinds translate to wildcard ma…
Browse files Browse the repository at this point in the history
…tch for dpdk (#3472)
  • Loading branch information
usha1830 authored Aug 3, 2022
1 parent 1576090 commit d3a55bb
Show file tree
Hide file tree
Showing 24 changed files with 2,058 additions and 2 deletions.
4 changes: 3 additions & 1 deletion backends/dpdk/spec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,9 @@ std::ostream &IR::DpdkTable::toSpec(std::ostream &out) const {
out << "\tkey {" << std::endl;
for (auto key : match_keys->keyElements) {
out << "\t\t" << DPDK::toStr(key->expression) << " ";
if ((key->matchType)->toString() == "ternary") {
if ((key->matchType)->toString() == "ternary" ||
(key->matchType)->toString() == "optional" ||
(key->matchType)->toString() == "range") {
out << "wildcard" << std::endl;
} else {
out << DPDK::toStr(key->matchType) << std::endl;
Expand Down
184 changes: 184 additions & 0 deletions testdata/p4_16_samples/psa-example-optional-match.p4
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
#include <core.p4>
#include <bmv2/psa.p4>


typedef bit<48> EthernetAddress;
header ethernet_t {
EthernetAddress dstAddr;
EthernetAddress srcAddr;
bit<16> etherType;
}

header ipv4_t {
bit<4> version;
bit<4> ihl;
bit<8> diffserv;
bit<16> totalLen;
bit<16> identification;
bit<3> flags;
bit<13> fragOffset;
bit<8> ttl;
bit<8> protocol;
bit<16> hdrChecksum;
bit<32> srcAddr;
bit<32> dstAddr;
}

header tcp_t {
bit<16> srcPort;
bit<16> dstPort;
bit<32> seqNo;
bit<32> ackNo;
bit<4> dataOffset;
bit<3> res;
bit<3> ecn;
bit<6> ctrl;
bit<16> window;
bit<16> checksum;
bit<16> urgentPtr;
}

struct empty_metadata_t {
}


struct metadata {
bit<16> data;
bit<8> tmpMask;
}

struct headers {
ethernet_t ethernet;
ipv4_t ipv4;
tcp_t tcp;
}


parser IngressParserImpl(packet_in buffer,
out headers hdr,
inout metadata user_meta,
in psa_ingress_parser_input_metadata_t istd,
in empty_metadata_t resubmit_meta,
in empty_metadata_t recirculate_meta)
{
bit<8> tmpMask;
state start {
buffer.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType) {
0x0800 &&& 0x0F00: parse_ipv4;
default: accept;
}
}
state parse_ipv4 {
buffer.extract(hdr.ipv4);
tmpMask = hdr.ipv4.protocol;
transition select(tmpMask) {
8w4 .. 8w7: parse_tcp;
default: accept;
}
}
state parse_tcp {
buffer.extract(hdr.tcp);
transition accept;
}
}

control ingress(inout headers hdr,
inout metadata user_meta,
in psa_ingress_input_metadata_t istd,
inout psa_ingress_output_metadata_t ostd)
{
bit<16> tmpMask = 1;
action execute() {
user_meta.data = tmpMask;
}
table tbl {
key = {
hdr.ethernet.srcAddr : optional;
hdr.ethernet.dstAddr : exact;
}
actions = { NoAction; execute; }
}
apply {
tbl.apply();
}
}
// END:Parse_Error_Example

parser EgressParserImpl(packet_in buffer,
out headers hdr,
inout metadata user_meta,
in psa_egress_parser_input_metadata_t istd,
in empty_metadata_t normal_meta,
in empty_metadata_t clone_i2e_meta,
in empty_metadata_t clone_e2e_meta)
{
state start {
buffer.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType) {
0x080 &&& 0x0C0: parse_ipv4;
default: accept;
}
}
state parse_ipv4 {
buffer.extract(hdr.ipv4);
transition select(hdr.ipv4.protocol) {
8w16 .. 8w23: parse_tcp;
default: accept;
}
}
state parse_tcp {
buffer.extract(hdr.tcp);
transition accept;
}
}

control egress(inout headers hdr,
inout metadata user_meta,
in psa_egress_input_metadata_t istd,
inout psa_egress_output_metadata_t ostd)
{
apply { }
}

control IngressDeparserImpl(packet_out packet,
out empty_metadata_t clone_i2e_meta,
out empty_metadata_t resubmit_meta,
out empty_metadata_t normal_meta,
inout headers hdr,
in metadata meta,
in psa_ingress_output_metadata_t istd)
{
apply {
packet.emit(hdr.ethernet);
packet.emit(hdr.ipv4);
packet.emit(hdr.tcp);
}
}

// BEGIN:Compute_New_IPv4_Checksum_Example
control EgressDeparserImpl(packet_out packet,
out empty_metadata_t clone_e2e_meta,
out empty_metadata_t recirculate_meta,
inout headers hdr,
in metadata meta,
in psa_egress_output_metadata_t istd,
in psa_egress_deparser_input_metadata_t edstd)
{
apply {
packet.emit(hdr.ethernet);
packet.emit(hdr.ipv4);
packet.emit(hdr.tcp);
}
}
// END:Compute_New_IPv4_Checksum_Example

IngressPipeline(IngressParserImpl(),
ingress(),
IngressDeparserImpl()) ip;

EgressPipeline(EgressParserImpl(),
egress(),
EgressDeparserImpl()) ep;

PSA_Switch(ip, PacketReplicationEngine(), ep, BufferingQueueingEngine()) main;
184 changes: 184 additions & 0 deletions testdata/p4_16_samples/psa-example-range-match.p4
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
#include <core.p4>
#include <bmv2/psa.p4>


typedef bit<48> EthernetAddress;
header ethernet_t {
EthernetAddress dstAddr;
EthernetAddress srcAddr;
bit<16> etherType;
}

header ipv4_t {
bit<4> version;
bit<4> ihl;
bit<8> diffserv;
bit<16> totalLen;
bit<16> identification;
bit<3> flags;
bit<13> fragOffset;
bit<8> ttl;
bit<8> protocol;
bit<16> hdrChecksum;
bit<32> srcAddr;
bit<32> dstAddr;
}

header tcp_t {
bit<16> srcPort;
bit<16> dstPort;
bit<32> seqNo;
bit<32> ackNo;
bit<4> dataOffset;
bit<3> res;
bit<3> ecn;
bit<6> ctrl;
bit<16> window;
bit<16> checksum;
bit<16> urgentPtr;
}

struct empty_metadata_t {
}


struct metadata {
bit<16> data;
bit<8> tmpMask;
}

struct headers {
ethernet_t ethernet;
ipv4_t ipv4;
tcp_t tcp;
}


parser IngressParserImpl(packet_in buffer,
out headers hdr,
inout metadata user_meta,
in psa_ingress_parser_input_metadata_t istd,
in empty_metadata_t resubmit_meta,
in empty_metadata_t recirculate_meta)
{
bit<8> tmpMask;
state start {
buffer.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType) {
0x0800 &&& 0x0F00: parse_ipv4;
default: accept;
}
}
state parse_ipv4 {
buffer.extract(hdr.ipv4);
tmpMask = hdr.ipv4.protocol;
transition select(tmpMask) {
8w4 .. 8w7: parse_tcp;
default: accept;
}
}
state parse_tcp {
buffer.extract(hdr.tcp);
transition accept;
}
}

control ingress(inout headers hdr,
inout metadata user_meta,
in psa_ingress_input_metadata_t istd,
inout psa_ingress_output_metadata_t ostd)
{
bit<16> tmpMask = 1;
action execute() {
user_meta.data = tmpMask;
}
table tbl {
key = {
hdr.ethernet.srcAddr : range;
hdr.ethernet.dstAddr : exact;
}
actions = { NoAction; execute; }
}
apply {
tbl.apply();
}
}
// END:Parse_Error_Example

parser EgressParserImpl(packet_in buffer,
out headers hdr,
inout metadata user_meta,
in psa_egress_parser_input_metadata_t istd,
in empty_metadata_t normal_meta,
in empty_metadata_t clone_i2e_meta,
in empty_metadata_t clone_e2e_meta)
{
state start {
buffer.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType) {
0x080 &&& 0x0C0: parse_ipv4;
default: accept;
}
}
state parse_ipv4 {
buffer.extract(hdr.ipv4);
transition select(hdr.ipv4.protocol) {
8w16 .. 8w23: parse_tcp;
default: accept;
}
}
state parse_tcp {
buffer.extract(hdr.tcp);
transition accept;
}
}

control egress(inout headers hdr,
inout metadata user_meta,
in psa_egress_input_metadata_t istd,
inout psa_egress_output_metadata_t ostd)
{
apply { }
}

control IngressDeparserImpl(packet_out packet,
out empty_metadata_t clone_i2e_meta,
out empty_metadata_t resubmit_meta,
out empty_metadata_t normal_meta,
inout headers hdr,
in metadata meta,
in psa_ingress_output_metadata_t istd)
{
apply {
packet.emit(hdr.ethernet);
packet.emit(hdr.ipv4);
packet.emit(hdr.tcp);
}
}

// BEGIN:Compute_New_IPv4_Checksum_Example
control EgressDeparserImpl(packet_out packet,
out empty_metadata_t clone_e2e_meta,
out empty_metadata_t recirculate_meta,
inout headers hdr,
in metadata meta,
in psa_egress_output_metadata_t istd,
in psa_egress_deparser_input_metadata_t edstd)
{
apply {
packet.emit(hdr.ethernet);
packet.emit(hdr.ipv4);
packet.emit(hdr.tcp);
}
}
// END:Compute_New_IPv4_Checksum_Example

IngressPipeline(IngressParserImpl(),
ingress(),
IngressDeparserImpl()) ip;

EgressPipeline(EgressParserImpl(),
egress(),
EgressDeparserImpl()) ep;

PSA_Switch(ip, PacketReplicationEngine(), ep, BufferingQueueingEngine()) main;
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ action execute_1 args none {

table tbl {
key {
m.Ingress_key optional
m.Ingress_key wildcard
m.ingress_tbl_ethernet_dstAddr exact
m.ingress_tbl_ethernet_srcAddr exact
}
Expand Down
Loading

0 comments on commit d3a55bb

Please sign in to comment.