1d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann/*
2d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *
3aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann *  BlueZ - Bluetooth protocol stack for Linux
4d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *
5e5e4f00bb96381f8971b9b1ca674902e9771626cMarcel Holtmann *  Copyright (C) 2004-2011  Marcel Holtmann <marcel@holtmann.org>
6d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *
7d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *
8d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *  This program is free software; you can redistribute it and/or modify
9d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *  it under the terms of the GNU General Public License as published by
10d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *  the Free Software Foundation; either version 2 of the License, or
11d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *  (at your option) any later version.
12d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *
13d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *  This program is distributed in the hope that it will be useful,
14d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *  GNU General Public License for more details.
17d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *
18d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *  You should have received a copy of the GNU General Public License
19d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *  along with this program; if not, write to the Free Software
20aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
21d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann *
22d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann */
23d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann
24aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#ifdef HAVE_CONFIG_H
25aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#include <config.h>
26aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#endif
27aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann
28d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann#include <stdio.h>
29d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann#include <errno.h>
30aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#include <unistd.h>
31aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#include <stdlib.h>
32d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann#include <string.h>
33d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann
34d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann#include <sys/types.h>
35d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann#include <netinet/in.h>
36d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann
37d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann#include "parser.h"
38d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann
39d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmannstatic char *si2str(uint8_t si)
40d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann{
41d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	switch (si & 0x7f) {
42d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x01:
43d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Discover";
44d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x02:
45d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Capabilities";
46d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x03:
47d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Set config";
48d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x04:
49d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Get config";
50d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x05:
51d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Reconfigure";
52d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x06:
53d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Open";
54d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x07:
55d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Start";
56d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x08:
57d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Close";
58d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x09:
59d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Suspend";
60d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x0a:
61d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Abort";
62d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x0b:
63d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Security";
64d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg	case 0x0c:
65d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		return "All Capabilities";
66d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg	case 0x0d:
67d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		return "Delay Report";
68d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	default:
69d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Unknown";
70d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	}
71d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann}
72d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann
73d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmannstatic char *pt2str(uint8_t hdr)
74d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann{
75d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	switch (hdr & 0x0c) {
76d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x00:
77d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Single";
78d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x04:
79d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Start";
80d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x08:
81d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Cont";
82d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x0c:
83d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "End";
84d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	default:
85d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "Unk";
86d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	}
87d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann}
88d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann
89d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmannstatic char *mt2str(uint8_t hdr)
90d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann{
91d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	switch (hdr & 0x03) {
92d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	case 0x00:
93d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "cmd";
94312106553ff029c8970f23011085a0fe8bf25c66Marcel Holtmann	case 0x02:
95d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "rsp";
96312106553ff029c8970f23011085a0fe8bf25c66Marcel Holtmann	case 0x03:
97d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann		return "rej";
98d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	default:
9916dddb442a1e249eea3cce08fbac926d1fd19e1eMarcel Holtmann		return "rfd";
100d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	}
101d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann}
102d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann
103563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic char *media2str(uint8_t type)
104563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
105563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (type) {
106563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0:
107563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Audio";
108563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 1:
109563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Video";
110563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 2:
111563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Multimedia";
112563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	default:
113563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Reserved";
114563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
115563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
116563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
117563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic char *codec2str(uint8_t type, uint8_t codec)
118563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
119563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (type) {
120563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0:
121563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		switch (codec) {
122563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0:
123563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "SBC";
124563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 1:
125563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "MPEG-1,2 Audio";
126563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 2:
127563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "MPEG-2,4 AAC";
128563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 4:
129563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "ATRAC family";
130563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 255:
131563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "non-A2DP";
132563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		default:
133563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "Reserved";
134563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		}
135563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
136563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 1:
137563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		switch (codec) {
138563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 1:
139563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "H.263 baseline";
140563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 2:
141563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "MPEG-4 Visual Simple Profile";
142563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 3:
143563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "H.263 profile 3";
144563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 4:
145563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "H.263 profile 8";
146563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 255:
147563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "Non-VDP";
148563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		default:
149563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			return "Reserved";
150563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		}
151563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
152563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
153452bca1bde500b8a6d830d232c2e3fe27cbe72b6Marcel Holtmann	return "Unknown";
154563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
155563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
156563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic char *cat2str(uint8_t cat)
157563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
158563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (cat) {
159563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 1:
160563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Media Transport";
161563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 2:
162563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Reporting";
163563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 3:
164563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Recovery";
165563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 4:
166563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Content Protection";
167563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 5:
168563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Header Compression";
169563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 6:
170563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Multiplexing";
171563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 7:
172563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Media Codec";
173d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg	case 8:
174d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		return "Delay Reporting";
175563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	default:
176563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		return "Reserved";
177563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
178563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
179563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
180563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic void errorcode(int level, struct frame *frm)
181563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
182563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	uint8_t code;
183563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
184563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	p_indent(level, frm);
185563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	code = get_u8(frm);
186563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	printf("Error code %d\n", code);
187563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
188563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
189563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic void acp_seid(int level, struct frame *frm)
190563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
191563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	uint8_t seid;
192563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
193563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	p_indent(level, frm);
194563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	seid = get_u8(frm);
195563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	printf("ACP SEID %d\n", seid >> 2);
196563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
197563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
198563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic void acp_int_seid(int level, struct frame *frm)
199563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
200563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	uint8_t acp_seid, int_seid;
201563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
202563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	p_indent(level, frm);
203563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	acp_seid = get_u8(frm);
204563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	int_seid = get_u8(frm);
205563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	printf("ACP SEID %d - INT SEID %d\n", acp_seid >> 2, int_seid >> 2);
206563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
207563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
208563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic void capabilities(int level, struct frame *frm)
209563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
210563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	uint8_t cat, len;
211563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
212563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	while (frm->len > 1) {
213563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		p_indent(level, frm);
214563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		cat = get_u8(frm);
215563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		len = get_u8(frm);
216563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
217563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		if (cat == 7) {
218563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			uint8_t type, codec, tmp;
219563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
220563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			type  = get_u8(frm);
221563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			codec = get_u8(frm);
222563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
223563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			printf("%s - %s\n", cat2str(cat), codec2str(type, codec));
224563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
225563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			switch (codec) {
226563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			case 0:
227563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				tmp = get_u8(frm);
228563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				p_indent(level + 1, frm);
229500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann				if (tmp & 0x80)
230563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("16kHz ");
2317593b7efd60a4efc23515ebc72a2e83a78d474a3Marcel Holtmann				if (tmp & 0x40)
232500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann					printf("32kHz ");
233500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann				if (tmp & 0x20)
234563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("44.1kHz ");
235500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann				if (tmp & 0x10)
236563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("48kHz ");
237563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				printf("\n");
238563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				p_indent(level + 1, frm);
239500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann				if (tmp & 0x08)
240563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("Mono ");
2417593b7efd60a4efc23515ebc72a2e83a78d474a3Marcel Holtmann				if (tmp & 0x04)
242500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann					printf("DualChannel ");
243500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann				if (tmp & 0x02)
244563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("Stereo ");
245500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann				if (tmp & 0x01)
246563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("JointStereo ");
247563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				printf("\n");
248563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				tmp = get_u8(frm);
249563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				p_indent(level + 1, frm);
250500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann				if (tmp & 0x80)
251563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("4 ");
2527593b7efd60a4efc23515ebc72a2e83a78d474a3Marcel Holtmann				if (tmp & 0x40)
253500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann					printf("8 ");
254500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann				if (tmp & 0x20)
255563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("12 ");
256500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann				if (tmp & 0x10)
257563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("16 ");
258563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				printf("Blocks\n");
259563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				p_indent(level + 1, frm);
2607593b7efd60a4efc23515ebc72a2e83a78d474a3Marcel Holtmann				if (tmp & 0x08)
261500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann					printf("4 ");
262500ad88a5c71b0c93d2fd93edfd5995f34683f2dMarcel Holtmann				if (tmp & 0x04)
263563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("8 ");
264563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				printf("Subbands\n");
265563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				p_indent(level + 1, frm);
266563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				if (tmp & 0x02)
267563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("SNR ");
268563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				if (tmp & 0x01)
269563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann					printf("Loudness ");
270563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				printf("\n");
271563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				tmp = get_u8(frm);
272563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				p_indent(level + 1, frm);
273563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				printf("Bitpool Range %d-%d\n", tmp, get_u8(frm));
274563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				break;
275563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			default:
276563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				hex_dump(level + 1, frm, len - 2);
277563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				frm->ptr += (len - 2);
278563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				frm->len -= (len - 2);
279563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				break;
280563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			}
281563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		} else {
282563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			printf("%s\n", cat2str(cat));
283563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			hex_dump(level + 1, frm, len);
284563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
285563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			frm->ptr += len;
286563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			frm->len -= len;
287563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		}
288563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
289563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
290563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
291563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic inline void discover(int level, uint8_t hdr, struct frame *frm)
292563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
293563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	uint8_t seid, type;
294563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
295563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (hdr & 0x03) {
296563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x02:
297563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		while (frm->len > 1) {
298563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			p_indent(level, frm);
299563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			seid = get_u8(frm);
300563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			type = get_u8(frm);
301563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			printf("ACP SEID %d - %s %s%s\n",
302563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				seid >> 2, media2str(type >> 4),
303563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				type & 0x08 ? "Sink" : "Source",
304563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann				seid & 0x02 ? " (InUse)" : "");
305563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		}
306563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
307563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x03:
308563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		errorcode(level, frm);
309563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
310563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
311563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
312563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
313563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic inline void get_capabilities(int level, uint8_t hdr, struct frame *frm)
314563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
315563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (hdr & 0x03) {
316563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x00:
317563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		acp_seid(level, frm);
318563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
319563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x02:
320563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		capabilities(level, frm);
321563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
322563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x03:
323563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		errorcode(level, frm);
324563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
325563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
326563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
327563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
328563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic inline void set_configuration(int level, uint8_t hdr, struct frame *frm)
329563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
330563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	uint8_t cat;
331563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
332563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (hdr & 0x03) {
333563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x00:
334563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		acp_int_seid(level, frm);
335563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		capabilities(level, frm);
336563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
337563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x03:
338563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		p_indent(level, frm);
339563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		cat = get_u8(frm);
340563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		printf("%s\n", cat2str(cat));
341563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		errorcode(level, frm);
342563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
343563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
344563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
345563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
346563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic inline void get_configuration(int level, uint8_t hdr, struct frame *frm)
347563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
348563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (hdr & 0x03) {
349563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x00:
350563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		acp_seid(level, frm);
351563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x02:
352563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		capabilities(level, frm);
353563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
354563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x03:
355563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		errorcode(level, frm);
356563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
357563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
358563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
359563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
360563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic inline void reconfigure(int level, uint8_t hdr, struct frame *frm)
361563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
362563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	uint8_t cat;
363563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
364563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (hdr & 0x03) {
365563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x00:
366563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		acp_seid(level, frm);
367563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		capabilities(level, frm);
368563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
369563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x03:
370563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		p_indent(level, frm);
371563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		cat = get_u8(frm);
372563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		printf("%s\n", cat2str(cat));
373563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		errorcode(level, frm);
374563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
375563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
376563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
377563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
378563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic inline void open_close_stream(int level, uint8_t hdr, struct frame *frm)
379563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
380563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (hdr & 0x03) {
381563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x00:
382563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		acp_seid(level, frm);
383563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
384563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x03:
385563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		errorcode(level, frm);
386563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
387563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
388563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
389563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
390563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic inline void start_suspend_stream(int level, uint8_t hdr, struct frame *frm)
391563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
392563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (hdr & 0x03) {
393563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x00:
394563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		while (frm->len > 0)
395563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			acp_seid(level, frm);
396563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
397563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x03:
398563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		acp_seid(level, frm);
399563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		errorcode(level, frm);
400563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
401563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
402563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
403563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
404563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic inline void abort_streaming(int level, uint8_t hdr, struct frame *frm)
405563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
406563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (hdr & 0x03) {
407563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x00:
408563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		acp_seid(level, frm);
409563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
410563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
411563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
412563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
413563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmannstatic inline void security(int level, uint8_t hdr, struct frame *frm)
414563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann{
415563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	switch (hdr & 0x03) {
416563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x00:
417563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		acp_seid(level, frm);
418563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x02:
419563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		hex_dump(level + 1, frm, frm->len);
420563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		frm->ptr += frm->len;
421563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		frm->len = 0;
422563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
423563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	case 0x03:
424563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		errorcode(level, frm);
425563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		break;
426563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann	}
427563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann}
428563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
429d11f7c72ed713424ca8c9548c282954551293550Johan Hedbergstatic inline void delay_report(int level, uint8_t hdr, struct frame *frm)
430d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg{
431d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg	uint8_t seid;
432d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg	uint16_t delay;
433d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg
434d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg	switch (hdr & 0x03) {
435d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg	case 0x00:
436d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		p_indent(level, frm);
437d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		seid = get_u8(frm);
438d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		delay = get_u16(frm);
439d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		printf("ACP SEID %d delay %u.%ums\n", seid >> 2,
440d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg						delay / 10, delay % 10);
441d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		break;
442d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg	case 0x03:
443d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		errorcode(level, frm);
444d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		break;
445d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg	}
446d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg}
447d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg
448d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmannvoid avdtp_dump(int level, struct frame *frm)
449d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann{
450d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann	uint8_t hdr, sid, nsp, type;
451d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann	uint16_t seqn;
452d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann	uint32_t time, ssrc;
453d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann
4541f2ab27c77f01e4aa213844bc3409634eea24d4aMarcel Holtmann	switch (frm->num) {
4551f2ab27c77f01e4aa213844bc3409634eea24d4aMarcel Holtmann	case 1:
4561f2ab27c77f01e4aa213844bc3409634eea24d4aMarcel Holtmann		p_indent(level, frm);
457c8958756bc90521ac900ebfeb650bc4d7a8c0a45Marcel Holtmann		hdr = get_u8(frm);
458d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann
459c8958756bc90521ac900ebfeb650bc4d7a8c0a45Marcel Holtmann		nsp = (hdr & 0x0c) == 0x04 ? get_u8(frm) : 0;
460c8958756bc90521ac900ebfeb650bc4d7a8c0a45Marcel Holtmann		sid = hdr & 0x08 ? 0x00 : get_u8(frm);
461d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann
462c8958756bc90521ac900ebfeb650bc4d7a8c0a45Marcel Holtmann		printf("AVDTP(s): %s %s: transaction %d\n",
463e4218197fc794d7e03d48f644338129ceb9d1e07Marcel Holtmann			hdr & 0x08 ? pt2str(hdr) : si2str(sid), mt2str(hdr), hdr >> 4);
464563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann
465563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		switch (sid & 0x7f) {
466563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0x01:
467563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			discover(level + 1, hdr, frm);
468563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			break;
469563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0x02:
470d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		case 0x0c:
471563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			get_capabilities(level + 1, hdr, frm);
472563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			break;
473563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0x03:
474563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			set_configuration(level + 1, hdr, frm);
475563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			break;
476563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0x04:
477563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			get_configuration(level + 1, hdr, frm);
478563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			break;
479563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0x05:
480563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			reconfigure(level + 1, hdr, frm);
481563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			break;
482563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0x06:
483563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			open_close_stream(level + 1, hdr, frm);
484563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			break;
485563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0x07:
486563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			start_suspend_stream(level + 1, hdr, frm);
487563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			break;
488563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0x08:
489563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			open_close_stream(level + 1, hdr, frm);
490563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			break;
491563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0x09:
492563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			start_suspend_stream(level + 1, hdr, frm);
493563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			break;
494563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0x0a:
495563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			abort_streaming(level + 1, hdr, frm);
496563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			break;
497563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		case 0x0b:
498563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			security(level + 1, hdr, frm);
499563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann			break;
500d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg		case 0x0d:
501d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg			delay_report(level + 1, hdr, frm);
502d11f7c72ed713424ca8c9548c282954551293550Johan Hedberg			break;
503563423c8e0de4403baed6b642fca585634de3c0aMarcel Holtmann		}
5041f2ab27c77f01e4aa213844bc3409634eea24d4aMarcel Holtmann
5051f2ab27c77f01e4aa213844bc3409634eea24d4aMarcel Holtmann		break;
5061f2ab27c77f01e4aa213844bc3409634eea24d4aMarcel Holtmann
5071f2ab27c77f01e4aa213844bc3409634eea24d4aMarcel Holtmann	case 2:
5081f2ab27c77f01e4aa213844bc3409634eea24d4aMarcel Holtmann		p_indent(level, frm);
509d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann		hdr  = get_u8(frm);
510d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann		type = get_u8(frm);
511d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann		seqn = get_u16(frm);
512d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann		time = get_u32(frm);
513d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann		ssrc = get_u32(frm);
514d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann
515d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann		printf("AVDTP(m): ver %d %s%scc %d %spt %d seqn %d time %d ssrc %d\n",
516d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann			hdr >> 6, hdr & 0x20 ? "pad " : "", hdr & 0x10 ? "ext " : "",
517d901b9f0e12271ee0a0baa4a9636d058af92ee1dMarcel Holtmann			hdr & 0xf, type & 0x80 ? "mark " : "", type & 0x7f, seqn, time, ssrc);
5181f2ab27c77f01e4aa213844bc3409634eea24d4aMarcel Holtmann		break;
519c8958756bc90521ac900ebfeb650bc4d7a8c0a45Marcel Holtmann	}
520d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann
521d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann	raw_dump(level, frm);
522d12491e536bff28ee5c3895c6de55eefd052c93dMarcel Holtmann}
523