P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfPsaDeparser.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_EBPFPSADEPARSER_H_
8#define BACKENDS_EBPF_PSA_EBPFPSADEPARSER_H_
9
10#include "backends/ebpf/ebpfDeparser.h"
11#include "backends/ebpf/psa/ebpfPsaParser.h"
12#include "backends/ebpf/psa/externs/ebpfPsaChecksum.h"
13#include "backends/ebpf/psa/externs/ebpfPsaDigest.h"
14#include "ebpfPsaControl.h"
15#include "lib/rtti.h"
16
17namespace P4::EBPF {
18
19class EBPFDeparserPSA;
20
21class DeparserBodyTranslatorPSA : public DeparserBodyTranslator {
22 public:
23 explicit DeparserBodyTranslatorPSA(const EBPFDeparserPSA *deparser);
24
25 void processFunction(const P4::ExternFunction *function) override;
26 void processMethod(const P4::ExternMethod *method) override;
27};
28
29class EBPFDeparserPSA : public EBPFDeparser {
30 public:
31 const IR::Parameter *user_metadata;
32 const IR::Parameter *istd;
33 const IR::Parameter *resubmit_meta;
34 std::map<cstring, EBPFChecksumPSA *> checksums;
35 std::map<cstring, EBPFDigestPSA *> digests;
36
37 EBPFDeparserPSA(const EBPFProgram *program, const IR::ControlBlock *control,
38 const IR::Parameter *parserHeaders, const IR::Parameter *istd)
39 : EBPFDeparser(program, control, parserHeaders), istd(istd) {
40 codeGen = new DeparserBodyTranslatorPSA(this);
41 }
42
43 void emitTypes(CodeBuilder *builder) const;
44 void emitDigestInstances(CodeBuilder *builder) const;
45 void emitDeclaration(CodeBuilder *builder, const IR::Declaration *decl) override;
46
47 EBPFChecksumPSA *getChecksum(cstring name) const {
48 auto result = ::P4::get(checksums, name);
49 BUG_CHECK(result != nullptr, "No checksum named %1%", name);
50 return result;
51 }
52
53 EBPFDigestPSA *getDigest(cstring name) const {
54 auto result = ::P4::get(digests, name);
55 BUG_CHECK(result != nullptr, "No digest named %1%", name);
56 return result;
57 }
58
59 void emitDeparserExternCalls(EBPF::CodeBuilder *builder) override {
60 controlBlock->container->body->apply(*codeGen);
61 builder->newline();
62 }
63
64 DECLARE_TYPEINFO(EBPFDeparserPSA, EBPFDeparser);
65};
66
67class IngressDeparserPSA : public EBPFDeparserPSA {
68 public:
69 IngressDeparserPSA(const EBPFProgram *program, const IR::ControlBlock *control,
70 const IR::Parameter *parserHeaders, const IR::Parameter *istd)
71 : EBPFDeparserPSA(program, control, parserHeaders, istd) {}
72
73 bool build() override;
74
75 DECLARE_TYPEINFO(IngressDeparserPSA, EBPFDeparserPSA);
76};
77
78class EgressDeparserPSA : public EBPFDeparserPSA {
79 public:
80 EgressDeparserPSA(const EBPFProgram *program, const IR::ControlBlock *control,
81 const IR::Parameter *parserHeaders, const IR::Parameter *istd)
82 : EBPFDeparserPSA(program, control, parserHeaders, istd) {}
83
84 bool build() override;
85
86 DECLARE_TYPEINFO(EgressDeparserPSA, EBPFDeparserPSA);
87};
88
89class TCIngressDeparserPSA : public IngressDeparserPSA {
90 public:
91 TCIngressDeparserPSA(const EBPFProgram *program, const IR::ControlBlock *control,
92 const IR::Parameter *parserHeaders, const IR::Parameter *istd)
93 : IngressDeparserPSA(program, control, parserHeaders, istd) {}
94
95 void emitPreDeparser(CodeBuilder *builder) override;
96
97 DECLARE_TYPEINFO(TCIngressDeparserPSA, IngressDeparserPSA);
98};
99
100class TCEgressDeparserPSA : public EgressDeparserPSA {
101 public:
102 TCEgressDeparserPSA(const EBPFProgram *program, const IR::ControlBlock *control,
103 const IR::Parameter *parserHeaders, const IR::Parameter *istd)
104 : EgressDeparserPSA(program, control, parserHeaders, istd) {}
105
106 DECLARE_TYPEINFO(TCEgressDeparserPSA, EgressDeparserPSA);
107};
108
109class TCIngressDeparserForTrafficManagerPSA : public TCIngressDeparserPSA {
110 public:
111 TCIngressDeparserForTrafficManagerPSA(const EBPFProgram *program,
112 const IR::ControlBlock *control,
113 const IR::Parameter *parserHeaders,
114 const IR::Parameter *istd)
115 : TCIngressDeparserPSA(program, control, parserHeaders, istd) {}
116 void emitPreDeparser(CodeBuilder *builder) override;
117 void emitDeparserExternCalls(CodeBuilder *builder) override {
118 (void)builder;
119 // do not emit deparser extern calls for TCIngressDeparserForTrafficManagerPSA
120 }
121
122 DECLARE_TYPEINFO(TCIngressDeparserForTrafficManagerPSA, TCIngressDeparserPSA);
123};
124
125class XDPIngressDeparserPSA : public IngressDeparserPSA {
126 public:
127 XDPIngressDeparserPSA(const EBPFProgram *program, const IR::ControlBlock *control,
128 const IR::Parameter *parserHeaders, const IR::Parameter *istd)
129 : IngressDeparserPSA(program, control, parserHeaders, istd) {}
130
131 void emitPreDeparser(CodeBuilder *builder) override;
132
133 DECLARE_TYPEINFO(XDPIngressDeparserPSA, IngressDeparserPSA);
134};
135
136class XDPEgressDeparserPSA : public EgressDeparserPSA {
137 public:
138 XDPEgressDeparserPSA(const EBPFProgram *program, const IR::ControlBlock *control,
139 const IR::Parameter *parserHeaders, const IR::Parameter *istd)
140 : EgressDeparserPSA(program, control, parserHeaders, istd) {}
141
142 void emitPreDeparser(CodeBuilder *builder) override;
143
144 DECLARE_TYPEINFO(XDPEgressDeparserPSA, EgressDeparserPSA);
145};
146
147} // namespace P4::EBPF
148
149#endif /* BACKENDS_EBPF_PSA_EBPFPSADEPARSER_H_ */
Definition ebpf/codeGen.h:33
Definition ebpfPsaDeparser.h:21
Definition ebpfPsaChecksum.h:15
Definition ebpfPsaDeparser.h:29
Definition ebpfPsaDigest.h:18
Definition ebpfProgram.h:30
void emitPreDeparser(CodeBuilder *builder) override
Definition ebpfPsaDeparser.cpp:168
void emitPreDeparser(CodeBuilder *builder) override
Definition ebpfPsaDeparser.cpp:124
void emitPreDeparser(CodeBuilder *builder) override
Definition ebpfPsaDeparser.cpp:278
void emitPreDeparser(CodeBuilder *builder) override
Definition ebpfPsaDeparser.cpp:183
Definition methodInstance.h:194
Definition methodInstance.h:168
Definition cstring.h:85
Definition codeGen.cpp:25