forked from p4lang/p4c
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpna-dpdk-direct-meter-err-1.p4
155 lines (137 loc) · 3.78 KB
/
pna-dpdk-direct-meter-err-1.p4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <core.p4>
#include <dpdk/pna.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;
}
struct empty_metadata_t {
}
// BEGIN:Counter_Example_Part1
typedef bit<48> ByteCounter_t;
typedef bit<32> PacketCounter_t;
typedef bit<80> PacketByteCounter_t;
const bit<32> NUM_PORTS = 512;
// END:Counter_Example_Part1
struct main_metadata_t {
bit<32> port_out;
bit<32> port_out1;
}
struct headers_t {
ethernet_t ethernet;
ipv4_t ipv4;
}
control PreControlImpl(
in headers_t hdr,
inout main_metadata_t meta,
in pna_pre_input_metadata_t istd,
inout pna_pre_output_metadata_t ostd)
{
apply {
}
}
parser MainParserImpl(
packet_in pkt,
out headers_t hdr,
inout main_metadata_t main_meta,
in pna_main_parser_input_metadata_t istd)
{
state start {
pkt.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType) {
0x0800: parse_ipv4;
default: accept;
}
}
state parse_ipv4 {
pkt.extract(hdr.ipv4);
transition accept;
}
}
// BEGIN:Counter_Example_Part2
control MainControlImpl(
inout headers_t hdr, // from main parser
inout main_metadata_t user_meta, // from main parser, to "next block"
in pna_main_input_metadata_t istd,
inout pna_main_output_metadata_t ostd)
{
PNA_MeterColor_t color_out;
PNA_MeterColor_t out1;
PNA_MeterColor_t color_in = PNA_MeterColor_t.RED;
DirectMeter(PNA_MeterType_t.BYTES) meter0;
DirectMeter(PNA_MeterType_t.BYTES) meter1;
action next_hop(PortId_t oport) {
out1 = meter0.dpdk_execute(color_in, 32w1024);
user_meta.port_out = (out1 == PNA_MeterColor_t.GREEN ? 32w1 : 32w0);
color_out = meter1.dpdk_execute(color_in, 32w1024);
user_meta.port_out1 = (color_out == PNA_MeterColor_t.GREEN ? 32w1 : 32w0);
send_to_port(oport);
}
action default_route_drop() {
out1 = meter0.dpdk_execute(color_in, 32w1024);
user_meta.port_out = (out1 == PNA_MeterColor_t.GREEN ? 32w1 : 32w0);
drop_packet();
}
table ipv4_da {
key = { hdr.ipv4.dstAddr: exact; }
actions = {
next_hop;
default_route_drop;
}
default_action = default_route_drop;
// table ipv4_da owns this DirectCounter instance
pna_direct_meter = meter0;
}
table ipv4_da_lpm {
key = { hdr.ipv4.dstAddr: lpm; }
actions = {
next_hop;
default_route_drop;
}
default_action = default_route_drop;
// table ipv4_da_lpm owns this DirectCounter instance
pna_direct_meter = meter1;
}
apply {
if (hdr.ipv4.isValid()) {
color_out = meter1.dpdk_execute(color_in, 32w1024);
user_meta.port_out1 = (color_out == PNA_MeterColor_t.GREEN ? 32w1 : 32w0);
ipv4_da_lpm.apply();
ipv4_da.apply();
}
}
}
control MainDeparserImpl(
packet_out pkt,
in headers_t hdr, // from main control
in main_metadata_t user_meta, // from main control
in pna_main_output_metadata_t ostd)
{
apply {
pkt.emit(hdr.ethernet);
pkt.emit(hdr.ipv4);
}
}
// BEGIN:Package_Instantiation_Example
PNA_NIC(
MainParserImpl(),
PreControlImpl(),
MainControlImpl(),
MainDeparserImpl()
) main;
// END:Package_Instantiation_Example