P4C
The P4 Compiler
 
Loading...
Searching...
No Matches
ebpfCodeGen.h
1/*
2Copyright (C) 2023 Intel Corporation
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing,
11software distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions
14and limitations under the License.
15*/
16
17#ifndef BACKENDS_TC_EBPFCODEGEN_H_
18#define BACKENDS_TC_EBPFCODEGEN_H_
19
20#include "backend.h"
21
22namespace TC {
23
24class ConvertToBackendIR;
25class EBPFPnaParser;
26
27// Similar to class PSAEbpfGenerator in backends/ebpf/psa/ebpfPsaGen.h
28
30 public:
31 EBPF::EBPFPipeline *pipeline;
32 const ConvertToBackendIR *tcIR;
33
34 PNAEbpfGenerator(const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
35 EBPF::EBPFPipeline *pipeline, const ConvertToBackendIR *tcIR)
36 : EBPF::EbpfCodeGenerator(options, ebpfTypes), pipeline(pipeline), tcIR(tcIR) {}
37
38 virtual void emit(EBPF::CodeBuilder *builder) const = 0;
39 virtual void emitInstances(EBPF::CodeBuilder *builder) const = 0;
40 virtual void emitParser(EBPF::CodeBuilder *builder) const = 0;
41 virtual void emitHeader(EBPF::CodeBuilder *builder) const = 0;
42 void emitPNAIncludes(EBPF::CodeBuilder *builder) const;
43 void emitPreamble(EBPF::CodeBuilder *builder) const override;
44 void emitCommonPreamble(EBPF::CodeBuilder *builder) const override;
45 void emitInternalStructures(EBPF::CodeBuilder *pBuilder) const override;
46 void emitTypes(EBPF::CodeBuilder *builder) const override;
47 void emitGlobalHeadersMetadata(EBPF::CodeBuilder *builder) const override;
48 void emitPipelineInstances(EBPF::CodeBuilder *builder) const override;
49 void emitP4TCFilterFields(EBPF::CodeBuilder *builder) const;
50 void emitP4TCActionParam(EBPF::CodeBuilder *builder) const;
51 cstring getProgramName() const;
52};
53
54// Similar to class PSAErrorCodesGen in backends/ebpf/psa/ebpfPsaGen.cpp
55
56class PNAErrorCodesGen : public Inspector {
57 EBPF::CodeBuilder *builder;
58
59 public:
60 explicit PNAErrorCodesGen(EBPF::CodeBuilder *builder) : builder(builder) {}
61
62 bool preorder(const IR::Type_Error *errors) override {
63 int id = -1;
64 for (auto decl : errors->members) {
65 ++id;
66 if (decl->srcInfo.isValid()) {
67 auto sourceFile = decl->srcInfo.getSourceFile();
68 // all the error codes are located in core.p4 file, they are defined in pna.h
69 if (sourceFile.endsWith("p4include/core.p4")) continue;
70 }
71
72 builder->emitIndent();
73 builder->appendFormat("static const ParserError_t %s = %d", decl->name.name, id);
74 builder->endOfStatement(true);
75
76 // type ParserError_t is u8, which can have values from 0 to 255
77 if (id > 255) {
78 ::error(ErrorType::ERR_OVERLIMIT, "%1%: Reached maximum number of possible errors",
79 decl);
80 }
81 }
82 builder->newline();
83 return false;
84 }
85};
86
87// Similar to class PSAArchTC in backends/ebpf/psa/ebpfPsaGen.h
88
90 public:
92
93 PNAArchTC(const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
95 const ConvertToBackendIR *tcIR)
96 : PNAEbpfGenerator(options, ebpfTypes, pipeline, tcIR), xdp(xdp) {}
97
98 void emit(EBPF::CodeBuilder *builder) const override;
99 void emitParser(EBPF::CodeBuilder *builder) const override;
100 void emitHeader(EBPF::CodeBuilder *builder) const override;
101 void emitInstances(EBPF::CodeBuilder *builder) const override;
102};
103
105 public:
106 TCIngressPipelinePNA(cstring name, const EbpfOptions &options, P4::ReferenceMap *refMap,
107 P4::TypeMap *typeMap)
108 : EBPF::TCIngressPipeline(name, options, refMap, typeMap) {}
109
110 void emit(EBPF::CodeBuilder *builder) override;
111 void emitLocalVariables(EBPF::CodeBuilder *builder) override;
112 void emitGlobalMetadataInitializer(EBPF::CodeBuilder *builder) override;
113 void emitTrafficManager(EBPF::CodeBuilder *builder) override;
114
116};
117
119 public:
122 : EBPF::PsaStateTranslationVisitor(refMap, typeMap, prsr) {}
123
124 protected:
125 void compileExtractField(const IR::Expression *expr, const IR::StructField *field,
126 unsigned hdrOffsetBits, EBPF::EBPFType *type) override;
127 void compileLookahead(const IR::Expression *destination) override;
128};
129
131 public:
132 EBPFPnaParser(const EBPF::EBPFProgram *program, const IR::ParserBlock *block,
133 const P4::TypeMap *typeMap);
134 void emit(EBPF::CodeBuilder *builder) override;
135 void emitRejectState(EBPF::CodeBuilder *) override;
136
137 DECLARE_TYPEINFO(EBPFPnaParser, EBPF::EBPFPsaParser);
138};
139
141 protected:
142 EBPF::ActionTranslationVisitor *createActionTranslationVisitor(
143 cstring valueName, const EBPF::EBPFProgram *program) const override;
144 void validateKeys() const override;
145 const ConvertToBackendIR *tcIR;
146
147 public:
148 EBPFTablePNA(const EBPF::EBPFProgram *program, const IR::TableBlock *table,
149 EBPF::CodeGenInspector *codeGen, const ConvertToBackendIR *tcIR)
150 : EBPF::EBPFTablePSA(program, table, codeGen), tcIR(tcIR) {}
151 void emitInitializer(EBPF::CodeBuilder *builder) override;
152 void emitDefaultActionStruct(EBPF::CodeBuilder *builder);
153 void emitKeyType(EBPF::CodeBuilder *builder) override;
154 void emitValueType(EBPF::CodeBuilder *builder) override;
155 void emitValueStructStructure(EBPF::CodeBuilder *builder) override;
156 void emitActionArguments(EBPF::CodeBuilder *builder, const IR::P4Action *action, cstring name);
157 void emitKeyPNA(EBPF::CodeBuilder *builder, cstring keyName);
158 bool isMatchTypeSupported(const IR::Declaration_ID *matchType) override {
159 if (matchType->name.name == "range" || matchType->name.name == "rangelist" ||
160 matchType->name.name == "optional")
161 return 1;
162 return EBPF::EBPFTable::isMatchTypeSupported(matchType);
163 }
164 void emitAction(EBPF::CodeBuilder *builder, cstring valueName,
165 cstring actionRunVariable) override;
166 void emitValueActionIDNames(EBPF::CodeBuilder *builder) override;
167 cstring p4ActionToActionIDName(const IR::P4Action *action) const;
168
169 DECLARE_TYPEINFO(EBPFTablePNA, EBPF::EBPFTablePSA);
170};
171
173 public:
174 IngressDeparserPNA(const EBPF::EBPFProgram *program, const IR::ControlBlock *control,
175 const IR::Parameter *parserHeaders, const IR::Parameter *istd)
176 : EBPF::EBPFDeparserPSA(program, control, parserHeaders, istd) {}
177
178 bool build() override;
179 void emit(EBPF::CodeBuilder *builder) override;
180 void emitPreDeparser(EBPF::CodeBuilder *builder) override;
181
182 DECLARE_TYPEINFO(IngressDeparserPNA, EBPF::EBPFDeparserPSA);
183};
184
185// Similar to class ConvertToEbpfPSA in backends/ebpf/psa/ebpfPsaGen.h
186
187class ConvertToEbpfPNA : public Transform {
188 const EbpfOptions &options;
189 P4::TypeMap *typemap;
190 P4::ReferenceMap *refmap;
191 const PNAEbpfGenerator *ebpf_program;
192 const ConvertToBackendIR *tcIR;
193
194 public:
195 ConvertToEbpfPNA(const EbpfOptions &options, P4::ReferenceMap *refmap, P4::TypeMap *typemap,
196 const ConvertToBackendIR *tcIR)
197 : options(options), typemap(typemap), refmap(refmap), ebpf_program(nullptr), tcIR(tcIR) {}
198
199 const PNAEbpfGenerator *build(const IR::ToplevelBlock *prog);
200 const IR::Node *preorder(IR::ToplevelBlock *p) override;
201 const PNAEbpfGenerator *getEBPFProgram() { return ebpf_program; }
202};
203
204// Similar to class ConvertToEbpfPipeline in backends/ebpf/psa/ebpfPsaGen.h
205
206class ConvertToEbpfPipelineTC : public Inspector {
207 const cstring name;
208 const EBPF::pipeline_type type;
209 const EbpfOptions &options;
210 const IR::ParserBlock *parserBlock;
211 const IR::ControlBlock *controlBlock;
212 const IR::ControlBlock *deparserBlock;
213 P4::TypeMap *typemap;
214 P4::ReferenceMap *refmap;
215 EBPF::EBPFPipeline *pipeline;
216 const ConvertToBackendIR *tcIR;
217
218 public:
219 ConvertToEbpfPipelineTC(cstring name, EBPF::pipeline_type type, const EbpfOptions &options,
220 const IR::ParserBlock *parserBlock,
221 const IR::ControlBlock *controlBlock,
222 const IR::ControlBlock *deparserBlock, P4::ReferenceMap *refmap,
223 P4::TypeMap *typemap, const ConvertToBackendIR *tcIR)
224 : name(name),
225 type(type),
226 options(options),
227 parserBlock(parserBlock),
228 controlBlock(controlBlock),
229 deparserBlock(deparserBlock),
230 typemap(typemap),
231 refmap(refmap),
232 pipeline(nullptr),
233 tcIR(tcIR) {}
234
235 bool preorder(const IR::PackageBlock *block) override;
236 EBPF::EBPFPipeline *getEbpfPipeline() { return pipeline; }
237};
238
239// Similar to class ConvertToEBPFParserPSA in backends/ebpf/psa/ebpfPsaGen.h
240
241class ConvertToEBPFParserPNA : public Inspector {
242 EBPF::EBPFProgram *program;
243 P4::TypeMap *typemap;
244 TC::EBPFPnaParser *parser;
245
246 public:
248 : program(program), typemap(typemap), parser(nullptr) {}
249
250 bool preorder(const IR::ParserBlock *prsr) override;
251 bool preorder(const IR::P4ValueSet *pvs) override;
252 EBPF::EBPFParser *getEBPFParser() { return parser; }
253};
254
255// Similar to class ConvertToEBPFControlPSA in backends/ebpf/psa/ebpfPsaGen.h
256
257class ConvertToEBPFControlPNA : public Inspector {
258 EBPF::EBPFProgram *program;
259 EBPF::pipeline_type type;
260 EBPF::EBPFControlPSA *control;
261
262 const IR::Parameter *parserHeaders;
263 P4::ReferenceMap *refmap;
264
265 const ConvertToBackendIR *tcIR;
266
267 public:
268 ConvertToEBPFControlPNA(EBPF::EBPFProgram *program, const IR::Parameter *parserHeaders,
269 P4::ReferenceMap *refmap, EBPF::pipeline_type type,
270 const ConvertToBackendIR *tcIR)
271 : program(program),
272 type(type),
273 control(nullptr),
274 parserHeaders(parserHeaders),
275 refmap(refmap),
276 tcIR(tcIR) {}
277
278 bool preorder(const IR::TableBlock *) override;
279 bool preorder(const IR::ControlBlock *) override;
280 bool preorder(const IR::Declaration_Variable *) override;
281 bool preorder(const IR::Member *m) override;
282 bool preorder(const IR::IfStatement *a) override;
283 bool preorder(const IR::ExternBlock *instance) override;
284 bool checkPnaTimestampMem(const IR::Member *m);
285 EBPF::EBPFControlPSA *getEBPFControl() { return control; }
286};
287
288// Similar to class ConvertToEBPFDeparserPSA in backends/ebpf/psa/ebpfPsaGen.h
289
290class ConvertToEBPFDeparserPNA : public Inspector {
291 EBPF::EBPFProgram *program;
292 const IR::Parameter *parserHeaders;
293 const IR::Parameter *istd;
294 TC::IngressDeparserPNA *deparser;
295
296 public:
297 ConvertToEBPFDeparserPNA(EBPF::EBPFProgram *program, const IR::Parameter *parserHeaders,
298 const IR::Parameter *istd)
299 : program(program), parserHeaders(parserHeaders), istd(istd), deparser(nullptr) {}
300
301 bool preorder(const IR::ControlBlock *) override;
302 bool preorder(const IR::Declaration_Instance *) override;
303 EBPF::EBPFDeparserPSA *getEBPFDeparser() { return deparser; }
304};
305
306// Similar to class ControlBodyTranslatorPSA in backends/ebpf/psa/ebpfPsaControl.h
307
309 public:
310 const ConvertToBackendIR *tcIR;
311 const EBPF::EBPFTablePSA *table;
312 explicit ControlBodyTranslatorPNA(const EBPF::EBPFControlPSA *control);
313 explicit ControlBodyTranslatorPNA(const EBPF::EBPFControlPSA *control,
314 const ConvertToBackendIR *tcIR);
315 explicit ControlBodyTranslatorPNA(const EBPF::EBPFControlPSA *control,
316 const ConvertToBackendIR *tcIR,
317 const EBPF::EBPFTablePSA *table);
318 void processFunction(const P4::ExternFunction *function) override;
319 void processApply(const P4::ApplyMethod *method) override;
320 bool checkPnaPortMem(const IR::Member *m);
321 virtual cstring getParamName(const IR::PathExpression *);
322 bool preorder(const IR::AssignmentStatement *a) override;
323 void processMethod(const P4::ExternMethod *method) override;
324 bool preorder(const IR::Member *) override;
325 bool IsTableAddOnMiss(const IR::P4Table *table);
326 const IR::P4Action *GetAddOnMissHitAction(cstring actionName);
327 void ValidateAddOnMissMissAction(const IR::P4Action *act);
328};
329
330// Similar to class ActionTranslationVisitorPSA in backends/ebpf/psa/ebpfPsaControl.h
331
334 protected:
335 const EBPF::EBPFTablePSA *table;
336
337 public:
338 const ConvertToBackendIR *tcIR;
339 ActionTranslationVisitorPNA(const EBPF::EBPFProgram *program, cstring valueName,
340 const EBPF::EBPFTablePSA *table, const ConvertToBackendIR *tcIR);
341
342 bool preorder(const IR::PathExpression *pe) override;
343 bool isActionParameter(const IR::Expression *expression) const;
344
345 cstring getParamInstanceName(const IR::Expression *expression) const override;
346 cstring getParamName(const IR::PathExpression *) override;
347};
348
349// Similar to class DeparserHdrEmitTranslator in backends/ebpf/ebpfDeparser.h
350
352 protected:
353 const EBPF::EBPFDeparser *deparser;
354
355 public:
356 explicit DeparserHdrEmitTranslatorPNA(const EBPF::EBPFDeparser *deparser);
357
358 void processMethod(const P4::ExternMethod *method) override;
359 void emitField(EBPF::CodeBuilder *builder, cstring field, const IR::Expression *hdrExpr,
360 unsigned alignment, EBPF::EBPFType *type, bool isMAC);
361};
362
364 public:
365 CRCChecksumAlgorithmPNA(const EBPF::EBPFProgram *program, cstring name, int width)
366 : EBPF::CRCChecksumAlgorithm(program, name, width) {}
367
368 static void emitUpdateMethod(EBPF::CodeBuilder *builder, int crcWidth);
369};
370
372 public:
374 : CRCChecksumAlgorithmPNA(program, name, 16) {
375 initialValue = "0";
376 // We use a 0x8005 polynomial.
377 // 0xA001 comes from 0x8005 value bits reflection.
378 polynomial = "0xA001";
379 updateMethod = "crc16_update";
380 finalizeMethod = "crc16_finalize";
381 }
382
383 static void emitGlobals(EBPF::CodeBuilder *builder);
384};
385
387 public:
389 : CRCChecksumAlgorithmPNA(program, name, 32) {
390 initialValue = "0xffffffff";
391 // We use a 0x04C11DB7 polynomial.
392 // 0xEDB88320 comes from 0x04C11DB7 value bits reflection.
393 polynomial = "0xEDB88320";
394 updateMethod = "crc32_update";
395 finalizeMethod = "crc32_finalize";
396 }
397
398 static void emitGlobals(EBPF::CodeBuilder *builder);
399};
400
402 public:
403 static EBPFHashAlgorithmTypeFactoryPNA *instance() {
404 static EBPFHashAlgorithmTypeFactoryPNA factory;
405 return &factory;
406 }
407 void emitGlobals(EBPF::CodeBuilder *builder) {
408 CRC16ChecksumAlgorithmPNA::emitGlobals(builder);
409 CRC32ChecksumAlgorithmPNA::emitGlobals(builder);
410 EBPF::InternetChecksumAlgorithm::emitGlobals(builder);
411 }
412};
413
414} // namespace TC
415
416#endif /* BACKENDS_TC_EBPFCODEGEN_H_ */
Definition ebpfTable.h:26
Definition ebpfPsaHashAlgorithm.h:74
Definition codeGen.h:33
Definition codeGen.h:41
Definition ebpfControl.h:28
Definition ebpfDeparser.h:38
Definition ebpfPsaControl.h:58
Definition ebpfDeparser.h:63
Definition ebpfPsaDeparser.h:39
Definition ebpfPsaHashAlgorithm.h:176
Definition ebpfParser.h:79
Definition ebpfPipeline.h:30
Definition ebpfProgram.h:39
Definition ebpfPsaParser.h:40
Definition ebpfPsaTable.h:29
Definition ebpfType.h:29
Definition ebpfPsaGen.h:32
Definition ebpfPsaParser.h:29
Definition ebpfPipeline.h:206
Definition xdpHelpProgram.h:24
Definition ebpfOptions.h:26
Definition methodInstance.h:124
Definition methodInstance.h:176
Definition methodInstance.h:144
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Definition typeMap.h:42
Definition ebpfCodeGen.h:333
Definition ebpfCodeGen.h:371
Definition ebpfCodeGen.h:386
Definition ebpfCodeGen.h:363
Definition ebpfCodeGen.h:308
Definition backend.h:48
Definition ebpfCodeGen.h:257
Definition ebpfCodeGen.h:290
Definition ebpfCodeGen.h:241
Definition ebpfCodeGen.h:187
Definition ebpfCodeGen.h:206
Definition ebpfCodeGen.h:351
Definition ebpfCodeGen.h:401
Definition ebpfCodeGen.h:130
Definition ebpfCodeGen.h:140
Definition ebpfCodeGen.h:172
Definition ebpfCodeGen.h:89
void emitParser(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:217
void emit(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:171
Definition ebpfCodeGen.h:29
Definition ebpfCodeGen.h:56
Definition ebpfCodeGen.h:118
Definition ebpfCodeGen.h:104
Definition cstring.h:72
This file defines functions for the pass to generate the introspection file.
Definition backend.cpp:24