P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfDeparser.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_EBPFDEPARSER_H_
8#define BACKENDS_EBPF_EBPFDEPARSER_H_
9
10#include "ebpfControl.h"
11
12namespace P4::EBPF {
13
14class EBPFDeparser;
15
17class DeparserBodyTranslator : public ControlBodyTranslator {
18 protected:
19 const EBPFDeparser *deparser;
20
21 public:
22 explicit DeparserBodyTranslator(const EBPFDeparser *deparser);
23
24 bool preorder(const IR::MethodCallExpression *expression) override;
25 bool preorder(const IR::IfStatement *ifstmt) override;
26};
27
29class DeparserPrepareBufferTranslator : public ControlBodyTranslator {
30 protected:
31 const EBPFDeparser *deparser;
32
33 public:
34 explicit DeparserPrepareBufferTranslator(const EBPFDeparser *deparser);
35
36 void processMethod(const P4::ExternMethod *method) override;
37 bool preorder(const IR::BlockStatement *s) override;
38 bool preorder(const IR::IfStatement *ifstmt) override;
39 bool preorder(const IR::AssignmentStatement *) override { return false; }
40 bool preorder(const IR::MethodCallStatement *s) override;
41 bool preorder(const IR::MethodCallExpression *expression) override;
42};
43
45class DeparserHdrEmitTranslator : public DeparserPrepareBufferTranslator {
46 protected:
47 const EBPFDeparser *deparser;
48
49 public:
50 explicit DeparserHdrEmitTranslator(const EBPFDeparser *deparser);
51
52 bool preorder(const IR::IfStatement *ifstmt) override;
53 bool preorder(const IR::MethodCallExpression *expression) override;
54 void processMethod(const P4::ExternMethod *method) override;
55 void emitField(CodeBuilder *builder, cstring field, const IR::Expression *hdrExpr,
56 unsigned alignment, EBPF::EBPFType *type);
57};
58
59class EBPFDeparser : public EBPFControl {
60 public:
61 const IR::Parameter *packet_out;
62
63 EBPFType *headerType;
64 cstring outerHdrOffsetVar, outerHdrLengthVar;
65 cstring returnCode;
66
67 EBPFDeparser(const EBPFProgram *program, const IR::ControlBlock *control,
68 const IR::Parameter *parserHeaders)
69 : EBPFControl(program, control, parserHeaders) {
70 codeGen = new DeparserBodyTranslator(this);
71 outerHdrOffsetVar = cstring("outHeaderOffset");
72 outerHdrLengthVar = cstring("outHeaderLength");
73 returnCode = cstring("returnCode");
74 }
75
76 bool build() override;
77 void emit(CodeBuilder *builder) override;
81 virtual void emitPreDeparser(CodeBuilder *builder) { (void)builder; }
82
83 virtual void emitDeparserExternCalls(CodeBuilder *builder) { (void)builder; }
84
85 void emitBufferAdjusts(CodeBuilder *builder) const;
86
87 DECLARE_TYPEINFO(EBPFDeparser, EBPFControl);
88};
89
90} // namespace P4::EBPF
91
92#endif /* BACKENDS_EBPF_EBPFDEPARSER_H_ */
Definition ebpf/codeGen.h:33
This translator emits deparser externs.
Definition ebpfDeparser.h:17
Definition ebpfDeparser.h:59
virtual void emitPreDeparser(CodeBuilder *builder)
Definition ebpfDeparser.h:81
Definition ebpfProgram.h:30
Base class for EBPF types.
Definition ebpfType.h:29
Definition methodInstance.h:168
Definition cstring.h:85
Definition codeGen.cpp:25