From: Petri Savolainen <petri.savolai...@linaro.org> Implemented the new packet payload print function using ODP_PRINT macro. Removed an extra space from the print macro as well as extra null char and line feed from odp_packet_print.
Signed-off-by: Petri Savolainen <petri.savolai...@linaro.org> --- /** Email created from pull request 258 (psavol:next-packet-dump) ** https://github.com/Linaro/odp/pull/258 ** Patch: https://github.com/Linaro/odp/pull/258.patch ** Base sha: 63d92eb289261d1534b5b9e1e04291faa5e45d30 ** Merge commit sha: 08d635e94f01265704fddd47cd98b0ccbdc669d4 **/ .../linux-generic/include/odp_debug_internal.h | 2 +- platform/linux-generic/odp_packet.c | 63 +++++++++++++++++++++- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/platform/linux-generic/include/odp_debug_internal.h b/platform/linux-generic/include/odp_debug_internal.h index 02ae87a90..4c44bebe0 100644 --- a/platform/linux-generic/include/odp_debug_internal.h +++ b/platform/linux-generic/include/odp_debug_internal.h @@ -81,7 +81,7 @@ extern "C" { * specifically for dumping internal data. */ #define ODP_PRINT(fmt, ...) \ - odp_global_data.log_fn(ODP_LOG_PRINT, " " fmt, ##__VA_ARGS__) + odp_global_data.log_fn(ODP_LOG_PRINT, fmt, ##__VA_ARGS__) #ifdef __cplusplus } diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index 603ac7181..67f103b32 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -1739,9 +1739,68 @@ void odp_packet_print(odp_packet_t pkt) seg = odp_packet_next_seg(pkt, seg); } - str[len] = '\0'; + ODP_PRINT("%s\n", str); +} + +void odp_packet_print_data(odp_packet_t pkt, uint32_t offset, + uint32_t byte_len) +{ + odp_packet_hdr_t *hdr = packet_hdr(pkt); + uint32_t bytes_per_row = 16; + int num_rows = (byte_len + bytes_per_row - 1) / bytes_per_row; + int max_len = 256 + (3 * byte_len) + (3 * num_rows); + char str[max_len]; + int len = 0; + int n = max_len - 1; + uint32_t data_len = odp_packet_len(pkt); + pool_t *pool = hdr->buf_hdr.pool_ptr; + + len += snprintf(&str[len], n - len, "Packet\n------\n"); + len += snprintf(&str[len], n - len, + " pool index %" PRIu32 "\n", pool->pool_idx); + len += snprintf(&str[len], n - len, + " buf index %" PRIu32 "\n", hdr->buf_hdr.index); + len += snprintf(&str[len], n - len, + " segcount %" PRIu16 "\n", hdr->buf_hdr.segcount); + len += snprintf(&str[len], n - len, + " data len %" PRIu32 "\n", data_len); + len += snprintf(&str[len], n - len, + " data ptr %p\n", odp_packet_data(pkt)); + len += snprintf(&str[len], n - len, + " print offset %" PRIu32 "\n", offset); + len += snprintf(&str[len], n - len, + " print length %" PRIu32 "\n", byte_len); + + if (offset + byte_len > data_len) { + len += snprintf(&str[len], n - len, " BAD OFFSET OR LEN\n"); + ODP_PRINT("%s\n", str); + return; + } + + while (byte_len) { + uint32_t copy_len; + uint8_t data[bytes_per_row]; + uint32_t i; + + if (byte_len > bytes_per_row) + copy_len = bytes_per_row; + else + copy_len = byte_len; + + odp_packet_copy_to_mem(pkt, offset, copy_len, data); + + len += snprintf(&str[len], n - len, " "); + + for (i = 0; i < copy_len; i++) + len += snprintf(&str[len], n - len, " %02x", data[i]); + + len += snprintf(&str[len], n - len, "\n"); + + byte_len -= copy_len; + offset += copy_len; + } - ODP_PRINT("\n%s\n", str); + ODP_PRINT("%s\n", str); } int odp_packet_is_valid(odp_packet_t pkt)