From 6ad329e4d2436a1172bf20a87dd8f787603ca951 Mon Sep 17 00:00:00 2001 From: Andrei Emeltchenko Date: Mon, 24 Oct 2011 12:22:34 +0300 Subject: [PATCH] hcidump: Decode fixed channel list info rsp Decode fixed channels in information response < ACL data: handle 1 flags 0x00 dlen 10 L2CAP(s): Info req: type 3 > ACL data: handle 1 flags 0x02 dlen 20 L2CAP(s): Info rsp: type 3 result 0 Fixed channel list 0x0000000a L2CAP Signalling Channel AMP Manager Protocol --- tools/parser/l2cap.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/tools/parser/l2cap.c b/tools/parser/l2cap.c index 9fad9bee2..5416cf8b6 100644 --- a/tools/parser/l2cap.c +++ b/tools/parser/l2cap.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "parser.h" #include "sdp.h" @@ -61,10 +62,12 @@ static cid_info cid_table[2][CID_TABLE_SIZE]; #define DCID cid_table[1] /* Can we move this to l2cap.h? */ -static struct { +struct features { char *name; int flag; -} l2cap_features[] = { +}; + +static struct features l2cap_features[] = { { "Flow control mode", L2CAP_FEAT_FLOWCTL }, { "Retransmission mode", L2CAP_FEAT_RETRANS }, { "Bi-directional QoS", L2CAP_FEAT_BIDIR_QOS }, @@ -78,6 +81,13 @@ static struct { { 0 } }; +static struct features l2cap_fix_chan[] = { + { "L2CAP Signalling Channel", L2CAP_FC_L2CAP }, + { "L2CAP Connless", L2CAP_FC_CONNLESS }, + { "AMP Manager Protocol", L2CAP_FC_A2MP }, + { 0 } +}; + static struct frame *add_handle(uint16_t handle) { register handle_info *t = handle_table; @@ -728,6 +738,7 @@ static inline void echo_rsp(int level, l2cap_cmd_hdr *cmd, struct frame *frm) static void info_opt(int level, int type, void *ptr, int len) { uint32_t mask; + uint64_t fc_mask; int i; p_indent(level, 0); @@ -747,7 +758,14 @@ static void info_opt(int level, int type, void *ptr, int len) } break; case 0x0003: - printf("Fixed channel list\n"); + fc_mask = bt_get_le64(ptr); + printf("Fixed channel list 0x%8.8" PRIx64 "\n", fc_mask); + if (parser.flags & DUMP_VERBOSE) + for (i=0; l2cap_fix_chan[i].name; i++) + if (fc_mask & l2cap_fix_chan[i].flag) { + p_indent(level + 1, 0); + printf("%s\n", l2cap_fix_chan[i].name); + } break; default: printf("Unknown (len %d)\n", len); -- 2.47.3