P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpfPsaControl.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_EBPFPSACONTROL_H_
8#define BACKENDS_EBPF_PSA_EBPFPSACONTROL_H_
9
10#include "backends/ebpf/ebpfControl.h"
11#include "backends/ebpf/psa/externs/ebpfPsaChecksum.h"
12#include "backends/ebpf/psa/externs/ebpfPsaRandom.h"
13#include "backends/ebpf/psa/externs/ebpfPsaRegister.h"
14#include "ebpfPsaTable.h"
15
16namespace P4::EBPF {
17
18class EBPFControlPSA;
19
20class ControlBodyTranslatorPSA : public ControlBodyTranslator {
21 public:
22 explicit ControlBodyTranslatorPSA(const EBPFControlPSA *control);
23
24 bool preorder(const IR::BaseAssignmentStatement *a) override { return notSupported(a); }
25 bool preorder(const IR::AssignmentStatement *a) override;
26
27 void processMethod(const P4::ExternMethod *method) override;
28
29 virtual cstring getParamName(const IR::PathExpression *);
30};
31
32class ActionTranslationVisitorPSA : public ActionTranslationVisitor,
33 public ControlBodyTranslatorPSA {
34 protected:
35 const EBPFTablePSA *table;
36
37 public:
38 ActionTranslationVisitorPSA(const EBPFProgram *program, cstring valueName,
39 const EBPFTablePSA *table);
40
41 bool preorder(const IR::PathExpression *pe) override;
42 bool isActionParameter(const IR::Expression *expression) const;
43
44 void processMethod(const P4::ExternMethod *method) override;
45 cstring getParamInstanceName(const IR::Expression *expression) const override;
46 cstring getParamName(const IR::PathExpression *) override;
47};
48
49class EBPFControlPSA : public EBPFControl {
50 public:
52 bool timestampIsUsed = false;
53
54 const IR::Parameter *user_metadata;
55 const IR::Parameter *inputStandardMetadata;
56 const IR::Parameter *outputStandardMetadata;
57
58 std::map<cstring, EBPFHashPSA *> hashes;
59 std::map<cstring, EBPFRandomPSA *> randoms;
60 std::map<cstring, EBPFRegisterPSA *> registers;
61 std::map<cstring, EBPFMeterPSA *> meters;
62
63 EBPFControlPSA(const EBPFProgram *program, const IR::ControlBlock *control,
64 const IR::Parameter *parserHeaders)
65 : EBPFControl(program, control, parserHeaders) {}
66
67 void emit(CodeBuilder *builder) override;
68 void emitTableTypes(CodeBuilder *builder) override;
69 void emitTableInstances(CodeBuilder *builder) override;
70 void emitTableInitializers(CodeBuilder *builder) override;
71
72 EBPFRandomPSA *getRandomExt(cstring name) const {
73 auto result = ::P4::get(randoms, name);
74 BUG_CHECK(result != nullptr, "No random generator named %1%", name);
75 return result;
76 }
77
78 EBPFRegisterPSA *getRegister(cstring name) const {
79 auto result = ::P4::get(registers, name);
80 BUG_CHECK(result != nullptr, "No register named %1%", name);
81 return result;
82 }
83
84 EBPFHashPSA *getHash(cstring name) const {
85 auto result = ::P4::get(hashes, name);
86 BUG_CHECK(result != nullptr, "No hash named %1%", name);
87 return result;
88 }
89
90 EBPFMeterPSA *getMeter(cstring name) const {
91 auto result = ::P4::get(meters, name);
92 BUG_CHECK(result != nullptr, "No meter named %1%", name);
93 return result;
94 }
95
96 DECLARE_TYPEINFO(EBPFControlPSA, EBPFControl);
97};
98
99} // namespace P4::EBPF
100
101#endif /* BACKENDS_EBPF_PSA_EBPFPSACONTROL_H_ */
Definition ebpf/codeGen.h:33
Definition ebpfPsaControl.h:49
bool timestampIsUsed
Keeps track if ingress_timestamp or egress_timestamp is used within a control block.
Definition ebpfPsaControl.h:52
Definition ebpfProgram.h:30
Definition ebpfPsaRandom.h:15
Definition ebpfPsaTable.h:19
Definition methodInstance.h:168
Definition cstring.h:85
Definition codeGen.cpp:25