7#ifndef BACKENDS_EBPF_PSA_EBPFPIPELINE_H_
8#define BACKENDS_EBPF_PSA_EBPFPIPELINE_H_
10#include "backends/ebpf/ebpfProgram.h"
11#include "backends/ebpf/target.h"
12#include "ebpfPsaControl.h"
13#include "ebpfPsaDeparser.h"
48 :
EBPFProgram(options, nullptr, refMap, typeMap, nullptr),
54 functionName =
name.replace(
'-',
'_') +
"_func";
55 errorEnum =
"ParserError_t"_cs;
56 packetStartVar =
"pkt"_cs;
57 headerStartVar =
"hdr_start"_cs;
59 lengthVar =
"pkt_len"_cs;
60 endLabel =
"deparser"_cs;
67 oneKey = EBPFModel::reserved(
"one"_cs);
76 virtual cstring dropReturnCode() {
82 return "TC_ACT_SHOT"_cs;
84 virtual cstring forwardReturnCode() {
90 return "TC_ACT_OK"_cs;
93 virtual void emit(CodeBuilder *builder) = 0;
94 virtual void emitTrafficManager(CodeBuilder *builder) = 0;
95 virtual void emitPSAControlInputMetadata(CodeBuilder *builder) = 0;
96 virtual void emitPSAControlOutputMetadata(CodeBuilder *builder) = 0;
112 virtual void emitCPUMAPInitializers(CodeBuilder *builder);
113 virtual void emitCPUMAPLookup(CodeBuilder *builder);
118 virtual void emitPacketLength(CodeBuilder *builder);
119 virtual void emitTimestamp(CodeBuilder *builder);
120 void emitInputPortMapping(CodeBuilder *builder);
122 void emitHeadersFromCPUMAP(CodeBuilder *builder);
123 void emitMetadataFromCPUMAP(CodeBuilder *builder);
125 bool hasAnyMeter()
const {
126 auto directMeter = std::find_if(control->tables.begin(), control->tables.end(),
127 [](std::pair<const cstring, EBPFTable *> elem) {
128 return !elem.second->to<EBPFTablePSA>()->meters.empty();
130 bool anyDirectMeter = directMeter != control->tables.end();
131 return anyDirectMeter || (!control->meters.empty());
145class EBPFIngressPipeline :
public EBPFPipeline {
147 unsigned int maxResubmitDepth;
154 : EBPFPipeline(
name, options, refMap, typeMap) {
156 maxResubmitDepth = 4;
162 void emitSharedMetadataInitializer(
CodeBuilder *builder);
165 void emitPSAControlInputMetadata(
CodeBuilder *builder)
override;
166 void emitPSAControlOutputMetadata(
CodeBuilder *builder)
override;
173class EBPFEgressPipeline :
public EBPFPipeline {
177 : EBPFPipeline(
name, options, refMap, typeMap) {}
180 void emitPSAControlInputMetadata(
CodeBuilder *builder)
override;
181 void emitPSAControlOutputMetadata(
CodeBuilder *builder)
override;
182 void emitCPUMAPLookup(
CodeBuilder *builder)
override;
184 virtual void emitCheckPacketMarkMetadata(
CodeBuilder *builder) = 0;
186 DECLARE_TYPEINFO(EBPFEgressPipeline, EBPFPipeline);
189class TCIngressPipeline :
public EBPFIngressPipeline {
193 : EBPFIngressPipeline(
name, options, refMap, typeMap) {}
199 void emitTCWorkaroundUsingMeta(
CodeBuilder *builder);
200 void emitTCWorkaroundUsingHead(
CodeBuilder *builder);
201 void emitTCWorkaroundUsingCPUMAP(
CodeBuilder *builder);
203 DECLARE_TYPEINFO(TCIngressPipeline, EBPFIngressPipeline);
206class TCEgressPipeline :
public EBPFEgressPipeline {
210 : EBPFEgressPipeline(
name, options, refMap, typeMap) {}
212 void emitTrafficManager(
CodeBuilder *builder)
override;
213 void emitCheckPacketMarkMetadata(
CodeBuilder *builder)
override;
215 DECLARE_TYPEINFO(TCEgressPipeline, EBPFEgressPipeline);
218class XDPIngressPipeline :
public EBPFIngressPipeline {
222 : EBPFIngressPipeline(
name, options, refMap, typeMap) {
226 progTarget =
new XdpTarget(options.emitTraceMessages);
230 void emitTrafficManager(
CodeBuilder *builder)
override;
232 DECLARE_TYPEINFO(XDPIngressPipeline, EBPFIngressPipeline);
235class XDPEgressPipeline :
public EBPFEgressPipeline {
239 : EBPFEgressPipeline(
name, options, refMap, typeMap) {
244 pktInstanceVar =
"0"_cs;
246 progTarget =
new XdpTarget(options.emitTraceMessages);
250 void emitTrafficManager(
CodeBuilder *builder)
override;
251 void emitCheckPacketMarkMetadata(
CodeBuilder *builder)
override;
253 DECLARE_TYPEINFO(XDPEgressPipeline, EBPFEgressPipeline);
256class TCTrafficManagerForXDP :
public TCIngressPipeline {
260 : TCIngressPipeline(
name, options, refMap, typeMap) {}
266 void emitReadXDP2TCMetadataFromHead(
CodeBuilder *builder);
267 void emitReadXDP2TCMetadataFromCPUMAP(
CodeBuilder *builder);
269 DECLARE_TYPEINFO(TCTrafficManagerForXDP, TCIngressPipeline);
Definition ebpf/codeGen.h:33
Definition ebpfPsaControl.h:49
Definition ebpfPsaDeparser.h:29
Definition ebpfPipeline.h:145
int actUnspecCode
Definition ebpfPipeline.h:150
EBPFPipeline represents a single eBPF program in the TC/XDP hook.
Definition ebpfPipeline.h:18
void emitLocalHeaderInstancesAsPointers(CodeBuilder *builder)
Generates a pointer to struct Headers_t and puts it on the BPF program's stack.
Definition ebpfPipeline.cpp:93
cstring name
A custom name of eBPF program.
Definition ebpfPipeline.h:21
void emitHeaderInstances(CodeBuilder *builder) override
Definition ebpfPipeline.cpp:105
cstring packetPathVar
Variables storing global metadata (packet_path & instance).
Definition ebpfPipeline.h:33
cstring inputPortVar
A variable to store ifindex after mapping (e.g. due to recirculation).
Definition ebpfPipeline.h:41
bool shouldEmitTimestamp() const
Definition ebpfPipeline.h:138
cstring ifindexVar
Variable storing ingress interface index.
Definition ebpfPipeline.h:29
cstring oneKey
A variable name storing "1" value. Used to access BPF array map index.
Definition ebpfPipeline.h:37
virtual void emitGlobalMetadataInitializer(CodeBuilder *builder)
Definition ebpfPipeline.cpp:141
void emitLocalVariables(CodeBuilder *builder) override
Generates a set of helper variables that are used during packet processing.
Definition ebpfPipeline.cpp:38
bool isEmpty() const
Definition ebpfPipeline.cpp:11
unsigned packetMark
A unique mark used to differentiate packets processed by P4/eBPF from others.
Definition ebpfPipeline.h:39
void emitCPUMAPHeadersInitializers(CodeBuilder *builder)
Generates a pointer to struct hdr_md. The pointer is used to access data from per-CPU map.
Definition ebpfPipeline.cpp:100
cstring sectionName
eBPF section name, which should a concatenation of classifier/ + a custom name.
Definition ebpfPipeline.h:23
cstring compilerGlobalMetadata
A name of an internal variable storing global metadata.
Definition ebpfPipeline.h:35
cstring timestampVar
Variable name storing current timestamp retrieved from bpf_ktime_get_ns().
Definition ebpfPipeline.h:27
cstring priorityVar
Variable storing skb->priority value (TC only).
Definition ebpfPipeline.h:31
void emitUserMetadataInstance(CodeBuilder *builder)
Definition ebpfPipeline.cpp:82
cstring contextVar
Variable name storing pointer to eBPF packet descriptor (e.g., __sk_buff).
Definition ebpfPipeline.h:25
Definition ebpfProgram.h:30
EBPFProgram(const EbpfOptions &options, const IR::P4Program *program, P4::ReferenceMap *refMap, P4::TypeMap *typeMap, const IR::ToplevelBlock *toplevel)
return 'true' on success
Definition ebpfProgram.h:56
Definition ebpf/target.h:130
void emitTrafficManager(CodeBuilder *builder) override
Definition ebpfPipeline.cpp:544
void emitGlobalMetadataInitializer(CodeBuilder *builder) override
Definition ebpfPipeline.cpp:460
void emitGlobalMetadataInitializer(CodeBuilder *builder) override
Definition ebpfPipeline.cpp:738
void emitGlobalMetadataInitializer(CodeBuilder *builder) override
Definition ebpfPipeline.cpp:694
void emitGlobalMetadataInitializer(CodeBuilder *builder) override
Definition ebpfPipeline.cpp:670
Target XDP.
Definition ebpf/target.h:249
Definition ebpfOptions.h:26
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition codeGen.cpp:25