14#ifndef BACKENDS_TC_TCEXTERNS_H_
15#define BACKENDS_TC_TCEXTERNS_H_
18#include "ebpfCodeGen.h"
22using namespace P4::literals;
28 const IR::Declaration_Instance *di;
32 EBPFCounterPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *di,
35 this->tblname = tblname;
38 EBPFCounterPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *di,
56 const IR::Type *keyArg;
57 const IR::Type *valueArg;
66 this->instanceName = di->toString();
67 if (!di->type->is<IR::Type_Specialized>()) {
68 ::P4::error(ErrorType::ERR_MODEL,
"Missing specialization: %1%", di);
71 auto ts = di->type->to<IR::Type_Specialized>();
73 if (ts->arguments->size() != PARAM_INDEX_2) {
74 ::P4::error(ErrorType::ERR_MODEL,
"Expected a type specialized with two arguments: %1%",
79 this->valueArg = ts->arguments->at(0);
80 this->keyArg = ts->arguments->at(1);
82 this->keyType = EBPF::EBPFTypeFactory::instance->create(keyArg);
83 this->valueType = EBPF::EBPFTypeFactory::instance->create(valueArg);
87 const IR::Expression *leftExpression);
99 bool preorder(
const IR::PathExpression *pe)
override {
100 auto decl = table->program->refMap->getDeclaration(pe->path,
true);
101 auto di = decl->to<IR::Declaration_Instance>();
103 if (EBPF::EBPFObject::getSpecializedTypeName(di) !=
"DirectCounter") {
105 "%1%: not a DirectCounter, see declaration of %2%", pe, decl);
108 auto counterName = EBPF::EBPFObject::externalName(di);
109 auto tblname = table->table->container->name.originalName;
110 auto ctr =
new EBPFCounterPNA(table->program, di, counterName, table->codeGen, tblname);
111 table->counters.emplace_back(std::make_pair(counterName, ctr));
115 void visitTableProperty() {
116 EBPF::EBPFTablePsaPropertyVisitor::visitTableProperty(
"pna_direct_counter"_cs);
125 void updateChecksum(
EBPF::CodeBuilder *builder,
const ArgumentsList &arguments,
bool addData);
134 void emitAddData(
EBPF::CodeBuilder *builder,
const ArgumentsList &arguments)
override;
137 void emitSubtractData(
EBPF::CodeBuilder *builder,
const ArgumentsList &arguments)
override;
141 const IR::MethodCallExpression *expr)
override;
142 cstring getConvertByteOrderFunction(
unsigned widthToEmit,
cstring byte_order);
150 EBPFChecksumPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
153 auto di = block->
to<IR::Declaration_Instance>();
154 if (di->arguments->size() != 1) {
155 ::P4::error(ErrorType::ERR_UNEXPECTED,
"Expected exactly 1 argument %1%", block);
158 int type = di->arguments->at(0)->expression->checkedTo<IR::Constant>()->asInt();
159 init(program, name, type);
162 EBPFChecksumPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
165 init(program, name, type);
169class EBPFInternetChecksumPNA :
public EBPFChecksumPNA {
171 EBPFInternetChecksumPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
173 : EBPFChecksumPNA(program, block, name,
174 EBPF::EBPFHashAlgorithmPSA::HashAlgorithm::ONES_COMPLEMENT16) {}
177 const IR::MethodCallExpression *expr,
Visitor *visitor)
override;
186 EBPFDigestPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *di,
190 this->externName = externName;
191 this->instanceName = di->toString();
Definition ebpf/codeGen.h:33
Definition ebpf/codeGen.h:41
Definition ebpfPsaChecksum.h:25
Definition ebpfPsaCounter.h:26
Definition ebpfPsaDigest.h:27
Definition ebpfPsaHashAlgorithm.h:26
Definition ebpfProgram.h:39
Also used to represent counters.
Definition ebpfTable.h:49
Definition ebpfPsaTable.h:29
Definition ebpfPsaTable.h:123
Base class for EBPF types.
Definition ebpfType.h:29
Definition methodInstance.h:149
Definition ebpfCodeGen.h:358
Definition tc/backend.h:49
Definition tcExterns.h:27
void emitVariables(EBPF::CodeBuilder *builder, const IR::Declaration_Instance *decl) override
decl might be a null pointer
Definition tcExterns.cpp:215
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 error.h:51
T * to() noexcept
Definition rtti.h:226