17#ifndef BACKENDS_TC_EBPFCODEGEN_H_
18#define BACKENDS_TC_EBPFCODEGEN_H_
28class ConvertToBackendIR;
67 bool preorder(
const IR::Type_Error *errors)
override {
69 for (
auto decl : errors->members) {
71 if (decl->srcInfo.isValid()) {
72 auto sourceFile = decl->srcInfo.getSourceFile();
74 if (sourceFile.endsWith(
"p4include/core.p4"))
continue;
77 builder->emitIndent();
78 builder->appendFormat(
"static const ParserError_t %s = %d", decl->name.name,
id);
79 builder->endOfStatement(
true);
83 ::error(ErrorType::ERR_OVERLIMIT,
"%1%: Reached maximum number of possible errors",
130 void compileExtractField(
const IR::Expression *expr,
const IR::StructField *field,
132 void compileLookahead(
const IR::Expression *destination)
override;
141 void emitDeclaration(
EBPF::CodeBuilder *builder,
const IR::Declaration *decl)
override;
150 const IR::P4Action *action,
151 bool isDefaultAction)
const;
153 void initDirectCounters();
160 initDirectCounters();
169 bool isMatchTypeSupported(
const IR::Declaration_ID *matchType)
override {
170 if (matchType->name.name ==
"range" || matchType->name.name ==
"rangelist" ||
171 matchType->name.name ==
"optional")
173 return EBPF::EBPFTable::isMatchTypeSupported(matchType);
176 cstring actionRunVariable)
override;
178 cstring p4ActionToActionIDName(
const IR::P4Action *action)
const;
186 const IR::Parameter *parserHeaders,
const IR::Parameter *istd)
189 bool build()
override;
192 void emitDeclaration(
EBPF::CodeBuilder *builder,
const IR::Declaration *decl)
override;
209 : options(options), typemap(typemap), refmap(refmap), ebpf_program(
nullptr), tcIR(tcIR) {}
212 const IR::Node *preorder(IR::ToplevelBlock *p)
override;
220 const EBPF::pipeline_type type;
222 const IR::ParserBlock *parserBlock;
223 const IR::ControlBlock *controlBlock;
224 const IR::ControlBlock *deparserBlock;
232 const IR::ParserBlock *parserBlock,
233 const IR::ControlBlock *controlBlock,
239 parserBlock(parserBlock),
240 controlBlock(controlBlock),
241 deparserBlock(deparserBlock),
247 bool preorder(
const IR::PackageBlock *block)
override;
260 : program(program), typemap(typemap), parser(
nullptr) {}
262 bool preorder(
const IR::ParserBlock *prsr)
override;
263 bool preorder(
const IR::P4ValueSet *pvs)
override;
269 bool addExternDeclaration =
false;
270 std::map<cstring, EBPFRegisterPNA *> pna_registers;
273 const IR::Parameter *parserHeaders)
277 auto result = ::get(pna_registers, name);
278 BUG_CHECK(result !=
nullptr,
"No register named %1%", name);
282 if (addExternDeclaration) {
283 builder->emitIndent();
284 builder->appendLine(
"struct p4tc_ext_bpf_params ext_params = {};");
285 builder->emitIndent();
286 builder->appendLine(
"struct p4tc_ext_bpf_val ext_val = {};");
287 builder->emitIndent();
288 builder->appendLine(
"struct p4tc_ext_bpf_val *ext_val_ptr;");
297 EBPF::pipeline_type type;
300 const IR::Parameter *parserHeaders;
312 parserHeaders(parserHeaders),
316 bool preorder(
const IR::TableBlock *)
override;
317 bool preorder(
const IR::ControlBlock *)
override;
318 bool preorder(
const IR::Declaration_Variable *)
override;
319 bool preorder(
const IR::Member *m)
override;
320 bool preorder(
const IR::IfStatement *a)
override;
321 bool preorder(
const IR::ExternBlock *instance)
override;
322 bool checkPnaTimestampMem(
const IR::Member *m);
330 const IR::Parameter *parserHeaders;
331 const IR::Parameter *istd;
336 const IR::Parameter *istd)
337 : program(program), parserHeaders(parserHeaders), istd(istd), deparser(
nullptr) {}
339 bool preorder(
const IR::ControlBlock *)
override;
340 bool preorder(
const IR::Declaration_Instance *)
override;
357 bool checkPnaPortMem(
const IR::Member *m);
358 virtual cstring getParamName(
const IR::PathExpression *);
359 bool preorder(
const IR::AssignmentStatement *a)
override;
361 bool preorder(
const IR::Member *)
override;
362 bool IsTableAddOnMiss(
const IR::P4Table *table);
363 const IR::P4Action *GetAddOnMissHitAction(
cstring actionName);
364 void ValidateAddOnMissMissAction(
const IR::P4Action *act);
373 bool isDefaultAction;
379 const IR::P4Action *act,
bool isDefaultAction);
380 bool preorder(
const IR::PathExpression *pe)
override;
381 bool isActionParameter(
const IR::Expression *expression)
const;
384 cstring getParamInstanceName(
const IR::Expression *expression)
const override;
385 cstring getParamName(
const IR::PathExpression *)
override;
414 initialValue =
"0"_cs;
417 polynomial =
"0xA001"_cs;
418 updateMethod =
"crc16_update"_cs;
419 finalizeMethod =
"crc16_finalize"_cs;
429 initialValue =
"0xffffffff"_cs;
432 polynomial =
"0xEDB88320"_cs;
433 updateMethod =
"crc32_update"_cs;
434 finalizeMethod =
"crc32_finalize"_cs;
448 CRC16ChecksumAlgorithmPNA::emitGlobals(builder);
449 CRC32ChecksumAlgorithmPNA::emitGlobals(builder);
Definition ebpfTable.h:26
Definition ebpfPsaHashAlgorithm.h:74
Definition ebpf/codeGen.h:33
Definition ebpf/codeGen.h:41
Definition ebpfControl.h:28
This translator emits buffer preparation (eg. which headers will be emitted)
Definition ebpfDeparser.h:38
Definition ebpfPsaControl.h:58
Definition ebpfDeparser.h:63
Definition ebpfPsaDeparser.h:39
Definition ebpfPsaHashAlgorithm.h:26
Definition ebpfPsaHashAlgorithm.h:172
Definition ebpfParser.h:79
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:24
Definition methodInstance.h:129
Definition methodInstance.h:181
Definition methodInstance.h:149
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Definition ebpfCodeGen.h:370
Definition ebpfCodeGen.h:410
Definition ebpfCodeGen.h:425
Definition ebpfCodeGen.h:402
Definition ebpfCodeGen.h:346
Definition tc/backend.h:49
Definition ebpfCodeGen.h:295
Definition ebpfCodeGen.h:328
Definition ebpfCodeGen.h:253
Definition ebpfCodeGen.h:199
Definition ebpfCodeGen.h:218
Definition ebpfCodeGen.h:390
Definition ebpfCodeGen.h:267
Definition ebpfCodeGen.h:440
Definition ebpfCodeGen.h:135
Definition tcExterns.h:53
Definition ebpfCodeGen.h:146
void validateKeys() const override
Definition ebpfCodeGen.cpp:2093
Definition ebpfCodeGen.h:183
void emitPreDeparser(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:1174
Definition ebpfCodeGen.h:94
void emitParser(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:216
void emit(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:170
Definition ebpfCodeGen.h:34
Definition ebpfCodeGen.h:61
Definition ebpfCodeGen.h:123
Definition ebpfCodeGen.h:109
void emitTrafficManager(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:485
void emitGlobalMetadataInitializer(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:444
void emitLocalVariables(EBPF::CodeBuilder *builder) override
Generates a set of helper variables that are used during packet processing.
Definition ebpfCodeGen.cpp:516
This file defines functions for the pass to generate the introspection file.
Definition tc/backend.cpp:24