+static
+enum bt_msg_iter_status switch_packet_state(struct bt_msg_iter *notit)
+{
+ enum bt_msg_iter_status status = BT_MSG_ITER_STATUS_OK;
+
+ /*
+ * We don't put the stream class here because we need to make
+ * sure that all the packets processed by the same message
+ * iterator refer to the same stream class (the first one).
+ */
+ BT_ASSERT(notit);
+
+ if (notit->cur_exp_packet_total_size != -1) {
+ notit->cur_packet_offset += notit->cur_exp_packet_total_size;
+ }
+
+ BT_COMP_LOGD("Switching packet: notit-addr=%p, cur=%zu, "
+ "packet-offset=%" PRId64, notit, notit->buf.at,
+ notit->cur_packet_offset);
+ stack_clear(notit->stack);
+ notit->meta.ec = NULL;
+ BT_PACKET_PUT_REF_AND_RESET(notit->packet);
+ BT_MESSAGE_PUT_REF_AND_RESET(notit->event_msg);
+ release_all_dscopes(notit);
+ notit->cur_dscope_field = NULL;
+
+ /*
+ * Adjust current buffer so that addr points to the beginning of the new
+ * packet.
+ */
+ if (notit->buf.addr) {
+ size_t consumed_bytes = (size_t) (notit->buf.at / CHAR_BIT);
+
+ /* Packets are assumed to start on a byte frontier. */
+ if (notit->buf.at % CHAR_BIT) {
+ BT_COMP_LOGW("Cannot switch packet: current position is not a multiple of 8: "
+ "notit-addr=%p, cur=%zu", notit, notit->buf.at);
+ status = BT_MSG_ITER_STATUS_ERROR;
+ goto end;
+ }
+
+ notit->buf.addr += consumed_bytes;
+ notit->buf.sz -= consumed_bytes;
+ notit->buf.at = 0;
+ notit->buf.packet_offset = 0;
+ BT_COMP_LOGD("Adjusted buffer: addr=%p, size=%zu",
+ notit->buf.addr, notit->buf.sz);
+ }
+
+ notit->cur_exp_packet_content_size = -1;
+ notit->cur_exp_packet_total_size = -1;
+ notit->cur_stream_class_id = -1;
+ notit->cur_event_class_id = -1;
+ notit->cur_data_stream_id = -1;
+ notit->prev_packet_snapshots = notit->snapshots;
+ notit->snapshots.discarded_events = UINT64_C(-1);
+ notit->snapshots.packets = UINT64_C(-1);
+ notit->snapshots.beginning_clock = UINT64_C(-1);
+ notit->snapshots.end_clock = UINT64_C(-1);
+ notit->state = STATE_DSCOPE_TRACE_PACKET_HEADER_BEGIN;
+
+end:
+ return status;
+}
+