P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfTable.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef BACKENDS_EBPF_EBPFTABLE_H_
9#define BACKENDS_EBPF_EBPFTABLE_H_
10
11#include "ebpfObject.h"
12#include "ebpfProgram.h"
13#include "frontends/p4/methodInstance.h"
14
15namespace P4::EBPF {
16
17class ActionTranslationVisitor : public virtual CodeGenInspector {
18 protected:
19 const EBPFProgram *program;
20 const IR::P4Action *action;
21 cstring valueName;
22
23 public:
24 ActionTranslationVisitor(cstring valueName, const EBPFProgram *program)
25 : CodeGenInspector(program->refMap, program->typeMap),
26 program(program),
27 action(nullptr),
28 valueName(valueName) {
29 CHECK_NULL(program);
30 }
31
32 bool preorder(const IR::PathExpression *expression);
33
34 bool preorder(const IR::P4Action *act);
35 virtual cstring getParamInstanceName(const IR::Expression *expression) const;
36 bool isActionParameter(const IR::PathExpression *expression) const;
37}; // ActionTranslationVisitor
38
40class EBPFTableBase : public EBPFObject {
41 public:
42 const EBPFProgram *program;
43
44 cstring instanceName;
45 cstring keyTypeName;
46 cstring valueTypeName;
47 cstring dataMapName;
48 CodeGenInspector *codeGen;
49
50 protected:
51 EBPFTableBase(const EBPFProgram *program, cstring instanceName, CodeGenInspector *codeGen)
52 : program(program), instanceName(instanceName), codeGen(codeGen) {
53 CHECK_NULL(codeGen);
54 CHECK_NULL(program);
55 keyTypeName = instanceName + "_key";
56 valueTypeName = instanceName + "_value";
57 dataMapName = instanceName;
58 }
59
60 DECLARE_TYPEINFO(EBPFTableBase, EBPFObject);
61};
62
63class EBPFTable : public EBPFTableBase {
64 const int prefixLenFieldWidth = 32;
65
66 void initKey();
67
68 public:
69 bool isLPMTable() const;
70 bool isTernaryTable() const;
71
72 protected:
73 void emitTernaryInstance(CodeBuilder *builder);
74
75 virtual void validateKeys() const;
76 virtual ActionTranslationVisitor *createActionTranslationVisitor(
77 cstring valueName, const EBPFProgram *program) const {
78 return new ActionTranslationVisitor(valueName, program);
79 }
80
81 public:
82 const IR::Key *keyGenerator;
83 const IR::ActionList *actionList;
84 const IR::TableBlock *table;
85 cstring defaultActionMapName;
86 std::map<const IR::KeyElement *, cstring> keyFieldNames;
87 std::map<const IR::KeyElement *, EBPFType *> keyTypes;
90 size_t size = 1024;
91 const cstring prefixFieldName = "prefixlen"_cs;
92
93 EBPFTable(const EBPFProgram *program, const IR::TableBlock *table, CodeGenInspector *codeGen);
94 EBPFTable(const EBPFProgram *program, CodeGenInspector *codeGen, cstring name);
95
96 cstring p4ActionToActionIDName(const IR::P4Action *action) const;
97 void emitActionArguments(CodeBuilder *builder, const IR::P4Action *action, cstring name);
98 void emitKey(CodeBuilder *builder, cstring keyName);
99
100 virtual void emitTypes(CodeBuilder *builder);
101 virtual void emitInstance(CodeBuilder *builder);
102 virtual void emitKeyType(CodeBuilder *builder);
103 virtual void emitValueType(CodeBuilder *builder);
104 virtual void emitValueActionIDNames(CodeBuilder *builder);
105 virtual void emitValueStructStructure(CodeBuilder *builder);
107 virtual void emitDirectValueTypes(CodeBuilder *builder) { (void)builder; }
108 virtual void emitAction(CodeBuilder *builder, cstring valueName, cstring actionRunVariable);
109 virtual void emitInitializer(CodeBuilder *builder);
110 virtual void emitLookup(CodeBuilder *builder, cstring key, cstring value);
111 virtual void emitLookupDefault(CodeBuilder *builder, cstring key, cstring value,
112 cstring actionRunVariable) {
113 (void)actionRunVariable;
114 builder->target->emitTableLookup(builder, defaultActionMapName, key, value);
115 builder->endOfStatement(true);
116 }
117 virtual bool isMatchTypeSupported(const IR::Declaration_ID *matchType) {
118 return matchType->name.name == P4::P4CoreLibrary::instance().exactMatch.name ||
119 matchType->name.name == P4::P4CoreLibrary::instance().ternaryMatch.name ||
120 matchType->name.name == P4::P4CoreLibrary::instance().lpmMatch.name;
121 }
124 virtual bool dropOnNoMatchingEntryFound() const { return true; }
125
126 virtual bool cacheEnabled() { return false; }
127 virtual void emitCacheLookup(CodeBuilder *builder, cstring key, cstring value) {
128 (void)builder;
129 (void)key;
130 (void)value;
131 }
132 virtual void emitCacheUpdate(CodeBuilder *builder, cstring key, cstring value) {
133 (void)builder;
134 (void)key;
135 (void)value;
136 }
137
138 DECLARE_TYPEINFO(EBPFTable, EBPFTableBase);
139};
140
141class EBPFCounterTable : public EBPFTableBase {
142 protected:
143 size_t size;
144 bool isHash;
145
146 public:
147 EBPFCounterTable(const EBPFProgram *program, const IR::ExternBlock *block, cstring name,
148 CodeGenInspector *codeGen);
149 EBPFCounterTable(const EBPFProgram *program, cstring name, CodeGenInspector *codeGen,
150 size_t size, bool isHash)
151 : EBPFTableBase(program, name, codeGen), size(size), isHash(isHash) {}
152 virtual void emitTypes(CodeBuilder *);
153 virtual void emitInstance(CodeBuilder *builder);
154 virtual void emitCounterIncrement(CodeBuilder *builder,
155 const IR::MethodCallExpression *expression);
156 virtual void emitCounterAdd(CodeBuilder *builder, const IR::MethodCallExpression *expression);
157 virtual void emitMethodInvocation(CodeBuilder *builder, const P4::ExternMethod *method);
158
159 DECLARE_TYPEINFO(EBPFCounterTable, EBPFTableBase);
160};
161
162class EBPFValueSet : public EBPFTableBase {
163 protected:
164 size_t size;
165 const IR::P4ValueSet *pvs;
166 std::vector<std::pair<cstring, const IR::Type *>> fieldNames;
167 cstring keyVarName;
168
169 public:
170 EBPFValueSet(const EBPFProgram *program, const IR::P4ValueSet *p4vs, cstring instanceName,
171 CodeGenInspector *codeGen);
172
173 void emitTypes(CodeBuilder *builder);
174 void emitInstance(CodeBuilder *builder);
175 void emitKeyInitializer(CodeBuilder *builder, const IR::SelectExpression *expression,
176 cstring varName);
177 void emitLookup(CodeBuilder *builder);
178
179 DECLARE_TYPEINFO(EBPFValueSet, EBPFTableBase);
180};
181
182} // namespace P4::EBPF
183
184#endif /* BACKENDS_EBPF_EBPFTABLE_H_ */
Definition ebpfTable.h:17
Definition ebpf/codeGen.h:24
Definition ebpf/codeGen.h:32
CodeGenInspector(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
precedence of current IR::Operation
Definition ebpf/codeGen.h:48
Base class for EBPF objects.
Definition ebpfObject.h:22
Definition ebpfProgram.h:30
virtual bool dropOnNoMatchingEntryFound() const
Definition ebpfTable.h:124
virtual void emitDirectValueTypes(CodeBuilder *builder)
Emits value types used by direct externs.
Definition ebpfTable.h:107
size_t size
Definition ebpfTable.h:90
bool isLPMTable() const
Definition ebpfTable.cpp:856
virtual void validateKeys() const
Definition ebpfTable.cpp:100
Definition methodInstance.h:159
Definition cstring.h:76
Definition codeGen.cpp:14