P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfPsaTableImplementation.h
1/*
2 * SPDX-FileCopyrightText: 2022 Open Networking Foundation
3 * SPDX-FileCopyrightText: 2022 Orange
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef BACKENDS_EBPF_PSA_EXTERNS_EBPFPSATABLEIMPLEMENTATION_H_
9#define BACKENDS_EBPF_PSA_EXTERNS_EBPFPSATABLEIMPLEMENTATION_H_
10
11#include "backends/ebpf/ebpfTable.h"
12#include "backends/ebpf/psa/ebpfPsaTable.h"
13#include "backends/ebpf/psa/externs/ebpfPsaHashAlgorithm.h"
14
15namespace P4::EBPF {
16
18class EBPFTableImplementationPSA : public EBPFTablePSA {
19 public:
20 EBPFTableImplementationPSA(const EBPFProgram *program, CodeGenInspector *codeGen,
21 const IR::Declaration_Instance *decl);
22
23 void emitTypes(CodeBuilder *builder) override;
24 void emitInitializer(CodeBuilder *builder) override;
25 virtual void emitReferenceEntry(CodeBuilder *builder);
26
27 virtual void registerTable(const EBPFTablePSA *instance);
28
29 virtual void applyImplementation(CodeBuilder *builder, cstring tableValueName,
30 cstring actionRunVariable) = 0;
31
32 protected:
33 const IR::Declaration_Instance *declaration;
34 cstring referenceName;
35
36 void verifyTableActionList(const EBPFTablePSA *instance);
37 void verifyTableNoDefaultAction(const EBPFTablePSA *instance);
38 void verifyTableNoDirectObjects(const EBPFTablePSA *instance);
39 void verifyTableNoEntries(const EBPFTablePSA *instance);
40
41 unsigned getUintFromExpression(const IR::Expression *expr, unsigned defaultValue);
42
43 DECLARE_TYPEINFO(EBPFTableImplementationPSA, EBPFTablePSA);
44};
45
46class EBPFActionProfilePSA : public EBPFTableImplementationPSA {
47 public:
48 EBPFActionProfilePSA(const EBPFProgram *program, CodeGenInspector *codeGen,
49 const IR::Declaration_Instance *decl);
50
51 void emitInstance(CodeBuilder *builder) override;
52 void applyImplementation(CodeBuilder *builder, cstring tableValueName,
53 cstring actionRunVariable) override;
54
55 DECLARE_TYPEINFO(EBPFActionProfilePSA, EBPFTableImplementationPSA);
56};
57
58class EBPFActionSelectorPSA : public EBPFTableImplementationPSA {
59 public:
60 EBPFActionSelectorPSA(const EBPFProgram *program, CodeGenInspector *codeGen,
61 const IR::Declaration_Instance *decl);
62
63 void emitInitializer(CodeBuilder *builder) override;
64 void emitInstance(CodeBuilder *builder) override;
65 void emitReferenceEntry(CodeBuilder *builder) override;
66
67 void applyImplementation(CodeBuilder *builder, cstring tableValueName,
68 cstring actionRunVariable) override;
69
70 void registerTable(const EBPFTablePSA *instance) override;
71
72 void emitCacheTypes(CodeBuilder *builder) override;
73 void emitCacheVariables(CodeBuilder *builder);
74 void emitCacheLookup(CodeBuilder *builder, cstring key, cstring value) override;
75 void emitCacheUpdate(CodeBuilder *builder, cstring key, cstring value) override;
76
77 protected:
78 typedef std::vector<const IR::KeyElement *> SelectorsListType;
79
80 const IR::Property *emptyGroupAction;
81 EBPFHashAlgorithmPSA *hashEngine;
82 SelectorsListType selectors;
83 cstring actionsMapName;
84 cstring groupsMapName;
85 cstring emptyGroupActionMapName;
86 size_t groupsMapSize;
87 cstring outputHashMask;
88 cstring isGroupEntryName;
89 cstring groupStateVarName;
90 cstring cacheKeyVar;
91 cstring cacheDoUpdateVar;
92
93 EBPFHashAlgorithmPSA::ArgumentsList unpackSelectors();
94 SelectorsListType getSelectorsFromTable(const EBPFTablePSA *instance);
95
96 void verifyTableSelectorKeySet(const EBPFTablePSA *instance);
97 void verifyTableEmptyGroupAction(const EBPFTablePSA *instance);
98
99 DECLARE_TYPEINFO(EBPFActionSelectorPSA, EBPFTableImplementationPSA);
100};
101
102} // namespace P4::EBPF
103
104#endif // BACKENDS_EBPF_PSA_EXTERNS_EBPFPSATABLEIMPLEMENTATION_H_
Definition ebpf/codeGen.h:33
Definition ebpf/codeGen.h:41
Definition ebpfPsaHashAlgorithm.h:16
Definition ebpfProgram.h:30
Definition ebpfPsaTable.h:19
Definition cstring.h:85
Definition codeGen.cpp:25