7#ifndef BACKENDS_EBPF_PSA_EXTERNS_EBPFPSAHASHALGORITHM_H_
8#define BACKENDS_EBPF_PSA_EXTERNS_EBPFPSAHASHALGORITHM_H_
10#include "backends/ebpf/ebpfObject.h"
18 typedef std::vector<const IR::Expression *> ArgumentsList;
25 ArgumentsList unpackArguments(
const IR::MethodCallExpression *expr,
int dataPos);
40 : baseName(name), program(program), visitor(nullptr) {}
42 void setVisitor(
Visitor *instance) { this->visitor = instance; }
44 virtual unsigned getOutputWidth()
const {
return 0; }
50 virtual void emitAddData(
CodeBuilder *builder,
int dataPos,
51 const IR::MethodCallExpression *expr);
52 virtual void emitAddData(
CodeBuilder *builder,
const ArgumentsList &arguments) = 0;
55 virtual void emitSubtractData(
CodeBuilder *builder,
int dataPos,
56 const IR::MethodCallExpression *expr);
57 virtual void emitSubtractData(
CodeBuilder *builder,
const ArgumentsList &arguments) = 0;
59 virtual void emitGetInternalState(
CodeBuilder *builder) = 0;
60 virtual void emitSetInternalState(
CodeBuilder *builder,
61 const IR::MethodCallExpression *expr) = 0;
64class CRCChecksumAlgorithm :
public EBPFHashAlgorithmPSA {
75 : EBPFHashAlgorithmPSA(program, name), crcWidth(width) {}
77 unsigned getOutputWidth()
const override {
return crcWidth; }
79 static void emitUpdateMethod(
CodeBuilder *builder,
int crcWidth);
87 void emitSubtractData(
CodeBuilder *builder,
const ArgumentsList &arguments)
override;
89 void emitGetInternalState(
CodeBuilder *builder)
override;
90 void emitSetInternalState(
CodeBuilder *builder,
const IR::MethodCallExpression *expr)
override;
99class CRC16ChecksumAlgorithm :
public CRCChecksumAlgorithm {
102 : CRCChecksumAlgorithm(program, name, 16) {
103 initialValue =
"0"_cs;
106 polynomial =
"0xA001"_cs;
107 updateMethod =
"crc16_update"_cs;
108 finalizeMethod =
"crc16_finalize"_cs;
121class CRC32ChecksumAlgorithm :
public CRCChecksumAlgorithm {
124 : CRCChecksumAlgorithm(program, name, 32) {
125 initialValue =
"0xffffffff"_cs;
128 polynomial =
"0xEDB88320"_cs;
129 updateMethod =
"crc32_update"_cs;
130 finalizeMethod =
"crc32_finalize"_cs;
136class InternetChecksumAlgorithm :
public EBPFHashAlgorithmPSA {
140 void updateChecksum(
CodeBuilder *builder,
const ArgumentsList &arguments,
bool addData);
144 : EBPFHashAlgorithmPSA(program, name) {}
146 unsigned getOutputWidth()
const override {
return 16; }
153 void emitAddData(
CodeBuilder *builder,
const ArgumentsList &arguments)
override;
156 void emitSubtractData(
CodeBuilder *builder,
const ArgumentsList &arguments)
override;
158 void emitGetInternalState(
CodeBuilder *builder)
override;
159 void emitSetInternalState(
CodeBuilder *builder,
const IR::MethodCallExpression *expr)
override;
170 if (type == EBPFHashAlgorithmPSA::HashAlgorithm::CRC32)
172 else if (type == EBPFHashAlgorithmPSA::HashAlgorithm::CRC16)
174 else if (type == EBPFHashAlgorithmPSA::HashAlgorithm::ONES_COMPLEMENT16 ||
175 type == EBPFHashAlgorithmPSA::HashAlgorithm::TARGET_DEFAULT)
182 CRC16ChecksumAlgorithm::emitGlobals(builder);
183 CRC32ChecksumAlgorithm::emitGlobals(builder);
184 InternetChecksumAlgorithm::emitGlobals(builder);
Definition ebpfPsaHashAlgorithm.h:99
Definition ebpfPsaHashAlgorithm.h:121
void emitAddData(CodeBuilder *builder, const ArgumentsList &arguments) override
Definition ebpfPsaHashAlgorithm.cpp:219
void emitVariables(CodeBuilder *builder, const IR::Declaration_Instance *decl) override
decl might be a null pointer
Definition ebpfPsaHashAlgorithm.cpp:164
Definition ebpf/codeGen.h:33
Definition ebpfPsaHashAlgorithm.h:16
virtual void emitVariables(CodeBuilder *builder, const IR::Declaration_Instance *decl)=0
decl might be a null pointer
HashAlgorithm
Keep this enum in sync with psa.p4 file.
Definition ebpfPsaHashAlgorithm.h:29
Definition ebpfPsaHashAlgorithm.h:162
Base class for EBPF objects.
Definition ebpfObject.h:31
Definition ebpfProgram.h:30
Definition ebpfPsaHashAlgorithm.h:136
void emitVariables(CodeBuilder *builder, const IR::Declaration_Instance *decl) override
decl might be a null pointer
Definition ebpfPsaHashAlgorithm.cpp:474
Definition codeGen.cpp:25