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