From 793b8d45c2b3e44f6c0640f021be65776cc0a205 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 12 Nov 2004 21:21:29 +0000 Subject: [PATCH] hcidump: Add BPA parser support --- tools/parser/bpa.c | 63 +++++++++++++++++++++++++++++++++++++++++++ tools/parser/hci.c | 8 ++++++ tools/parser/parser.h | 4 ++- 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 tools/parser/bpa.c diff --git a/tools/parser/bpa.c b/tools/parser/bpa.c new file mode 100644 index 000000000..9f188e060 --- /dev/null +++ b/tools/parser/bpa.c @@ -0,0 +1,63 @@ +/* + * + * Bluetooth packet analyzer - BPA parser + * + * Copyright (C) 2004 Marcel Holtmann + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * $Id$ + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include "parser.h" + +#define BPA_U8(frm) (get_u8(frm)) +#define BPA_U16(frm) (htobs(htons(get_u16(frm)))) +#define BPA_U32(frm) (htobl(htonl(get_u32(frm)))) + +void bpa_dump(int level, struct frame *frm) +{ + uint8_t id, status, channel; + uint16_t num, len; + uint32_t time; + + id = get_u8(frm); + num = get_u16(frm); + len = BPA_U16(frm); + + status = get_u8(frm); + time = get_u32(frm); + channel = get_u8(frm); + + p_indent(level, frm); + printf("BPA: id %d num %d status 0x%02x time %d channel %d\n", + id, num, status, time, channel); + + raw_dump(level, frm); +} diff --git a/tools/parser/hci.c b/tools/parser/hci.c index 260c23f5a..120298890 100644 --- a/tools/parser/hci.c +++ b/tools/parser/hci.c @@ -428,6 +428,14 @@ static inline void sco_dump(int level, struct frame *frm) static inline void vendor_dump(int level, struct frame *frm) { + if (p_filter(FILT_HCI)) + return; + + if (get_manufacturer() == 12) { + bpa_dump(level, frm); + return; + } + p_indent(level, frm); printf("Vendor data: len %d\n", frm->len); raw_dump(level, frm); diff --git a/tools/parser/parser.h b/tools/parser/parser.h index bc44e0ccf..7b1d84e13 100644 --- a/tools/parser/parser.h +++ b/tools/parser/parser.h @@ -67,7 +67,8 @@ struct frame { #define FILT_OBEX 0x00010000 #define FILT_CAPI 0x00020000 -#define FILT_CSR 0x1000000f +#define FILT_CSR 0x1000000a +#define FILT_BPA 0x1000000f #define STRUCT_OFFSET(type, member) ((uint8_t *)&(((type *)NULL)->member) - \ (uint8_t *)((type *)NULL)) @@ -181,6 +182,7 @@ void avdtp_dump(int level, struct frame *frm); void obex_dump(int level, struct frame *frm); void capi_dump(int level, struct frame *frm); void csr_dump(int level, struct frame *frm); +void bpa_dump(int level, struct frame *frm); static inline void parse(struct frame *frm) { -- 2.47.3