From 8916fbd7c3bd837bc84d3fb8bb2f3cb4bf8fe087 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 17 Jan 2006 17:18:48 +0000 Subject: [PATCH] hcidump: Add generic RFCOMM streaming helpers --- tools/parser/obex.c | 132 ----------------------------------------- tools/parser/parser.c | 133 ++++++++++++++++++++++++++++++++++++++++++ tools/parser/parser.h | 10 +++- tools/parser/rfcomm.c | 2 +- tools/parser/sdp.c | 14 ++--- 5 files changed, 150 insertions(+), 141 deletions(-) diff --git a/tools/parser/obex.c b/tools/parser/obex.c index 338144221..0a73a795d 100644 --- a/tools/parser/obex.c +++ b/tools/parser/obex.c @@ -36,133 +36,6 @@ #include "parser.h" -#define TABLE_SIZE 20 - -static struct { - uint16_t handle; - uint8_t dlci; - uint8_t opcode; - uint8_t status; - struct frame frm; -} table[TABLE_SIZE]; - -static void del_frame(uint16_t handle, uint8_t dlci) -{ - int i; - - for (i = 0; i < TABLE_SIZE; i++) - if (table[i].handle == handle && table[i].dlci == dlci) { - table[i].handle = 0; - table[i].dlci = 0; - table[i].opcode = 0; - table[i].status = 0; - if (table[i].frm.data) - free(table[i].frm.data); - memset(&table[i].frm, 0, sizeof(struct frame)); - break; - } -} - -static struct frame *add_frame(struct frame *frm) -{ - struct frame *fr; - void *data; - int i, pos = -1; - - for (i = 0; i < TABLE_SIZE; i++) { - if (table[i].handle == frm->handle && table[i].dlci == frm->dlci) { - pos = i; - break; - } - - if (pos < 0 && !table[i].handle && !table[i].dlci) - pos = i; - } - - if (pos < 0) - return frm; - - table[pos].handle = frm->handle; - table[pos].dlci = frm->dlci; - fr = &table[pos].frm; - - data = malloc(fr->len + frm->len); - if (!data) { - perror("Can't allocate OBEX stream buffer"); - del_frame(frm->handle, frm->dlci); - return frm; - } - - if (fr->len > 0) - memcpy(data, fr->ptr, fr->len); - - if (frm->len > 0) - memcpy(data + fr->len, frm->ptr, frm->len); - - if (fr->data) - free(fr->data); - - fr->data = data; - fr->data_len = fr->len + frm->len; - fr->len = fr->data_len; - fr->ptr = fr->data; - fr->dev_id = frm->dev_id; - fr->in = frm->in; - fr->ts = frm->ts; - fr->handle = frm->handle; - fr->cid = frm->cid; - fr->num = frm->num; - fr->dlci = frm->dlci; - fr->channel = frm->channel; - fr->audio_fd = frm->audio_fd; - - return fr; -} - -static uint8_t get_opcode(uint16_t handle, uint8_t dlci) -{ - int i; - - for (i = 0; i < TABLE_SIZE; i++) - if (table[i].handle == handle && table[i].dlci == dlci) - return table[i].opcode; - - return 0x00; -} - -static void set_opcode(uint16_t handle, uint8_t dlci, uint8_t opcode) -{ - int i; - - for (i = 0; i < TABLE_SIZE; i++) - if (table[i].handle == handle && table[i].dlci == dlci) { - table[i].opcode = opcode; - break; - } -} - -static uint8_t get_status(uint16_t handle, uint8_t dlci) -{ - int i; - - for (i = 0; i < TABLE_SIZE; i++) - if (table[i].handle == handle && table[i].dlci == dlci) - return table[i].status; - - return 0x00; -} - -static void set_status(uint16_t handle, uint8_t dlci, uint8_t status) -{ - int i; - - for (i = 0; i < TABLE_SIZE; i++) - if (table[i].handle == handle && table[i].dlci == dlci) { - table[i].status = status; - break; - } -} - static char *opcode2str(uint8_t opcode) { switch (opcode & 0x7f) { @@ -429,8 +302,3 @@ void obex_dump(int level, struct frame *frm) parse_headers(level, frm); } } - -void obex_clear(uint16_t handle, uint8_t dlci) -{ - del_frame(handle, dlci); -} diff --git a/tools/parser/parser.c b/tools/parser/parser.c index c76dc5633..cab8136bc 100644 --- a/tools/parser/parser.c +++ b/tools/parser/parser.c @@ -114,6 +114,139 @@ uint32_t get_proto(uint16_t handle, uint16_t psm, uint8_t channel) return (pos < 0) ? 0 : proto_table[pos].proto; } +#define FRAME_TABLE_SIZE 20 + +static struct { + uint16_t handle; + uint8_t dlci; + uint8_t opcode; + uint8_t status; + struct frame frm; +} frame_table[FRAME_TABLE_SIZE]; + +void del_frame(uint16_t handle, uint8_t dlci) +{ + int i; + + for (i = 0; i < FRAME_TABLE_SIZE; i++) + if (frame_table[i].handle == handle && + frame_table[i].dlci == dlci) { + frame_table[i].handle = 0; + frame_table[i].dlci = 0; + frame_table[i].opcode = 0; + frame_table[i].status = 0; + if (frame_table[i].frm.data) + free(frame_table[i].frm.data); + memset(&frame_table[i].frm, 0, sizeof(struct frame)); + break; + } +} + +struct frame *add_frame(struct frame *frm) +{ + struct frame *fr; + void *data; + int i, pos = -1; + + for (i = 0; i < FRAME_TABLE_SIZE; i++) { + if (frame_table[i].handle == frm->handle && + frame_table[i].dlci == frm->dlci) { + pos = i; + break; + } + + if (pos < 0 && !frame_table[i].handle && !frame_table[i].dlci) + pos = i; + } + + if (pos < 0) + return frm; + + frame_table[pos].handle = frm->handle; + frame_table[pos].dlci = frm->dlci; + fr = &frame_table[pos].frm; + + data = malloc(fr->len + frm->len); + if (!data) { + perror("Can't allocate frame stream buffer"); + del_frame(frm->handle, frm->dlci); + return frm; + } + + if (fr->len > 0) + memcpy(data, fr->ptr, fr->len); + + if (frm->len > 0) + memcpy(data + fr->len, frm->ptr, frm->len); + + if (fr->data) + free(fr->data); + + fr->data = data; + fr->data_len = fr->len + frm->len; + fr->len = fr->data_len; + fr->ptr = fr->data; + fr->dev_id = frm->dev_id; + fr->in = frm->in; + fr->ts = frm->ts; + fr->handle = frm->handle; + fr->cid = frm->cid; + fr->num = frm->num; + fr->dlci = frm->dlci; + fr->channel = frm->channel; + fr->audio_fd = frm->audio_fd; + + return fr; +} + +uint8_t get_opcode(uint16_t handle, uint8_t dlci) +{ + int i; + + for (i = 0; i < FRAME_TABLE_SIZE; i++) + if (frame_table[i].handle == handle && + frame_table[i].dlci == dlci) + return frame_table[i].opcode; + + return 0x00; +} + +void set_opcode(uint16_t handle, uint8_t dlci, uint8_t opcode) +{ + int i; + + for (i = 0; i < FRAME_TABLE_SIZE; i++) + if (frame_table[i].handle == handle && + frame_table[i].dlci == dlci) { + frame_table[i].opcode = opcode; + break; + } +} + +uint8_t get_status(uint16_t handle, uint8_t dlci) +{ + int i; + + for (i = 0; i < FRAME_TABLE_SIZE; i++) + if (frame_table[i].handle == handle && + frame_table[i].dlci == dlci) + return frame_table[i].status; + + return 0x00; +} + +void set_status(uint16_t handle, uint8_t dlci, uint8_t status) +{ + int i; + + for (i = 0; i < FRAME_TABLE_SIZE; i++) + if (frame_table[i].handle == handle && + frame_table[i].dlci == dlci) { + frame_table[i].status = status; + break; + } +} + void ascii_dump(int level, struct frame *frm, int num) { unsigned char *buf = frm->ptr; diff --git a/tools/parser/parser.h b/tools/parser/parser.h index 1b82b57b5..ba166078d 100644 --- a/tools/parser/parser.h +++ b/tools/parser/parser.h @@ -197,8 +197,16 @@ char *get_uuid_name(int uuid); void set_proto(uint16_t handle, uint16_t psm, uint8_t channel, uint32_t proto); uint32_t get_proto(uint16_t handle, uint16_t psm, uint8_t channel); +struct frame *add_frame(struct frame *frm); +void del_frame(uint16_t handle, uint8_t dlci); + +uint8_t get_opcode(uint16_t handle, uint8_t dlci); +void set_opcode(uint16_t handle, uint8_t dlci, uint8_t opcode); + +uint8_t get_status(uint16_t handle, uint8_t dlci); +void set_status(uint16_t handle, uint8_t dlci, uint8_t status); + void l2cap_clear(uint16_t handle); -void obex_clear(uint16_t handle, uint8_t dlci); void ascii_dump(int level, struct frame *frm, int num); void hex_dump(int level, struct frame *frm, int num); diff --git a/tools/parser/rfcomm.c b/tools/parser/rfcomm.c index d576342a3..e7ffc991d 100644 --- a/tools/parser/rfcomm.c +++ b/tools/parser/rfcomm.c @@ -339,7 +339,7 @@ void rfcomm_dump(int level, struct frame *frm) break; case DISC: printf("DISC: "); - obex_clear(frm->handle, GET_DLCI(head.addr)); + del_frame(frm->handle, GET_DLCI(head.addr)); break; default: printf("ERR: "); diff --git a/tools/parser/sdp.c b/tools/parser/sdp.c index f3ddbefc7..9a3121e71 100644 --- a/tools/parser/sdp.c +++ b/tools/parser/sdp.c @@ -601,7 +601,7 @@ static char *pid2str(uint8_t pid) static struct frame frame_table[FRAME_TABLE_SIZE]; -static int add_frame(struct frame *frm, int count) +static int frame_add(struct frame *frm, int count) { register struct frame *fr; register unsigned char *data; @@ -652,11 +652,11 @@ static int add_frame(struct frame *frm, int count) return pos; } -static struct frame *get_frame(struct frame *frm, int count) +static struct frame *frame_get(struct frame *frm, int count) { register int pos; - pos = add_frame(frm, count); + pos = frame_add(frm, count); if (pos < 0) return frm; @@ -754,9 +754,9 @@ void sdp_dump(int level, struct frame *frm) if (cont == 0) { /* Parse AttributeList */ - print_attr_list(level + 1, get_frame(frm, count)); + print_attr_list(level + 1, frame_get(frm, count)); } else - add_frame(frm, count); + frame_add(frm, count); print_cont_state(level + 1, frm->ptr + count); break; @@ -787,9 +787,9 @@ void sdp_dump(int level, struct frame *frm) if (cont == 0) { /* Parse AttributeLists */ - print_attr_lists(level + 1, get_frame(frm, count)); + print_attr_lists(level + 1, frame_get(frm, count)); } else - add_frame(frm, count); + frame_add(frm, count); print_cont_state(level + 1, frm->ptr + count); break; -- 2.47.3