diff options
author | Andrei Emeltchenko <andrei.emeltchenko@intel.com> | 2011-10-24 12:22:34 +0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2011-10-25 11:14:52 +0200 |
commit | 65f14fc5e1bd8ec573ab9bfe0a4eafaa19041cf2 (patch) | |
tree | 6e4ec9a59e7806352394634ffdb4ecd2f4bb24ec | |
parent | ef5372e347ee00979e6e6e896ad2339e54619ea1 (diff) | |
download | bluez-hcidump-65f14fc5e1bd8ec573ab9bfe0a4eafaa19041cf2.tar.gz |
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
-rw-r--r-- | parser/l2cap.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/parser/l2cap.c b/parser/l2cap.c index 6a5a4b2..696456a 100644 --- a/parser/l2cap.c +++ b/parser/l2cap.c @@ -31,6 +31,7 @@ #include <unistd.h> #include <stdlib.h> #include <string.h> +#include <inttypes.h> #include "parser/parser.h" #include "parser/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); |