P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfPsaHashAlgorithm.h
1/*
2 * SPDX-FileCopyrightText: 2022 Open Networking Foundation
3 * SPDX-FileCopyrightText: 2022 Orange
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7#ifndef BACKENDS_EBPF_PSA_EXTERNS_EBPFPSAHASHALGORITHM_H_
8#define BACKENDS_EBPF_PSA_EXTERNS_EBPFPSAHASHALGORITHM_H_
9
10#include "backends/ebpf/ebpfObject.h"
11
12namespace P4::EBPF {
13
14class EBPFProgram;
15
16class EBPFHashAlgorithmPSA : public EBPFObject {
17 public:
18 typedef std::vector<const IR::Expression *> ArgumentsList;
19
20 protected:
21 cstring baseName;
22 const EBPFProgram *program;
23 Visitor *visitor;
24
25 ArgumentsList unpackArguments(const IR::MethodCallExpression *expr, int dataPos);
26
27 public:
30 IDENTITY,
31 CRC32,
32 CRC32_CUSTOM,
33 CRC16,
34 CRC16_CUSTOM,
35 ONES_COMPLEMENT16, // aka InternetChecksum
36 TARGET_DEFAULT
37 };
38
39 EBPFHashAlgorithmPSA(const EBPFProgram *program, cstring name)
40 : baseName(name), program(program), visitor(nullptr) {}
41
42 void setVisitor(Visitor *instance) { this->visitor = instance; }
43
44 virtual unsigned getOutputWidth() const { return 0; }
45
47 virtual void emitVariables(CodeBuilder *builder, const IR::Declaration_Instance *decl) = 0;
48
49 virtual void emitClear(CodeBuilder *builder) = 0;
50 virtual void emitAddData(CodeBuilder *builder, int dataPos,
51 const IR::MethodCallExpression *expr);
52 virtual void emitAddData(CodeBuilder *builder, const ArgumentsList &arguments) = 0;
53 virtual void emitGet(CodeBuilder *builder) = 0;
54
55 virtual void emitSubtractData(CodeBuilder *builder, int dataPos,
56 const IR::MethodCallExpression *expr);
57 virtual void emitSubtractData(CodeBuilder *builder, const ArgumentsList &arguments) = 0;
58
59 virtual void emitGetInternalState(CodeBuilder *builder) = 0;
60 virtual void emitSetInternalState(CodeBuilder *builder,
61 const IR::MethodCallExpression *expr) = 0;
62};
63
64class CRCChecksumAlgorithm : public EBPFHashAlgorithmPSA {
65 protected:
66 cstring registerVar;
67 cstring initialValue;
68 cstring updateMethod;
69 cstring finalizeMethod;
70 cstring polynomial;
71 const int crcWidth;
72
73 public:
74 CRCChecksumAlgorithm(const EBPFProgram *program, cstring name, int width)
75 : EBPFHashAlgorithmPSA(program, name), crcWidth(width) {}
76
77 unsigned getOutputWidth() const override { return crcWidth; }
78
79 static void emitUpdateMethod(CodeBuilder *builder, int crcWidth);
80
81 void emitVariables(CodeBuilder *builder, const IR::Declaration_Instance *decl) override;
82
83 void emitClear(CodeBuilder *builder) override;
84 void emitAddData(CodeBuilder *builder, const ArgumentsList &arguments) override;
85 void emitGet(CodeBuilder *builder) override;
86
87 void emitSubtractData(CodeBuilder *builder, const ArgumentsList &arguments) override;
88
89 void emitGetInternalState(CodeBuilder *builder) override;
90 void emitSetInternalState(CodeBuilder *builder, const IR::MethodCallExpression *expr) override;
91};
92
99class CRC16ChecksumAlgorithm : public CRCChecksumAlgorithm {
100 public:
101 CRC16ChecksumAlgorithm(const EBPFProgram *program, cstring name)
102 : CRCChecksumAlgorithm(program, name, 16) {
103 initialValue = "0"_cs;
104 // We use a 0x8005 polynomial.
105 // 0xA001 comes from 0x8005 value bits reflection.
106 polynomial = "0xA001"_cs;
107 updateMethod = "crc16_update"_cs;
108 finalizeMethod = "crc16_finalize"_cs;
109 }
110
111 static void emitGlobals(CodeBuilder *builder);
112};
113
121class CRC32ChecksumAlgorithm : public CRCChecksumAlgorithm {
122 public:
123 CRC32ChecksumAlgorithm(const EBPFProgram *program, cstring name)
124 : CRCChecksumAlgorithm(program, name, 32) {
125 initialValue = "0xffffffff"_cs;
126 // We use a 0x04C11DB7 polynomial.
127 // 0xEDB88320 comes from 0x04C11DB7 value bits reflection.
128 polynomial = "0xEDB88320"_cs;
129 updateMethod = "crc32_update"_cs;
130 finalizeMethod = "crc32_finalize"_cs;
131 }
132
133 static void emitGlobals(CodeBuilder *builder);
134};
135
136class InternetChecksumAlgorithm : public EBPFHashAlgorithmPSA {
137 protected:
138 cstring stateVar;
139
140 void updateChecksum(CodeBuilder *builder, const ArgumentsList &arguments, bool addData);
141
142 public:
143 InternetChecksumAlgorithm(const EBPFProgram *program, cstring name)
144 : EBPFHashAlgorithmPSA(program, name) {}
145
146 unsigned getOutputWidth() const override { return 16; }
147
148 static void emitGlobals(CodeBuilder *builder);
149
150 void emitVariables(CodeBuilder *builder, const IR::Declaration_Instance *decl) override;
151
152 void emitClear(CodeBuilder *builder) override;
153 void emitAddData(CodeBuilder *builder, const ArgumentsList &arguments) override;
154 void emitGet(CodeBuilder *builder) override;
155
156 void emitSubtractData(CodeBuilder *builder, const ArgumentsList &arguments) override;
157
158 void emitGetInternalState(CodeBuilder *builder) override;
159 void emitSetInternalState(CodeBuilder *builder, const IR::MethodCallExpression *expr) override;
160};
161
163 public:
164 static EBPFHashAlgorithmTypeFactoryPSA *instance() {
165 static EBPFHashAlgorithmTypeFactoryPSA factory;
166 return &factory;
167 }
168
169 EBPFHashAlgorithmPSA *create(int type, const EBPFProgram *program, cstring name) {
170 if (type == EBPFHashAlgorithmPSA::HashAlgorithm::CRC32)
171 return new CRC32ChecksumAlgorithm(program, name);
172 else if (type == EBPFHashAlgorithmPSA::HashAlgorithm::CRC16)
173 return new CRC16ChecksumAlgorithm(program, name);
174 else if (type == EBPFHashAlgorithmPSA::HashAlgorithm::ONES_COMPLEMENT16 ||
175 type == EBPFHashAlgorithmPSA::HashAlgorithm::TARGET_DEFAULT)
176 return new InternetChecksumAlgorithm(program, name);
177
178 return nullptr;
179 }
180
181 void emitGlobals(CodeBuilder *builder) {
182 CRC16ChecksumAlgorithm::emitGlobals(builder);
183 CRC32ChecksumAlgorithm::emitGlobals(builder);
184 InternetChecksumAlgorithm::emitGlobals(builder);
185 }
186};
187
188} // namespace P4::EBPF
189
190#endif /* BACKENDS_EBPF_PSA_EXTERNS_EBPFPSAHASHALGORITHM_H_ */
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 visitor.h:75
Definition cstring.h:85
Definition codeGen.cpp:25