P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfCodeGen.h
1/*
2Copyright (C) 2023 Intel Corporation
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing,
11software distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions
14and limitations under the License.
15*/
16
17#ifndef BACKENDS_TC_EBPFCODEGEN_H_
18#define BACKENDS_TC_EBPFCODEGEN_H_
19
20#include "backend.h"
21#include "tcExterns.h"
22
23namespace P4::TC {
24
25using namespace P4::literals;
26
27// Similar to class PSAEbpfGenerator in backends/ebpf/psa/ebpfPsaGen.h
28
29class PNAEbpfGenerator : public EBPF::EbpfCodeGenerator, public ICastable {
30 public:
31 EBPF::EBPFPipeline *pipeline;
32 const ConvertToBackendIR *tcIR;
33
34 PNAEbpfGenerator(const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
35 EBPF::EBPFPipeline *pipeline, const ConvertToBackendIR *tcIR)
36 : EBPF::EbpfCodeGenerator(options, ebpfTypes), pipeline(pipeline), tcIR(tcIR) {}
37
38 virtual void emit(EBPF::CodeBuilder *builder) const = 0;
39 virtual void emitInstances(EBPF::CodeBuilder *builder) const = 0;
40 virtual void emitParser(EBPF::CodeBuilder *builder) const = 0;
41 virtual void emitHeader(EBPF::CodeBuilder *builder) const = 0;
42 void emitPNAIncludes(EBPF::CodeBuilder *builder) const;
43 void emitPreamble(EBPF::CodeBuilder *builder) const override;
44 void emitCommonPreamble(EBPF::CodeBuilder *builder) const override;
45 void emitInternalStructures(EBPF::CodeBuilder *pBuilder) const override;
46 void emitTypes(EBPF::CodeBuilder *builder) const override;
47 void emitGlobalHeadersMetadata(EBPF::CodeBuilder *builder) const override;
48 void emitPipelineInstances(EBPF::CodeBuilder *builder) const override;
49 void emitP4TCFilterFields(EBPF::CodeBuilder *builder) const;
50 void emitP4TCActionParam(EBPF::CodeBuilder *builder) const;
51 cstring getProgramName() const;
52
53 DECLARE_TYPEINFO(PNAEbpfGenerator);
54};
55
56// Similar to class PSAErrorCodesGen in backends/ebpf/psa/ebpfPsaGen.cpp
57
58class PNAErrorCodesGen : public Inspector {
59 EBPF::CodeBuilder *builder;
60
61 public:
62 explicit PNAErrorCodesGen(EBPF::CodeBuilder *builder) : builder(builder) {}
63
64 bool preorder(const IR::Type_Error *errors) override {
65 int id = -1;
66 for (auto decl : errors->members) {
67 ++id;
68 if (decl->srcInfo.isValid()) {
69 auto sourceFile = decl->srcInfo.getSourceFile();
70 // all the error codes are located in core.p4 file, they are defined in pna.h
71 if (sourceFile.endsWith("p4include/core.p4")) continue;
72 }
73
74 builder->emitIndent();
75 builder->appendFormat("static const ParserError_t %v = %d", decl->name, id);
76 builder->endOfStatement(true);
77
78 // type ParserError_t is u8, which can have values from 0 to 255
79 if (id > 255) {
80 ::P4::error(ErrorType::ERR_OVERLIMIT,
81 "%1%: Reached maximum number of possible errors", decl);
82 }
83 }
84 builder->newline();
85 return false;
86 }
87};
88
89// Similar to class PSAArchTC in backends/ebpf/psa/ebpfPsaGen.h
90
91class PNAArchTC : public PNAEbpfGenerator {
92 public:
94
95 PNAArchTC(const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes,
97 const ConvertToBackendIR *tcIR)
98 : PNAEbpfGenerator(options, ebpfTypes, pipeline, tcIR), xdp(xdp) {}
99
100 void emit(EBPF::CodeBuilder *builder) const override;
101 void emitParser(EBPF::CodeBuilder *builder) const override;
102 void emitHeader(EBPF::CodeBuilder *builder) const override;
103 virtual void emitHeaderIncludes(EBPF::CodeBuilder *builder) const;
104 virtual void emitHeaderDefs(EBPF::CodeBuilder *builder) const;
105 void emitInstances(EBPF::CodeBuilder *builder) const override;
106 void emitGlobalFunctions(EBPF::CodeBuilder *builder) const;
107
108 DECLARE_TYPEINFO(PNAArchTC);
109};
110
111class TCIngressPipelinePNA : public EBPF::TCIngressPipeline {
112 public:
113 TCIngressPipelinePNA(cstring name, const EbpfOptions &options, P4::ReferenceMap *refMap,
114 P4::TypeMap *typeMap)
115 : EBPF::TCIngressPipeline(name, options, refMap, typeMap) {}
116
117 void emit(EBPF::CodeBuilder *builder) override;
118 void emitLocalVariables(EBPF::CodeBuilder *builder) override;
119 void emitGlobalMetadataInitializer(EBPF::CodeBuilder *builder) override;
120 void emitTrafficManager(EBPF::CodeBuilder *builder) override;
121
122 DECLARE_TYPEINFO(TCIngressPipelinePNA, EBPF::TCIngressPipeline);
123};
124
125class PnaStateTranslationVisitor : public EBPF::PsaStateTranslationVisitor {
126 public:
127 explicit PnaStateTranslationVisitor(P4::ReferenceMap *refMap, P4::TypeMap *typeMap,
129 : EBPF::PsaStateTranslationVisitor(refMap, typeMap, prsr) {}
130
131 bool preorder(const IR::Member *expression) override;
132 mutable bool extractedVarbit = false;
133
134 protected:
135 unsigned int compileExtractVarbits(const IR::Expression *, const IR::StructField *,
136 unsigned int, EBPF::EBPFType *, const char *);
137 unsigned int compileExtractField(const IR::Expression *, const IR::StructField *, unsigned int,
138 EBPF::EBPFType *, const char *);
139 void compileLookahead(const IR::Expression *destination) override;
140 bool preorder(const IR::SelectCase *selectCase) override;
141 bool preorder(const IR::SelectExpression *expression) override;
142 bool preorder(const IR::AssignmentStatement *statement) override;
143 void processMethod(const P4::ExternMethod *method) override;
144 void compileExtract(const IR::Expression *dest, const IR::Expression *varsize = 0);
145 char *visit_to_string(const IR::Expression *);
146};
147
148class EBPFPnaParser : public EBPF::EBPFPsaParser {
149 public:
150 EBPFPnaParser(const EBPF::EBPFProgram *program, const IR::ParserBlock *block,
151 const P4::TypeMap *typeMap);
152 void emit(EBPF::CodeBuilder *builder) override;
153 void emitRejectState(EBPF::CodeBuilder *) override;
154 void emitDeclaration(EBPF::CodeBuilder *builder, const IR::Declaration *decl) override;
155
156 DECLARE_TYPEINFO(EBPFPnaParser, EBPF::EBPFPsaParser);
157};
158
159class EBPFTablePNA : public EBPF::EBPFTablePSA {
160 protected:
161 EBPF::ActionTranslationVisitor *createActionTranslationVisitor(cstring valueName,
162 const EBPF::EBPFProgram *program,
163 const IR::P4Action *action,
164 bool isDefaultAction) const;
165 void validateKeys() const override;
166 void initDirectCounters();
167 void initDirectMeters();
168 const ConvertToBackendIR *tcIR;
169
170 public:
171 EBPFTablePNA(const EBPF::EBPFProgram *program, const IR::TableBlock *table,
172 EBPF::CodeGenInspector *codeGen, const ConvertToBackendIR *tcIR)
173 : EBPF::EBPFTablePSA(program, table, codeGen), tcIR(tcIR) {
174 initDirectCounters();
175 initDirectMeters();
176 }
177 void emitInitializer(EBPF::CodeBuilder *builder) override;
178 void emitDefaultActionStruct(EBPF::CodeBuilder *builder);
179 void emitKeyType(EBPF::CodeBuilder *builder) override;
180 void emitValueType(EBPF::CodeBuilder *builder) override;
181 void emitValueStructStructure(EBPF::CodeBuilder *builder) override;
182 void emitActionArguments(EBPF::CodeBuilder *builder, const IR::P4Action *action, cstring name);
183 void emitKeyPNA(EBPF::CodeBuilder *builder, cstring keyName);
184 bool isMatchTypeSupported(const IR::Declaration_ID *matchType) override {
185 if (matchType->name.name == "range" || matchType->name.name == "rangelist" ||
186 matchType->name.name == "optional")
187 return 1;
188 return EBPF::EBPFTable::isMatchTypeSupported(matchType);
189 }
190 void emitAction(EBPF::CodeBuilder *builder, cstring valueName,
191 cstring actionRunVariable) override;
192 void emitValueActionIDNames(EBPF::CodeBuilder *builder) override;
193 cstring p4ActionToActionIDName(const IR::P4Action *action) const;
194
195 DECLARE_TYPEINFO(EBPFTablePNA, EBPF::EBPFTablePSA);
196};
197
199
200class DeparserBodyTranslatorPNA : public EBPF::DeparserBodyTranslatorPSA {
201 public:
202 explicit DeparserBodyTranslatorPNA(const IngressDeparserPNA *deparser);
203
204 void processFunction(const P4::ExternFunction *function) override;
205 bool preorder(const IR::AssignmentStatement *a) override;
206};
207
208class IngressDeparserPNA : public EBPF::EBPFDeparserPSA {
209 public:
210 mutable bool touched_skb_metadata;
211
212 IngressDeparserPNA(const EBPF::EBPFProgram *program, const IR::ControlBlock *control,
213 const IR::Parameter *parserHeaders, const IR::Parameter *istd)
214 : EBPF::EBPFDeparserPSA(program, control, parserHeaders, istd),
215 touched_skb_metadata(false) {
216 codeGen = new DeparserBodyTranslatorPNA(this);
217 }
218
219 bool addExternDeclaration = false;
220 bool build() override;
221 void emit(EBPF::CodeBuilder *builder) override;
222 void emitPreDeparser(EBPF::CodeBuilder *builder) override;
223 void emitDeclaration(EBPF::CodeBuilder *builder, const IR::Declaration *decl) override;
224
225 void emitExternDefinition(EBPF::CodeBuilder *builder) {
226 if (addExternDeclaration) {
227 builder->emitIndent();
228 builder->appendLine("struct p4tc_ext_bpf_params ext_params = {};");
229 }
230 }
231 DECLARE_TYPEINFO(IngressDeparserPNA, EBPF::EBPFDeparserPSA);
232};
233
234// Similar to class ConvertToEbpfPSA in backends/ebpf/psa/ebpfPsaGen.h
235
236class ConvertToEbpfPNA : public Transform {
237 const EbpfOptions &options;
238 P4::TypeMap *typemap;
239 P4::ReferenceMap *refmap;
240 const PNAEbpfGenerator *ebpf_program;
241 const ConvertToBackendIR *tcIR;
242
243 public:
244 ConvertToEbpfPNA(const EbpfOptions &options, P4::ReferenceMap *refmap, P4::TypeMap *typemap,
245 const ConvertToBackendIR *tcIR)
246 : options(options), typemap(typemap), refmap(refmap), ebpf_program(nullptr), tcIR(tcIR) {}
247
248 const PNAEbpfGenerator *build(const IR::ToplevelBlock *prog);
249 const IR::Node *preorder(IR::ToplevelBlock *p) override;
250 const PNAEbpfGenerator *getEBPFProgram() { return ebpf_program; }
251};
252
253// Similar to class ConvertToEbpfPipeline in backends/ebpf/psa/ebpfPsaGen.h
254
255class ConvertToEbpfPipelineTC : public Inspector {
256 const cstring name;
257 const EBPF::pipeline_type type;
258 const EbpfOptions &options;
259 const IR::ParserBlock *parserBlock;
260 const IR::ControlBlock *controlBlock;
261 const IR::ControlBlock *deparserBlock;
262 P4::TypeMap *typemap;
263 P4::ReferenceMap *refmap;
264 EBPF::EBPFPipeline *pipeline;
265 const ConvertToBackendIR *tcIR;
266 std::vector<EBPF::EBPFType *> ebpfTypes;
267
268 public:
269 ConvertToEbpfPipelineTC(cstring name, EBPF::pipeline_type type, const EbpfOptions &options,
270 const IR::ParserBlock *parserBlock,
271 const IR::ControlBlock *controlBlock,
272 const IR::ControlBlock *deparserBlock, P4::ReferenceMap *refmap,
273 P4::TypeMap *typemap, const ConvertToBackendIR *tcIR,
274 std::vector<EBPF::EBPFType *> ebpfTypes)
275 : name(name),
276 type(type),
277 options(options),
278 parserBlock(parserBlock),
279 controlBlock(controlBlock),
280 deparserBlock(deparserBlock),
281 typemap(typemap),
282 refmap(refmap),
283 pipeline(nullptr),
284 tcIR(tcIR),
285 ebpfTypes(ebpfTypes) {}
286
287 bool preorder(const IR::PackageBlock *block) override;
288 EBPF::EBPFPipeline *getEbpfPipeline() { return pipeline; }
289};
290
291// Similar to class ConvertToEBPFParserPSA in backends/ebpf/psa/ebpfPsaGen.h
292
293class ConvertToEBPFParserPNA : public Inspector {
294 EBPF::EBPFProgram *program;
295 P4::TypeMap *typemap;
296 TC::EBPFPnaParser *parser;
297
298 public:
299 ConvertToEBPFParserPNA(EBPF::EBPFProgram *program, P4::TypeMap *typemap)
300 : program(program), typemap(typemap), parser(nullptr) {}
301
302 bool preorder(const IR::ParserBlock *prsr) override;
303 bool preorder(const IR::P4ValueSet *pvs) override;
304 EBPF::EBPFParser *getEBPFParser() { return parser; }
305};
306
307class EBPFControlPNA : public EBPF::EBPFControlPSA {
308 public:
309 bool addExternDeclaration = false;
310 std::map<cstring, EBPFRegisterPNA *> pna_registers;
311 std::map<cstring, EBPFHashPNA *> pna_hashes;
312 std::map<cstring, EBPFRandomPNA *> pna_randoms;
313
314 mutable bool touched_skb_metadata;
315
316 EBPFControlPNA(const EBPF::EBPFProgram *program, const IR::ControlBlock *control,
317 const IR::Parameter *parserHeaders)
318 : EBPF::EBPFControlPSA(program, control, parserHeaders), touched_skb_metadata(false) {}
319
320 EBPFRegisterPNA *getRegister(cstring name) const {
321 auto result = ::P4::get(pna_registers, name);
322 BUG_CHECK(result != nullptr, "No register named %1%", name);
323 return result;
324 }
325 EBPFHashPNA *getHash(cstring name) const {
326 auto result = ::P4::get(pna_hashes, name);
327 return result;
328 }
329 EBPFRandomPNA *getRandom(cstring name) const {
330 auto result = ::P4::get(pna_randoms, name);
331 return result;
332 }
333 void emitExternDefinition(EBPF::CodeBuilder *builder) {
334 if (addExternDeclaration) {
335 builder->emitIndent();
336 builder->appendLine("struct p4tc_ext_bpf_params ext_params = {};");
337 builder->emitIndent();
338 builder->appendLine("struct p4tc_ext_bpf_val ext_val = {};");
339 builder->emitIndent();
340 builder->appendLine("struct p4tc_ext_bpf_val *ext_val_ptr;");
341 }
342 }
343 void emitTableTypes(EBPF::CodeBuilder *builder) { EBPF::EBPFControl::emitTableTypes(builder); }
344 void emit(EBPF::CodeBuilder *builder);
345};
346
347// Similar to class ConvertToEBPFControlPSA in backends/ebpf/psa/ebpfPsaGen.h
348
349class ConvertToEBPFControlPNA : public Inspector {
350 EBPF::EBPFProgram *program;
351 EBPF::pipeline_type type;
352 EBPFControlPNA *control;
353
354 const IR::Parameter *parserHeaders;
355 P4::ReferenceMap *refmap;
356
357 const ConvertToBackendIR *tcIR;
358
359 public:
360 ConvertToEBPFControlPNA(EBPF::EBPFProgram *program, const IR::Parameter *parserHeaders,
361 P4::ReferenceMap *refmap, EBPF::pipeline_type type,
362 const ConvertToBackendIR *tcIR)
363 : program(program),
364 type(type),
365 control(nullptr),
366 parserHeaders(parserHeaders),
367 refmap(refmap),
368 tcIR(tcIR) {}
369
370 bool preorder(const IR::TableBlock *) override;
371 bool preorder(const IR::ControlBlock *) override;
372 bool preorder(const IR::Declaration_Variable *) override;
373 bool preorder(const IR::Member *m) override;
374 bool preorder(const IR::IfStatement *a) override;
375 bool preorder(const IR::ExternBlock *instance) override;
376 bool checkPnaTimestampMem(const IR::Member *m);
377 EBPFControlPNA *getEBPFControl() { return control; }
378};
379
380// Similar to class ConvertToEBPFDeparserPSA in backends/ebpf/psa/ebpfPsaGen.h
381
382class ConvertToEBPFDeparserPNA : public Inspector {
383 EBPF::EBPFProgram *program;
384 const IR::Parameter *parserHeaders;
385 const IR::Parameter *istd;
386 const ConvertToBackendIR *tcIR;
387 std::vector<EBPF::EBPFType *> ebpfTypes;
388 TC::IngressDeparserPNA *deparser;
389
390 public:
391 ConvertToEBPFDeparserPNA(EBPF::EBPFProgram *program, const IR::Parameter *parserHeaders,
392 const IR::Parameter *istd, const ConvertToBackendIR *tcIR,
393 std::vector<EBPF::EBPFType *> ebpfTypes)
394 : program(program),
395 parserHeaders(parserHeaders),
396 istd(istd),
397 tcIR(tcIR),
398 ebpfTypes(ebpfTypes),
399 deparser(nullptr) {}
400
401 bool preorder(const IR::ControlBlock *) override;
402 bool preorder(const IR::Declaration_Instance *) override;
403 EBPF::EBPFDeparserPSA *getEBPFDeparser() { return deparser; }
404};
405
406// Similar to class ControlBodyTranslatorPSA in backends/ebpf/psa/ebpfPsaControl.h
407
408class ControlBodyTranslatorPNA : public EBPF::ControlBodyTranslator {
409 public:
410 const ConvertToBackendIR *tcIR;
411 const EBPF::EBPFTablePSA *table;
412 explicit ControlBodyTranslatorPNA(const EBPFControlPNA *control);
413 explicit ControlBodyTranslatorPNA(const EBPFControlPNA *control,
414 const ConvertToBackendIR *tcIR);
415 explicit ControlBodyTranslatorPNA(const EBPFControlPNA *control, const ConvertToBackendIR *tcIR,
416 const EBPF::EBPFTablePSA *table);
417 void processFunction(const P4::ExternFunction *function) override;
418 void processApply(const P4::ApplyMethod *method) override;
419 virtual cstring getParamName(const IR::PathExpression *);
420 bool preorder(const IR::AssignmentStatement *a) override;
421 void processMethod(const P4::ExternMethod *method) override;
422 bool preorder(const IR::Member *) override;
423 bool IsTableAddOnMiss(const IR::P4Table *table);
424 const IR::P4Action *GetAddOnMissHitAction(cstring actionName);
425 void ValidateAddOnMissMissAction(const IR::P4Action *act);
426 bool arithCommon(const IR::Operation_Binary *, const char *, const char *);
427 bool sarithCommon(const IR::Operation_Binary *, const char *);
428 bool preorder(const IR::Concat *) override;
429 bool preorder(const IR::Add *) override;
430 bool preorder(const IR::Sub *) override;
431 bool preorder(const IR::Mul *) override;
432 bool preorder(const IR::Cast *) override;
433 bool preorder(const IR::Neg *) override;
434 bool preorder(const IR::Cmpl *) override;
435 bool preorder(const IR::Shl *) override;
436 bool preorder(const IR::Shr *) override;
437 bool preorder(const IR::Equ *) override;
438 bool preorder(const IR::Neq *) override;
439 bool preorder(const IR::Lss *) override;
440 bool preorder(const IR::Leq *) override;
441 bool preorder(const IR::Grt *) override;
442 bool preorder(const IR::Geq *) override;
443 bool preorder(const IR::BAnd *) override;
444 bool preorder(const IR::BOr *) override;
445 bool preorder(const IR::BXor *) override;
446 bool preorder(const IR::AddSat *) override;
447 bool preorder(const IR::SubSat *) override;
448 bool preorder(const IR::Constant *) override;
449 bool bigXSmallMul(const IR::Expression *, const IR::Constant *);
450 void visitHostOrder(const IR::Expression *);
451};
452
453// Similar to class ActionTranslationVisitorPSA in backends/ebpf/psa/ebpfPsaControl.h
454
455class ActionTranslationVisitorPNA : public EBPF::ActionTranslationVisitor,
456 public ControlBodyTranslatorPNA {
457 protected:
458 const EBPF::EBPFTablePSA *table;
459 bool isDefaultAction;
460
461 public:
462 const ConvertToBackendIR *tcIR;
463 ActionTranslationVisitorPNA(const EBPF::EBPFProgram *program, cstring valueName,
464 const EBPF::EBPFTablePSA *table, const ConvertToBackendIR *tcIR,
465 const IR::P4Action *act, bool isDefaultAction);
466 bool preorder(const IR::PathExpression *pe) override;
467 bool isActionParameter(const IR::Expression *expression) const;
468 void processMethod(const P4::ExternMethod *method) override;
469
470 cstring getParamInstanceName(const IR::Expression *expression) const override;
471 cstring getParamName(const IR::PathExpression *) override;
472};
473
474// Similar to class DeparserHdrEmitTranslator in backends/ebpf/ebpfDeparser.h
475
476class DeparserHdrEmitTranslatorPNA : public EBPF::DeparserPrepareBufferTranslator {
477 protected:
478 const EBPF::EBPFDeparser *deparser;
479
480 public:
481 bool in_var = false;
482 mutable bool hasVarbit = false;
483 explicit DeparserHdrEmitTranslatorPNA(const EBPF::EBPFDeparser *deparser);
484
485 void processMethod(const P4::ExternMethod *method) override;
486 void emitField(EBPF::CodeBuilder *builder, cstring field, const IR::Expression *hdrExpr,
487 unsigned alignment, EBPF::EBPFType *type, bool isMAC);
488};
489
490class SizeScanner : public EBPF::DeparserPrepareBufferTranslator {
491 protected:
492 const EBPF::EBPFDeparser *deparser;
493
494 public:
495 explicit SizeScanner(const EBPF::EBPFDeparser *deparser);
496
497 void processMethod(const P4::ExternMethod *method) override;
498 bool preorder(const IR::MethodCallStatement *) override;
499};
500
502 public:
503 static EBPFHashAlgorithmTypeFactoryPNA *instance() {
504 static EBPFHashAlgorithmTypeFactoryPNA factory;
505 return &factory;
506 }
507
508 EBPF::EBPFHashAlgorithmPSA *create(int type, const EBPF::EBPFProgram *program, cstring name);
509};
510
512 public:
513 static EBPFChecksumAlgorithmTypeFactoryPNA *instance() {
515 return &factory;
516 }
517
518 EBPF::EBPFHashAlgorithmPSA *create(int type, const EBPF::EBPFProgram *program, cstring name);
519};
520
521} // namespace P4::TC
522
523#endif /* BACKENDS_TC_EBPFCODEGEN_H_ */
Definition methodInstance.h:129
Definition ebpfTable.h:26
Definition ebpf/codeGen.h:33
Definition ebpf/codeGen.h:41
Definition ebpfControl.h:28
Definition ebpfPsaDeparser.h:31
This translator emits buffer preparation (eg. which headers will be emitted)
Definition ebpfDeparser.h:38
Definition ebpfPsaControl.h:59
Definition ebpfDeparser.h:63
Definition ebpfPsaDeparser.h:39
Definition ebpfPsaHashAlgorithm.h:26
Definition ebpfPsaHashAlgorithm.h:172
Definition ebpfParser.h:81
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:26
Definition methodInstance.h:194
Definition methodInstance.h:168
Definition castable.h:36
Definition node.h:53
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition tc/backend.h:328
Definition ebpfCodeGen.h:200
Definition ebpfCodeGen.h:307
Definition ebpfCodeGen.h:501
Definition tcExterns.h:180
Definition ebpfCodeGen.h:148
Definition tcExterns.h:320
Definition tcExterns.h:52
void validateKeys() const override
Definition ebpfCodeGen.cpp:3071
Definition ebpfCodeGen.h:208
void emitPreDeparser(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:1807
void emit(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:180
void emitParser(EBPF::CodeBuilder *builder) const override
Definition ebpfCodeGen.cpp:278
Definition ebpfCodeGen.h:29
void emitLocalVariables(EBPF::CodeBuilder *builder) override
Generates a set of helper variables that are used during packet processing.
Definition ebpfCodeGen.cpp:609
void emitGlobalMetadataInitializer(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:536
void emitTrafficManager(EBPF::CodeBuilder *builder) override
Definition ebpfCodeGen.cpp:578
Definition typeMap.h:41
Definition cstring.h:85
This file defines functions for the pass to generate the introspection file.
Definition tc/backend.cpp:28
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:58