17#ifndef BACKENDS_TC_EBPFCODEGEN_H_
18#define BACKENDS_TC_EBPFCODEGEN_H_
26using namespace P4::literals;
40 PNAEbpfGenerator(
const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
62class PNAErrorCodesGen :
public Inspector {
68 bool preorder(
const IR::Type_Error *errors)
override {
70 for (
auto decl : errors->members) {
72 if (decl->srcInfo.isValid()) {
73 auto sourceFile = decl->srcInfo.getSourceFile();
75 if (sourceFile.endsWith(
"p4include/core.p4"))
continue;
78 builder->emitIndent();
79 builder->appendFormat(
"static const ParserError_t %v = %d", decl->name,
id);
80 builder->endOfStatement(
true);
85 "%1%: Reached maximum number of possible errors", decl);
95class PNAArchTC :
public PNAEbpfGenerator {
99 PNAArchTC(
const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
102 : PNAEbpfGenerator(options, ebpfTypes, pipeline, tcIR), xdp(xdp) {}
131 bool preorder(
const IR::Member *expression)
override;
134 void compileExtractField(
const IR::Expression *expr,
const IR::StructField *field,
136 void compileLookahead(
const IR::Expression *destination)
override;
137 bool preorder(
const IR::SelectCase *selectCase)
override;
146 void emitDeclaration(
EBPF::CodeBuilder *builder,
const IR::Declaration *decl)
override;
155 const IR::P4Action *action,
156 bool isDefaultAction)
const;
158 void initDirectCounters();
159 void initDirectMeters();
166 initDirectCounters();
176 bool isMatchTypeSupported(
const IR::Declaration_ID *matchType)
override {
177 if (matchType->name.name ==
"range" || matchType->name.name ==
"rangelist" ||
178 matchType->name.name ==
"optional")
180 return EBPF::EBPFTable::isMatchTypeSupported(matchType);
183 cstring actionRunVariable)
override;
185 cstring p4ActionToActionIDName(
const IR::P4Action *action)
const;
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;
259 ConvertToEbpfPipelineTC(
cstring name, EBPF::pipeline_type type,
const EbpfOptions &options,
260 const IR::ParserBlock *parserBlock,
261 const IR::ControlBlock *controlBlock,
267 parserBlock(parserBlock),
268 controlBlock(controlBlock),
269 deparserBlock(deparserBlock),
275 bool preorder(
const IR::PackageBlock *block)
override;
281class ConvertToEBPFParserPNA :
public Inspector {
288 : program(program), typemap(typemap), parser(
nullptr) {}
290 bool preorder(
const IR::ParserBlock *prsr)
override;
291 bool preorder(
const IR::P4ValueSet *pvs)
override;
297 bool addExternDeclaration =
false;
298 std::map<cstring, EBPFRegisterPNA *> pna_registers;
299 std::map<cstring, EBPFHashPNA *> pna_hashes;
301 mutable bool touched_skb_metadata;
303 EBPFControlPNA(
const EBPF::EBPFProgram *program,
const IR::ControlBlock *control,
304 const IR::Parameter *parserHeaders)
308 auto result = ::P4::get(pna_registers, name);
309 BUG_CHECK(result !=
nullptr,
"No register named %1%", name);
313 auto result = ::P4::get(pna_hashes, name);
317 if (addExternDeclaration) {
318 builder->emitIndent();
319 builder->appendLine(
"struct p4tc_ext_bpf_params ext_params = {};");
320 builder->emitIndent();
321 builder->appendLine(
"struct p4tc_ext_bpf_val ext_val = {};");
322 builder->emitIndent();
323 builder->appendLine(
"struct p4tc_ext_bpf_val *ext_val_ptr;");
326 void emitTableTypes(
EBPF::CodeBuilder *builder) { EBPF::EBPFControl::emitTableTypes(builder); }
332class ConvertToEBPFControlPNA :
public Inspector {
334 EBPF::pipeline_type type;
337 const IR::Parameter *parserHeaders;
343 ConvertToEBPFControlPNA(
EBPF::EBPFProgram *program,
const IR::Parameter *parserHeaders,
349 parserHeaders(parserHeaders),
353 bool preorder(
const IR::TableBlock *)
override;
354 bool preorder(
const IR::ControlBlock *)
override;
355 bool preorder(
const IR::Declaration_Variable *)
override;
356 bool preorder(
const IR::Member *m)
override;
357 bool preorder(
const IR::IfStatement *a)
override;
358 bool preorder(
const IR::ExternBlock *instance)
override;
359 bool checkPnaTimestampMem(
const IR::Member *m);
365class ConvertToEBPFDeparserPNA :
public Inspector {
367 const IR::Parameter *parserHeaders;
368 const IR::Parameter *istd;
373 ConvertToEBPFDeparserPNA(
EBPF::EBPFProgram *program,
const IR::Parameter *parserHeaders,
376 parserHeaders(parserHeaders),
381 bool preorder(
const IR::ControlBlock *)
override;
382 bool preorder(
const IR::Declaration_Instance *)
override;
399 virtual cstring getParamName(
const IR::PathExpression *);
400 bool preorder(
const IR::AssignmentStatement *a)
override;
402 bool preorder(
const IR::Member *)
override;
403 bool IsTableAddOnMiss(
const IR::P4Table *table);
404 const IR::P4Action *GetAddOnMissHitAction(
cstring actionName);
405 void ValidateAddOnMissMissAction(
const IR::P4Action *act);
411 public ControlBodyTranslatorPNA {
414 bool isDefaultAction;
420 const IR::P4Action *act,
bool isDefaultAction);
421 bool preorder(
const IR::PathExpression *pe)
override;
422 bool isActionParameter(
const IR::Expression *expression)
const;
425 cstring getParamInstanceName(
const IR::Expression *expression)
const override;
426 cstring getParamName(
const IR::PathExpression *)
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:49
Definition ebpfCodeGen.h:192
Definition ebpfCodeGen.h:295
Definition ebpfCodeGen.h:443
Definition tcExterns.h:180
Definition ebpfCodeGen.h:140
Definition tcExterns.h:53
void validateKeys() const override
Definition ebpfCodeGen.cpp:2507
Definition ebpfCodeGen.h:199
void emitPreDeparser(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:1358
void emit(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:179
void emitParser(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:279
Definition ebpfCodeGen.h:35
void emitLocalVariables(EBPF::CodeBuilder *builder) override
Generates a set of helper variables that are used during packet processing.
Definition ebpfCodeGen.cpp:602
void emitGlobalMetadataInitializer(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:529
void emitTrafficManager(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:571
This file defines functions for the pass to generate the introspection file.
Definition tc/backend.cpp:24
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:58