sdp.c revision 8d58db62739c32c4c111f260cd96a7db5911846e
1d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky/* 2e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 3aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann * BlueZ - Bluetooth protocol stack for Linux 4e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 5e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * Copyright (C) 2001-2002 Ricky Yuen <ryuen@qualcomm.com> 6fa3dc8fee8b3525e53b8b2513b57abfc8bf93927Marcel Holtmann * Copyright (C) 2003-2006 Marcel Holtmann <marcel@holtmann.org> 7e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 8e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 9e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * This program is free software; you can redistribute it and/or modify 10e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * it under the terms of the GNU General Public License as published by 11e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * the Free Software Foundation; either version 2 of the License, or 12e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * (at your option) any later version. 13e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 14e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * This program is distributed in the hope that it will be useful, 15e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * but WITHOUT ANY WARRANTY; without even the implied warranty of 16e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * GNU General Public License for more details. 18e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 19e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * You should have received a copy of the GNU General Public License 20e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * along with this program; if not, write to the Free Software 21aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 22e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 23d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky */ 24d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 25aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#ifdef HAVE_CONFIG_H 26aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#include <config.h> 27aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#endif 28aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann 29d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <stdio.h> 30e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#include <errno.h> 31e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann#include <ctype.h> 32d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <unistd.h> 33aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#include <stdlib.h> 34d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <string.h> 35d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 36d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <sys/types.h> 37d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <netinet/in.h> 38d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 39d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include "parser.h" 40d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include "sdp.h" 41d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 4257795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_ERROR_RSP 0x01 4357795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_SERVICE_SEARCH_REQ 0x02 4457795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_SERVICE_SEARCH_RSP 0x03 4557795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_SERVICE_ATTR_REQ 0x04 4657795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_SERVICE_ATTR_RSP 0x05 4757795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_SERVICE_SEARCH_ATTR_REQ 0x06 4857795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_SERVICE_SEARCH_ATTR_RSP 0x07 4957795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann 5057795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmanntypedef struct { 5157795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann uint8_t pid; 5257795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann uint16_t tid; 5357795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann uint16_t len; 5457795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann} __attribute__ ((packed)) sdp_pdu_hdr; 5557795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_PDU_HDR_SIZE 5 5657795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann 5757795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann/* Data element type descriptor */ 5857795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_DE_NULL 0 5957795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_DE_UINT 1 6057795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_DE_INT 2 6157795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_DE_UUID 3 6257795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_DE_STRING 4 6357795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_DE_BOOL 5 6457795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_DE_SEQ 6 6557795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_DE_ALT 7 6657795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_DE_URL 8 6757795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann 6857795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann/* Data element size index lookup table */ 6957795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmanntypedef struct { 7057795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann int addl_bits; 7157795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann int num_bytes; 7257795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann} sdp_siz_idx_lookup_table_t; 7357795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann 74bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmannstatic sdp_siz_idx_lookup_table_t sdp_siz_idx_lookup_table[] = { 75d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 1 }, /* Size index = 0 */ 76d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 2 }, /* 1 */ 77d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 4 }, /* 2 */ 78d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 8 }, /* 3 */ 79d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 16 }, /* 4 */ 80d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 1, 1 }, /* 5 */ 81d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 1, 2 }, /* 6 */ 82d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 1, 4 }, /* 7 */ 83d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky}; 84d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 8557795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann/* UUID name lookup table */ 8657795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmanntypedef struct { 8757795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann int uuid; 8857795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann char* name; 8957795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann} sdp_uuid_nam_lookup_table_t; 9057795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann 91bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmannstatic sdp_uuid_nam_lookup_table_t sdp_uuid_nam_lookup_table[] = { 92d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_SDP, "SDP" }, 93d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_UDP, "UDP" }, 94d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_RFCOMM, "RFCOMM" }, 95d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_TCP, "TCP" }, 96d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_TCS_BIN, "TCS-BIN" }, 97d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_TCS_AT, "TCS-AT" }, 98d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_OBEX, "OBEX" }, 99d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_IP, "IP" }, 100d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_FTP, "FTP" }, 101d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_HTTP, "HTTP" }, 102d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_WSP, "WSP" }, 103d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_L2CAP, "L2CAP" }, 104fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_UUID_BNEP, "BNEP" }, /* PAN */ 105f2bde694d03053d212266485254a1a1c62706667Marcel Holtmann { SDP_UUID_HIDP, "HIDP" }, /* HID */ 106a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_AVCTP, "AVCTP" }, /* AVCTP */ 10719688cc886a18e183a2b40f492f3b05497bd9af3Marcel Holtmann { SDP_UUID_AVDTP, "AVDTP" }, /* AVDTP */ 108f2bde694d03053d212266485254a1a1c62706667Marcel Holtmann { SDP_UUID_CMTP, "CMTP" }, /* CIP */ 109a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_UDI_C_PLANE, "UDI_C-Plane" }, /* UDI */ 110d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_SERVICE_DISCOVERY_SERVER, "SDServer" }, 111d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_BROWSE_GROUP_DESCRIPTOR, "BrwsGrpDesc" }, 112d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_PUBLIC_BROWSE_GROUP, "PubBrwsGrp" }, 113d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_SERIAL_PORT, "SP" }, 114d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_LAN_ACCESS_PPP, "LAN" }, 115d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_DIALUP_NETWORKING, "DUN" }, 116d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_IR_MC_SYNC, "IRMCSync" }, 117d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_OBEX_OBJECT_PUSH, "OBEXObjPush" }, 118d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_OBEX_FILE_TRANSFER, "OBEXObjTrnsf" }, 119d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_IR_MC_SYNC_COMMAND, "IRMCSyncCmd" }, 120d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_HEADSET, "Headset" }, 121d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_CORDLESS_TELEPHONY, "CordlessTel" }, 12219688cc886a18e183a2b40f492f3b05497bd9af3Marcel Holtmann { SDP_UUID_AUDIO_SOURCE, "AudioSource" }, /* A2DP */ 12319688cc886a18e183a2b40f492f3b05497bd9af3Marcel Holtmann { SDP_UUID_AUDIO_SINK, "AudioSink" }, /* A2DP */ 124a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_AV_REMOTE_TARGET, "AVRemTarget" }, /* AVRCP */ 12519688cc886a18e183a2b40f492f3b05497bd9af3Marcel Holtmann { SDP_UUID_ADVANCED_AUDIO, "AdvAudio" }, /* A2DP */ 126a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_AV_REMOTE, "AVRemote" }, /* AVRCP */ 127a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_VIDEO_CONFERENCING, "VideoConf" }, /* VCP */ 128d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_INTERCOM, "Intercom" }, 129d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_FAX, "Fax" }, 130a5bcb10a662048170e72ee8aba8d69a9d70b2618Marcel Holtmann { SDP_UUID_HEADSET_AUDIO_GATEWAY, "Headset AG" }, 1314f9e927a637144034294199939f530f269f178e1Marcel Holtmann { SDP_UUID_WAP, "WAP" }, 1324f9e927a637144034294199939f530f269f178e1Marcel Holtmann { SDP_UUID_WAP_CLIENT, "WAP Client" }, 133fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_UUID_PANU, "PANU" }, /* PAN */ 134fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_UUID_NAP, "NAP" }, /* PAN */ 135fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_UUID_GN, "GN" }, /* PAN */ 136a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_DIRECT_PRINTING, "DirectPrint" }, /* BPP */ 137a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_REFERENCE_PRINTING, "RefPrint" }, /* BPP */ 138e1dbe962b2620b26d9a5ce7f276d801f589fccb1Marcel Holtmann { SDP_UUID_IMAGING, "Imaging" }, /* BIP */ 139e1dbe962b2620b26d9a5ce7f276d801f589fccb1Marcel Holtmann { SDP_UUID_IMAGING_RESPONDER, "ImagingResp" }, /* BIP */ 140a5bcb10a662048170e72ee8aba8d69a9d70b2618Marcel Holtmann { SDP_UUID_HANDSFREE, "Handsfree" }, 141a5bcb10a662048170e72ee8aba8d69a9d70b2618Marcel Holtmann { SDP_UUID_HANDSFREE_AUDIO_GATEWAY, "Handsfree AG" }, 142a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_DIRECT_PRINTING_REF_OBJS, "RefObjsPrint" }, /* BPP */ 143a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_REFLECTED_UI, "ReflectedUI" }, /* BPP */ 144a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_BASIC_PRINTING, "BasicPrint" }, /* BPP */ 145a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_PRINTING_STATUS, "PrintStatus" }, /* BPP */ 146f2bde694d03053d212266485254a1a1c62706667Marcel Holtmann { SDP_UUID_HUMAN_INTERFACE_DEVICE, "HID" }, /* HID */ 147a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_HARDCOPY_CABLE_REPLACE, "HCRP" }, /* HCRP */ 148a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_HCR_PRINT, "HCRPrint" }, /* HCRP */ 149a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_HCR_SCAN, "HCRScan" }, /* HCRP */ 150f2bde694d03053d212266485254a1a1c62706667Marcel Holtmann { SDP_UUID_COMMON_ISDN_ACCESS, "CIP" }, /* CIP */ 151a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_VIDEO_CONFERENCING_GW, "VideoConf GW" }, /* VCP */ 152a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_UDI_MT, "UDI MT" }, /* UDI */ 153a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_UDI_TA, "UDI TA" }, /* UDI */ 154a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_AUDIO_VIDEO, "AudioVideo" }, /* VCP */ 155a5bcb10a662048170e72ee8aba8d69a9d70b2618Marcel Holtmann { SDP_UUID_SIM_ACCESS, "SAP" }, /* SAP */ 156fa0104f2aa7040bc88f207852c1573c472e6e390Marcel Holtmann { SDP_UUID_PHONEBOOK_ACCESS_PCE, "PBAP PCE" }, /* PBAP */ 157fa0104f2aa7040bc88f207852c1573c472e6e390Marcel Holtmann { SDP_UUID_PHONEBOOK_ACCESS_PSE, "PBAP PSE" }, /* PBAP */ 1588d58db62739c32c4c111f260cd96a7db5911846eMarcel Holtmann { SDP_UUID_PHONEBOOK_ACCESS, "PBAP" }, /* PBAP */ 159d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_PNP_INFORMATION, "PNPInfo" }, 160d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_GENERIC_NETWORKING, "Networking" }, 161d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_GENERIC_FILE_TRANSFER, "FileTrnsf" }, 162d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_GENERIC_AUDIO, "Audio" }, 16319688cc886a18e183a2b40f492f3b05497bd9af3Marcel Holtmann { SDP_UUID_GENERIC_TELEPHONY, "Telephony" }, 164a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_UPNP_SERVICE, "UPNP" }, /* ESDP */ 165a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_UPNP_IP_SERVICE, "UPNP IP" }, /* ESDP */ 166a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_ESDP_UPNP_IP_PAN, "UPNP PAN" }, /* ESDP */ 167a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_ESDP_UPNP_IP_LAP, "UPNP LAP" }, /* ESDP */ 168a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann { SDP_UUID_ESDP_UPNP_L2CAP, "UPNP L2CAP" }, /* ESDP */ 16919688cc886a18e183a2b40f492f3b05497bd9af3Marcel Holtmann { SDP_UUID_VIDEO_SOURCE, "VideoSource" }, /* VDP */ 17017c912876937aef10ccfb6778eb34b63d35a23e3Marcel Holtmann { SDP_UUID_VIDEO_SINK, "VideoSink" }, /* VDP */ 17117c912876937aef10ccfb6778eb34b63d35a23e3Marcel Holtmann { SDP_UUID_VIDEO_DISTRIBUTION, "VideoDist" }, /* VDP */ 1726fa591f86f7cd3bbba449f84f2276ad02e9590c4Marcel Holtmann { SDP_UUID_APPLE_AGENT, "AppleAgent" }, 173d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky}; 174d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 17557795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_UUID_NAM_LOOKUP_TABLE_SIZE \ 17657795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann (sizeof(sdp_uuid_nam_lookup_table)/sizeof(sdp_uuid_nam_lookup_table_t)) 17757795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann 17857795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann/* AttrID name lookup table */ 17957795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmanntypedef struct { 18057795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann int attr_id; 18157795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann char* name; 18257795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann} sdp_attr_id_nam_lookup_table_t; 18357795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann 184bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmannstatic sdp_attr_id_nam_lookup_table_t sdp_attr_id_nam_lookup_table[] = { 185d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_RECORD_HANDLE, "SrvRecHndl" }, 186d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_CLASS_ID_LIST, "SrvClassIDList" }, 187d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_RECORD_STATE, "SrvRecState" }, 188d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_SERVICE_ID, "SrvID" }, 189d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_PROTOCOL_DESCRIPTOR_LIST, "ProtocolDescList" }, 190d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_BROWSE_GROUP_LIST, "BrwGrpList" }, 191d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_LANGUAGE_BASE_ATTRIBUTE_ID_LIST, "LangBaseAttrIDList" }, 192d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_INFO_TIME_TO_LIVE, "SrvInfoTimeToLive" }, 193d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_AVAILABILITY, "SrvAvail" }, 194d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_BLUETOOTH_PROFILE_DESCRIPTOR_LIST, "BTProfileDescList" }, 195d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_DOCUMENTATION_URL, "DocURL" }, 196d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_CLIENT_EXECUTABLE_URL, "ClientExeURL" }, 197d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_ICON_10, "Icon10" }, 198d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_ICON_URL, "IconURL" }, 199d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_NAME, "SrvName" }, 200d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_DESCRIPTION, "SrvDesc" }, 201d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_PROVIDER_NAME, "ProviderName" }, 202d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_VERSION_NUMBER_LIST, "VersionNumList" }, 203d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_GROUP_ID, "GrpID" }, 204d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_DATABASE_STATE, "SrvDBState" }, 2050a7b156a76a997be7f4093f2f16943b5d7ae2bc5Max Krasnyansky { SDP_ATTR_ID_SERVICE_VERSION, "SrvVersion" }, 206fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_ATTR_ID_SECURITY_DESCRIPTION, "SecurityDescription"}, /* PAN */ 207803752117135528b1adebf0fa045596e188a996dMarcel Holtmann { SDP_ATTR_ID_SUPPORTED_DATA_STORES_LIST, "SuppDataStoresList" }, /* Synchronization */ 208803752117135528b1adebf0fa045596e188a996dMarcel Holtmann { SDP_ATTR_ID_SUPPORTED_FORMATS_LIST, "SuppFormatsList" }, /* OBEX Object Push */ 209fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_ATTR_ID_NET_ACCESS_TYPE, "NetAccessType" }, /* PAN */ 210fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_ATTR_ID_MAX_NET_ACCESS_RATE, "MaxNetAccessRate" }, /* PAN */ 211fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_ATTR_ID_IPV4_SUBNET, "IPv4Subnet" }, /* PAN */ 2128d58db62739c32c4c111f260cd96a7db5911846eMarcel Holtmann { SDP_ATTR_ID_IPV6_SUBNET, "IPv6Subnet" }, /* PAN */ 2138d58db62739c32c4c111f260cd96a7db5911846eMarcel Holtmann { SDP_ATTR_ID_SUPPORTED_CAPABILITIES, "SuppCapabilities" }, /* Imaging */ 2148d58db62739c32c4c111f260cd96a7db5911846eMarcel Holtmann { SDP_ATTR_ID_SUPPORTED_FEATURES, "SuppFeatures" }, /* Imaging and Hansfree */ 2158d58db62739c32c4c111f260cd96a7db5911846eMarcel Holtmann { SDP_ATTR_ID_SUPPORTED_FUNCTIONS, "SuppFunctions" }, /* Imaging */ 2168d58db62739c32c4c111f260cd96a7db5911846eMarcel Holtmann { SDP_ATTR_ID_TOTAL_IMAGING_DATA_CAPACITY, "SuppTotalCapacity" }, /* Imaging */ 2178d58db62739c32c4c111f260cd96a7db5911846eMarcel Holtmann { SDP_ATTR_ID_SUPPORTED_REPOSITORIES, "SuppRepositories" }, /* PBAP */ 218d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky}; 219d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 22057795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann#define SDP_ATTR_ID_NAM_LOOKUP_TABLE_SIZE \ 22157795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann (sizeof(sdp_attr_id_nam_lookup_table)/sizeof(sdp_attr_id_nam_lookup_table_t)) 22257795b48fdf990a39061d7e258fa59cc19360006Marcel Holtmann 2233f4bfd3f26aafca84ea9eb31f0128846f7e44c71Max Krasnyanskychar* get_uuid_name(int uuid) 224d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 225d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int i; 226d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 2273f4bfd3f26aafca84ea9eb31f0128846f7e44c71Max Krasnyansky for (i = 0; i < SDP_UUID_NAM_LOOKUP_TABLE_SIZE; i++) { 228d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (sdp_uuid_nam_lookup_table[i].uuid == uuid) 229d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return sdp_uuid_nam_lookup_table[i].name; 230d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 231d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 232d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return 0; 233d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 234d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 235d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline char* get_attr_id_name(int attr_id) 236d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 237d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int i; 238d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 239d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky for (i = 0; i < SDP_ATTR_ID_NAM_LOOKUP_TABLE_SIZE; i++) 240d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (sdp_attr_id_nam_lookup_table[i].attr_id == attr_id) 241d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return sdp_attr_id_nam_lookup_table[i].name; 242d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return 0; 243d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 244d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 245bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmannstatic inline uint8_t parse_de_hdr(struct frame *frm, int *n) 246d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 247bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann uint8_t de_hdr = get_u8(frm); 248bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann uint8_t de_type = de_hdr >> 3; 249bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann uint8_t siz_idx = de_hdr & 0x07; 250d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 251d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Get the number of bytes */ 252d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (sdp_siz_idx_lookup_table[siz_idx].addl_bits) { 253d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(sdp_siz_idx_lookup_table[siz_idx].num_bytes) { 254d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 1: 255d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = get_u8(frm); break; 256d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: 257d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = get_u16(frm); break; 258d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: 259d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = get_u32(frm); break; 26064e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane case 8: 26164e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane *n = get_u64(frm); break; 262d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 263e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann } else 264d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = sdp_siz_idx_lookup_table[siz_idx].num_bytes; 265d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 266d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return de_type; 267d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 268d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 2690149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmannstatic inline void print_int(uint8_t de_type, int level, int n, struct frame *frm, uint16_t *psm, uint8_t *channel) 270d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 2710d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint64_t val, val2; 272d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 273d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(de_type) { 274d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_UINT: 275d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" uint"); 276d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 277d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_INT: 278d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" int"); 279d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 280d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_BOOL: 281d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" bool"); 282d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 283d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 284d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 285d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(n) { 286d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 1: /* 8-bit */ 287d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky val = get_u8(frm); 2880149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann if (channel && de_type == SDP_DE_UINT) 2890149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann if (*channel == 0) 2900149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann *channel = val; 291d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 292d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: /* 16-bit */ 293d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky val = get_u16(frm); 294bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann if (psm && de_type == SDP_DE_UINT) 295bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann if (*psm == 0) 296bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann *psm = val; 297d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 298d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: /* 32-bit */ 299d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky val = get_u32(frm); 300d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 301d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 8: /* 64-bit */ 30264e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane val = get_u64(frm); 303d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 30464e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane case 16:/* 128-bit */ 30564e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane get_u128(frm, &val, &val2); 306bac049aa90abb07de7df8e7d6f5610f20688b8bcMarcel Holtmann printf(" 0x%jx", val2); 307fab8d4bbda673187de603df5ed39cdf0c9635a9dMarcel Holtmann if (val < 0x1000000000000000LL) 3081a4905db6e78b27cdb341691c9b30112b2b5056eStephen Crane printf("0"); 309bac049aa90abb07de7df8e7d6f5610f20688b8bcMarcel Holtmann printf("%jx", val); 31064e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane return; 311d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky default: /* syntax error */ 312d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" err"); 313d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += n; 314d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= n; 315d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return; 316d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 317d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 318bac049aa90abb07de7df8e7d6f5610f20688b8bcMarcel Holtmann printf(" 0x%jx", val); 319d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 320d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 3210149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmannstatic inline void print_uuid(int n, struct frame *frm, uint16_t *psm, uint8_t *channel) 322d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 3230d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint32_t uuid = 0; 324d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky char* s; 32584d27e7d443952fee20f86ab528c1aa9d6aaff87Marcel Holtmann int i; 326d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 327d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(n) { 328d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: /* 16-bit UUID */ 329d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky uuid = get_u16(frm); 330b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane s = "uuid-16"; 331d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 332d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: /* 32_bit UUID */ 333d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky uuid = get_u32(frm); 334b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane s = "uuid-32"; 335d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 336d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 16: /* 128-bit UUID */ 33784d27e7d443952fee20f86ab528c1aa9d6aaff87Marcel Holtmann printf(" uuid-128 "); 33884d27e7d443952fee20f86ab528c1aa9d6aaff87Marcel Holtmann for (i = 0; i < 16; i++) { 33984d27e7d443952fee20f86ab528c1aa9d6aaff87Marcel Holtmann printf("%02x", ((unsigned char *) frm->ptr)[i]); 34084d27e7d443952fee20f86ab528c1aa9d6aaff87Marcel Holtmann if (i == 3 || i == 5 || i == 7 || i == 9) 34184d27e7d443952fee20f86ab528c1aa9d6aaff87Marcel Holtmann printf("-"); 34284d27e7d443952fee20f86ab528c1aa9d6aaff87Marcel Holtmann } 34384d27e7d443952fee20f86ab528c1aa9d6aaff87Marcel Holtmann frm->ptr += 16; 34484d27e7d443952fee20f86ab528c1aa9d6aaff87Marcel Holtmann frm->len -= 16; 34584d27e7d443952fee20f86ab528c1aa9d6aaff87Marcel Holtmann return; 346d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky default: /* syntax error */ 347d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" *err*"); 348d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += n; 349d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= n; 350d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return; 351d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 352d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 353bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann if (psm && *psm > 0 && *psm != 0xffff) { 3540149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann set_proto(frm->handle, *psm, 0, uuid); 355bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann *psm = 0xffff; 356bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann } 357bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann 3580149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann if (channel && *channel > 0 && *channel != 0xff) { 3590149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann set_proto(frm->handle, *psm, *channel, uuid); 3600149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann *channel = 0xff; 3610149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann } 3620149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann 363b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane printf(" %s 0x%04x", s, uuid); 364b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane if ((s = get_uuid_name(uuid))) 365d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" (%s)", s); 366d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 367d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 36864e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Cranestatic inline void print_string(int n, struct frame *frm, const char *name) 369d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 370e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann int i, hex = 0; 371e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann 3725a6d9f66419b4157ace1c09448ced8c804b1b3f2Marcel Holtmann for (i = 0; i < n; i++) { 3735a6d9f66419b4157ace1c09448ced8c804b1b3f2Marcel Holtmann if (i == (n - 1) && ((char *) frm->ptr)[i] == '\0') 3745a6d9f66419b4157ace1c09448ced8c804b1b3f2Marcel Holtmann break; 3755a6d9f66419b4157ace1c09448ced8c804b1b3f2Marcel Holtmann 376e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann if (!isprint(((char *) frm->ptr)[i])) { 377e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann hex = 1; 378e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann break; 379e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann } 3805a6d9f66419b4157ace1c09448ced8c804b1b3f2Marcel Holtmann } 381d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 38264e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane printf(" %s", name); 383e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann if (hex) { 384e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann for (i = 0; i < n; i++) 385e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann printf(" %02x", ((unsigned char *) frm->ptr)[i]); 386e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann } else { 387e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann printf(" \""); 388e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann for (i = 0; i < n; i++) 389e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann printf("%c", ((char *) frm->ptr)[i]); 390e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann printf("\""); 391e1c078f9c74d2ceac8e7a526716a9f24ddcbfba7Marcel Holtmann } 392e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 393d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += n; 394d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= n; 395d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 396d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 3970149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmannstatic inline void print_de(int, struct frame *frm, int *split, uint16_t *psm, uint8_t *channel); 398bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann 3990149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmannstatic inline void print_des(uint8_t de_type, int level, int n, struct frame *frm, int *split, uint16_t *psm, uint8_t *channel) 400e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky{ 401e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky int len = frm->len; 402bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann while (len - frm->len < n && frm->len > 0) 4030149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann print_de(level, frm, split, psm, channel); 404e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky} 405e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky 4060149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmannstatic inline void print_de(int level, struct frame *frm, int *split, uint16_t *psm, uint8_t *channel) 407d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 408452bca1bde500b8a6d830d232c2e3fe27cbe72b6Marcel Holtmann int n = 0; 4090d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint8_t de_type = parse_de_hdr(frm, &n); 410d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 411bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann switch (de_type) { 412d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_NULL: 41383c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane printf(" null"); 414d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 415d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_UINT: 416d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_INT: 417d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_BOOL: 4180149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann print_int(de_type, level, n, frm, psm, channel); 419d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 420d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_UUID: 421e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky if (split) { 422e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky /* Split output by uuids. 423e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky * Used for printing Protocol Desc List */ 424bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann if (*split) { 425e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky printf("\n"); 426e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky p_indent(level, NULL); 427e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky } 428e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky ++*split; 429e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky } 4300149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann print_uuid(n, frm, psm, channel); 431d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 43264e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane case SDP_DE_URL: 433d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_STRING: 43464e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane print_string(n, frm, de_type == SDP_DE_URL? "url": "str"); 435d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 436d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_SEQ: 43783c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane printf(" <"); 4380149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann print_des(de_type, level, n, frm, split, psm, channel); 43983c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane printf(" >"); 44083c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane break; 441d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_ALT: 44283c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane printf(" ["); 4430149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann print_des(de_type, level, n, frm, split, psm, channel); 44483c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane printf(" ]"); 445d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 446d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 447d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 448d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 449d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_srv_srch_pat(int level, struct frame *frm) 450d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 4510ad0a747b1ffd34e58ca6f286b33392591d7a1b3Marcel Holtmann int len, n1 = 0, n2 = 0; 452d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 453ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 454d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("pat"); 455d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 456d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { 457bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann len = frm->len; 458eb7774e40e1e137b31b8f4cb1b6e17ccd64fad8aMarcel Holtmann while (len - frm->len < n1 && frm->len > 0) { 459a734cfae470f350f6375cbe20aa063753118c7ceMarcel Holtmann if (parse_de_hdr(frm, &n2) == SDP_DE_UUID) { 4600149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann print_uuid(n2, frm, NULL, NULL); 461d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 4621362b7f4b6b7c3e61e9b7f084d52c98da4f7f227Max Krasnyansky printf("\nERROR: Unexpected syntax (UUID)\n"); 463d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 464d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 465d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 466d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\n"); 467d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 4681362b7f4b6b7c3e61e9b7f084d52c98da4f7f227Max Krasnyansky printf("\nERROR: Unexpected syntax (SEQ)\n"); 469d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 470d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 471d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 472d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 473d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_attr_id_list(int level, struct frame *frm) 474d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 4750d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t attr_id; 4760d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint32_t attr_id_range; 4770ad0a747b1ffd34e58ca6f286b33392591d7a1b3Marcel Holtmann int len, n1 = 0, n2 = 0; 478d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 479ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 480d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("aid(s)"); 481d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 482d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { 483bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann len = frm->len; 484eb7774e40e1e137b31b8f4cb1b6e17ccd64fad8aMarcel Holtmann while (len - frm->len < n1 && frm->len > 0) { 485d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Print AttributeID */ 486d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n2) == SDP_DE_UINT) { 4879bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane char *name; 488d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(n2) { 489d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: 490d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky attr_id = get_u16(frm); 4919bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane name = get_attr_id_name(attr_id); 4929bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane if (!name) 4939bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane name = "unknown"; 4949bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane printf(" 0x%04x (%s)", attr_id, name); 495d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 496d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: 497d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky attr_id_range = get_u32(frm); 498c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai printf(" 0x%04x - 0x%04x", 499d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky (attr_id_range >> 16), 500d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky (attr_id_range & 0xFFFF)); 501d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 502d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 503d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 504d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 505d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 506d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 507d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 508d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\n"); 509d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 510d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 511d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 512d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 513d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 514d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 515d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_attr_list(int level, struct frame *frm) 516d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 517bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann uint16_t attr_id, psm; 5180149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann uint8_t channel; 519452bca1bde500b8a6d830d232c2e3fe27cbe72b6Marcel Holtmann int len, split, n1 = 0, n2 = 0; 520d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 521d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { 522bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann len = frm->len; 523eb7774e40e1e137b31b8f4cb1b6e17ccd64fad8aMarcel Holtmann while (len - frm->len < n1 && frm->len > 0) { 524d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Print AttributeID */ 5259bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane if (parse_de_hdr(frm, &n2) == SDP_DE_UINT && n2 == sizeof(attr_id)) { 526b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane char *name; 527d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky attr_id = get_u16(frm); 52865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 529b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane name = get_attr_id_name(attr_id); 530b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane if (!name) 531b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane name = "unknown"; 532b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane printf("aid 0x%04x (%s)\n", attr_id, name); 5339bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane split = (attr_id != SDP_ATTR_ID_PROTOCOL_DESCRIPTOR_LIST); 534bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann psm = 0; 5350149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann channel = 0; 536bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann 537d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Print AttributeValue */ 538e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky p_indent(level + 1, 0); 539bf336caaf4d6f967474d46cb768e6edc17cc5777Marcel Holtmann print_de(level + 1, frm, split ? NULL: &split, 5400149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann attr_id == SDP_ATTR_ID_PROTOCOL_DESCRIPTOR_LIST ? &psm : NULL, 5410149ab32c9391faed284ec6214950ccf70d699cbMarcel Holtmann attr_id == SDP_ATTR_ID_PROTOCOL_DESCRIPTOR_LIST ? &channel : NULL); 5420a7b156a76a997be7f4093f2f16943b5d7ae2bc5Max Krasnyansky printf("\n"); 543d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 544d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 545d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 546d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 547d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 548d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 549d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 550d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 551d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 552d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 553d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 554d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 555e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmannstatic inline void print_attr_lists(int level, struct frame *frm) 556d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 5570ad0a747b1ffd34e58ca6f286b33392591d7a1b3Marcel Holtmann int n = 0, cnt = 0; 558e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann int count = frm->len; 559d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 560d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n) == SDP_DE_SEQ) { 561e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann while (count - frm->len < n && frm->len > 0) { 56265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 563e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("record #%d\n", cnt++); 564e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann print_attr_list(level + 2, frm); 565d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 566d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 567d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 568d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 569d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 570d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 571d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 572e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmannstatic inline void print_cont_state(int level, unsigned char *buf) 573d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 574e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann uint8_t cont = buf[0]; 575e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann int i; 576d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 57765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 578e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("cont"); 579e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann for (i = 0; i < cont + 1; i++) 580e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf(" %2.2X", buf[i]); 581e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("\n"); 582d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 583d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 584e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmannstatic char *pid2str(uint8_t pid) 585d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 586e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann switch (pid) { 587e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann case SDP_ERROR_RSP: 588e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return "Error Rsp"; 589e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann case SDP_SERVICE_SEARCH_REQ: 590e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return "SS Req"; 591e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann case SDP_SERVICE_SEARCH_RSP: 592e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return "SS Rsp"; 593e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann case SDP_SERVICE_ATTR_REQ: 594e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return "SA Req"; 595e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann case SDP_SERVICE_ATTR_RSP: 596e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return "SA Rsp"; 597e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann case SDP_SERVICE_SEARCH_ATTR_REQ: 598e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return "SSA Req"; 599e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann case SDP_SERVICE_SEARCH_ATTR_RSP: 600e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return "SSA Rsp"; 601e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann default: 602e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return "Unknown"; 603e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann } 604e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann} 605d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 606e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann#define FRAME_TABLE_SIZE 10 607d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 608e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmannstatic struct frame frame_table[FRAME_TABLE_SIZE]; 609d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 6109855f79c828c3530ffcd3a6a20eeb28e10cb27f1Marcel Holtmannstatic int frame_add(struct frame *frm, int count) 611e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann{ 612e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann register struct frame *fr; 613e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann register unsigned char *data; 614e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann register int i, len = 0, pos = -1; 615e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 616e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann for (i = 0; i < FRAME_TABLE_SIZE; i++) { 617e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (frame_table[i].handle == frm->handle && 618e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann frame_table[i].cid == frm->cid) { 619e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann pos = i; 620e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann len = frame_table[i].data_len; 621e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann break; 622d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 623e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (pos < 0 && !frame_table[i].handle) 624e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann pos = i; 625d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 626d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 627e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (pos < 0 || count <= 0) 628e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return -EIO; 629d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 630e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann data = malloc(len + count); 631e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (!data) 632e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return -ENOMEM; 633d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 634e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann fr = &frame_table[pos]; 635d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 636e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (len > 0) { 637e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann memcpy(data, fr->data, len); 638e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann memcpy(data + len, frm->ptr, count); 639e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann } else 640e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann memcpy(data, frm->ptr, count); 641d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 642e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (fr->data) 643e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann free(fr->data); 644d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 6459e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->data = data; 6469e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->data_len = len + count; 6479e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->len = fr->data_len; 6489e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->ptr = fr->data; 6499e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->dev_id = frm->dev_id; 6509e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->in = frm->in; 6519e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->ts = frm->ts; 6529e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->handle = frm->handle; 6539e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->cid = frm->cid; 6549e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->num = frm->num; 6559e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->channel = frm->channel; 6569e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->pppdump_fd = frm->pppdump_fd; 6579e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann fr->audio_fd = frm->audio_fd; 658d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 659e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return pos; 660d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 661d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 6629855f79c828c3530ffcd3a6a20eeb28e10cb27f1Marcel Holtmannstatic struct frame *frame_get(struct frame *frm, int count) 663d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 664e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann register int pos; 665d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 6669855f79c828c3530ffcd3a6a20eeb28e10cb27f1Marcel Holtmann pos = frame_add(frm, count); 667e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (pos < 0) 668e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return frm; 669d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 670e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann frame_table[pos].handle = 0; 671d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 672e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann return &frame_table[pos]; 673d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 674d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 675d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskyvoid sdp_dump(int level, struct frame *frm) 676d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 677d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky sdp_pdu_hdr *hdr = frm->ptr; 678e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann uint16_t tid = ntohs(hdr->tid); 6790d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t len = ntohs(hdr->len); 680e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann uint16_t total, count; 681e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann uint8_t cont; 682d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 683d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += SDP_PDU_HDR_SIZE; 684d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= SDP_PDU_HDR_SIZE; 685d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 686ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 687e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("SDP %s: tid 0x%x len 0x%x\n", pid2str(hdr->pid), tid, len); 688d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 6891362b7f4b6b7c3e61e9b7f084d52c98da4f7f227Max Krasnyansky switch (hdr->pid) { 690d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_ERROR_RSP: 691e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann p_indent(level + 1, frm); 692e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("code 0x%x info ", get_u16(frm)); 693e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (frm->len > 0) 694e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann hex_dump(0, frm, frm->len); 695e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann else 696e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("none\n"); 697d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 698e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 699d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_REQ: 700e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse ServiceSearchPattern */ 701e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann print_srv_srch_pat(level + 1, frm); 702e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 703e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse MaximumServiceRecordCount */ 704e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann p_indent(level + 1, frm); 705e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("max %d\n", get_u16(frm)); 706e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 707e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse ContinuationState */ 708e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann print_cont_state(level + 1, frm->ptr); 709d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 710e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 711d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_RSP: 712e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse TotalServiceRecordCount */ 713e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann total = get_u16(frm); 714e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 715e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse CurrentServiceRecordCount */ 716e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann count = get_u16(frm); 717e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann p_indent(level + 1, frm); 718e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (count < total) 719e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("count %d of %d\n", count, total); 720e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann else 721e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("count %d\n", count); 722e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 723e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse service record handle(s) */ 724e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (count > 0) { 725e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann int i; 726e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann p_indent(level + 1, frm); 727e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("handle%s", count > 1 ? "s" : ""); 728e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann for (i = 0; i < count; i++) 729e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf(" 0x%x", get_u32(frm)); 730e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("\n"); 731e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann } 732e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 733e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse ContinuationState */ 734e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann print_cont_state(level + 1, frm->ptr); 735d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 736e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 737d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_ATTR_REQ: 738e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse ServiceRecordHandle */ 739e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann p_indent(level + 1, frm); 740e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("handle 0x%x\n", get_u32(frm)); 741e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 742e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse MaximumAttributeByteCount */ 743e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann p_indent(level + 1, frm); 744e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("max %d\n", get_u16(frm)); 745e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 746e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse ServiceSearchPattern */ 747e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann print_attr_id_list(level + 1, frm); 748e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 749e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse ContinuationState */ 750e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann print_cont_state(level + 1, frm->ptr); 751d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 752e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 753d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_ATTR_RSP: 754e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse AttributeByteCount */ 755e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann count = get_u16(frm); 756e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann p_indent(level + 1, frm); 757e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("count %d\n", count); 758e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 759e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse ContinuationState */ 760e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann cont = *(unsigned char *)(frm->ptr + count); 761e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 762e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (cont == 0) { 763e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse AttributeList */ 7649855f79c828c3530ffcd3a6a20eeb28e10cb27f1Marcel Holtmann print_attr_list(level + 1, frame_get(frm, count)); 765e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann } else 7669855f79c828c3530ffcd3a6a20eeb28e10cb27f1Marcel Holtmann frame_add(frm, count); 767e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 768e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann print_cont_state(level + 1, frm->ptr + count); 769d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 770e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 771d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_ATTR_REQ: 772e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse ServiceSearchPattern */ 773e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann print_srv_srch_pat(level + 1, frm); 774e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 775e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse MaximumAttributeByteCount */ 776e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann p_indent(level + 1, frm); 777e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("max %d\n", get_u16(frm)); 778e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 779e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse AttributeList */ 780e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann print_attr_id_list(level + 1, frm); 781e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 782e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse ContinuationState */ 783e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann print_cont_state(level + 1, frm->ptr); 784d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 785e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 786d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_ATTR_RSP: 787e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse AttributeByteCount */ 788e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann count = get_u16(frm); 789e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann p_indent(level + 1, frm); 790e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann printf("count %d\n", count); 791d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 792d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse ContinuationState */ 793e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann cont = *(unsigned char *)(frm->ptr + count); 794e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 795e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann if (cont == 0) { 796e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann /* Parse AttributeLists */ 7979855f79c828c3530ffcd3a6a20eeb28e10cb27f1Marcel Holtmann print_attr_lists(level + 1, frame_get(frm, count)); 798e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann } else 7999855f79c828c3530ffcd3a6a20eeb28e10cb27f1Marcel Holtmann frame_add(frm, count); 800e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 801e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann print_cont_state(level + 1, frm->ptr + count); 802e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann break; 803e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann 804e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann default: 805e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann raw_dump(level + 1, frm); 806e37a3738f92e103e053fe09e48affd25600cc233Marcel Holtmann break; 807d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 808d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 809