blob: 6d092af46998330df87ab3e8a388f5bafd9e1c1f [file] [log] [blame]
/*
* Copyright (c) 2020 Demant
*
* SPDX-License-Identifier: Apache-2.0
*
* Run this test from zephyr directory as:
*
* ./scripts/twister --coverage -p native_posix -v -T tests/bluetooth/ctrl_isoal/
*
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <zephyr/types.h>
#include <zephyr/ztest.h>
#include <zephyr/ztest_error_hook.h>
#include <zephyr/toolchain.h>
#include <zephyr/sys/util.h>
#include <zephyr/kernel.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/bluetooth/hci.h>
#include "util/memq.h"
#include "pdu_df.h"
#include "lll/pdu_vendor.h"
#include "pdu.h"
#include "ll.h"
#include "lll.h"
#include "lll_conn_iso.h"
#include "lll_iso_tx.h"
#include "isoal.h"
#include "ull_iso_types.h"
#include "isoal_test_common.h"
#include "isoal_test_debug.h"
#if defined(DEBUG_TEST)
/**
* Print contents of a RX PDU
* @param[in] pdu_meta Pointer to PDU structure including meta information
*/
void isoal_test_debug_print_rx_pdu(struct isoal_pdu_rx *pdu_meta)
{
zassert_not_null(pdu_meta, "");
PRINT("\n");
PRINT("PDU %04u (%10u) | %12s [%10s] %03u: ",
(uint32_t) pdu_meta->meta->payload_number,
(uint32_t) pdu_meta->meta->timestamp,
LLID_TO_STR(pdu_meta->pdu->ll_id),
DU_ERR_TO_STR(pdu_meta->meta->status),
pdu_meta->pdu->length);
for (int i = 0; i < pdu_meta->pdu->length; i++) {
PRINT("%02x ", pdu_meta->pdu->payload[i]);
}
PRINT("\n");
PRINT("\n");
}
/**
* Print contents of RX SDU
* @param sink_ctx Sink context provided when SDU is emitted
* @param sdu_frag Information on emitted fragment
* @param sdu Information collated for SDu
*/
void isoal_test_debug_print_rx_sdu(const struct isoal_sink *sink_ctx,
const struct isoal_emitted_sdu_frag *sdu_frag,
const struct isoal_emitted_sdu *sdu)
{
zassert_not_null(sink_ctx, "");
zassert_not_null(sdu_frag, "");
zassert_not_null(sdu, "");
uint8_t *buf = ((struct rx_sdu_frag_buffer *)sdu_frag->sdu.contents.dbuf)->sdu;
uint16_t len = sdu_frag->sdu_frag_size;
PRINT("\n");
PRINT("SDU %04d (%10d) | %12s [%10s] %03d: ",
sdu_frag->sdu.seqn,
sdu_frag->sdu.timestamp,
STATE_TO_STR(sdu_frag->sdu_state),
DU_ERR_TO_STR(sdu_frag->sdu.status),
len);
for (int i = 0; i < len; i++) {
PRINT("%02x ", buf[i]);
}
PRINT("\n");
PRINT(" %17s %12s [%10s] %03d ",
"Collated-",
(sdu->total_sdu_size != len ||
sdu->collated_status != sdu_frag->sdu.status ?
"!! DIFF !!" : ""),
DU_ERR_TO_STR(sdu->collated_status),
sdu->total_sdu_size);
PRINT("\n");
PRINT("\n");
}
/**
* Print contents of a TX PDU
* @param[in] node_tx Pointer to PDU structure including meta information
*/
void isoal_test_debug_print_tx_pdu(struct node_tx_iso *node_tx)
{
struct pdu_iso *pdu;
uint8_t seg_length;
zassert_not_null(node_tx, "");
pdu = (struct pdu_iso *)node_tx->pdu;
seg_length = 0;
zassert_not_null(pdu, "");
PRINT("\n");
PRINT("PDU %04u ( %02u ) | %12s | %03u: ",
(uint32_t) node_tx->payload_count,
node_tx->sdu_fragments,
LLID_TO_STR(pdu->ll_id),
pdu->length);
for (int i = 0; i < pdu->length; i++) {
if (seg_length == 0 && pdu->ll_id == PDU_BIS_LLID_FRAMED) {
seg_length = pdu->payload[i+1];
PRINT("[%s %s %03u]",
pdu->payload[i] & BIT(0) ? "C" : "S",
pdu->payload[i] & BIT(1) ? "C" : "-",
pdu->payload[i+1]);
if ((pdu->payload[i] & BIT(0)) == 0) {
PRINT("(%8uus)",
((uint32_t)pdu->payload[i+2] +
((uint32_t)pdu->payload[i+3] << 8) +
((uint32_t)pdu->payload[i+4] << 16)));
}
PRINT(" / ");
PRINT("[%02x %02x]",
pdu->payload[i],
pdu->payload[i+1]);
if ((pdu->payload[i] & BIT(0)) == 0) {
PRINT("(%02x %02x %02x)",
(uint32_t)pdu->payload[i+4],
(uint32_t)pdu->payload[i+3],
(uint32_t)pdu->payload[i+2]);
}
PRINT(" : ");
seg_length -= pdu->payload[i] & BIT(0) ? 0 : PDU_ISO_SEG_TIMEOFFSET_SIZE;
i = i + PDU_ISO_SEG_HDR_SIZE +
(pdu->payload[i] & BIT(0) ? 0 : PDU_ISO_SEG_TIMEOFFSET_SIZE);
}
PRINT("%02x ", pdu->payload[i]);
seg_length--;
if (seg_length == 0 && pdu->ll_id == PDU_BIS_LLID_FRAMED) {
PRINT("\n%44s", "");
}
}
PRINT("\n");
PRINT("\n");
}
/**
* Print contents of TX SDU
* @param[in] sink_ctx Sink context provided when SDU is emitted
* @param[in] buf SDU data buffer pointer
*/
void isoal_test_debug_print_tx_sdu(struct isoal_sdu_tx *tx_sdu)
{
uint8_t *buf;
uint16_t len;
zassert_not_null(tx_sdu, "");
buf = tx_sdu->dbuf;
len = tx_sdu->size;
PRINT("\n");
PRINT("SDU %04u (%10u) | %12s | %03u: ",
tx_sdu->packet_sn,
tx_sdu->time_stamp,
STATE_TO_STR(tx_sdu->sdu_state),
len);
for (int i = 0; i < len; i++) {
PRINT("%02x ", buf[i]);
}
PRINT("\n");
PRINT(" Ref. <%10u>\n", tx_sdu->grp_ref_point);
PRINT(" Event <%10u>\n", (uint32_t)tx_sdu->target_event);
PRINT("\n");
}
#else /* DEBUG_TEST */
void isoal_test_debug_print_rx_pdu(struct isoal_pdu_rx *pdu_meta) {}
void isoal_test_debug_print_rx_sdu(const struct isoal_sink *sink_ctx,
const struct isoal_emitted_sdu_frag *sdu_frag,
const struct isoal_emitted_sdu *sdu)
{
}
void isoal_test_debug_print_tx_pdu(struct node_tx_iso *node_tx) {}
void isoal_test_debug_print_tx_sdu(struct isoal_sdu_tx *tx_sdu) {}
#endif /* DEBUG_TEST */
#if defined(DEBUG_TRACE)
/**
* Print function trace
* @param func Function name
* @param status Status
*/
void isoal_test_debug_trace_func_call(const uint8_t *func, const uint8_t *status)
{
PRINT("%s :: %s\n", func, status);
}
#else /* DEBUG_TRACE */
void isoal_test_debug_trace_func_call(const uint8_t *func, const uint8_t *status) {}
#endif /* DEBUG_TRACE */