|
6 | 6 |
|
7 | 7 | #ifdef BM_PACKET_TRACE_ON |
8 | 8 |
|
| 9 | +#include <bm/bm_sim/_assert.h> |
| 10 | +#include <bm/bm_sim/deparser.h> |
9 | 11 | #include <bm/bm_sim/logger.h> |
10 | 12 | #include <bm/bm_sim/packet.h> |
| 13 | +#include <bm/bm_sim/parser.h> |
| 14 | +#include <bm/bm_sim/pipeline.h> |
11 | 15 | #include <google/protobuf/text_format.h> |
12 | 16 |
|
13 | 17 | #include <filesystem> |
@@ -41,6 +45,11 @@ PacketTraceContext::PacketTraceContext( |
41 | 45 | std::shared_ptr<TraceTreeWrapper> tree_wrapper, p4::bm::TraceTree* node) |
42 | 46 | : tree_wrapper_(std::move(tree_wrapper)), current_node_(node) {} |
43 | 47 |
|
| 48 | +void PacketTraceContext::add_event(p4::bm::TraceEvent event) { |
| 49 | + std::lock_guard<std::mutex> lock(tree_wrapper_->mutex_); |
| 50 | + *current_node_->add_events() = std::move(event); |
| 51 | +} |
| 52 | + |
44 | 53 | // ---------- PacketTracer ---------- |
45 | 54 |
|
46 | 55 | void PacketTracer::set_output_dir(const std::string& output_dir) { |
@@ -75,6 +84,134 @@ void PacketTracer::flush_trace(const p4::bm::PacketTrace& trace) { |
75 | 84 | } |
76 | 85 | } |
77 | 86 |
|
| 87 | +void PacketTracer::attach_trace_ctx(Packet* packet) { |
| 88 | + if (!enabled_) return; |
| 89 | + auto ctx = std::make_unique<PacketTraceContext>(packet->get_packet_id(), |
| 90 | + packet->get_ingress_port()); |
| 91 | + packet->set_trace_ctx(std::move(ctx)); |
| 92 | +} |
| 93 | + |
| 94 | +namespace { |
| 95 | + |
| 96 | +// Add a TraceEvent to the packet's trace context (if present). |
| 97 | +void trace_add_event(const Packet& packet, p4::bm::TraceEvent event) { |
| 98 | + auto* ctx = packet.get_trace_ctx(); |
| 99 | + if (ctx) { |
| 100 | + ctx->add_event(std::move(event)); |
| 101 | + } |
| 102 | +} |
| 103 | + |
| 104 | +} // namespace |
| 105 | + |
| 106 | +void PacketTracer::packet_in(const Packet& packet) { _BM_UNUSED(packet); } |
| 107 | + |
| 108 | +void PacketTracer::packet_out(const Packet& packet) { _BM_UNUSED(packet); } |
| 109 | + |
| 110 | +void PacketTracer::parser_start(const Packet& packet, const Parser& parser) { |
| 111 | + p4::bm::TraceEvent ev; |
| 112 | + auto* ps = ev.mutable_pipeline_stage(); |
| 113 | + ps->set_stage_name(parser.get_name()); |
| 114 | + ps->set_stage_kind(p4::bm::PipelineStageEvent::PARSER); |
| 115 | + ps->set_direction(p4::bm::PipelineStageEvent::ENTER); |
| 116 | + trace_add_event(packet, std::move(ev)); |
| 117 | +} |
| 118 | + |
| 119 | +void PacketTracer::parser_done(const Packet& packet, const Parser& parser) { |
| 120 | + p4::bm::TraceEvent ev; |
| 121 | + auto* ps = ev.mutable_pipeline_stage(); |
| 122 | + ps->set_stage_name(parser.get_name()); |
| 123 | + ps->set_stage_kind(p4::bm::PipelineStageEvent::PARSER); |
| 124 | + ps->set_direction(p4::bm::PipelineStageEvent::EXIT); |
| 125 | + trace_add_event(packet, std::move(ev)); |
| 126 | +} |
| 127 | + |
| 128 | +void PacketTracer::parser_extract(const Packet& packet, header_id_t header) { |
| 129 | + _BM_UNUSED(packet); |
| 130 | + _BM_UNUSED(header); |
| 131 | +} |
| 132 | + |
| 133 | +void PacketTracer::deparser_start(const Packet& packet, |
| 134 | + const Deparser& deparser) { |
| 135 | + p4::bm::TraceEvent ev; |
| 136 | + auto* ps = ev.mutable_pipeline_stage(); |
| 137 | + ps->set_stage_name(deparser.get_name()); |
| 138 | + ps->set_stage_kind(p4::bm::PipelineStageEvent::DEPARSER); |
| 139 | + ps->set_direction(p4::bm::PipelineStageEvent::ENTER); |
| 140 | + trace_add_event(packet, std::move(ev)); |
| 141 | +} |
| 142 | + |
| 143 | +void PacketTracer::deparser_done(const Packet& packet, |
| 144 | + const Deparser& deparser) { |
| 145 | + p4::bm::TraceEvent ev; |
| 146 | + auto* ps = ev.mutable_pipeline_stage(); |
| 147 | + ps->set_stage_name(deparser.get_name()); |
| 148 | + ps->set_stage_kind(p4::bm::PipelineStageEvent::DEPARSER); |
| 149 | + ps->set_direction(p4::bm::PipelineStageEvent::EXIT); |
| 150 | + trace_add_event(packet, std::move(ev)); |
| 151 | +} |
| 152 | + |
| 153 | +void PacketTracer::deparser_emit(const Packet& packet, header_id_t header) { |
| 154 | + _BM_UNUSED(packet); |
| 155 | + _BM_UNUSED(header); |
| 156 | +} |
| 157 | + |
| 158 | +void PacketTracer::checksum_update(const Packet& packet, |
| 159 | + const Checksum& checksum) { |
| 160 | + _BM_UNUSED(packet); |
| 161 | + _BM_UNUSED(checksum); |
| 162 | +} |
| 163 | + |
| 164 | +void PacketTracer::pipeline_start(const Packet& packet, |
| 165 | + const Pipeline& pipeline) { |
| 166 | + p4::bm::TraceEvent ev; |
| 167 | + auto* ps = ev.mutable_pipeline_stage(); |
| 168 | + ps->set_stage_name(pipeline.get_name()); |
| 169 | + ps->set_stage_kind(p4::bm::PipelineStageEvent::CONTROL); |
| 170 | + ps->set_direction(p4::bm::PipelineStageEvent::ENTER); |
| 171 | + trace_add_event(packet, std::move(ev)); |
| 172 | +} |
| 173 | + |
| 174 | +void PacketTracer::pipeline_done(const Packet& packet, |
| 175 | + const Pipeline& pipeline) { |
| 176 | + p4::bm::TraceEvent ev; |
| 177 | + auto* ps = ev.mutable_pipeline_stage(); |
| 178 | + ps->set_stage_name(pipeline.get_name()); |
| 179 | + ps->set_stage_kind(p4::bm::PipelineStageEvent::CONTROL); |
| 180 | + ps->set_direction(p4::bm::PipelineStageEvent::EXIT); |
| 181 | + trace_add_event(packet, std::move(ev)); |
| 182 | +} |
| 183 | + |
| 184 | +void PacketTracer::condition_eval(const Packet& packet, const Conditional& cond, |
| 185 | + bool result) { |
| 186 | + _BM_UNUSED(packet); |
| 187 | + _BM_UNUSED(cond); |
| 188 | + _BM_UNUSED(result); |
| 189 | +} |
| 190 | + |
| 191 | +void PacketTracer::table_hit(const Packet& packet, |
| 192 | + const MatchTableAbstract& table, |
| 193 | + entry_handle_t handle) { |
| 194 | + _BM_UNUSED(packet); |
| 195 | + _BM_UNUSED(table); |
| 196 | + _BM_UNUSED(handle); |
| 197 | +} |
| 198 | + |
| 199 | +void PacketTracer::table_miss(const Packet& packet, |
| 200 | + const MatchTableAbstract& table) { |
| 201 | + _BM_UNUSED(packet); |
| 202 | + _BM_UNUSED(table); |
| 203 | +} |
| 204 | + |
| 205 | +void PacketTracer::action_execute(const Packet& packet, |
| 206 | + const ActionFn& action_fn, |
| 207 | + const ActionData& action_data) { |
| 208 | + _BM_UNUSED(packet); |
| 209 | + _BM_UNUSED(action_fn); |
| 210 | + _BM_UNUSED(action_data); |
| 211 | +} |
| 212 | + |
| 213 | +void PacketTracer::config_change() {} |
| 214 | + |
78 | 215 | } // namespace bm |
79 | 216 |
|
80 | 217 | #endif // BM_PACKET_TRACE_ON |
0 commit comments