Blame tools/parser/avdtp.c

Packit 34410b
/*
Packit 34410b
 *
Packit 34410b
 *  BlueZ - Bluetooth protocol stack for Linux
Packit 34410b
 *
Packit 34410b
 *  Copyright (C) 2004-2011  Marcel Holtmann <marcel@holtmann.org>
Packit 34410b
 *
Packit 34410b
 *
Packit 34410b
 *  This program is free software; you can redistribute it and/or modify
Packit 34410b
 *  it under the terms of the GNU General Public License as published by
Packit 34410b
 *  the Free Software Foundation; either version 2 of the License, or
Packit 34410b
 *  (at your option) any later version.
Packit 34410b
 *
Packit 34410b
 *  This program is distributed in the hope that it will be useful,
Packit 34410b
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 34410b
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 34410b
 *  GNU General Public License for more details.
Packit 34410b
 *
Packit 34410b
 *  You should have received a copy of the GNU General Public License
Packit 34410b
 *  along with this program; if not, write to the Free Software
Packit 34410b
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Packit 34410b
 *
Packit 34410b
 */
Packit 34410b
Packit 34410b
#ifdef HAVE_CONFIG_H
Packit 34410b
#include <config.h>
Packit 34410b
#endif
Packit 34410b
Packit 34410b
#define _GNU_SOURCE
Packit 34410b
#include <stdio.h>
Packit 34410b
#include <errno.h>
Packit 34410b
#include <unistd.h>
Packit 34410b
#include <stdlib.h>
Packit 34410b
#include <string.h>
Packit 34410b
Packit 34410b
#include "parser.h"
Packit 34410b
Packit 34410b
static char *si2str(uint8_t si)
Packit 34410b
{
Packit 34410b
	switch (si & 0x7f) {
Packit 34410b
	case 0x01:
Packit 34410b
		return "Discover";
Packit 34410b
	case 0x02:
Packit 34410b
		return "Capabilities";
Packit 34410b
	case 0x03:
Packit 34410b
		return "Set config";
Packit 34410b
	case 0x04:
Packit 34410b
		return "Get config";
Packit 34410b
	case 0x05:
Packit 34410b
		return "Reconfigure";
Packit 34410b
	case 0x06:
Packit 34410b
		return "Open";
Packit 34410b
	case 0x07:
Packit 34410b
		return "Start";
Packit 34410b
	case 0x08:
Packit 34410b
		return "Close";
Packit 34410b
	case 0x09:
Packit 34410b
		return "Suspend";
Packit 34410b
	case 0x0a:
Packit 34410b
		return "Abort";
Packit 34410b
	case 0x0b:
Packit 34410b
		return "Security";
Packit 34410b
	case 0x0c:
Packit 34410b
		return "All Capabilities";
Packit 34410b
	case 0x0d:
Packit 34410b
		return "Delay Report";
Packit 34410b
	default:
Packit 34410b
		return "Unknown";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static char *pt2str(uint8_t hdr)
Packit 34410b
{
Packit 34410b
	switch (hdr & 0x0c) {
Packit 34410b
	case 0x00:
Packit 34410b
		return "Single";
Packit 34410b
	case 0x04:
Packit 34410b
		return "Start";
Packit 34410b
	case 0x08:
Packit 34410b
		return "Cont";
Packit 34410b
	case 0x0c:
Packit 34410b
		return "End";
Packit 34410b
	default:
Packit 34410b
		return "Unk";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static char *mt2str(uint8_t hdr)
Packit 34410b
{
Packit 34410b
	switch (hdr & 0x03) {
Packit 34410b
	case 0x00:
Packit 34410b
		return "cmd";
Packit 34410b
	case 0x02:
Packit 34410b
		return "rsp";
Packit 34410b
	case 0x03:
Packit 34410b
		return "rej";
Packit 34410b
	default:
Packit 34410b
		return "rfd";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static char *media2str(uint8_t type)
Packit 34410b
{
Packit 34410b
	switch (type) {
Packit 34410b
	case 0:
Packit 34410b
		return "Audio";
Packit 34410b
	case 1:
Packit 34410b
		return "Video";
Packit 34410b
	case 2:
Packit 34410b
		return "Multimedia";
Packit 34410b
	default:
Packit 34410b
		return "Reserved";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static char *codec2str(uint8_t type, uint8_t codec)
Packit 34410b
{
Packit 34410b
	switch (type) {
Packit 34410b
	case 0:
Packit 34410b
		switch (codec) {
Packit 34410b
		case 0:
Packit 34410b
			return "SBC";
Packit 34410b
		case 1:
Packit 34410b
			return "MPEG-1,2 Audio";
Packit 34410b
		case 2:
Packit 34410b
			return "MPEG-2,4 AAC";
Packit 34410b
		case 4:
Packit 34410b
			return "ATRAC family";
Packit 34410b
		case 255:
Packit 34410b
			return "non-A2DP";
Packit 34410b
		default:
Packit 34410b
			return "Reserved";
Packit 34410b
		}
Packit 34410b
		break;
Packit 34410b
	case 1:
Packit 34410b
		switch (codec) {
Packit 34410b
		case 1:
Packit 34410b
			return "H.263 baseline";
Packit 34410b
		case 2:
Packit 34410b
			return "MPEG-4 Visual Simple Profile";
Packit 34410b
		case 3:
Packit 34410b
			return "H.263 profile 3";
Packit 34410b
		case 4:
Packit 34410b
			return "H.263 profile 8";
Packit 34410b
		case 255:
Packit 34410b
			return "Non-VDP";
Packit 34410b
		default:
Packit 34410b
			return "Reserved";
Packit 34410b
		}
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
	return "Unknown";
Packit 34410b
}
Packit 34410b
Packit 34410b
static char *vndcodec2str(uint32_t vendor, uint16_t vndcodec)
Packit 34410b
{
Packit 34410b
	if (vendor == 0x0000004f && vndcodec == 0x0001)
Packit 34410b
		return "aptX";
Packit 34410b
	else if (vendor == 0x0000012d && vndcodec == 0x00aa)
Packit 34410b
		return "LDAC";
Packit 34410b
	return "Unknown";
Packit 34410b
}
Packit 34410b
Packit 34410b
static char *cat2str(uint8_t cat)
Packit 34410b
{
Packit 34410b
	switch (cat) {
Packit 34410b
	case 1:
Packit 34410b
		return "Media Transport";
Packit 34410b
	case 2:
Packit 34410b
		return "Reporting";
Packit 34410b
	case 3:
Packit 34410b
		return "Recovery";
Packit 34410b
	case 4:
Packit 34410b
		return "Content Protection";
Packit 34410b
	case 5:
Packit 34410b
		return "Header Compression";
Packit 34410b
	case 6:
Packit 34410b
		return "Multiplexing";
Packit 34410b
	case 7:
Packit 34410b
		return "Media Codec";
Packit 34410b
	case 8:
Packit 34410b
		return "Delay Reporting";
Packit 34410b
	default:
Packit 34410b
		return "Reserved";
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static void errorcode(int level, struct frame *frm)
Packit 34410b
{
Packit 34410b
	uint8_t code;
Packit 34410b
Packit 34410b
	p_indent(level, frm);
Packit 34410b
	code = p_get_u8(frm);
Packit 34410b
	printf("Error code %d\n", code);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void acp_seid(int level, struct frame *frm)
Packit 34410b
{
Packit 34410b
	uint8_t seid;
Packit 34410b
Packit 34410b
	p_indent(level, frm);
Packit 34410b
	seid = p_get_u8(frm);
Packit 34410b
	printf("ACP SEID %d\n", seid >> 2);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void acp_int_seid(int level, struct frame *frm)
Packit 34410b
{
Packit 34410b
	uint8_t acp_seid, int_seid;
Packit 34410b
Packit 34410b
	p_indent(level, frm);
Packit 34410b
	acp_seid = p_get_u8(frm);
Packit 34410b
	int_seid = p_get_u8(frm);
Packit 34410b
	printf("ACP SEID %d - INT SEID %d\n", acp_seid >> 2, int_seid >> 2);
Packit 34410b
}
Packit 34410b
Packit 34410b
static void capabilities(int level, struct frame *frm)
Packit 34410b
{
Packit 34410b
	uint8_t cat, len;
Packit 34410b
Packit 34410b
	while (frm->len > 1) {
Packit 34410b
		p_indent(level, frm);
Packit 34410b
		cat = p_get_u8(frm);
Packit 34410b
		len = p_get_u8(frm);
Packit 34410b
Packit 34410b
		if (cat == 7) {
Packit 34410b
			uint8_t type, codec;
Packit 34410b
			uint16_t tmp, freq, vndcodec = 0;
Packit 34410b
			uint32_t bitrate, vendor = 0;
Packit 34410b
			int i;
Packit 34410b
Packit 34410b
			type  = p_get_u8(frm);
Packit 34410b
			codec = p_get_u8(frm);
Packit 34410b
Packit 34410b
			if (codec == 255) {
Packit 34410b
				vendor = btohl(htonl(p_get_u32(frm)));
Packit 34410b
				vndcodec = btohs(htons(p_get_u16(frm)));
Packit 34410b
Packit 34410b
				printf("%s - %s (%s)\n", cat2str(cat),
Packit 34410b
						codec2str(type, codec),
Packit 34410b
						vndcodec2str(vendor, vndcodec));
Packit 34410b
			} else {
Packit 34410b
				printf("%s - %s\n", cat2str(cat),
Packit 34410b
							codec2str(type, codec));
Packit 34410b
			}
Packit 34410b
Packit 34410b
			switch (codec) {
Packit 34410b
			case 0:
Packit 34410b
				tmp = p_get_u8(frm);
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				if (tmp & 0x80)
Packit 34410b
					printf("16kHz ");
Packit 34410b
				if (tmp & 0x40)
Packit 34410b
					printf("32kHz ");
Packit 34410b
				if (tmp & 0x20)
Packit 34410b
					printf("44.1kHz ");
Packit 34410b
				if (tmp & 0x10)
Packit 34410b
					printf("48kHz ");
Packit 34410b
				printf("\n");
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				if (tmp & 0x08)
Packit 34410b
					printf("Mono ");
Packit 34410b
				if (tmp & 0x04)
Packit 34410b
					printf("DualChannel ");
Packit 34410b
				if (tmp & 0x02)
Packit 34410b
					printf("Stereo ");
Packit 34410b
				if (tmp & 0x01)
Packit 34410b
					printf("JointStereo ");
Packit 34410b
				printf("\n");
Packit 34410b
				tmp = p_get_u8(frm);
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				if (tmp & 0x80)
Packit 34410b
					printf("4 ");
Packit 34410b
				if (tmp & 0x40)
Packit 34410b
					printf("8 ");
Packit 34410b
				if (tmp & 0x20)
Packit 34410b
					printf("12 ");
Packit 34410b
				if (tmp & 0x10)
Packit 34410b
					printf("16 ");
Packit 34410b
				printf("Blocks\n");
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				if (tmp & 0x08)
Packit 34410b
					printf("4 ");
Packit 34410b
				if (tmp & 0x04)
Packit 34410b
					printf("8 ");
Packit 34410b
				printf("Subbands\n");
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				if (tmp & 0x02)
Packit 34410b
					printf("SNR ");
Packit 34410b
				if (tmp & 0x01)
Packit 34410b
					printf("Loudness ");
Packit 34410b
				printf("\n");
Packit 34410b
				tmp = p_get_u8(frm);
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				printf("Bitpool Range %d-%d\n", tmp, p_get_u8(frm));
Packit 34410b
				break;
Packit 34410b
			case 1:
Packit 34410b
				tmp = p_get_u8(frm);
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				printf("Layers: ");
Packit 34410b
				if (tmp & 0x80)
Packit 34410b
					printf("1 ");
Packit 34410b
				if (tmp & 0x40)
Packit 34410b
					printf("2 ");
Packit 34410b
				if (tmp & 0x20)
Packit 34410b
					printf("3 ");
Packit 34410b
				printf("\n");
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				printf("CRC Protection: %s\n",
Packit 34410b
						tmp & 0x10 ? "Yes" : "No");
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				if (tmp & 0x08)
Packit 34410b
					printf("Mono ");
Packit 34410b
				if (tmp & 0x04)
Packit 34410b
					printf("DualChannel ");
Packit 34410b
				if (tmp & 0x02)
Packit 34410b
					printf("Stereo ");
Packit 34410b
				if (tmp & 0x01)
Packit 34410b
					printf("JointStereo ");
Packit 34410b
				printf("\n");
Packit 34410b
				tmp = p_get_u8(frm);
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				printf("Media Payload Format: RFC-2250 %s\n",
Packit 34410b
						tmp & 0x40 ? "RFC-3119" : "");
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				if (tmp & 0x20)
Packit 34410b
					printf("16kHz ");
Packit 34410b
				if (tmp & 0x10)
Packit 34410b
					printf("22.05kHz ");
Packit 34410b
				if (tmp & 0x08)
Packit 34410b
					printf("24kHz ");
Packit 34410b
				if (tmp & 0x04)
Packit 34410b
					printf("32kHz ");
Packit 34410b
				if (tmp & 0x02)
Packit 34410b
					printf("44.1kHz ");
Packit 34410b
				if (tmp & 0x01)
Packit 34410b
					printf("48kHz ");
Packit 34410b
				printf("\n");
Packit 34410b
				tmp = p_get_u16(frm);
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				printf("VBR: %s\n",
Packit 34410b
						tmp & 0x8000 ? "Yes" : "No");
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				printf("Bit Rate Indexes: ");
Packit 34410b
				if (tmp & 0x8000) {
Packit 34410b
					printf("n/a");
Packit 34410b
				} else {
Packit 34410b
					for (i = 0; i < 15; i++, tmp >>= 1)
Packit 34410b
						if (tmp & 0x0001)
Packit 34410b
							printf("%d ", i);
Packit 34410b
				}
Packit 34410b
				printf("\n");
Packit 34410b
				break;
Packit 34410b
			case 2:
Packit 34410b
				tmp = p_get_u8(frm);
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				if (tmp & 0x80)
Packit 34410b
					printf("MPEG-2 AAC LC ");
Packit 34410b
				if (tmp & 0x40)
Packit 34410b
					printf("MPEG-4 AAC LC ");
Packit 34410b
				if (tmp & 0x20)
Packit 34410b
					printf("MPEG-4 AAC LTP ");
Packit 34410b
				if (tmp & 0x10)
Packit 34410b
					printf("MPEG-4 AAC scalable ");
Packit 34410b
				printf("\n");
Packit 34410b
				tmp = p_get_u16(frm);
Packit 34410b
				freq = tmp >> 4;
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				if (freq & 0x0800)
Packit 34410b
					printf("8kHz ");
Packit 34410b
				if (freq & 0x0400)
Packit 34410b
					printf("11.025kHz ");
Packit 34410b
				if (freq & 0x0200)
Packit 34410b
					printf("12kHz ");
Packit 34410b
				if (freq & 0x0100)
Packit 34410b
					printf("16kHz ");
Packit 34410b
				if (freq & 0x0080)
Packit 34410b
					printf("22.05kHz ");
Packit 34410b
				if (freq & 0x0040)
Packit 34410b
					printf("24kHz ");
Packit 34410b
				if (freq & 0x0020)
Packit 34410b
					printf("32kHz ");
Packit 34410b
				if (freq & 0x0010)
Packit 34410b
					printf("44.1kHz ");
Packit 34410b
				if (freq & 0x0008)
Packit 34410b
					printf("48kHz ");
Packit 34410b
				if (freq & 0x0004)
Packit 34410b
					printf("64kHz ");
Packit 34410b
				if (freq & 0x0002)
Packit 34410b
					printf("88.2kHz ");
Packit 34410b
				if (freq & 0x0001)
Packit 34410b
					printf("96kHz ");
Packit 34410b
				printf("\n");
Packit 34410b
				tmp >>= 2;
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				if (tmp & 0x02)
Packit 34410b
					printf("1 ");
Packit 34410b
				if (tmp & 0x01)
Packit 34410b
					printf("2 ");
Packit 34410b
				printf("Channels\n");
Packit 34410b
				tmp = p_get_u8(frm);
Packit 34410b
				bitrate = ((tmp & 0x7f) << 16) | p_get_u16(frm);
Packit 34410b
				p_indent(level + 1, frm);
Packit 34410b
				printf("%ubps ", bitrate);
Packit 34410b
				printf("%s\n", tmp & 0x80 ? "VBR" : "");
Packit 34410b
				break;
Packit 34410b
			case 255:
Packit 34410b
				if (vendor == 0x0000004f &&
Packit 34410b
							vndcodec == 0x0001) {
Packit 34410b
					tmp = p_get_u8(frm);
Packit 34410b
					p_indent(level + 1, frm);
Packit 34410b
					if (tmp & 0x80)
Packit 34410b
						printf("16kHz ");
Packit 34410b
					if (tmp & 0x40)
Packit 34410b
						printf("32kHz ");
Packit 34410b
					if (tmp & 0x20)
Packit 34410b
						printf("44.1kHz ");
Packit 34410b
					if (tmp & 0x10)
Packit 34410b
						printf("48kHz ");
Packit 34410b
					printf("\n");
Packit 34410b
					p_indent(level + 1, frm);
Packit 34410b
					if (tmp & 0x02)
Packit 34410b
						printf("Stereo ");
Packit 34410b
					if (tmp & 0x01)
Packit 34410b
						printf("Mono ");
Packit 34410b
					printf("\n");
Packit 34410b
					break;
Packit 34410b
				} else {
Packit 34410b
					hex_dump(level + 1, frm, len - 8);
Packit 34410b
					frm->ptr += (len - 8);
Packit 34410b
					frm->len -= (len - 8);
Packit 34410b
				}
Packit 34410b
				break;
Packit 34410b
			default:
Packit 34410b
				hex_dump(level + 1, frm, len - 2);
Packit 34410b
				frm->ptr += (len - 2);
Packit 34410b
				frm->len -= (len - 2);
Packit 34410b
				break;
Packit 34410b
			}
Packit 34410b
		} else {
Packit 34410b
			printf("%s\n", cat2str(cat));
Packit 34410b
			hex_dump(level + 1, frm, len);
Packit 34410b
Packit 34410b
			frm->ptr += len;
Packit 34410b
			frm->len -= len;
Packit 34410b
		}
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static inline void discover(int level, uint8_t hdr, struct frame *frm)
Packit 34410b
{
Packit 34410b
	uint8_t seid, type;
Packit 34410b
Packit 34410b
	switch (hdr & 0x03) {
Packit 34410b
	case 0x02:
Packit 34410b
		while (frm->len > 1) {
Packit 34410b
			p_indent(level, frm);
Packit 34410b
			seid = p_get_u8(frm);
Packit 34410b
			type = p_get_u8(frm);
Packit 34410b
			printf("ACP SEID %d - %s %s%s\n",
Packit 34410b
				seid >> 2, media2str(type >> 4),
Packit 34410b
				type & 0x08 ? "Sink" : "Source",
Packit 34410b
				seid & 0x02 ? " (InUse)" : "");
Packit 34410b
		}
Packit 34410b
		break;
Packit 34410b
	case 0x03:
Packit 34410b
		errorcode(level, frm);
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static inline void get_capabilities(int level, uint8_t hdr, struct frame *frm)
Packit 34410b
{
Packit 34410b
	switch (hdr & 0x03) {
Packit 34410b
	case 0x00:
Packit 34410b
		acp_seid(level, frm);
Packit 34410b
		break;
Packit 34410b
	case 0x02:
Packit 34410b
		capabilities(level, frm);
Packit 34410b
		break;
Packit 34410b
	case 0x03:
Packit 34410b
		errorcode(level, frm);
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static inline void set_configuration(int level, uint8_t hdr, struct frame *frm)
Packit 34410b
{
Packit 34410b
	uint8_t cat;
Packit 34410b
Packit 34410b
	switch (hdr & 0x03) {
Packit 34410b
	case 0x00:
Packit 34410b
		acp_int_seid(level, frm);
Packit 34410b
		capabilities(level, frm);
Packit 34410b
		break;
Packit 34410b
	case 0x03:
Packit 34410b
		p_indent(level, frm);
Packit 34410b
		cat = p_get_u8(frm);
Packit 34410b
		printf("%s\n", cat2str(cat));
Packit 34410b
		errorcode(level, frm);
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static inline void get_configuration(int level, uint8_t hdr, struct frame *frm)
Packit 34410b
{
Packit 34410b
	switch (hdr & 0x03) {
Packit 34410b
	case 0x00:
Packit 34410b
		acp_seid(level, frm);
Packit 34410b
		break;
Packit 34410b
	case 0x02:
Packit 34410b
		capabilities(level, frm);
Packit 34410b
		break;
Packit 34410b
	case 0x03:
Packit 34410b
		errorcode(level, frm);
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static inline void reconfigure(int level, uint8_t hdr, struct frame *frm)
Packit 34410b
{
Packit 34410b
	uint8_t cat;
Packit 34410b
Packit 34410b
	switch (hdr & 0x03) {
Packit 34410b
	case 0x00:
Packit 34410b
		acp_seid(level, frm);
Packit 34410b
		capabilities(level, frm);
Packit 34410b
		break;
Packit 34410b
	case 0x03:
Packit 34410b
		p_indent(level, frm);
Packit 34410b
		cat = p_get_u8(frm);
Packit 34410b
		printf("%s\n", cat2str(cat));
Packit 34410b
		errorcode(level, frm);
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static inline void open_close_stream(int level, uint8_t hdr, struct frame *frm)
Packit 34410b
{
Packit 34410b
	switch (hdr & 0x03) {
Packit 34410b
	case 0x00:
Packit 34410b
		acp_seid(level, frm);
Packit 34410b
		break;
Packit 34410b
	case 0x03:
Packit 34410b
		errorcode(level, frm);
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static inline void start_suspend_stream(int level, uint8_t hdr, struct frame *frm)
Packit 34410b
{
Packit 34410b
	switch (hdr & 0x03) {
Packit 34410b
	case 0x00:
Packit 34410b
		while (frm->len > 0)
Packit 34410b
			acp_seid(level, frm);
Packit 34410b
		break;
Packit 34410b
	case 0x03:
Packit 34410b
		acp_seid(level, frm);
Packit 34410b
		errorcode(level, frm);
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static inline void abort_streaming(int level, uint8_t hdr, struct frame *frm)
Packit 34410b
{
Packit 34410b
	switch (hdr & 0x03) {
Packit 34410b
	case 0x00:
Packit 34410b
		acp_seid(level, frm);
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static inline void security(int level, uint8_t hdr, struct frame *frm)
Packit 34410b
{
Packit 34410b
	switch (hdr & 0x03) {
Packit 34410b
	case 0x00:
Packit 34410b
		acp_seid(level, frm);
Packit 34410b
		break;
Packit 34410b
	case 0x02:
Packit 34410b
		hex_dump(level + 1, frm, frm->len);
Packit 34410b
		frm->ptr += frm->len;
Packit 34410b
		frm->len = 0;
Packit 34410b
		break;
Packit 34410b
	case 0x03:
Packit 34410b
		errorcode(level, frm);
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
static inline void delay_report(int level, uint8_t hdr, struct frame *frm)
Packit 34410b
{
Packit 34410b
	uint8_t seid;
Packit 34410b
	uint16_t delay;
Packit 34410b
Packit 34410b
	switch (hdr & 0x03) {
Packit 34410b
	case 0x00:
Packit 34410b
		p_indent(level, frm);
Packit 34410b
		seid = p_get_u8(frm);
Packit 34410b
		delay = p_get_u16(frm);
Packit 34410b
		printf("ACP SEID %d delay %u.%ums\n", seid >> 2,
Packit 34410b
						delay / 10, delay % 10);
Packit 34410b
		break;
Packit 34410b
	case 0x03:
Packit 34410b
		errorcode(level, frm);
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
}
Packit 34410b
Packit 34410b
void avdtp_dump(int level, struct frame *frm)
Packit 34410b
{
Packit 34410b
	uint8_t hdr, sid, nsp, type;
Packit 34410b
	uint16_t seqn;
Packit 34410b
	uint32_t time, ssrc;
Packit 34410b
Packit 34410b
	switch (frm->num) {
Packit 34410b
	case 1:
Packit 34410b
		p_indent(level, frm);
Packit 34410b
		hdr = p_get_u8(frm);
Packit 34410b
Packit 34410b
		nsp = (hdr & 0x0c) == 0x04 ? p_get_u8(frm) : 0;
Packit 34410b
		sid = hdr & 0x08 ? 0x00 : p_get_u8(frm);
Packit 34410b
Packit 34410b
		printf("AVDTP(s): %s %s: transaction %d nsp 0x%02x\n",
Packit 34410b
			hdr & 0x08 ? pt2str(hdr) : si2str(sid),
Packit 34410b
			mt2str(hdr), hdr >> 4, nsp);
Packit 34410b
Packit 34410b
		switch (sid & 0x7f) {
Packit 34410b
		case 0x01:
Packit 34410b
			discover(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		case 0x02:
Packit 34410b
		case 0x0c:
Packit 34410b
			get_capabilities(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		case 0x03:
Packit 34410b
			set_configuration(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		case 0x04:
Packit 34410b
			get_configuration(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		case 0x05:
Packit 34410b
			reconfigure(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		case 0x06:
Packit 34410b
			open_close_stream(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		case 0x07:
Packit 34410b
			start_suspend_stream(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		case 0x08:
Packit 34410b
			open_close_stream(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		case 0x09:
Packit 34410b
			start_suspend_stream(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		case 0x0a:
Packit 34410b
			abort_streaming(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		case 0x0b:
Packit 34410b
			security(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		case 0x0d:
Packit 34410b
			delay_report(level + 1, hdr, frm);
Packit 34410b
			break;
Packit 34410b
		}
Packit 34410b
Packit 34410b
		break;
Packit 34410b
Packit 34410b
	case 2:
Packit 34410b
		p_indent(level, frm);
Packit 34410b
		hdr  = p_get_u8(frm);
Packit 34410b
		type = p_get_u8(frm);
Packit 34410b
		seqn = p_get_u16(frm);
Packit 34410b
		time = p_get_u32(frm);
Packit 34410b
		ssrc = p_get_u32(frm);
Packit 34410b
Packit 34410b
		printf("AVDTP(m): ver %d %s%scc %d %spt %d seqn %d time %d ssrc %d\n",
Packit 34410b
			hdr >> 6, hdr & 0x20 ? "pad " : "", hdr & 0x10 ? "ext " : "",
Packit 34410b
			hdr & 0xf, type & 0x80 ? "mark " : "", type & 0x7f, seqn, time, ssrc);
Packit 34410b
		break;
Packit 34410b
	}
Packit 34410b
Packit 34410b
	raw_dump(level, frm);
Packit 34410b
}