+
+int bt_packet_move_header(struct bt_packet *packet,
+ struct bt_packet_header_field *header_field)
+{
+ struct bt_trace *trace;
+ struct bt_field_wrapper *field_wrapper = (void *) header_field;
+
+ BT_ASSERT_PRE_NON_NULL(packet, "Event");
+ BT_ASSERT_PRE_NON_NULL(field_wrapper, "Header field");
+ BT_ASSERT_PRE_HOT(packet, "Packet", ": %!+a", packet);
+ trace = bt_stream_class_borrow_trace(
+ bt_stream_borrow_class(packet->stream));
+ BT_ASSERT_PRE(trace->packet_header_field_type,
+ "Trace has no packet header field type: %!+t",
+ trace);
+
+ /* TODO: compare field types (precondition) */
+
+ /* Recycle current header field: always exists */
+ BT_ASSERT(packet->header);
+ bt_packet_header_field_recycle(packet->header, trace);
+
+ /* Move new field */
+ packet->header = field_wrapper;
+ return 0;
+}
+
+int bt_packet_move_context(struct bt_packet *packet,
+ struct bt_packet_context_field *context_field)
+{
+ struct bt_stream_class *stream_class;
+ struct bt_field_wrapper *field_wrapper = (void *) context_field;
+
+ BT_ASSERT_PRE_NON_NULL(packet, "Event");
+ BT_ASSERT_PRE_NON_NULL(field_wrapper, "Context field");
+ BT_ASSERT_PRE_HOT(packet, "Packet", ": %!+a", packet);
+ stream_class = bt_stream_borrow_class(packet->stream);
+ BT_ASSERT_PRE(stream_class->packet_context_field_type,
+ "Stream class has no packet context field type: %!+S",
+ stream_class);
+
+ /* TODO: compare field types (precondition) */
+
+ /* Recycle current context field: always exists */
+ BT_ASSERT(packet->context);
+ bt_packet_context_field_recycle(packet->context, stream_class);
+
+ /* Move new field */
+ packet->context = field_wrapper;
+ return 0;
+}
+
+enum bt_packet_property_availability
+bt_packet_borrow_default_beginning_clock_value(struct bt_packet *packet,
+ struct bt_clock_value **clock_value)
+{
+ enum bt_packet_property_availability avail =
+ BT_PACKET_PROPERTY_AVAILABILITY_AVAILABLE;
+
+ BT_ASSERT_PRE_NON_NULL(packet, "Packet");
+ BT_ASSERT_PRE_NON_NULL(clock_value, "Clock value");
+ *clock_value = packet->begin_cv_set.default_cv;
+ if (!*clock_value) {
+ avail = BT_PACKET_PROPERTY_AVAILABILITY_NOT_AVAILABLE;
+ }
+
+ return avail;
+}
+
+enum bt_packet_property_availability
+bt_packet_borrow_default_end_clock_value(struct bt_packet *packet,
+ struct bt_clock_value **clock_value)
+{
+ enum bt_packet_property_availability avail =
+ BT_PACKET_PROPERTY_AVAILABILITY_AVAILABLE;
+
+ BT_ASSERT_PRE_NON_NULL(packet, "Packet");
+ BT_ASSERT_PRE_NON_NULL(clock_value, "Clock value");
+ *clock_value = packet->end_cv_set.default_cv;
+ if (!*clock_value) {
+ avail = BT_PACKET_PROPERTY_AVAILABILITY_NOT_AVAILABLE;
+ }
+
+ return avail;
+}
+
+enum bt_packet_previous_packet_availability
+bt_packet_get_previous_packet_availability(struct bt_packet *packet)
+{
+ BT_ASSERT_PRE_NON_NULL(packet, "Packet");
+ return packet->prev_packet_info.avail;
+}
+
+enum bt_packet_property_availability
+bt_packet_borrow_previous_packet_default_end_clock_value(
+ struct bt_packet *packet, struct bt_clock_value **clock_value)
+{
+ BT_ASSERT_PRE_NON_NULL(packet, "Packet");
+ BT_ASSERT_PRE_NON_NULL(clock_value, "Clock value");
+ *clock_value = packet->prev_packet_info.default_end_cv.cv;
+ return packet->prev_packet_info.default_end_cv.avail;
+}
+
+enum bt_packet_property_availability bt_packet_get_discarded_event_counter(
+ struct bt_packet *packet, uint64_t *counter)
+{
+ BT_ASSERT_PRE_NON_NULL(packet, "Packet");
+ BT_ASSERT_PRE_NON_NULL(counter, "Counter");
+ *counter = packet->discarded_event_counter.value;
+ return packet->discarded_event_counter.avail;
+}
+
+enum bt_packet_property_availability bt_packet_get_sequence_number(
+ struct bt_packet *packet, uint64_t *sequence_number)
+{
+ BT_ASSERT_PRE_NON_NULL(packet, "Packet");
+ BT_ASSERT_PRE_NON_NULL(sequence_number, "Sequence number");
+ *sequence_number = packet->seq_num.value;
+ return packet->seq_num.avail;
+}
+
+enum bt_packet_property_availability bt_packet_get_discarded_event_count(
+ struct bt_packet *packet, uint64_t *count)
+{
+ BT_ASSERT_PRE_NON_NULL(packet, "Packet");
+ BT_ASSERT_PRE_NON_NULL(count, "Count");
+ *count = packet->discarded_event_count.value;
+ return packet->discarded_event_count.avail;
+}
+
+enum bt_packet_property_availability bt_packet_get_discarded_packet_count(
+ struct bt_packet *packet, uint64_t *count)
+{
+ BT_ASSERT_PRE_NON_NULL(packet, "Packet");
+ BT_ASSERT_PRE_NON_NULL(count, "Count");
+ *count = packet->discarded_packet_count.value;
+ return packet->discarded_packet_count.avail;
+}
+