P4C
The P4 Compiler
 
Loading...
Searching...
No Matches
ebpfPsaGen.h
1/*
2Copyright 2022-present Orange
3Copyright 2022-present Open Networking Foundation
4
5Licensed under the Apache License, Version 2.0 (the "License");
6you may not use this file except in compliance with the License.
7You may obtain a copy of the License at
8
9 http://www.apache.org/licenses/LICENSE-2.0
10
11Unless required by applicable law or agreed to in writing, software
12distributed under the License is distributed on an "AS IS" BASIS,
13WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14See the License for the specific language governing permissions and
15limitations under the License.
16*/
17#ifndef BACKENDS_EBPF_PSA_EBPFPSAGEN_H_
18#define BACKENDS_EBPF_PSA_EBPFPSAGEN_H_
19
20#include "backends/bmv2/psa_switch/psaSwitch.h"
21#include "backends/ebpf/codeGen.h"
22#include "backends/ebpf/ebpfObject.h"
23#include "backends/ebpf/ebpfOptions.h"
24#include "ebpfPipeline.h"
25#include "ebpfPsaParser.h"
26#include "xdpHelpProgram.h"
27
28namespace EBPF {
29
30enum pipeline_type { TC_INGRESS, TC_EGRESS, XDP_INGRESS, XDP_EGRESS, TC_TRAFFIC_MANAGER };
31
33 public:
34 const EbpfOptions &options;
35 std::vector<EBPF::EBPFType *> ebpfTypes;
36
37 EbpfCodeGenerator(const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes)
38 : options(options), ebpfTypes(ebpfTypes) {}
39
40 virtual void emitCommonPreamble(EBPF::CodeBuilder *builder) const = 0;
41 virtual void emitPreamble(CodeBuilder *builder) const = 0;
42 virtual void emitInternalStructures(EBPF::CodeBuilder *pBuilder) const = 0;
43 virtual void emitTypes(EBPF::CodeBuilder *builder) const = 0;
44 virtual void emitGlobalHeadersMetadata(EBPF::CodeBuilder *builder) const = 0;
45 virtual void emitPipelineInstances(EBPF::CodeBuilder *builder) const = 0;
46};
47
49 public:
50 static const unsigned MaxClones = 64;
51 static const unsigned MaxCloneSessions = 1024;
52
53 EBPFPipeline *ingress;
54 EBPFPipeline *egress;
55
56 PSAEbpfGenerator(const EbpfOptions &options, std::vector<EBPFType *> &ebpfTypes,
57 EBPFPipeline *ingress, EBPFPipeline *egress)
58 : EbpfCodeGenerator(options, ebpfTypes), ingress(ingress), egress(egress) {}
59
60 virtual void emit(CodeBuilder *builder) const = 0;
61 virtual void emitInstances(EBPF::CodeBuilder *builder) const = 0;
62
63 void emitPSAIncludes(CodeBuilder *builder) const;
64 void emitPreamble(CodeBuilder *builder) const override;
65 void emitCommonPreamble(CodeBuilder *builder) const override;
66 void emitInternalStructures(CodeBuilder *pBuilder) const override;
67 void emitTypes(CodeBuilder *builder) const override;
68 void emitGlobalHeadersMetadata(CodeBuilder *builder) const override;
69 void emitPacketReplicationTables(CodeBuilder *builder) const;
70 void emitPipelineInstances(CodeBuilder *builder) const override;
71 void emitInitializer(CodeBuilder *builder) const;
72 virtual void emitInitializerSection(CodeBuilder *builder) const = 0;
73 void emitHelperFunctions(CodeBuilder *builder) const;
74
75 // TODO: move them to the externs/ebpfPsaHashAlgorithm.cpp file
76 void emitCRC32LookupTableTypes(CodeBuilder *builder) const;
77 void emitCRC32LookupTableInitializer(CodeBuilder *builder) const;
78 void emitCRC32LookupTableInstance(CodeBuilder *builder) const;
79};
80
82 public:
83 XDPHelpProgram *xdp;
84
85 PSAArchTC(const EbpfOptions &options, std::vector<EBPFType *> &ebpfTypes, XDPHelpProgram *xdp,
86 EBPFPipeline *tcIngress, EBPFPipeline *tcEgress)
87 : PSAEbpfGenerator(options, ebpfTypes, tcIngress, tcEgress), xdp(xdp) {}
88
89 void emit(CodeBuilder *builder) const override;
90
91 void emitInstances(CodeBuilder *builder) const override;
92 void emitInitializerSection(CodeBuilder *builder) const override;
93};
94
96 public:
97 // TC Ingress program used to support packet cloning in the XDP mode.
98 EBPFPipeline *tcIngressForXDP;
99 // If the XDP mode is used, we need to have TC Egress pipeline to handle cloned packets.
100 EBPFPipeline *tcEgressForXDP;
101 static const unsigned egressDevmapSize = 256;
102
103 PSAArchXDP(const EbpfOptions &options, std::vector<EBPFType *> &ebpfTypes,
104 EBPFPipeline *xdpIngress, EBPFPipeline *xdpEgress, EBPFPipeline *tcTrafficManager,
105 EBPFPipeline *tcEgress)
106 : PSAEbpfGenerator(options, ebpfTypes, xdpIngress, xdpEgress),
107 tcIngressForXDP(tcTrafficManager),
108 tcEgressForXDP(tcEgress) {}
109
110 void emit(CodeBuilder *builder) const override;
111
112 void emitPreamble(CodeBuilder *builder) const override;
113 void emitInstances(CodeBuilder *builder) const override;
114 void emitInitializerSection(CodeBuilder *builder) const override;
115
116 void emitXDP2TCInternalStructures(CodeBuilder *builder) const;
117 void emitDummyProgram(CodeBuilder *builder) const;
118};
119
120class ConvertToEbpfPSA : public Transform {
121 const EbpfOptions &options;
122 P4::TypeMap *typemap;
123 P4::ReferenceMap *refmap;
124 const PSAEbpfGenerator *ebpf_psa_arch;
125
126 public:
127 ConvertToEbpfPSA(const EbpfOptions &options, P4::ReferenceMap *refmap, P4::TypeMap *typemap)
128 : options(options), typemap(typemap), refmap(refmap), ebpf_psa_arch(nullptr) {}
129
130 const PSAEbpfGenerator *build(const IR::ToplevelBlock *prog);
131 const IR::Node *preorder(IR::ToplevelBlock *p) override;
132
133 const PSAEbpfGenerator *getPSAArchForEBPF() { return ebpf_psa_arch; }
134};
135
136class ConvertToEbpfPipeline : public Inspector {
137 const cstring name;
138 const pipeline_type type;
139 const EbpfOptions &options;
140 const IR::ParserBlock *parserBlock;
141 const IR::ControlBlock *controlBlock;
142 const IR::ControlBlock *deparserBlock;
143 P4::TypeMap *typemap;
144 P4::ReferenceMap *refmap;
145 EBPFPipeline *pipeline;
146
147 public:
148 ConvertToEbpfPipeline(cstring name, pipeline_type type, const EbpfOptions &options,
149 const IR::ParserBlock *parserBlock, const IR::ControlBlock *controlBlock,
150 const IR::ControlBlock *deparserBlock, P4::ReferenceMap *refmap,
151 P4::TypeMap *typemap)
152 : name(name),
153 type(type),
154 options(options),
155 parserBlock(parserBlock),
156 controlBlock(controlBlock),
157 deparserBlock(deparserBlock),
158 typemap(typemap),
159 refmap(refmap),
160 pipeline(nullptr) {}
161
162 bool preorder(const IR::PackageBlock *block) override;
163 EBPFPipeline *getEbpfPipeline() { return pipeline; }
164};
165
166class ConvertToEBPFParserPSA : public Inspector {
167 EBPF::EBPFProgram *program;
168 pipeline_type type;
169
170 P4::TypeMap *typemap;
171 EBPF::EBPFPsaParser *parser;
172
173 public:
174 ConvertToEBPFParserPSA(EBPF::EBPFProgram *program, P4::TypeMap *typemap, pipeline_type type)
175 : program(program), type(type), typemap(typemap), parser(nullptr) {}
176
177 bool preorder(const IR::ParserBlock *prsr) override;
178 bool preorder(const IR::P4ValueSet *pvs) override;
179 EBPF::EBPFParser *getEBPFParser() { return parser; }
180};
181
182class ConvertToEBPFControlPSA : public Inspector {
183 EBPF::EBPFProgram *program;
184 pipeline_type type;
185 EBPF::EBPFControlPSA *control;
186
187 const IR::Parameter *parserHeaders;
188 P4::ReferenceMap *refmap;
189
190 public:
191 ConvertToEBPFControlPSA(EBPF::EBPFProgram *program, const IR::Parameter *parserHeaders,
192 P4::ReferenceMap *refmap, pipeline_type type)
193 : program(program),
194 type(type),
195 control(nullptr),
196 parserHeaders(parserHeaders),
197 refmap(refmap) {}
198
199 bool preorder(const IR::TableBlock *) override;
200 bool preorder(const IR::ControlBlock *) override;
201 bool preorder(const IR::Declaration_Variable *) override;
202 bool preorder(const IR::Member *m) override;
203 bool preorder(const IR::IfStatement *a) override;
204 bool preorder(const IR::ExternBlock *instance) override;
205
206 EBPF::EBPFControlPSA *getEBPFControl() { return control; }
207};
208
209class ConvertToEBPFDeparserPSA : public Inspector {
210 EBPF::EBPFProgram *program;
211 pipeline_type pipelineType;
212
213 const IR::Parameter *parserHeaders;
214 const IR::Parameter *istd;
215 EBPF::EBPFDeparserPSA *deparser;
216
217 public:
218 ConvertToEBPFDeparserPSA(EBPFProgram *program, const IR::Parameter *parserHeaders,
219 const IR::Parameter *istd, pipeline_type type)
220 : program(program),
221 pipelineType(type),
222 parserHeaders(parserHeaders),
223 istd(istd),
224 deparser(nullptr) {}
225
226 bool preorder(const IR::ControlBlock *) override;
227 bool preorder(const IR::Declaration_Instance *) override;
228 EBPF::EBPFDeparserPSA *getEBPFDeparser() { return deparser; }
229};
230
231} // namespace EBPF
232
233#endif /* BACKENDS_EBPF_PSA_EBPFPSAGEN_H_ */
Definition codeGen.h:33
Definition ebpfPsaGen.h:182
Definition ebpfPsaGen.h:209
Definition ebpfPsaGen.h:166
Definition ebpfPsaGen.h:120
Definition ebpfPsaGen.h:136
Definition ebpfPsaControl.h:58
Definition ebpfPsaDeparser.h:39
Definition ebpfParser.h:79
Definition ebpfPipeline.h:30
Definition ebpfProgram.h:39
Definition ebpfPsaParser.h:40
Definition ebpfPsaGen.h:32
Definition ebpfPsaGen.h:81
void emit(CodeBuilder *builder) const override
Definition ebpfPsaGen.cpp:419
Definition ebpfPsaGen.h:95
Definition ebpfPsaGen.h:48
Definition xdpHelpProgram.h:24
Definition ebpfOptions.h:26
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Definition typeMap.h:42
Definition cstring.h:72