P4C
The P4 Compiler
 
Loading...
Searching...
No Matches
ebpfPsaHashAlgorithm.h
1/*
2Copyright 2022-present Orange
3Copyright 2022-present Open Networking Foundation
4
5Licensed under the Apache License, Version 2.0 (the "License");
6you may not use this file except in compliance with the License.
7You may obtain a copy of the License at
8
9 http://www.apache.org/licenses/LICENSE-2.0
10
11Unless required by applicable law or agreed to in writing, software
12distributed under the License is distributed on an "AS IS" BASIS,
13WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14See the License for the specific language governing permissions and
15limitations under the License.
16*/
17#ifndef BACKENDS_EBPF_PSA_EXTERNS_EBPFPSAHASHALGORITHM_H_
18#define BACKENDS_EBPF_PSA_EXTERNS_EBPFPSAHASHALGORITHM_H_
19
20#include "backends/ebpf/ebpfObject.h"
21
22namespace EBPF {
23
24class EBPFProgram;
25
27 public:
28 typedef std::vector<const IR::Expression *> ArgumentsList;
29
30 protected:
31 cstring baseName;
32 const EBPFProgram *program;
33 Visitor *visitor;
34
35 ArgumentsList unpackArguments(const IR::MethodCallExpression *expr, int dataPos);
36
37 public:
38 // keep this enum in sync with psa.p4 file
39 enum HashAlgorithm {
40 IDENTITY,
41 CRC32,
42 CRC32_CUSTOM,
43 CRC16,
44 CRC16_CUSTOM,
45 ONES_COMPLEMENT16, // aka InternetChecksum
46 TARGET_DEFAULT
47 };
48
49 EBPFHashAlgorithmPSA(const EBPFProgram *program, cstring name)
50 : baseName(name), program(program), visitor(nullptr) {}
51
52 void setVisitor(Visitor *instance) { this->visitor = instance; }
53
54 virtual unsigned getOutputWidth() const { return 0; }
55
56 // decl might be a null pointer
57 virtual void emitVariables(CodeBuilder *builder, const IR::Declaration_Instance *decl) = 0;
58
59 virtual void emitClear(CodeBuilder *builder) = 0;
60 virtual void emitAddData(CodeBuilder *builder, int dataPos,
61 const IR::MethodCallExpression *expr);
62 virtual void emitAddData(CodeBuilder *builder, const ArgumentsList &arguments) = 0;
63 virtual void emitGet(CodeBuilder *builder) = 0;
64
65 virtual void emitSubtractData(CodeBuilder *builder, int dataPos,
66 const IR::MethodCallExpression *expr);
67 virtual void emitSubtractData(CodeBuilder *builder, const ArgumentsList &arguments) = 0;
68
69 virtual void emitGetInternalState(CodeBuilder *builder) = 0;
70 virtual void emitSetInternalState(CodeBuilder *builder,
71 const IR::MethodCallExpression *expr) = 0;
72};
73
75 protected:
76 cstring registerVar;
77 cstring initialValue;
78 cstring updateMethod;
79 cstring finalizeMethod;
80 cstring polynomial;
81 const int crcWidth;
82
83 public:
84 CRCChecksumAlgorithm(const EBPFProgram *program, cstring name, int width)
85 : EBPFHashAlgorithmPSA(program, name), crcWidth(width) {}
86
87 unsigned getOutputWidth() const override { return crcWidth; }
88
89 static void emitUpdateMethod(CodeBuilder *builder, int crcWidth);
90
91 void emitVariables(CodeBuilder *builder, const IR::Declaration_Instance *decl) override;
92
93 void emitClear(CodeBuilder *builder) override;
94 void emitAddData(CodeBuilder *builder, const ArgumentsList &arguments) override;
95 void emitGet(CodeBuilder *builder) override;
96
97 void emitSubtractData(CodeBuilder *builder, const ArgumentsList &arguments) override;
98
99 void emitGetInternalState(CodeBuilder *builder) override;
100 void emitSetInternalState(CodeBuilder *builder, const IR::MethodCallExpression *expr) override;
101};
102
112 public:
113 CRC16ChecksumAlgorithm(const EBPFProgram *program, cstring name)
114 : CRCChecksumAlgorithm(program, name, 16) {
115 initialValue = "0";
116 // We use a 0x8005 polynomial.
117 // 0xA001 comes from 0x8005 value bits reflection.
118 polynomial = "0xA001";
119 updateMethod = "crc16_update";
120 finalizeMethod = "crc16_finalize";
121 }
122
123 static void emitGlobals(CodeBuilder *builder);
124};
125
136 public:
137 CRC32ChecksumAlgorithm(const EBPFProgram *program, cstring name)
138 : CRCChecksumAlgorithm(program, name, 32) {
139 initialValue = "0xffffffff";
140 // We use a 0x04C11DB7 polynomial.
141 // 0xEDB88320 comes from 0x04C11DB7 value bits reflection.
142 polynomial = "0xEDB88320";
143 updateMethod = "crc32_update";
144 finalizeMethod = "crc32_finalize";
145 }
146
147 static void emitGlobals(CodeBuilder *builder);
148};
149
151 protected:
152 cstring stateVar;
153
154 void updateChecksum(CodeBuilder *builder, const ArgumentsList &arguments, bool addData);
155
156 public:
157 InternetChecksumAlgorithm(const EBPFProgram *program, cstring name)
158 : EBPFHashAlgorithmPSA(program, name) {}
159
160 unsigned getOutputWidth() const override { return 16; }
161
162 static void emitGlobals(CodeBuilder *builder);
163
164 void emitVariables(CodeBuilder *builder, const IR::Declaration_Instance *decl) override;
165
166 void emitClear(CodeBuilder *builder) override;
167 void emitAddData(CodeBuilder *builder, const ArgumentsList &arguments) override;
168 void emitGet(CodeBuilder *builder) override;
169
170 void emitSubtractData(CodeBuilder *builder, const ArgumentsList &arguments) override;
171
172 void emitGetInternalState(CodeBuilder *builder) override;
173 void emitSetInternalState(CodeBuilder *builder, const IR::MethodCallExpression *expr) override;
174};
175
177 public:
178 static EBPFHashAlgorithmTypeFactoryPSA *instance() {
179 static EBPFHashAlgorithmTypeFactoryPSA factory;
180 return &factory;
181 }
182
183 EBPFHashAlgorithmPSA *create(int type, const EBPFProgram *program, cstring name) {
184 if (type == EBPFHashAlgorithmPSA::HashAlgorithm::CRC32)
185 return new CRC32ChecksumAlgorithm(program, name);
186 else if (type == EBPFHashAlgorithmPSA::HashAlgorithm::CRC16)
187 return new CRC16ChecksumAlgorithm(program, name);
188 else if (type == EBPFHashAlgorithmPSA::HashAlgorithm::ONES_COMPLEMENT16 ||
189 type == EBPFHashAlgorithmPSA::HashAlgorithm::TARGET_DEFAULT)
190 return new InternetChecksumAlgorithm(program, name);
191
192 return nullptr;
193 }
194
195 void emitGlobals(CodeBuilder *builder) {
196 CRC16ChecksumAlgorithm::emitGlobals(builder);
197 CRC32ChecksumAlgorithm::emitGlobals(builder);
198 InternetChecksumAlgorithm::emitGlobals(builder);
199 }
200};
201
202} // namespace EBPF
203
204#endif /* BACKENDS_EBPF_PSA_EXTERNS_EBPFPSAHASHALGORITHM_H_ */
Definition ebpfPsaHashAlgorithm.h:111
Definition ebpfPsaHashAlgorithm.h:135
Definition ebpfPsaHashAlgorithm.h:74
Definition codeGen.h:33
Definition ebpfPsaHashAlgorithm.h:26
Definition ebpfPsaHashAlgorithm.h:176
Definition ebpfObject.h:31
Definition ebpfProgram.h:39
Definition ebpfPsaHashAlgorithm.h:150
Definition cstring.h:72