diff --git a/repos/base/include/base/trace/events.h b/repos/base/include/base/trace/events.h index b5a084d015..b5d6026174 100644 --- a/repos/base/include/base/trace/events.h +++ b/repos/base/include/base/trace/events.h @@ -26,6 +26,7 @@ namespace Genode { namespace Trace { struct Signal_submit; struct Signal_received; struct Checkpoint; + struct Ethernet_packet; } } @@ -151,4 +152,33 @@ struct Genode::Trace::Checkpoint }; +struct Genode::Trace::Ethernet_packet +{ + enum Direction : char { + RECV = 0x0, + SENT = 0x1 + }; + + char const *name; + Direction direction; + char *data; + size_t length; + + Ethernet_packet(char const *name, Direction direction, char *data, size_t len) + : name(name), direction(direction), data(data), length(len) + { + Thread::trace(this); + } + + Ethernet_packet(char const *name, Direction direction, void *data, size_t len) + : name(name), direction(direction), data((char*)data), length(len) + { + Thread::trace(this); + } + + size_t generate(Policy_module &policy, char *dst) const { + return policy.trace_eth_packet(dst, name, direction == Direction::SENT, data, length); } +}; + + #endif /* _INCLUDE__BASE__TRACE__EVENTS_H_ */ diff --git a/repos/base/include/base/trace/policy.h b/repos/base/include/base/trace/policy.h index ea9b514484..05b8b2dd5a 100644 --- a/repos/base/include/base/trace/policy.h +++ b/repos/base/include/base/trace/policy.h @@ -32,6 +32,7 @@ namespace Genode { struct Genode::Trace::Policy_module { size_t (*max_event_size) (); + size_t (*trace_eth_packet) (char *, char const *, bool, char *, size_t); size_t (*checkpoint) (char *, char const *, unsigned long, void *, unsigned char); size_t (*log_output) (char *, char const *, size_t); size_t (*rpc_call) (char *, char const *, Msgbuf_base const &); diff --git a/repos/os/include/trace/policy.h b/repos/os/include/trace/policy.h index 1a2698c6cb..c387302459 100644 --- a/repos/os/include/trace/policy.h +++ b/repos/os/include/trace/policy.h @@ -22,6 +22,7 @@ namespace Genode { } extern "C" size_t max_event_size (); +extern "C" size_t trace_eth_packet (char *dst, char const *name, bool out, char *data, size_t len); extern "C" size_t checkpoint (char *dst, char const *name, unsigned long, void *, unsigned char); extern "C" size_t log_output (char *dst, char const *log_message, size_t len); extern "C" size_t rpc_call (char *dst, char const *rpc_name, Genode::Msgbuf_base const &); diff --git a/repos/os/src/lib/trace/policy/div_zero/policy.cc b/repos/os/src/lib/trace/policy/div_zero/policy.cc index a5d57efb7f..acc6eeb183 100644 --- a/repos/os/src/lib/trace/policy/div_zero/policy.cc +++ b/repos/os/src/lib/trace/policy/div_zero/policy.cc @@ -18,6 +18,10 @@ size_t max_event_size() return MAX_EVENT_SIZE; } +size_t trace_eth_packet(char *, char const *, bool, char *, size_t) +{ + return 0; +} size_t checkpoint(char *dst, char const *, unsigned long, void *, unsigned char) { diff --git a/repos/os/src/lib/trace/policy/log_output/policy.cc b/repos/os/src/lib/trace/policy/log_output/policy.cc index 287839cfb7..7684adef22 100644 --- a/repos/os/src/lib/trace/policy/log_output/policy.cc +++ b/repos/os/src/lib/trace/policy/log_output/policy.cc @@ -10,6 +10,11 @@ size_t max_event_size() return MAX_EVENT_SIZE; } +size_t trace_eth_packet(char *, char const *, bool, char *, size_t) +{ + return 0; +} + size_t checkpoint(char *dst, char const *, unsigned long, void *, unsigned char) { return 0; diff --git a/repos/os/src/lib/trace/policy/null/policy.cc b/repos/os/src/lib/trace/policy/null/policy.cc index f79e16390f..76fb18c9f6 100644 --- a/repos/os/src/lib/trace/policy/null/policy.cc +++ b/repos/os/src/lib/trace/policy/null/policy.cc @@ -7,6 +7,11 @@ size_t max_event_size() return 0; } +size_t trace_eth_packet(char *, char const *, bool, char *, size_t) +{ + return 0; +} + size_t checkpoint(char *dst, char const *, unsigned long, void *, unsigned char) { return 0; diff --git a/repos/os/src/lib/trace/policy/rpc_name/policy.cc b/repos/os/src/lib/trace/policy/rpc_name/policy.cc index effeffe4de..a1293f43a4 100644 --- a/repos/os/src/lib/trace/policy/rpc_name/policy.cc +++ b/repos/os/src/lib/trace/policy/rpc_name/policy.cc @@ -10,6 +10,11 @@ size_t max_event_size() return MAX_EVENT_SIZE; } +size_t trace_eth_packet(char *, char const *, bool, char *, size_t) +{ + return 0; +} + size_t checkpoint(char *, char const *, unsigned long, void *, unsigned char) { return 0; diff --git a/repos/os/src/lib/trace/policy/table.cc b/repos/os/src/lib/trace/policy/table.cc index 09efbb7d67..e92331d297 100644 --- a/repos/os/src/lib/trace/policy/table.cc +++ b/repos/os/src/lib/trace/policy/table.cc @@ -19,6 +19,7 @@ extern "C" { Genode::Trace::Policy_module policy_jump_table = { max_event_size, + trace_eth_packet, checkpoint, log_output, rpc_call,