17#ifndef BACKENDS_TC_EBPFCODEGEN_H_
18#define BACKENDS_TC_EBPFCODEGEN_H_
26using namespace P4::literals;
41 PNAEbpfGenerator(
const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
60 DECLARE_TYPEINFO(PNAEbpfGenerator);
65class PNAErrorCodesGen :
public Inspector {
71 bool preorder(
const IR::Type_Error *errors)
override {
73 for (
auto decl : errors->members) {
75 if (decl->srcInfo.isValid()) {
76 auto sourceFile = decl->srcInfo.getSourceFile();
78 if (sourceFile.endsWith(
"p4include/core.p4"))
continue;
81 builder->emitIndent();
82 builder->appendFormat(
"static const ParserError_t %v = %d", decl->name,
id);
83 builder->endOfStatement(
true);
88 "%1%: Reached maximum number of possible errors", decl);
98class PNAArchTC :
public PNAEbpfGenerator {
102 PNAArchTC(
const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
105 : PNAEbpfGenerator(options, ebpfTypes, pipeline, tcIR), xdp(xdp) {}
115 DECLARE_TYPEINFO(PNAArchTC);
138 bool preorder(
const IR::Member *expression)
override;
139 mutable bool extractedVarbit =
false;
142 unsigned int compileExtractVarbits(
const IR::Expression *,
const IR::StructField *,
144 unsigned int compileExtractField(
const IR::Expression *,
const IR::StructField *,
unsigned int,
146 void compileLookahead(
const IR::Expression *destination)
override;
147 bool preorder(
const IR::SelectCase *selectCase)
override;
148 bool preorder(
const IR::SelectExpression *expression)
override;
149 bool preorder(
const IR::AssignmentStatement *statement)
override;
151 void compileExtract(
const IR::Expression *dest,
const IR::Expression *varsize = 0);
152 char *visit_to_string(
const IR::Expression *);
161 void emitDeclaration(
EBPF::CodeBuilder *builder,
const IR::Declaration *decl)
override;
170 const IR::P4Action *action,
171 bool isDefaultAction)
const;
173 void initDirectCounters();
174 void initDirectMeters();
181 initDirectCounters();
191 bool isMatchTypeSupported(
const IR::Declaration_ID *matchType)
override {
192 if (matchType->name.name ==
"range" || matchType->name.name ==
"rangelist" ||
193 matchType->name.name ==
"optional")
195 return EBPF::EBPFTable::isMatchTypeSupported(matchType);
198 cstring actionRunVariable)
override;
200 cstring p4ActionToActionIDName(
const IR::P4Action *action)
const;
212 bool preorder(
const IR::AssignmentStatement *a)
override;
217 mutable bool touched_skb_metadata;
219 IngressDeparserPNA(
const EBPF::EBPFProgram *program,
const IR::ControlBlock *control,
220 const IR::Parameter *parserHeaders,
const IR::Parameter *istd)
222 touched_skb_metadata(
false) {
226 bool addExternDeclaration =
false;
227 bool build()
override;
230 void emitDeclaration(
EBPF::CodeBuilder *builder,
const IR::Declaration *decl)
override;
233 if (addExternDeclaration) {
234 builder->emitIndent();
235 builder->appendLine(
"struct p4tc_ext_bpf_params ext_params = {};");
243class ConvertToEbpfPNA :
public Transform {
253 : options(options), typemap(typemap), refmap(refmap), ebpf_program(
nullptr), tcIR(tcIR) {}
256 const IR::Node *preorder(IR::ToplevelBlock *p)
override;
262class ConvertToEbpfPipelineTC :
public Inspector {
264 const EBPF::pipeline_type type;
266 const IR::ParserBlock *parserBlock;
267 const IR::ControlBlock *controlBlock;
268 const IR::ControlBlock *deparserBlock;
273 std::vector<EBPF::EBPFType *> ebpfTypes;
276 ConvertToEbpfPipelineTC(
cstring name, EBPF::pipeline_type type,
const EbpfOptions &options,
277 const IR::ParserBlock *parserBlock,
278 const IR::ControlBlock *controlBlock,
281 std::vector<EBPF::EBPFType *> ebpfTypes)
285 parserBlock(parserBlock),
286 controlBlock(controlBlock),
287 deparserBlock(deparserBlock),
292 ebpfTypes(ebpfTypes) {}
294 bool preorder(
const IR::PackageBlock *block)
override;
300class ConvertToEBPFParserPNA :
public Inspector {
307 : program(program), typemap(typemap), parser(
nullptr) {}
309 bool preorder(
const IR::ParserBlock *prsr)
override;
310 bool preorder(
const IR::P4ValueSet *pvs)
override;
316 bool addExternDeclaration =
false;
317 std::map<cstring, EBPFRegisterPNA *> pna_registers;
318 std::map<cstring, EBPFHashPNA *> pna_hashes;
319 std::map<cstring, EBPFRandomPNA *> pna_randoms;
321 mutable bool touched_skb_metadata;
323 EBPFControlPNA(
const EBPF::EBPFProgram *program,
const IR::ControlBlock *control,
324 const IR::Parameter *parserHeaders)
328 auto result = ::P4::get(pna_registers, name);
329 BUG_CHECK(result !=
nullptr,
"No register named %1%", name);
333 auto result = ::P4::get(pna_hashes, name);
337 auto result = ::P4::get(pna_randoms, name);
341 if (addExternDeclaration) {
342 builder->emitIndent();
343 builder->appendLine(
"struct p4tc_ext_bpf_params ext_params = {};");
344 builder->emitIndent();
345 builder->appendLine(
"struct p4tc_ext_bpf_val ext_val = {};");
346 builder->emitIndent();
347 builder->appendLine(
"struct p4tc_ext_bpf_val *ext_val_ptr;");
350 void emitTableTypes(
EBPF::CodeBuilder *builder) { EBPF::EBPFControl::emitTableTypes(builder); }
356class ConvertToEBPFControlPNA :
public Inspector {
358 EBPF::pipeline_type type;
361 const IR::Parameter *parserHeaders;
367 ConvertToEBPFControlPNA(
EBPF::EBPFProgram *program,
const IR::Parameter *parserHeaders,
373 parserHeaders(parserHeaders),
377 bool preorder(
const IR::TableBlock *)
override;
378 bool preorder(
const IR::ControlBlock *)
override;
379 bool preorder(
const IR::Declaration_Variable *)
override;
380 bool preorder(
const IR::Member *m)
override;
381 bool preorder(
const IR::IfStatement *a)
override;
382 bool preorder(
const IR::ExternBlock *instance)
override;
383 bool checkPnaTimestampMem(
const IR::Member *m);
389class ConvertToEBPFDeparserPNA :
public Inspector {
391 const IR::Parameter *parserHeaders;
392 const IR::Parameter *istd;
394 std::vector<EBPF::EBPFType *> ebpfTypes;
398 ConvertToEBPFDeparserPNA(
EBPF::EBPFProgram *program,
const IR::Parameter *parserHeaders,
400 std::vector<EBPF::EBPFType *> ebpfTypes)
402 parserHeaders(parserHeaders),
405 ebpfTypes(ebpfTypes),
408 bool preorder(
const IR::ControlBlock *)
override;
409 bool preorder(
const IR::Declaration_Instance *)
override;
426 virtual cstring getParamName(
const IR::PathExpression *);
427 bool preorder(
const IR::AssignmentStatement *a)
override;
429 bool preorder(
const IR::Member *)
override;
430 bool IsTableAddOnMiss(
const IR::P4Table *table);
431 const IR::P4Action *GetAddOnMissHitAction(
cstring actionName);
432 void ValidateAddOnMissMissAction(
const IR::P4Action *act);
433 bool arithCommon(
const IR::Operation_Binary *,
const char *,
const char *);
434 bool sarithCommon(
const IR::Operation_Binary *,
const char *);
435 bool preorder(
const IR::Concat *)
override;
436 bool preorder(
const IR::Add *)
override;
437 bool preorder(
const IR::Sub *)
override;
438 bool preorder(
const IR::Mul *)
override;
439 bool preorder(
const IR::Cast *)
override;
440 bool preorder(
const IR::Neg *)
override;
441 bool preorder(
const IR::Cmpl *)
override;
442 bool preorder(
const IR::Shl *)
override;
443 bool preorder(
const IR::Shr *)
override;
444 bool preorder(
const IR::Equ *)
override;
445 bool preorder(
const IR::Neq *)
override;
446 bool preorder(
const IR::Lss *)
override;
447 bool preorder(
const IR::Leq *)
override;
448 bool preorder(
const IR::Grt *)
override;
449 bool preorder(
const IR::Geq *)
override;
450 bool preorder(
const IR::BAnd *)
override;
451 bool preorder(
const IR::BOr *)
override;
452 bool preorder(
const IR::BXor *)
override;
453 bool preorder(
const IR::AddSat *)
override;
454 bool preorder(
const IR::SubSat *)
override;
455 bool preorder(
const IR::Constant *)
override;
456 bool bigXSmallMul(
const IR::Expression *,
const IR::Constant *);
457 void visitHostOrder(
const IR::Expression *);
463 public ControlBodyTranslatorPNA {
466 bool isDefaultAction;
472 const IR::P4Action *act,
bool isDefaultAction);
473 bool preorder(
const IR::PathExpression *pe)
override;
474 bool isActionParameter(
const IR::Expression *expression)
const;
477 cstring getParamInstanceName(
const IR::Expression *expression)
const override;
478 cstring getParamName(
const IR::PathExpression *)
override;
489 mutable bool hasVarbit =
false;
505 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:31
This translator emits buffer preparation (eg. which headers will be emitted)
Definition ebpfDeparser.h:38
Definition ebpfPsaControl.h:59
Definition ebpfDeparser.h:63
Definition ebpfPsaDeparser.h:39
Definition ebpfPsaHashAlgorithm.h:26
Definition ebpfPsaHashAlgorithm.h:172
Definition ebpfParser.h:81
EBPFPipeline represents a single eBPF program in the TC/XDP hook.
Definition ebpfPipeline.h:28
cstring name
A custom name of eBPF program.
Definition ebpfPipeline.h:31
Definition ebpfProgram.h:39
Definition ebpfPsaParser.h:40
Definition ebpfPsaTable.h:29
Base class for EBPF types.
Definition ebpfType.h:29
Definition ebpfPsaGen.h:31
Definition ebpfPsaParser.h:29
Definition ebpfPipeline.h:199
Definition xdpHelpProgram.h:24
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:329
Definition ebpfCodeGen.h:207
Definition ebpfCodeGen.h:518
Definition ebpfCodeGen.h:314
Definition ebpfCodeGen.h:508
Definition tcExterns.h:181
Definition ebpfCodeGen.h:155
Definition tcExterns.h:321
Definition tcExterns.h:53
void validateKeys() const override
Definition ebpfCodeGen.cpp:3071
Definition ebpfCodeGen.h:215
void emitPreDeparser(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:1807
void emit(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:180
void emitParser(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:278
Definition ebpfCodeGen.h:36
void emitLocalVariables(EBPF::CodeBuilder *builder) override
Generates a set of helper variables that are used during packet processing.
Definition ebpfCodeGen.cpp:609
void emitGlobalMetadataInitializer(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:536
void emitTrafficManager(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:578
This file defines functions for the pass to generate the introspection file.
Definition tc/backend.cpp:27
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:58