P4C
The P4 Compiler
Loading...
Searching...
No Matches
ubpfProgram.h
1/*
2 * Copyright 2019 Orange
3 * SPDX-FileCopyrightText: 2019 Orange
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef BACKENDS_UBPF_UBPFPROGRAM_H_
9#define BACKENDS_UBPF_UBPFPROGRAM_H_
10
11#include "backends/ebpf/ebpfOptions.h"
12#include "backends/ebpf/ebpfProgram.h"
13#include "codeGen.h"
14#include "frontends/p4/evaluator/evaluator.h"
15#include "frontends/p4/typeMap.h"
16#include "ir/ir.h"
17#include "target.h"
18#include "ubpfModel.h"
19
20namespace P4::UBPF {
21
22class UBPFControl;
23class UBPFParser;
24class UBPFDeparser;
25class UBPFTable;
26class UBPFType;
27
28class UBPFProgram : public EBPF::EBPFProgram {
29 public:
30 UBPFParser *parser{};
31 UBPFControl *control{};
32 UBPFDeparser *deparser{};
33 UBPFModel &model;
34
35 cstring contextVar, outerHdrOffsetVar, outerHdrLengthVar;
36 cstring stdMetadataVar;
37 cstring packetTruncatedSizeVar;
38 cstring arrayIndexType = "uint32_t"_cs;
39
40 UBPFProgram(const EbpfOptions &options, const IR::P4Program *program, P4::ReferenceMap *refMap,
41 P4::TypeMap *typeMap, const IR::ToplevelBlock *toplevel)
42 : EBPF::EBPFProgram(options, program, refMap, typeMap, toplevel),
43 model(UBPFModel::instance) {
44 packetStartVar = cstring("pkt");
45 offsetVar = cstring("packetOffsetInBits");
46 outerHdrOffsetVar = cstring("outHeaderOffset");
47 outerHdrLengthVar = cstring("outHeaderLength");
48 contextVar = cstring("ctx");
49 lengthVar = cstring("pkt_len");
50 endLabel = cstring("deparser");
51 stdMetadataVar = cstring("std_meta");
52 packetTruncatedSizeVar = cstring("packetTruncatedSize");
53 }
54
55 bool build() override;
56 void emitC(UbpfCodeBuilder *builder, const std::filesystem::path &headerFile);
57 void emitH(EBPF::CodeBuilder *builder, const std::filesystem::path &headerFile) override;
58 void emitPreamble(EBPF::CodeBuilder *builder) override;
59 void emitTypes(EBPF::CodeBuilder *builder) override;
60 void emitTableDefinition(EBPF::CodeBuilder *builder) const;
61 void emitPktVariable(UbpfCodeBuilder *builder) const;
62 void emitPacketLengthVariable(UbpfCodeBuilder *builder) const;
63 void emitHeaderInstances(EBPF::CodeBuilder *builder) override;
64 void emitMetadataInstance(EBPF::CodeBuilder *builder) const;
65 void emitLocalVariables(EBPF::CodeBuilder *builder) override;
66 void emitPipeline(EBPF::CodeBuilder *builder) override;
67
68 bool isLibraryMethod(cstring methodName) override {
69 static std::set<cstring> DEFAULT_METHODS = {
70 "mark_to_drop"_cs, "mark_to_pass"_cs, "ubpf_time_get_ns"_cs, "truncate"_cs,
71 "hash"_cs, "csum_replace2"_cs, "csum_replace4"_cs,
72 };
73 return DEFAULT_METHODS.find(methodName) != DEFAULT_METHODS.end() ||
74 EBPFProgram::isLibraryMethod(methodName);
75 }
76};
77
78} // namespace P4::UBPF
79
80#endif /* BACKENDS_UBPF_UBPFPROGRAM_H_ */
Definition ebpf/codeGen.h:33
Definition ebpfProgram.h:30
Definition ebpfOptions.h:26
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition typeMap.h:32
Definition ubpfControl.h:51
Definition ubpfDeparser.h:55
Definition ubpfModel.h:58
Definition ubpfParser.h:24
bool isLibraryMethod(cstring methodName) override
Definition ubpfProgram.h:68
Definition ubpfTable.h:43
Definition ubpf/codeGen.h:16
Definition cstring.h:85