P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfPsaGen.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_EBPFPSAGEN_H_
8#define BACKENDS_EBPF_PSA_EBPFPSAGEN_H_
9
10#include "backends/ebpf/codeGen.h"
11#include "backends/ebpf/ebpfObject.h"
12#include "backends/ebpf/ebpfOptions.h"
13#include "ebpfPipeline.h"
14#include "ebpfPsaParser.h"
15#include "xdpHelpProgram.h"
16
17namespace P4::EBPF {
18
19enum pipeline_type { TC_INGRESS, TC_EGRESS, XDP_INGRESS, XDP_EGRESS, TC_TRAFFIC_MANAGER };
20
21class EbpfCodeGenerator {
22 public:
23 const EbpfOptions &options;
24 std::vector<EBPF::EBPFType *> ebpfTypes;
25
26 EbpfCodeGenerator(const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes)
27 : options(options), ebpfTypes(ebpfTypes) {}
28
29 virtual void emitCommonPreamble(EBPF::CodeBuilder *builder) const = 0;
30 virtual void emitPreamble(CodeBuilder *builder) const = 0;
31 virtual void emitInternalStructures(EBPF::CodeBuilder *pBuilder) const = 0;
32 virtual void emitTypes(EBPF::CodeBuilder *builder) const = 0;
33 virtual void emitGlobalHeadersMetadata(EBPF::CodeBuilder *builder) const = 0;
34 virtual void emitPipelineInstances(EBPF::CodeBuilder *builder) const = 0;
35};
36
37class PSAEbpfGenerator : public EbpfCodeGenerator {
38 public:
39 static constexpr unsigned MaxClones = 64;
40 static constexpr unsigned MaxCloneSessions = 1024;
41
42 EBPFPipeline *ingress;
43 EBPFPipeline *egress;
44
45 PSAEbpfGenerator(const EbpfOptions &options, std::vector<EBPFType *> &ebpfTypes,
46 EBPFPipeline *ingress, EBPFPipeline *egress)
47 : EbpfCodeGenerator(options, ebpfTypes), ingress(ingress), egress(egress) {}
48
49 virtual void emit(CodeBuilder *builder) const = 0;
50 virtual void emitInstances(EBPF::CodeBuilder *builder) const = 0;
51
52 void emitPSAIncludes(CodeBuilder *builder) const;
53 void emitPreamble(CodeBuilder *builder) const override;
54 void emitCommonPreamble(CodeBuilder *builder) const override;
55 void emitInternalStructures(CodeBuilder *pBuilder) const override;
56 void emitTypes(CodeBuilder *builder) const override;
57 void emitGlobalHeadersMetadata(CodeBuilder *builder) const override;
58 void emitPacketReplicationTables(CodeBuilder *builder) const;
59 void emitPipelineInstances(CodeBuilder *builder) const override;
60 void emitInitializer(CodeBuilder *builder) const;
61 virtual void emitInitializerSection(CodeBuilder *builder) const = 0;
62 void emitHelperFunctions(CodeBuilder *builder) const;
63
65 void emitCRC32LookupTableTypes(CodeBuilder *builder) const;
66 void emitCRC32LookupTableInitializer(CodeBuilder *builder) const;
67 void emitCRC32LookupTableInstance(CodeBuilder *builder) const;
68};
69
70class PSAArchTC : public PSAEbpfGenerator {
71 public:
72 XDPHelpProgram *xdp;
73
74 PSAArchTC(const EbpfOptions &options, std::vector<EBPFType *> &ebpfTypes, XDPHelpProgram *xdp,
75 EBPFPipeline *tcIngress, EBPFPipeline *tcEgress)
76 : PSAEbpfGenerator(options, ebpfTypes, tcIngress, tcEgress), xdp(xdp) {}
77
78 void emit(CodeBuilder *builder) const override;
79
80 void emitInstances(CodeBuilder *builder) const override;
81 void emitInitializerSection(CodeBuilder *builder) const override;
82};
83
84class PSAArchXDP : public PSAEbpfGenerator {
85 public:
90 static constexpr unsigned egressDevmapSize = 256;
91
92 PSAArchXDP(const EbpfOptions &options, std::vector<EBPFType *> &ebpfTypes,
93 EBPFPipeline *xdpIngress, EBPFPipeline *xdpEgress, EBPFPipeline *tcTrafficManager,
94 EBPFPipeline *tcEgress)
95 : PSAEbpfGenerator(options, ebpfTypes, xdpIngress, xdpEgress),
96 tcIngressForXDP(tcTrafficManager),
97 tcEgressForXDP(tcEgress) {}
98
99 void emit(CodeBuilder *builder) const override;
100
101 void emitPreamble(CodeBuilder *builder) const override;
102 void emitInstances(CodeBuilder *builder) const override;
103 void emitInitializerSection(CodeBuilder *builder) const override;
104
105 void emitXDP2TCInternalStructures(CodeBuilder *builder) const;
106 void emitDummyProgram(CodeBuilder *builder) const;
107};
108
109class ConvertToEbpfPSA : public Transform {
110 const EbpfOptions &options;
111 P4::TypeMap *typemap;
112 P4::ReferenceMap *refmap;
113 const PSAEbpfGenerator *ebpf_psa_arch;
114
115 public:
116 ConvertToEbpfPSA(const EbpfOptions &options, P4::ReferenceMap *refmap, P4::TypeMap *typemap)
117 : options(options), typemap(typemap), refmap(refmap), ebpf_psa_arch(nullptr) {}
118
119 const PSAEbpfGenerator *build(const IR::ToplevelBlock *prog);
120 const IR::Node *preorder(IR::ToplevelBlock *p) override;
121
122 const PSAEbpfGenerator *getPSAArchForEBPF() { return ebpf_psa_arch; }
123};
124
125class ConvertToEbpfPipeline : public Inspector {
126 const cstring name;
127 const pipeline_type type;
128 const EbpfOptions &options;
129 const IR::ParserBlock *parserBlock;
130 const IR::ControlBlock *controlBlock;
131 const IR::ControlBlock *deparserBlock;
132 P4::TypeMap *typemap;
133 P4::ReferenceMap *refmap;
134 EBPFPipeline *pipeline;
135
136 public:
137 ConvertToEbpfPipeline(cstring name, pipeline_type type, const EbpfOptions &options,
138 const IR::ParserBlock *parserBlock, const IR::ControlBlock *controlBlock,
139 const IR::ControlBlock *deparserBlock, P4::ReferenceMap *refmap,
140 P4::TypeMap *typemap)
141 : name(name),
142 type(type),
143 options(options),
144 parserBlock(parserBlock),
145 controlBlock(controlBlock),
146 deparserBlock(deparserBlock),
147 typemap(typemap),
148 refmap(refmap),
149 pipeline(nullptr) {}
150
151 bool preorder(const IR::PackageBlock *block) override;
152 EBPFPipeline *getEbpfPipeline() { return pipeline; }
153};
154
155class ConvertToEBPFParserPSA : public Inspector {
156 EBPF::EBPFProgram *program;
157 pipeline_type type;
158
159 P4::TypeMap *typemap;
160 EBPF::EBPFPsaParser *parser;
161
162 public:
163 ConvertToEBPFParserPSA(EBPF::EBPFProgram *program, P4::TypeMap *typemap, pipeline_type type)
164 : program(program), type(type), typemap(typemap), parser(nullptr) {}
165
166 bool preorder(const IR::ParserBlock *prsr) override;
167 bool preorder(const IR::P4ValueSet *pvs) override;
168 EBPF::EBPFParser *getEBPFParser() { return parser; }
169};
170
171class ConvertToEBPFControlPSA : public Inspector {
172 EBPF::EBPFProgram *program;
173 pipeline_type type;
174 EBPF::EBPFControlPSA *control;
175
176 const IR::Parameter *parserHeaders;
177 P4::ReferenceMap *refmap;
178
179 public:
180 ConvertToEBPFControlPSA(EBPF::EBPFProgram *program, const IR::Parameter *parserHeaders,
181 P4::ReferenceMap *refmap, pipeline_type type)
182 : program(program),
183 type(type),
184 control(nullptr),
185 parserHeaders(parserHeaders),
186 refmap(refmap) {}
187
188 bool preorder(const IR::TableBlock *) override;
189 bool preorder(const IR::ControlBlock *) override;
190 bool preorder(const IR::Declaration_Variable *) override;
191 bool preorder(const IR::Member *m) override;
192 bool preorder(const IR::IfStatement *a) override;
193 bool preorder(const IR::ExternBlock *instance) override;
194
195 EBPF::EBPFControlPSA *getEBPFControl() { return control; }
196};
197
198class ConvertToEBPFDeparserPSA : public Inspector {
199 EBPF::EBPFProgram *program;
200 pipeline_type pipelineType;
201
202 const IR::Parameter *parserHeaders;
203 const IR::Parameter *istd;
204 EBPF::EBPFDeparserPSA *deparser;
205
206 public:
207 ConvertToEBPFDeparserPSA(EBPFProgram *program, const IR::Parameter *parserHeaders,
208 const IR::Parameter *istd, pipeline_type type)
209 : program(program),
210 pipelineType(type),
211 parserHeaders(parserHeaders),
212 istd(istd),
213 deparser(nullptr) {}
214
215 bool preorder(const IR::ControlBlock *) override;
216 bool preorder(const IR::Declaration_Instance *) override;
217 EBPF::EBPFDeparserPSA *getEBPFDeparser() { return deparser; }
218};
219
220} // namespace P4::EBPF
221
222#endif /* BACKENDS_EBPF_PSA_EBPFPSAGEN_H_ */
Definition ebpf/codeGen.h:33
Definition ebpfPsaControl.h:49
Definition ebpfPsaDeparser.h:29
Definition ebpfParser.h:81
EBPFPipeline represents a single eBPF program in the TC/XDP hook.
Definition ebpfPipeline.h:18
Definition ebpfProgram.h:30
Definition ebpfPsaParser.h:30
EBPFPipeline * tcIngressForXDP
TC Ingress program used to support packet cloning in the XDP mode.
Definition ebpfPsaGen.h:87
EBPFPipeline * tcEgressForXDP
If the XDP mode is used, we need to have TC Egress pipeline to handle cloned packets.
Definition ebpfPsaGen.h:89
Definition ebpfPsaGen.h:37
void emitCRC32LookupTableTypes(CodeBuilder *builder) const
TODO: move them to the externs/ebpfPsaHashAlgorithm.cpp file.
Definition ebpfPsaGen.cpp:310
void emitTypes(CodeBuilder *builder) const override
Generate headers and structs in p4 prog.
Definition ebpfPsaGen.cpp:105
Definition xdpHelpProgram.h:14
Definition ebpfOptions.h:26
Definition node.h:53
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition typeMap.h:32
Definition cstring.h:85
Definition codeGen.cpp:25