From ffb5c13ca2cb0c0e270a00d66e9dca97a8c2f236 Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Mon, 3 Jun 2019 14:25:12 -0400 Subject: [PATCH] sink.ctf.fs: support packets, DE, and DP w/o beginning/end clock snapshots This patch makes `sink.ctf.fs` support more stream class configurations. The table below shows the valid configurations, where: DE: Discarded events. DP: Discarded packets. CS: Clock snapshot. Each table cell indicates whether or not the given message has a default clock snapshot (or two default clock snapshots for discarded events packets messages). Each row is a configuration supported by `sink.ctf.fs`. +------------+------------+-------+-------+ | Pkt beg CS | Pkt end CS | DE CS | DP CS | +------------+------------+-------+-------+ | No | No | No | No | | No | Yes | No | No | | Yes | No | No | No | | Yes | Yes | No | No | | Yes | Yes | No | Yes | | Yes | Yes | Yes | No | | Yes | Yes | Yes | Yes | +------------+------------+-------+-------+ All other configurations are not supported (the component logs an error and fails). As shown by the table above, discarded events and packets messages without default clock snapshots are always supported: * Any discarded events message occuring between two packet end messages increments the discarded event counter for the packet targeted by the second packet end message. * Any discarded packets message occuring between a packet end message and a packet beginning message increments the packet sequence number for the packet targeted by the packet beginning message. When discarded events/packets messages have default clock snapshots, however, packet beginning and end messages must also have default clock snapshots. This is to ensure that the discarded item time range matches what is specified by CTF, which relies on the packet time ranges. `src.ctf.fs` never produces (and will never produce) such a configuration, so the CTF-to-CTF use case remains completely compatible. When packet beginning messages have no default clock snapshot, the generated packet context has no `timestamp_begin` member. When packet end messages have no default clock snapshot, the generated packet context has no `timestamp_end` member. When a stream class does not support discarded event messages, the generated packet context has no `events_discarded` member. NOTE: As of this patch, `src.ctf.fs` cannot produce all the configurations above. This work is reserved for a future patch. Signed-off-by: Philippe Proulx Change-Id: I4e4fcb5c6f4e363d5c467427fb151c725d100cfb Reviewed-on: https://review.lttng.org/c/babeltrace/+/1366 Reviewed-by: Simon Marchi Tested-by: jenkins --- plugins/ctf/fs-sink/fs-sink-ctf-meta.h | 25 ++ plugins/ctf/fs-sink/fs-sink-stream.c | 18 +- plugins/ctf/fs-sink/fs-sink.c | 346 ++++++++---------- .../ctf/fs-sink/translate-ctf-ir-to-tsdl.c | 21 +- 4 files changed, 209 insertions(+), 201 deletions(-) diff --git a/plugins/ctf/fs-sink/fs-sink-ctf-meta.h b/plugins/ctf/fs-sink/fs-sink-ctf-meta.h index 657fdd73..04ef5afb 100644 --- a/plugins/ctf/fs-sink/fs-sink-ctf-meta.h +++ b/plugins/ctf/fs-sink/fs-sink-ctf-meta.h @@ -133,6 +133,11 @@ struct fs_sink_ctf_stream_class { const bt_clock_class *default_clock_class; GString *default_clock_class_name; + bool packets_have_ts_begin; + bool packets_have_ts_end; + bool has_discarded_events; + bool discarded_events_has_ts; + bool discarded_packets_has_ts; /* Owned by this */ struct fs_sink_ctf_field_class *packet_context_fc; @@ -731,6 +736,26 @@ struct fs_sink_ctf_stream_class *fs_sink_ctf_stream_class_create( sc->event_classes_from_ir = g_hash_table_new(g_direct_hash, g_direct_equal); BT_ASSERT(sc->event_classes_from_ir); + sc->packets_have_ts_begin = + bt_stream_class_packets_have_default_beginning_clock_snapshot( + ir_sc); + sc->packets_have_ts_end = + bt_stream_class_packets_have_default_end_clock_snapshot(ir_sc); + sc->has_discarded_events = + bt_stream_class_supports_discarded_events(ir_sc); + + if (sc->has_discarded_events) { + sc->discarded_events_has_ts = + bt_stream_class_discarded_events_have_default_clock_snapshots( + ir_sc); + } + + if (bt_stream_class_supports_discarded_packets(ir_sc)) { + sc->discarded_packets_has_ts = + bt_stream_class_discarded_packets_have_default_clock_snapshots( + ir_sc); + } + g_ptr_array_add(tc->stream_classes, sc); return sc; } diff --git a/plugins/ctf/fs-sink/fs-sink-stream.c b/plugins/ctf/fs-sink/fs-sink-stream.c index c11305b7..26977c2f 100644 --- a/plugins/ctf/fs-sink/fs-sink-stream.c +++ b/plugins/ctf/fs-sink/fs-sink-stream.c @@ -474,14 +474,16 @@ int write_packet_context(struct fs_sink_stream *stream) goto end; } - if (stream->sc->default_clock_class) { + if (stream->sc->packets_have_ts_begin) { /* Beginning time */ ret = bt_ctfser_write_byte_aligned_unsigned_int(&stream->ctfser, stream->packet_state.beginning_cs, 8, 64, BYTE_ORDER); if (ret) { goto end; } + } + if (stream->sc->packets_have_ts_end) { /* End time */ ret = bt_ctfser_write_byte_aligned_unsigned_int(&stream->ctfser, stream->packet_state.end_cs, 8, 64, BYTE_ORDER); @@ -490,12 +492,14 @@ int write_packet_context(struct fs_sink_stream *stream) } } - /* Discarded event counter */ - ret = bt_ctfser_write_byte_aligned_unsigned_int(&stream->ctfser, - stream->packet_state.discarded_events_counter, 8, 64, - BYTE_ORDER); - if (ret) { - goto end; + if (stream->sc->has_discarded_events) { + /* Discarded event counter */ + ret = bt_ctfser_write_byte_aligned_unsigned_int(&stream->ctfser, + stream->packet_state.discarded_events_counter, 8, 64, + BYTE_ORDER); + if (ret) { + goto end; + } } /* Sequence number */ diff --git a/plugins/ctf/fs-sink/fs-sink.c b/plugins/ctf/fs-sink/fs-sink.c index 5316d30c..0d79c992 100644 --- a/plugins/ctf/fs-sink/fs-sink.c +++ b/plugins/ctf/fs-sink/fs-sink.c @@ -320,50 +320,62 @@ bt_self_component_status handle_packet_beginning_msg( goto end; } - if (stream->sc->default_clock_class) { + if (stream->sc->packets_have_ts_begin) { cs = bt_message_packet_beginning_borrow_default_clock_snapshot_const( msg); BT_ASSERT(cs); } if (stream->discarded_events_state.in_range) { + uint64_t expected_cs; + + BT_ASSERT(stream->sc->discarded_events_has_ts); + BT_ASSERT(stream->sc->packets_have_ts_begin); + BT_ASSERT(stream->sc->packets_have_ts_end); + /* * Make sure that the current discarded events range's * beginning time matches what's expected for CTF 1.8. */ - if (stream->sc->default_clock_class) { - uint64_t expected_cs; - - if (stream->prev_packet_state.end_cs == UINT64_C(-1)) { - /* We're opening the first packet */ - expected_cs = bt_clock_snapshot_get_value(cs); - } else { - expected_cs = stream->prev_packet_state.end_cs; - } + if (stream->prev_packet_state.end_cs == UINT64_C(-1)) { + /* We're opening the first packet */ + expected_cs = bt_clock_snapshot_get_value(cs); + } else { + expected_cs = stream->prev_packet_state.end_cs; + } - if (stream->discarded_events_state.beginning_cs != - expected_cs) { - BT_LOGE("Incompatible discarded events message: " - "unexpected beginning time: " - "beginning-cs-val=%" PRIu64 ", " - "expected-beginning-cs-val=%" PRIu64 ", " - "stream-id=%" PRIu64 ", stream-name=\"%s\", " - "trace-name=\"%s\", path=\"%s/%s\"", - stream->discarded_events_state.beginning_cs, - expected_cs, - bt_stream_get_id(ir_stream), - bt_stream_get_name(ir_stream), - bt_trace_get_name( - bt_stream_borrow_trace_const(ir_stream)), - stream->trace->path->str, stream->file_name->str); - status = BT_SELF_COMPONENT_STATUS_ERROR; - goto end; - } + if (stream->discarded_events_state.beginning_cs != + expected_cs) { + BT_LOGE("Incompatible discarded events message: " + "unexpected beginning time: " + "beginning-cs-val=%" PRIu64 ", " + "expected-beginning-cs-val=%" PRIu64 ", " + "stream-id=%" PRIu64 ", stream-name=\"%s\", " + "trace-name=\"%s\", path=\"%s/%s\"", + stream->discarded_events_state.beginning_cs, + expected_cs, + bt_stream_get_id(ir_stream), + bt_stream_get_name(ir_stream), + bt_trace_get_name( + bt_stream_borrow_trace_const(ir_stream)), + stream->trace->path->str, stream->file_name->str); + status = BT_SELF_COMPONENT_STATUS_ERROR; + goto end; } } - if (stream->discarded_packets_state.in_range) { + uint64_t expected_end_cs; + + BT_ASSERT(stream->sc->discarded_packets_has_ts); + BT_ASSERT(stream->sc->packets_have_ts_begin); + BT_ASSERT(stream->sc->packets_have_ts_end); + + /* + * Make sure that the current discarded packets range's + * beginning and end times match what's expected for CTF + * 1.8. + */ if (stream->prev_packet_state.end_cs == UINT64_C(-1)) { BT_LOGE("Incompatible discarded packets message " "occuring before the stream's first packet: " @@ -378,56 +390,51 @@ bt_self_component_status handle_packet_beginning_msg( goto end; } - /* - * Make sure that the current discarded packets range's - * beginning and end times match what's expected for CTF - * 1.8. - */ - if (stream->sc->default_clock_class) { - uint64_t expected_end_cs = - bt_clock_snapshot_get_value(cs); - - if (stream->discarded_packets_state.beginning_cs != - stream->prev_packet_state.end_cs) { - BT_LOGE("Incompatible discarded packets message: " - "unexpected beginning time: " - "beginning-cs-val=%" PRIu64 ", " - "expected-beginning-cs-val=%" PRIu64 ", " - "stream-id=%" PRIu64 ", stream-name=\"%s\", " - "trace-name=\"%s\", path=\"%s/%s\"", - stream->discarded_packets_state.beginning_cs, - stream->prev_packet_state.end_cs, - bt_stream_get_id(ir_stream), - bt_stream_get_name(ir_stream), - bt_trace_get_name( - bt_stream_borrow_trace_const(ir_stream)), - stream->trace->path->str, stream->file_name->str); - status = BT_SELF_COMPONENT_STATUS_ERROR; - goto end; - } + if (stream->discarded_packets_state.beginning_cs != + stream->prev_packet_state.end_cs) { + BT_LOGE("Incompatible discarded packets message: " + "unexpected beginning time: " + "beginning-cs-val=%" PRIu64 ", " + "expected-beginning-cs-val=%" PRIu64 ", " + "stream-id=%" PRIu64 ", stream-name=\"%s\", " + "trace-name=\"%s\", path=\"%s/%s\"", + stream->discarded_packets_state.beginning_cs, + stream->prev_packet_state.end_cs, + bt_stream_get_id(ir_stream), + bt_stream_get_name(ir_stream), + bt_trace_get_name( + bt_stream_borrow_trace_const(ir_stream)), + stream->trace->path->str, stream->file_name->str); + status = BT_SELF_COMPONENT_STATUS_ERROR; + goto end; + } - if (stream->discarded_packets_state.end_cs != - expected_end_cs) { - BT_LOGE("Incompatible discarded packets message: " - "unexpected end time: " - "end-cs-val=%" PRIu64 ", " - "expected-end-cs-val=%" PRIu64 ", " - "stream-id=%" PRIu64 ", stream-name=\"%s\", " - "trace-name=\"%s\", path=\"%s/%s\"", - stream->discarded_packets_state.beginning_cs, - expected_end_cs, - bt_stream_get_id(ir_stream), - bt_stream_get_name(ir_stream), - bt_trace_get_name( - bt_stream_borrow_trace_const(ir_stream)), - stream->trace->path->str, stream->file_name->str); - status = BT_SELF_COMPONENT_STATUS_ERROR; - goto end; - } + expected_end_cs = bt_clock_snapshot_get_value(cs); + + if (stream->discarded_packets_state.end_cs != + expected_end_cs) { + BT_LOGE("Incompatible discarded packets message: " + "unexpected end time: " + "end-cs-val=%" PRIu64 ", " + "expected-end-cs-val=%" PRIu64 ", " + "stream-id=%" PRIu64 ", stream-name=\"%s\", " + "trace-name=\"%s\", path=\"%s/%s\"", + stream->discarded_packets_state.end_cs, + expected_end_cs, + bt_stream_get_id(ir_stream), + bt_stream_get_name(ir_stream), + bt_trace_get_name( + bt_stream_borrow_trace_const(ir_stream)), + stream->trace->path->str, stream->file_name->str); + status = BT_SELF_COMPONENT_STATUS_ERROR; + goto end; } } - stream->discarded_packets_state.in_range = false; + if (stream->sc->discarded_packets_has_ts) { + stream->discarded_packets_state.in_range = false; + } + ret = fs_sink_stream_open_packet(stream, cs, ir_packet); if (ret) { status = BT_SELF_COMPONENT_STATUS_ERROR; @@ -456,44 +463,41 @@ bt_self_component_status handle_packet_end_msg( goto end; } - if (stream->sc->default_clock_class) { - cs = bt_message_packet_end_borrow_default_clock_snapshot_const( - msg); - BT_ASSERT(cs); - } - - if (stream->sc->default_clock_class) { + if (stream->sc->packets_have_ts_end) { cs = bt_message_packet_end_borrow_default_clock_snapshot_const( msg); BT_ASSERT(cs); } if (stream->discarded_events_state.in_range) { + uint64_t expected_cs; + + BT_ASSERT(stream->sc->discarded_events_has_ts); + BT_ASSERT(stream->sc->packets_have_ts_begin); + BT_ASSERT(stream->sc->packets_have_ts_end); + /* * Make sure that the current discarded events range's * end time matches what's expected for CTF 1.8. */ - if (stream->sc->default_clock_class) { - uint64_t expected_cs = bt_clock_snapshot_get_value(cs); - - if (stream->discarded_events_state.end_cs != - expected_cs) { - BT_LOGE("Incompatible discarded events message: " - "unexpected end time: " - "end-cs-val=%" PRIu64 ", " - "expected-end-cs-val=%" PRIu64 ", " - "stream-id=%" PRIu64 ", stream-name=\"%s\", " - "trace-name=\"%s\", path=\"%s/%s\"", - stream->discarded_events_state.end_cs, - expected_cs, - bt_stream_get_id(ir_stream), - bt_stream_get_name(ir_stream), - bt_trace_get_name( - bt_stream_borrow_trace_const(ir_stream)), - stream->trace->path->str, stream->file_name->str); - status = BT_SELF_COMPONENT_STATUS_ERROR; - goto end; - } + expected_cs = bt_clock_snapshot_get_value(cs); + + if (stream->discarded_events_state.end_cs != expected_cs) { + BT_LOGE("Incompatible discarded events message: " + "unexpected end time: " + "end-cs-val=%" PRIu64 ", " + "expected-end-cs-val=%" PRIu64 ", " + "stream-id=%" PRIu64 ", stream-name=\"%s\", " + "trace-name=\"%s\", path=\"%s/%s\"", + stream->discarded_events_state.end_cs, + expected_cs, + bt_stream_get_id(ir_stream), + bt_stream_get_name(ir_stream), + bt_trace_get_name( + bt_stream_borrow_trace_const(ir_stream)), + stream->trace->path->str, stream->file_name->str); + status = BT_SELF_COMPONENT_STATUS_ERROR; + goto end; } } @@ -503,7 +507,9 @@ bt_self_component_status handle_packet_end_msg( goto end; } - stream->discarded_events_state.in_range = false; + if (stream->sc->discarded_events_has_ts) { + stream->discarded_events_state.in_range = false; + } end: return status; @@ -519,67 +525,47 @@ bt_self_component_status handle_stream_beginning_msg( const bt_stream_class *ir_sc = bt_stream_borrow_class_const(ir_stream); struct fs_sink_stream *stream; + bool packets_have_beginning_end_cs = + bt_stream_class_packets_have_default_beginning_clock_snapshot(ir_sc) && + bt_stream_class_packets_have_default_end_clock_snapshot(ir_sc); /* - * Temporary: if the stream's class has a default clock class, - * make sure packet beginning and end messages have default - * clock snapshots until the support for not having them is - * implemented. + * Not supported: discarded events with default clock snapshots, + * but packet beginning/end without default clock snapshot. */ - if (bt_stream_class_borrow_default_clock_class_const(ir_sc)) { - if (!bt_stream_class_packets_have_default_beginning_clock_snapshot( - ir_sc)) { - BT_LOGE("Unsupported stream: packets have " - "no beginning clock snapshot: " - "stream-addr=%p, " - "stream-id=%" PRIu64 ", " - "stream-name=\"%s\"", - ir_stream, bt_stream_get_id(ir_stream), - bt_stream_get_name(ir_stream)); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; - goto end; - } - - if (!bt_stream_class_packets_have_default_end_clock_snapshot( - ir_sc)) { - BT_LOGE("Unsupported stream: packets have " - "no end clock snapshot: " - "stream-addr=%p, " - "stream-id=%" PRIu64 ", " - "stream-name=\"%s\"", - ir_stream, bt_stream_get_id(ir_stream), - bt_stream_get_name(ir_stream)); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; - goto end; - } - - if (!fs_sink->ignore_discarded_events && - bt_stream_class_supports_discarded_events(ir_sc) && - !bt_stream_class_discarded_events_have_default_clock_snapshots(ir_sc)) { - BT_LOGE("Unsupported stream: discarded events " - "have no clock snapshots: " - "stream-addr=%p, " - "stream-id=%" PRIu64 ", " - "stream-name=\"%s\"", - ir_stream, bt_stream_get_id(ir_stream), - bt_stream_get_name(ir_stream)); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; - goto end; - } + if (!fs_sink->ignore_discarded_events && + bt_stream_class_discarded_events_have_default_clock_snapshots(ir_sc) && + !packets_have_beginning_end_cs) { + BT_LOGE("Unsupported stream: discarded events have " + "default clock snapshots, but packets have no " + "beginning and/or end default clock snapshots: " + "stream-addr=%p, " + "stream-id=%" PRIu64 ", " + "stream-name=\"%s\"", + ir_stream, bt_stream_get_id(ir_stream), + bt_stream_get_name(ir_stream)); + status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + goto end; + } - if (!fs_sink->ignore_discarded_packets && - bt_stream_class_supports_discarded_packets(ir_sc) && - !bt_stream_class_discarded_packets_have_default_clock_snapshots(ir_sc)) { - BT_LOGE("Unsupported stream: discarded packets " - "have no clock snapshots: " - "stream-addr=%p, " - "stream-id=%" PRIu64 ", " - "stream-name=\"%s\"", - ir_stream, bt_stream_get_id(ir_stream), - bt_stream_get_name(ir_stream)); - status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; - goto end; - } + /* + * Not supported: discarded packets with default clock + * snapshots, but packet beginning/end without default clock + * snapshot. + */ + if (!fs_sink->ignore_discarded_packets && + bt_stream_class_discarded_packets_have_default_clock_snapshots(ir_sc) && + !packets_have_beginning_end_cs) { + BT_LOGE("Unsupported stream: discarded packets have " + "default clock snapshots, but packets have no " + "beginning and/or end default clock snapshots: " + "stream-addr=%p, " + "stream-id=%" PRIu64 ", " + "stream-name=\"%s\"", + ir_stream, bt_stream_get_id(ir_stream), + bt_stream_get_name(ir_stream)); + status = BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR; + goto end; } stream = borrow_stream(fs_sink, ir_stream); @@ -674,9 +660,10 @@ bt_self_component_status handle_discarded_events_msg( goto end; } - if (stream->packet_state.is_open) { - BT_LOGE("Unsupported discarded events message occuring " - "within a packet: " + if (stream->packet_state.is_open && + stream->sc->discarded_events_has_ts) { + BT_LOGE("Unsupported discarded events message with " + "default clock snapshots occuring within a packet: " "stream-id=%" PRIu64 ", stream-name=\"%s\", " "trace-name=\"%s\", path=\"%s/%s\"", bt_stream_get_id(ir_stream), @@ -688,9 +675,9 @@ bt_self_component_status handle_discarded_events_msg( goto end; } - stream->discarded_events_state.in_range = true; + if (stream->sc->discarded_events_has_ts) { + stream->discarded_events_state.in_range = true; - if (stream->sc->default_clock_class) { /* * The clock snapshot values will be validated when * handling the next "packet beginning" message. @@ -703,11 +690,7 @@ bt_self_component_status handle_discarded_events_msg( cs = bt_message_discarded_events_borrow_default_end_clock_snapshot_const( msg); BT_ASSERT(cs); - stream->discarded_events_state.end_cs = - bt_clock_snapshot_get_value(cs); - } else { - stream->discarded_events_state.beginning_cs = UINT64_C(-1); - stream->discarded_events_state.end_cs = UINT64_C(-1); + stream->discarded_events_state.end_cs = bt_clock_snapshot_get_value(cs); } avail = bt_message_discarded_events_get_count(msg, &count); @@ -764,23 +747,11 @@ bt_self_component_status handle_discarded_packets_msg( goto end; } - if (stream->packet_state.is_open) { - BT_LOGE("Unsupported discarded packets message occuring " - "within a packet: " - "stream-id=%" PRIu64 ", stream-name=\"%s\", " - "trace-name=\"%s\", path=\"%s/%s\"", - bt_stream_get_id(ir_stream), - bt_stream_get_name(ir_stream), - bt_trace_get_name( - bt_stream_borrow_trace_const(ir_stream)), - stream->trace->path->str, stream->file_name->str); - status = BT_SELF_COMPONENT_STATUS_ERROR; - goto end; - } + BT_ASSERT(!stream->packet_state.is_open); - stream->discarded_packets_state.in_range = true; + if (stream->sc->discarded_packets_has_ts) { + stream->discarded_packets_state.in_range = true; - if (stream->sc->default_clock_class) { /* * The clock snapshot values will be validated when * handling the next "packet beginning" message. @@ -795,9 +766,6 @@ bt_self_component_status handle_discarded_packets_msg( BT_ASSERT(cs); stream->discarded_packets_state.end_cs = bt_clock_snapshot_get_value(cs); - } else { - stream->discarded_packets_state.beginning_cs = UINT64_C(-1); - stream->discarded_packets_state.end_cs = UINT64_C(-1); } avail = bt_message_discarded_packets_get_count(msg, &count); diff --git a/plugins/ctf/fs-sink/translate-ctf-ir-to-tsdl.c b/plugins/ctf/fs-sink/translate-ctf-ir-to-tsdl.c index c148caea..e8522138 100644 --- a/plugins/ctf/fs-sink/translate-ctf-ir-to-tsdl.c +++ b/plugins/ctf/fs-sink/translate-ctf-ir-to-tsdl.c @@ -710,12 +710,15 @@ void append_stream_class(struct ctx *ctx, BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL, NULL, "content_size", true); - if (sc->default_clock_class) { + if (sc->packets_have_ts_begin) { append_indent(ctx); append_integer_field_class_from_props(ctx, 64, 8, false, BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL, sc->default_clock_class_name->str, "timestamp_begin", true); + } + + if (sc->packets_have_ts_end) { append_indent(ctx); append_integer_field_class_from_props(ctx, 64, 8, false, BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL, @@ -723,10 +726,18 @@ void append_stream_class(struct ctx *ctx, "timestamp_end", true); } - append_indent(ctx); - append_integer_field_class_from_props(ctx, 64, 8, false, - BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL, - NULL, "events_discarded", true); + if (sc->has_discarded_events) { + append_indent(ctx); + append_integer_field_class_from_props(ctx, 64, 8, false, + BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL, + NULL, "events_discarded", true); + } + + /* + * Unconditionnally write the packet sequence number as, even if + * there's no possible discarded packets message, it's still + * useful information to have. + */ append_indent(ctx); append_integer_field_class_from_props(ctx, 64, 8, false, BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL, -- 2.34.1