Skip to content

Commit a354790

Browse files
committed
tlv_dump: fix off-by-1, add string decode, add dump helper
1 parent 9e9b6ba commit a354790

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

lib/libqrtr.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,16 @@ void *qmi_tlv_get_array(struct qmi_tlv *tlv, uint8_t id, size_t len_size,
178178
int qmi_tlv_set(struct qmi_tlv *tlv, uint8_t id, void *buf, size_t len);
179179
int qmi_tlv_set_array(struct qmi_tlv *tlv, uint8_t id, size_t len_size,
180180
void *buf, size_t len, size_t size);
181-
182181
struct qmi_response_type_v01 *qmi_tlv_get_result(struct qmi_tlv *tlv);
183182

183+
static inline int qmi_tlv_dump_buf(void *buf, size_t len) {
184+
struct qmi_tlv *tlv = qmi_tlv_decode(buf, len);
185+
if (!tlv)
186+
return -1;
187+
qmi_tlv_dump(tlv);
188+
qmi_tlv_free(tlv);
189+
}
190+
184191
/* Initial kernel header didn't expose these */
185192
#ifndef QRTR_NODE_BCAST
186193

lib/qmi_tlv.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <ctype.h>
12
#include <errno.h>
23
#include <string.h>
34
#include <stdint.h>
@@ -227,7 +228,7 @@ struct qmi_response_type_v01 *qmi_tlv_get_result(struct qmi_tlv *tlv)
227228
}
228229

229230
#define MIN(x, y) ((x) < (y) ? (x) : (y))
230-
#define LINE_LENGTH 64
231+
#define LINE_LENGTH 40
231232

232233
static inline uint8_t to_hex(uint8_t ch)
233234
{
@@ -238,7 +239,7 @@ static inline uint8_t to_hex(uint8_t ch)
238239
void qmi_tlv_dump(struct qmi_tlv *tlv) {
239240
struct qmi_tlv_item *item;
240241
struct qmi_header *pkt;
241-
unsigned offset = 0;
242+
unsigned offset = sizeof(struct qmi_header);
242243
void *pkt_data;
243244
int i = 0, li, j, k;
244245
uint8_t ch;
@@ -254,10 +255,11 @@ void qmi_tlv_dump(struct qmi_tlv *tlv) {
254255
printf("<<< msg_id : 0x%1$04x (%1$u)\n", pkt->msg_id);
255256
printf("<<< txn_id : 0x%1$04x (%1$u)\n", pkt->txn_id);
256257
printf("<<< TLVs:\n");
257-
while (offset < tlv->size - sizeof(struct qmi_header)) {
258+
// I do not understand why this -1 is needed
259+
while (offset < tlv->size - 1) {
258260
item = pkt_data + offset;
259261
printf("<<< TLV %d: {id: 0x%02x, len: 0x%02x}\n", i, item->key, item->len);
260-
if (item->len > pkt->msg_len - offset) {
262+
if (item->len > pkt->msg_len + sizeof(struct qmi_header) - offset) {
261263
fprintf(stderr, "Invalid item length!\n");
262264
return;
263265
}
@@ -271,6 +273,18 @@ void qmi_tlv_dump(struct qmi_tlv *tlv) {
271273
line[li++] = to_hex(ch);
272274
line[li++] = k < linelen - 1 ? ':' : ' ';
273275
}
276+
277+
for (; k < LINE_LENGTH; k++) {
278+
line[li++] = ' ';
279+
line[li++] = ' ';
280+
line[li++] = ' ';
281+
}
282+
283+
for (k = 0; k < linelen; k++) {
284+
ch = item->data[j + k];
285+
line[li++] = isprint(ch) ? ch : '.';
286+
}
287+
274288
line[li] = '\0';
275289

276290
printf("%s\n\n", line);

0 commit comments

Comments
 (0)