|
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 |
}
|