-
Notifications
You must be signed in to change notification settings - Fork 449
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Dpdk backend: optional and range match kinds translate to wildcard ma…
…tch for dpdk (#3472)
- Loading branch information
Showing
24 changed files
with
2,058 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.