3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2004-2011 Marcel Holtmann <marcel@holtmann.org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
36 static char *si2str(uint8_t si)
42 return "Capabilities";
62 return "All Capabilities";
64 return "Delay Report";
70 static char *pt2str(uint8_t hdr)
86 static char *mt2str(uint8_t hdr)
100 static char *media2str(uint8_t type)
114 static char *codec2str(uint8_t type, uint8_t codec)
122 return "MPEG-1,2 Audio";
124 return "MPEG-2,4 AAC";
126 return "ATRAC family";
136 return "H.263 baseline";
138 return "MPEG-4 Visual Simple Profile";
140 return "H.263 profile 3";
142 return "H.263 profile 8";
153 static char *cat2str(uint8_t cat)
157 return "Media Transport";
163 return "Content Protection";
165 return "Header Compression";
167 return "Multiplexing";
169 return "Media Codec";
171 return "Delay Reporting";
177 static void errorcode(int level, struct frame *frm)
181 p_indent(level, frm);
183 printf("Error code %d\n", code);
186 static void acp_seid(int level, struct frame *frm)
190 p_indent(level, frm);
192 printf("ACP SEID %d\n", seid >> 2);
195 static void acp_int_seid(int level, struct frame *frm)
197 uint8_t acp_seid, int_seid;
199 p_indent(level, frm);
200 acp_seid = get_u8(frm);
201 int_seid = get_u8(frm);
202 printf("ACP SEID %d - INT SEID %d\n", acp_seid >> 2, int_seid >> 2);
205 static void capabilities(int level, struct frame *frm)
209 while (frm->len > 1) {
210 p_indent(level, frm);
215 uint8_t type, codec, tmp;
220 printf("%s - %s\n", cat2str(cat), codec2str(type, codec));
225 p_indent(level + 1, frm);
235 p_indent(level + 1, frm);
239 printf("DualChannel ");
243 printf("JointStereo ");
246 p_indent(level + 1, frm);
256 p_indent(level + 1, frm);
261 printf("Subbands\n");
262 p_indent(level + 1, frm);
269 p_indent(level + 1, frm);
270 printf("Bitpool Range %d-%d\n", tmp, get_u8(frm));
273 hex_dump(level + 1, frm, len - 2);
274 frm->ptr += (len - 2);
275 frm->len -= (len - 2);
279 printf("%s\n", cat2str(cat));
280 hex_dump(level + 1, frm, len);
288 static inline void discover(int level, uint8_t hdr, struct frame *frm)
292 switch (hdr & 0x03) {
294 while (frm->len > 1) {
295 p_indent(level, frm);
298 printf("ACP SEID %d - %s %s%s\n",
299 seid >> 2, media2str(type >> 4),
300 type & 0x08 ? "Sink" : "Source",
301 seid & 0x02 ? " (InUse)" : "");
305 errorcode(level, frm);
310 static inline void get_capabilities(int level, uint8_t hdr, struct frame *frm)
312 switch (hdr & 0x03) {
314 acp_seid(level, frm);
317 capabilities(level, frm);
320 errorcode(level, frm);
325 static inline void set_configuration(int level, uint8_t hdr, struct frame *frm)
329 switch (hdr & 0x03) {
331 acp_int_seid(level, frm);
332 capabilities(level, frm);
335 p_indent(level, frm);
337 printf("%s\n", cat2str(cat));
338 errorcode(level, frm);
343 static inline void get_configuration(int level, uint8_t hdr, struct frame *frm)
345 switch (hdr & 0x03) {
347 acp_seid(level, frm);
349 capabilities(level, frm);
352 errorcode(level, frm);
357 static inline void reconfigure(int level, uint8_t hdr, struct frame *frm)
361 switch (hdr & 0x03) {
363 acp_seid(level, frm);
364 capabilities(level, frm);
367 p_indent(level, frm);
369 printf("%s\n", cat2str(cat));
370 errorcode(level, frm);
375 static inline void open_close_stream(int level, uint8_t hdr, struct frame *frm)
377 switch (hdr & 0x03) {
379 acp_seid(level, frm);
382 errorcode(level, frm);
387 static inline void start_suspend_stream(int level, uint8_t hdr, struct frame *frm)
389 switch (hdr & 0x03) {
392 acp_seid(level, frm);
395 acp_seid(level, frm);
396 errorcode(level, frm);
401 static inline void abort_streaming(int level, uint8_t hdr, struct frame *frm)
403 switch (hdr & 0x03) {
405 acp_seid(level, frm);
410 static inline void security(int level, uint8_t hdr, struct frame *frm)
412 switch (hdr & 0x03) {
414 acp_seid(level, frm);
416 hex_dump(level + 1, frm, frm->len);
417 frm->ptr += frm->len;
421 errorcode(level, frm);
426 static inline void delay_report(int level, uint8_t hdr, struct frame *frm)
431 switch (hdr & 0x03) {
433 p_indent(level, frm);
435 delay = get_u16(frm);
436 printf("ACP SEID %d delay %u.%ums\n", seid >> 2,
437 delay / 10, delay % 10);
440 errorcode(level, frm);
445 void avdtp_dump(int level, struct frame *frm)
447 uint8_t hdr, sid, nsp, type;
453 p_indent(level, frm);
456 nsp = (hdr & 0x0c) == 0x04 ? get_u8(frm) : 0;
457 sid = hdr & 0x08 ? 0x00 : get_u8(frm);
459 printf("AVDTP(s): %s %s: transaction %d nsp 0x%02x\n",
460 hdr & 0x08 ? pt2str(hdr) : si2str(sid),
461 mt2str(hdr), hdr >> 4, nsp);
463 switch (sid & 0x7f) {
465 discover(level + 1, hdr, frm);
469 get_capabilities(level + 1, hdr, frm);
472 set_configuration(level + 1, hdr, frm);
475 get_configuration(level + 1, hdr, frm);
478 reconfigure(level + 1, hdr, frm);
481 open_close_stream(level + 1, hdr, frm);
484 start_suspend_stream(level + 1, hdr, frm);
487 open_close_stream(level + 1, hdr, frm);
490 start_suspend_stream(level + 1, hdr, frm);
493 abort_streaming(level + 1, hdr, frm);
496 security(level + 1, hdr, frm);
499 delay_report(level + 1, hdr, frm);
506 p_indent(level, frm);
513 printf("AVDTP(m): ver %d %s%scc %d %spt %d seqn %d time %d ssrc %d\n",
514 hdr >> 6, hdr & 0x20 ? "pad " : "", hdr & 0x10 ? "ext " : "",
515 hdr & 0xf, type & 0x80 ? "mark " : "", type & 0x7f, seqn, time, ssrc);
519 raw_dump(level, frm);