aboutsummaryrefslogtreecommitdiff
path: root/parser/csr.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2005-03-25 20:13:40 +0000
committerMarcel Holtmann <marcel@holtmann.org>2005-03-25 20:13:40 +0000
commit0ec1d7cea1ed6b6a7d45018ef6d1ba08084bc30a (patch)
tree086b2fd7de2fea70f78206dd0c89210d8a083c18 /parser/csr.c
parente84f187b4feea92ba018d0c0e2a841d307036f78 (diff)
downloadhcidump-0ec1d7cea1ed6b6a7d45018ef6d1ba08084bc30a.tar.gz
Add BCCMD decoding support
Diffstat (limited to 'parser/csr.c')
-rw-r--r--parser/csr.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/parser/csr.c b/parser/csr.c
index c3a4b71..182874b 100644
--- a/parser/csr.c
+++ b/parser/csr.c
@@ -38,6 +38,35 @@
#define CSR_U16(frm) (btohs(htons(get_u16(frm))))
#define CSR_U32(frm) (btohl(htonl(get_u32(frm))))
+static char *type2str(uint16_t type)
+{
+ switch (type) {
+ case 0x0000:
+ return "Get req";
+ case 0x0001:
+ return "Get rsp";
+ case 0x0002:
+ return "Set req";
+ default:
+ return "Reserved";
+ }
+}
+
+static inline void bccmd_dump(int level, struct frame *frm)
+{
+ uint16_t type, length, seqno, varid, status;
+
+ type = CSR_U16(frm);
+ length = CSR_U16(frm);
+ seqno = CSR_U16(frm);
+ varid = CSR_U16(frm);
+ status = CSR_U16(frm);
+
+ p_indent(level, frm);
+ printf("BCCMD: %s: len %d seqno %d varid 0x%4.4x status %d\n",
+ type2str(type), length, seqno, varid, status);
+}
+
static char *cid2str(uint8_t cid)
{
switch (cid & 0x3f) {
@@ -101,7 +130,13 @@ void csr_dump(int level, struct frame *frm)
cid = desc & 0x3f;
- if (cid == 20) {
+ switch (cid) {
+ case 2:
+ bccmd_dump(level, frm);
+ level++;
+ break;
+
+ case 20:
type = CSR_U8(frm);
if (!p_filter(FILT_LMP)) {
@@ -137,9 +172,12 @@ void csr_dump(int level, struct frame *frm)
p_indent(level, frm);
printf("CSR: Debug (type 0x%2.2x)\n", type);
- } else {
+ break;
+
+ default:
p_indent(level, frm);
printf("CSR: %s (channel %d)%s\n", cid2str(cid), cid, frag2str(desc));
+ break;
}
raw_dump(level, frm);