7#ifndef BACKENDS_EBPF_PSA_EBPFPSAGEN_H_
8#define BACKENDS_EBPF_PSA_EBPFPSAGEN_H_
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"
19enum pipeline_type { TC_INGRESS, TC_EGRESS, XDP_INGRESS, XDP_EGRESS, TC_TRAFFIC_MANAGER };
21class EbpfCodeGenerator {
24 std::vector<EBPF::EBPFType *> ebpfTypes;
26 EbpfCodeGenerator(
const EbpfOptions &options, std::vector<EBPF::EBPFType *> &ebpfTypes)
27 : options(options), ebpfTypes(ebpfTypes) {}
30 virtual void emitPreamble(
CodeBuilder *builder)
const = 0;
37class PSAEbpfGenerator :
public EbpfCodeGenerator {
39 static constexpr unsigned MaxClones = 64;
40 static constexpr unsigned MaxCloneSessions = 1024;
45 PSAEbpfGenerator(
const EbpfOptions &options, std::vector<EBPFType *> &ebpfTypes,
47 : EbpfCodeGenerator(options, ebpfTypes), ingress(ingress), egress(egress) {}
53 void emitPreamble(
CodeBuilder *builder)
const override;
54 void emitCommonPreamble(
CodeBuilder *builder)
const override;
55 void emitInternalStructures(
CodeBuilder *pBuilder)
const override;
57 void emitGlobalHeadersMetadata(
CodeBuilder *builder)
const override;
58 void emitPacketReplicationTables(
CodeBuilder *builder)
const;
59 void emitPipelineInstances(
CodeBuilder *builder)
const override;
61 virtual void emitInitializerSection(
CodeBuilder *builder)
const = 0;
62 void emitHelperFunctions(
CodeBuilder *builder)
const;
66 void emitCRC32LookupTableInitializer(
CodeBuilder *builder)
const;
67 void emitCRC32LookupTableInstance(
CodeBuilder *builder)
const;
70class PSAArchTC :
public PSAEbpfGenerator {
76 : PSAEbpfGenerator(options, ebpfTypes, tcIngress, tcEgress), xdp(xdp) {}
80 void emitInstances(
CodeBuilder *builder)
const override;
81 void emitInitializerSection(
CodeBuilder *builder)
const override;
84class PSAArchXDP :
public PSAEbpfGenerator {
90 static constexpr unsigned egressDevmapSize = 256;
92 PSAArchXDP(
const EbpfOptions &options, std::vector<EBPFType *> &ebpfTypes,
95 : PSAEbpfGenerator(options, ebpfTypes, xdpIngress, xdpEgress),
101 void emitPreamble(
CodeBuilder *builder)
const override;
102 void emitInstances(
CodeBuilder *builder)
const override;
103 void emitInitializerSection(
CodeBuilder *builder)
const override;
105 void emitXDP2TCInternalStructures(
CodeBuilder *builder)
const;
109class ConvertToEbpfPSA :
public Transform {
117 : options(options), typemap(typemap), refmap(refmap), ebpf_psa_arch(
nullptr) {}
120 const IR::Node *preorder(IR::ToplevelBlock *p)
override;
125class ConvertToEbpfPipeline :
public Inspector {
127 const pipeline_type type;
129 const IR::ParserBlock *parserBlock;
130 const IR::ControlBlock *controlBlock;
131 const IR::ControlBlock *deparserBlock;
138 const IR::ParserBlock *parserBlock,
const IR::ControlBlock *controlBlock,
144 parserBlock(parserBlock),
145 controlBlock(controlBlock),
146 deparserBlock(deparserBlock),
151 bool preorder(
const IR::PackageBlock *block)
override;
155class ConvertToEBPFParserPSA :
public Inspector {
164 : program(program), type(type), typemap(typemap), parser(
nullptr) {}
166 bool preorder(
const IR::ParserBlock *prsr)
override;
167 bool preorder(
const IR::P4ValueSet *pvs)
override;
171class ConvertToEBPFControlPSA :
public Inspector {
176 const IR::Parameter *parserHeaders;
180 ConvertToEBPFControlPSA(
EBPF::EBPFProgram *program,
const IR::Parameter *parserHeaders,
185 parserHeaders(parserHeaders),
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;
198class ConvertToEBPFDeparserPSA :
public Inspector {
200 pipeline_type pipelineType;
202 const IR::Parameter *parserHeaders;
203 const IR::Parameter *istd;
207 ConvertToEBPFDeparserPSA(
EBPFProgram *program,
const IR::Parameter *parserHeaders,
208 const IR::Parameter *istd, pipeline_type type)
211 parserHeaders(parserHeaders),
215 bool preorder(
const IR::ControlBlock *)
override;
216 bool preorder(
const IR::Declaration_Instance *)
override;
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
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition codeGen.cpp:25