8#ifndef BACKENDS_TC_EBPFCODEGEN_H_
9#define BACKENDS_TC_EBPFCODEGEN_H_
16using namespace P4::literals;
25 PNAEbpfGenerator(
const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
44 DECLARE_TYPEINFO(PNAEbpfGenerator);
49class PNAErrorCodesGen :
public Inspector {
55 bool preorder(
const IR::Type_Error *errors)
override {
57 for (
auto decl : errors->members) {
59 if (decl->srcInfo.isValid()) {
60 auto sourceFile = decl->srcInfo.getSourceFile();
62 if (sourceFile.endsWith(
"p4include/core.p4"))
continue;
65 builder->emitIndent();
66 builder->appendFormat(
"static const ParserError_t %v = %d", decl->name,
id);
67 builder->endOfStatement(
true);
72 "%1%: Reached maximum number of possible errors", decl);
82class PNAArchTC :
public PNAEbpfGenerator {
86 PNAArchTC(
const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
89 : PNAEbpfGenerator(options, ebpfTypes, pipeline, tcIR), xdp(xdp) {}
99 DECLARE_TYPEINFO(PNAArchTC);
122 bool preorder(
const IR::Member *expression)
override;
123 mutable bool extractedVarbit =
false;
126 unsigned int compileExtractVarbits(
const IR::Expression *,
const IR::StructField *,
128 unsigned int compileExtractField(
const IR::Expression *,
const IR::StructField *,
unsigned int,
130 void compileLookahead(
const IR::Expression *destination)
override;
131 bool preorder(
const IR::SelectCase *selectCase)
override;
132 bool preorder(
const IR::SelectExpression *expression)
override;
133 bool preorder(
const IR::AssignmentStatement *statement)
override;
135 void compileExtract(
const IR::Expression *dest,
const IR::Expression *varsize = 0);
136 char *visit_to_string(
const IR::Expression *);
145 void emitDeclaration(
EBPF::CodeBuilder *builder,
const IR::Declaration *decl)
override;
154 const IR::P4Action *action,
155 bool isDefaultAction)
const;
157 void initDirectCounters();
158 void initDirectMeters();
165 initDirectCounters();
175 bool isMatchTypeSupported(
const IR::Declaration_ID *matchType)
override {
176 if (matchType->name.name ==
"range" || matchType->name.name ==
"rangelist" ||
177 matchType->name.name ==
"optional")
179 return EBPF::EBPFTable::isMatchTypeSupported(matchType);
182 cstring actionRunVariable)
override;
184 cstring p4ActionToActionIDName(
const IR::P4Action *action)
const;
196 bool preorder(
const IR::AssignmentStatement *a)
override;
201 mutable bool touched_skb_metadata;
203 IngressDeparserPNA(
const EBPF::EBPFProgram *program,
const IR::ControlBlock *control,
204 const IR::Parameter *parserHeaders,
const IR::Parameter *istd)
206 touched_skb_metadata(
false) {
210 bool addExternDeclaration =
false;
211 bool build()
override;
214 void emitDeclaration(
EBPF::CodeBuilder *builder,
const IR::Declaration *decl)
override;
217 if (addExternDeclaration) {
218 builder->emitIndent();
219 builder->appendLine(
"struct p4tc_ext_bpf_params ext_params = {};");
227class ConvertToEbpfPNA :
public Transform {
237 : options(options), typemap(typemap), refmap(refmap), ebpf_program(
nullptr), tcIR(tcIR) {}
240 const IR::Node *preorder(IR::ToplevelBlock *p)
override;
246class ConvertToEbpfPipelineTC :
public Inspector {
248 const EBPF::pipeline_type type;
250 const IR::ParserBlock *parserBlock;
251 const IR::ControlBlock *controlBlock;
252 const IR::ControlBlock *deparserBlock;
257 std::vector<EBPF::EBPFType *> ebpfTypes;
260 ConvertToEbpfPipelineTC(
cstring name, EBPF::pipeline_type type,
const EbpfOptions &options,
261 const IR::ParserBlock *parserBlock,
262 const IR::ControlBlock *controlBlock,
265 std::vector<EBPF::EBPFType *> ebpfTypes)
269 parserBlock(parserBlock),
270 controlBlock(controlBlock),
271 deparserBlock(deparserBlock),
276 ebpfTypes(ebpfTypes) {}
278 bool preorder(
const IR::PackageBlock *block)
override;
284class ConvertToEBPFParserPNA :
public Inspector {
291 : program(program), typemap(typemap), parser(
nullptr) {}
293 bool preorder(
const IR::ParserBlock *prsr)
override;
294 bool preorder(
const IR::P4ValueSet *pvs)
override;
300 bool addExternDeclaration =
false;
301 std::map<cstring, EBPFRegisterPNA *> pna_registers;
302 std::map<cstring, EBPFHashPNA *> pna_hashes;
303 std::map<cstring, EBPFRandomPNA *> pna_randoms;
305 mutable bool touched_skb_metadata;
307 EBPFControlPNA(
const EBPF::EBPFProgram *program,
const IR::ControlBlock *control,
308 const IR::Parameter *parserHeaders)
312 auto result = ::P4::get(pna_registers, name);
313 BUG_CHECK(result !=
nullptr,
"No register named %1%", name);
317 auto result = ::P4::get(pna_hashes, name);
321 auto result = ::P4::get(pna_randoms, name);
325 if (addExternDeclaration) {
326 builder->emitIndent();
327 builder->appendLine(
"struct p4tc_ext_bpf_params ext_params = {};");
328 builder->emitIndent();
329 builder->appendLine(
"struct p4tc_ext_bpf_val ext_val = {};");
330 builder->emitIndent();
331 builder->appendLine(
"struct p4tc_ext_bpf_val *ext_val_ptr;");
334 void emitTableTypes(
EBPF::CodeBuilder *builder) { EBPF::EBPFControl::emitTableTypes(builder); }
340class ConvertToEBPFControlPNA :
public Inspector {
342 EBPF::pipeline_type type;
345 const IR::Parameter *parserHeaders;
351 ConvertToEBPFControlPNA(
EBPF::EBPFProgram *program,
const IR::Parameter *parserHeaders,
357 parserHeaders(parserHeaders),
361 bool preorder(
const IR::TableBlock *)
override;
362 bool preorder(
const IR::ControlBlock *)
override;
363 bool preorder(
const IR::Declaration_Variable *)
override;
364 bool preorder(
const IR::Member *m)
override;
365 bool preorder(
const IR::IfStatement *a)
override;
366 bool preorder(
const IR::ExternBlock *instance)
override;
367 bool checkPnaTimestampMem(
const IR::Member *m);
373class ConvertToEBPFDeparserPNA :
public Inspector {
375 const IR::Parameter *parserHeaders;
376 const IR::Parameter *istd;
378 std::vector<EBPF::EBPFType *> ebpfTypes;
382 ConvertToEBPFDeparserPNA(
EBPF::EBPFProgram *program,
const IR::Parameter *parserHeaders,
384 std::vector<EBPF::EBPFType *> ebpfTypes)
386 parserHeaders(parserHeaders),
389 ebpfTypes(ebpfTypes),
392 bool preorder(
const IR::ControlBlock *)
override;
393 bool preorder(
const IR::Declaration_Instance *)
override;
410 virtual cstring getParamName(
const IR::PathExpression *);
411 bool preorder(
const IR::AssignmentStatement *a)
override;
413 bool preorder(
const IR::Member *)
override;
414 bool IsTableAddOnMiss(
const IR::P4Table *table);
415 const IR::P4Action *GetAddOnMissHitAction(
cstring actionName);
416 void ValidateAddOnMissMissAction(
const IR::P4Action *act);
417 bool arithCommon(
const IR::Operation_Binary *,
const char *,
const char *);
418 bool sarithCommon(
const IR::Operation_Binary *,
const char *);
419 bool preorder(
const IR::Concat *)
override;
420 bool preorder(
const IR::Add *)
override;
421 bool preorder(
const IR::Sub *)
override;
422 bool preorder(
const IR::Mul *)
override;
423 bool preorder(
const IR::Cast *)
override;
424 bool preorder(
const IR::Neg *)
override;
425 bool preorder(
const IR::Cmpl *)
override;
426 bool preorder(
const IR::Shl *)
override;
427 bool preorder(
const IR::Shr *)
override;
428 bool preorder(
const IR::Equ *)
override;
429 bool preorder(
const IR::Neq *)
override;
430 bool preorder(
const IR::Lss *)
override;
431 bool preorder(
const IR::Leq *)
override;
432 bool preorder(
const IR::Grt *)
override;
433 bool preorder(
const IR::Geq *)
override;
434 bool preorder(
const IR::BAnd *)
override;
435 bool preorder(
const IR::BOr *)
override;
436 bool preorder(
const IR::BXor *)
override;
437 bool preorder(
const IR::AddSat *)
override;
438 bool preorder(
const IR::SubSat *)
override;
439 bool preorder(
const IR::Constant *)
override;
440 bool bigXSmallMul(
const IR::Expression *,
const IR::Constant *);
441 void visitHostOrder(
const IR::Expression *);
447 public ControlBodyTranslatorPNA {
450 bool isDefaultAction;
456 const IR::P4Action *act,
bool isDefaultAction);
457 bool preorder(
const IR::PathExpression *pe)
override;
458 bool isActionParameter(
const IR::Expression *expression)
const;
461 cstring getParamInstanceName(
const IR::Expression *expression)
const override;
462 cstring getParamName(
const IR::PathExpression *)
override;
473 mutable bool hasVarbit =
false;
477 bool preorder(
const IR::BlockStatement *s)
override;
478 bool preorder(
const IR::MethodCallStatement *s)
override;
491 bool preorder(
const IR::BlockStatement *s)
override;
492 bool preorder(
const IR::MethodCallStatement *)
override;
Definition methodInstance.h:129
Definition ebpfTable.h:26
Definition ebpf/codeGen.h:33
Definition ebpf/codeGen.h:41
Definition ebpfControl.h:28
Definition ebpfPsaDeparser.h:21
This translator emits buffer preparation (eg. which headers will be emitted)
Definition ebpfDeparser.h:29
Definition ebpfPsaControl.h:49
Definition ebpfDeparser.h:59
Definition ebpfPsaDeparser.h:29
Definition ebpfPsaHashAlgorithm.h:16
Definition ebpfPsaHashAlgorithm.h:162
Definition ebpfParser.h:81
EBPFPipeline represents a single eBPF program in the TC/XDP hook.
Definition ebpfPipeline.h:18
cstring name
A custom name of eBPF program.
Definition ebpfPipeline.h:21
Definition ebpfProgram.h:30
Definition ebpfPsaParser.h:30
Definition ebpfPsaTable.h:19
Base class for EBPF types.
Definition ebpfType.h:29
Definition ebpfPsaGen.h:21
Definition ebpfPsaParser.h:19
Definition ebpfPipeline.h:189
Definition xdpHelpProgram.h:14
Definition ebpfOptions.h:26
Definition methodInstance.h:194
Definition methodInstance.h:168
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition tc/backend.h:319
Definition ebpfCodeGen.h:191
Definition ebpfCodeGen.h:505
Definition ebpfCodeGen.h:298
Definition ebpfCodeGen.h:495
Definition tcExterns.h:174
Definition ebpfCodeGen.h:139
Definition tcExterns.h:314
Definition tcExterns.h:46
void validateKeys() const override
Definition ebpfCodeGen.cpp:3069
Definition ebpfCodeGen.h:199
void emitPreDeparser(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:1796
void emit(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:169
void emitParser(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:267
Definition ebpfCodeGen.h:20
void emitLocalVariables(EBPF::CodeBuilder *builder) override
Generates a set of helper variables that are used during packet processing.
Definition ebpfCodeGen.cpp:598
void emitGlobalMetadataInitializer(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:525
void emitTrafficManager(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:567
This file defines functions for the pass to generate the introspection file.
Definition tc/backend.cpp:17
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:58