45 cstring packetPathVar, pktInstanceVar;
60 :
EBPFProgram(options,
nullptr, refMap, typeMap,
nullptr),
65 sectionName =
"classifier/" + name;
66 functionName = name.replace(
"-",
"_") +
"_func";
67 errorEnum =
"ParserError_t";
68 packetStartVar =
cstring(
"pkt");
69 headerStartVar =
cstring(
"hdr_start");
73 timestampVar =
cstring(
"tstamp");
74 ifindexVar =
cstring(
"skb->ifindex");
75 compilerGlobalMetadata =
cstring(
"compiler_meta__");
76 packetPathVar = compilerGlobalMetadata +
cstring(
"->packet_path");
77 pktInstanceVar = compilerGlobalMetadata +
cstring(
"->instance");
78 priorityVar =
cstring(
"skb->priority");
79 oneKey = EBPFModel::reserved(
"one");
80 inputPortVar =
cstring(
"ebpf_input_port");
88 virtual cstring dropReturnCode() {
89 if (sectionName.startsWith(
"xdp")) {
96 virtual cstring forwardReturnCode() {
97 if (sectionName.startsWith(
"xdp")) {
106 virtual void emitTrafficManager(
CodeBuilder *builder) = 0;
107 virtual void emitPSAControlInputMetadata(
CodeBuilder *builder) = 0;
108 virtual void emitPSAControlOutputMetadata(
CodeBuilder *builder) = 0;
111 void emitLocalHeaderInstancesAsPointers(
CodeBuilder *builder);
113 void emitCPUMAPHeadersInitializers(
CodeBuilder *builder);
116 void emitHeaderInstances(
CodeBuilder *builder)
override;
118 void emitLocalVariables(
CodeBuilder *builder)
override;
122 void emitUserMetadataInstance(
CodeBuilder *builder);
124 virtual void emitCPUMAPInitializers(
CodeBuilder *builder);
125 virtual void emitCPUMAPLookup(
CodeBuilder *builder);
128 virtual void emitGlobalMetadataInitializer(
CodeBuilder *builder);
129 virtual void emitPacketLength(
CodeBuilder *builder);
136 bool hasAnyMeter()
const {
137 auto directMeter = std::find_if(control->tables.begin(), control->tables.end(),
138 [](std::pair<const cstring, EBPFTable *> elem) {
139 return !elem.second->to<EBPFTablePSA>()->meters.empty();
141 bool anyDirectMeter = directMeter != control->tables.end();
142 return anyDirectMeter || (!control->meters.empty());
151 bool shouldEmitTimestamp()
const {
return hasAnyMeter() || control->timestampIsUsed; }