sdp.c revision e1dbe962b2620b26d9a5ce7f276d801f589fccb1
1d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky/* 2c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai HCIDump - HCI packet analyzer 3c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai Copyright (C) 2000-2001 Maxim Krasnyansky <maxk@qualcomm.com> 4c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai 5c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai This program is free software; you can redistribute it and/or modify 6c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai it under the terms of the GNU General Public License version 2 as 7c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai published by the Free Software Foundation; 8c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai 9c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 10c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 11c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. 12c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM, 13c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER 14c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 15c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE 16c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai USE OR PERFORMANCE OF THIS SOFTWARE. 17c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai 18c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS, 19c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED. 20d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky*/ 21d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 22d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky/* 23d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky SDP parser. 24d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky Copyright (C) 2001 Ricky Yuen <ryuen@qualcomm.com> 25d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky*/ 26d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 27d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky/* 28d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky * $Id$ 29d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky */ 30d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 31d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <stdio.h> 32d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <stdlib.h> 33d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <unistd.h> 34d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <errno.h> 35d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <string.h> 36d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 37d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <sys/types.h> 380d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <sys/socket.h> 39d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <netinet/in.h> 40d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 41d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <bluetooth/bluetooth.h> 42d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <bluetooth/hci.h> 43d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <bluetooth/l2cap.h> 44d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 45d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include "parser.h" 46d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include "sdp.h" 47d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 48e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyanskystatic inline void print_de(int, struct frame*, int *split); 49d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 50d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskysdp_siz_idx_lookup_table_t sdp_siz_idx_lookup_table[] = { 51d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 1 }, /* Size index = 0 */ 52d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 2 }, /* 1 */ 53d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 4 }, /* 2 */ 54d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 8 }, /* 3 */ 55d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 16 }, /* 4 */ 56d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 1, 1 }, /* 5 */ 57d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 1, 2 }, /* 6 */ 58d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 1, 4 }, /* 7 */ 59d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky}; 60d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 61d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskysdp_uuid_nam_lookup_table_t sdp_uuid_nam_lookup_table[] = { 62d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_SDP, "SDP" }, 63d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_UDP, "UDP" }, 64d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_RFCOMM, "RFCOMM" }, 65d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_TCP, "TCP" }, 66d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_TCS_BIN, "TCS-BIN" }, 67d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_TCS_AT, "TCS-AT" }, 68d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_OBEX, "OBEX" }, 69d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_IP, "IP" }, 70d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_FTP, "FTP" }, 71d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_HTTP, "HTTP" }, 72d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_WSP, "WSP" }, 73d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_L2CAP, "L2CAP" }, 74fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_UUID_BNEP, "BNEP" }, /* PAN */ 75f2bde694d03053d212266485254a1a1c62706667Marcel Holtmann { SDP_UUID_HIDP, "HIDP" }, /* HID */ 76f2bde694d03053d212266485254a1a1c62706667Marcel Holtmann { SDP_UUID_CMTP, "CMTP" }, /* CIP */ 77d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_SERVICE_DISCOVERY_SERVER, "SDServer" }, 78d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_BROWSE_GROUP_DESCRIPTOR, "BrwsGrpDesc" }, 79d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_PUBLIC_BROWSE_GROUP, "PubBrwsGrp" }, 80d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_SERIAL_PORT, "SP" }, 81d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_LAN_ACCESS_PPP, "LAN" }, 82d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_DIALUP_NETWORKING, "DUN" }, 83d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_IR_MC_SYNC, "IRMCSync" }, 84d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_OBEX_OBJECT_PUSH, "OBEXObjPush" }, 85d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_OBEX_FILE_TRANSFER, "OBEXObjTrnsf" }, 86d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_IR_MC_SYNC_COMMAND, "IRMCSyncCmd" }, 87d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_HEADSET, "Headset" }, 88d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_CORDLESS_TELEPHONY, "CordlessTel" }, 89d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_INTERCOM, "Intercom" }, 90d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_FAX, "Fax" }, 91d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_HEADSET_AUDIO_GATEWAY, "AG" }, 92fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_UUID_PANU, "PANU" }, /* PAN */ 93fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_UUID_NAP, "NAP" }, /* PAN */ 94fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_UUID_GN, "GN" }, /* PAN */ 95e1dbe962b2620b26d9a5ce7f276d801f589fccb1Marcel Holtmann { SDP_UUID_IMAGING, "Imaging" }, /* BIP */ 96e1dbe962b2620b26d9a5ce7f276d801f589fccb1Marcel Holtmann { SDP_UUID_IMAGING_RESPONDER, "ImagingResp" }, /* BIP */ 97f2bde694d03053d212266485254a1a1c62706667Marcel Holtmann { SDP_UUID_HUMAN_INTERFACE_DEVICE, "HID" }, /* HID */ 98f2bde694d03053d212266485254a1a1c62706667Marcel Holtmann { SDP_UUID_COMMON_ISDN_ACCESS, "CIP" }, /* CIP */ 99d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_PNP_INFORMATION, "PNPInfo" }, 100d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_GENERIC_NETWORKING, "Networking" }, 101d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_GENERIC_FILE_TRANSFER, "FileTrnsf" }, 102d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_GENERIC_AUDIO, "Audio" }, 103d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_GENERIC_TELEPHONY, "Telephony" } 104d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky}; 105d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 106d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskysdp_attr_id_nam_lookup_table_t sdp_attr_id_nam_lookup_table[] = { 107d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_RECORD_HANDLE, "SrvRecHndl" }, 108d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_CLASS_ID_LIST, "SrvClassIDList" }, 109d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_RECORD_STATE, "SrvRecState" }, 110d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_SERVICE_ID, "SrvID" }, 111d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_PROTOCOL_DESCRIPTOR_LIST, "ProtocolDescList" }, 112d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_BROWSE_GROUP_LIST, "BrwGrpList" }, 113d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_LANGUAGE_BASE_ATTRIBUTE_ID_LIST, "LangBaseAttrIDList" }, 114d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_INFO_TIME_TO_LIVE, "SrvInfoTimeToLive" }, 115d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_AVAILABILITY, "SrvAvail" }, 116d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_BLUETOOTH_PROFILE_DESCRIPTOR_LIST, "BTProfileDescList" }, 117d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_DOCUMENTATION_URL, "DocURL" }, 118d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_CLIENT_EXECUTABLE_URL, "ClientExeURL" }, 119d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_ICON_10, "Icon10" }, 120d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_ICON_URL, "IconURL" }, 121d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_NAME, "SrvName" }, 122d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_DESCRIPTION, "SrvDesc" }, 123d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_PROVIDER_NAME, "ProviderName" }, 124d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_VERSION_NUMBER_LIST, "VersionNumList" }, 125d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_GROUP_ID, "GrpID" }, 126d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_DATABASE_STATE, "SrvDBState" }, 1270a7b156a76a997be7f4093f2f16943b5d7ae2bc5Max Krasnyansky { SDP_ATTR_ID_SERVICE_VERSION, "SrvVersion" }, 128fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_ATTR_ID_SECURITY_DESCRIPTION, "SecurityDescription"}, /* PAN */ 1296a11bf43e2f17a3378ceeb10de58dce223ef509bStephen Crane { SDP_ATTR_ID_SUPPORTED_DATA_STORES_LIST, "SuppDataStoresList" }, /* Synchronization */ 1306a11bf43e2f17a3378ceeb10de58dce223ef509bStephen Crane { SDP_ATTR_ID_SUPPORTED_FORMATS_LIST, "SuppFormatsList" }, /* OBEX Object Push */ 131fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_ATTR_ID_NET_ACCESS_TYPE, "NetAccessType" }, /* PAN */ 132fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_ATTR_ID_MAX_NET_ACCESS_RATE, "MaxNetAccessRate" }, /* PAN */ 133fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_ATTR_ID_IPV4_SUBNET, "IPv4Subnet" }, /* PAN */ 134fcfd5f0ba79cf3f45cf076bbce92590cab5c043cMarcel Holtmann { SDP_ATTR_ID_IPV6_SUBNET, "IPv6Subnet" } /* PAN */ 135d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky}; 136d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 1373f4bfd3f26aafca84ea9eb31f0128846f7e44c71Max Krasnyanskychar* get_uuid_name(int uuid) 138d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 139d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int i; 140d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 1413f4bfd3f26aafca84ea9eb31f0128846f7e44c71Max Krasnyansky for (i = 0; i < SDP_UUID_NAM_LOOKUP_TABLE_SIZE; i++) { 142d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (sdp_uuid_nam_lookup_table[i].uuid == uuid) 143d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return sdp_uuid_nam_lookup_table[i].name; 144d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 145d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 146d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return 0; 147d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 148d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 149d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline char* get_attr_id_name(int attr_id) 150d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 151d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int i; 152d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 153d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky for (i = 0; i < SDP_ATTR_ID_NAM_LOOKUP_TABLE_SIZE; i++) 154d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (sdp_attr_id_nam_lookup_table[i].attr_id == attr_id) 155d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return sdp_attr_id_nam_lookup_table[i].name; 156d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return 0; 157d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 158d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 1590d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmannstatic inline uint8_t parse_de_hdr(struct frame *frm, int* n) 160d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 1610d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint8_t de_hdr = get_u8(frm); 1620d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint8_t de_type = de_hdr >> 3; 1630d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint8_t siz_idx = de_hdr & 0x07; 164d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 165d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Get the number of bytes */ 166d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (sdp_siz_idx_lookup_table[siz_idx].addl_bits) { 167d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(sdp_siz_idx_lookup_table[siz_idx].num_bytes) { 168d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 1: 169d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = get_u8(frm); break; 170d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: 171d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = get_u16(frm); break; 172d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: 173d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = get_u32(frm); break; 17464e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane case 8: 17564e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane *n = get_u64(frm); break; 176d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 177d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 178d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = sdp_siz_idx_lookup_table[siz_idx].num_bytes; 179d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 180d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 181d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return de_type; 182d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 183d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 1840d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmannstatic inline void print_int(uint8_t de_type, int level, int n, struct frame *frm) 185d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 1860d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint64_t val, val2; 187d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 188d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(de_type) { 189d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_UINT: 190d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" uint"); 191d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 192d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_INT: 193d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" int"); 194d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 195d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_BOOL: 196d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" bool"); 197d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 198d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 199d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 200d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(n) { 201d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 1: /* 8-bit */ 202d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky val = get_u8(frm); 203d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 204d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: /* 16-bit */ 205d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky val = get_u16(frm); 206d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 207d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: /* 32-bit */ 208d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky val = get_u32(frm); 209d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 210d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 8: /* 64-bit */ 21164e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane val = get_u64(frm); 212d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 21364e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane case 16:/* 128-bit */ 21464e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane get_u128(frm, &val, &val2); 2151a4905db6e78b27cdb341691c9b30112b2b5056eStephen Crane printf(" 0x%llx", val2); 2161a4905db6e78b27cdb341691c9b30112b2b5056eStephen Crane if (val < 0x1000000000000000L) 2171a4905db6e78b27cdb341691c9b30112b2b5056eStephen Crane printf("0"); 2181a4905db6e78b27cdb341691c9b30112b2b5056eStephen Crane printf("%llx", val); 21964e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane return; 220d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky default: /* syntax error */ 221d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" err"); 222d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += n; 223d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= n; 224d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return; 225d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 226d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 227d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" 0x%llx", val); 228d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 229d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 230d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_uuid(int n, struct frame *frm) 231d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 2320d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint32_t uuid = 0; 233d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky char* s; 234d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 235d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(n) { 236d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: /* 16-bit UUID */ 237d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky uuid = get_u16(frm); 238b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane s = "uuid-16"; 239d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 240d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: /* 32_bit UUID */ 241d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky uuid = get_u32(frm); 242b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane s = "uuid-32"; 243d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 244d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 16: /* 128-bit UUID */ 245d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky uuid = get_u32(frm); 246b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane s = "uuid-128"; 247d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += 12; 248d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= 12; 249d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 250d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky default: /* syntax error */ 251d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" *err*"); 252d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += n; 253d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= n; 254d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return; 255d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 256d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 257b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane printf(" %s 0x%04x", s, uuid); 258b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane if ((s = get_uuid_name(uuid))) 259d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" (%s)", s); 260d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 261d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 26264e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Cranestatic inline void print_string(int n, struct frame *frm, const char *name) 263d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 264e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky char *s; 265d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 26664e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane printf(" %s", name); 267d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if ((s = malloc(n + 1))) { 2680a7b156a76a997be7f4093f2f16943b5d7ae2bc5Max Krasnyansky strncpy(s, frm->ptr, n); 269d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky s[n] = '\0'; 270d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" \"%s\"", s); 2710a7b156a76a997be7f4093f2f16943b5d7ae2bc5Max Krasnyansky free(s); 272d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 273d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky perror("Can't allocate string buffer"); 274d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 275d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += n; 276d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= n; 277d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 278d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 2790d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmannstatic inline void print_des(uint8_t de_type, int level, int n, struct frame *frm, int *split) 280e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky{ 281e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky int len = frm->len; 282e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky while (len - frm->len < n ) 283e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky print_de(level, frm, split); 284e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky} 285e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky 286e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyanskystatic inline void print_de(int level, struct frame *frm, int *split) 287d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 288d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n; 2890d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint8_t de_type = parse_de_hdr(frm, &n); 290d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 291d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(de_type) { 292d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_NULL: 29383c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane printf(" null"); 294d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 295d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_UINT: 296d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_INT: 297d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_BOOL: 298d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_int(de_type, level, n, frm); 299d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 300d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_UUID: 301e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky if (split) { 302e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky /* Split output by uuids. 303e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky * Used for printing Protocol Desc List */ 304e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky if (*split) { 305e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky printf("\n"); 306e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky p_indent(level, NULL); 307e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky } 308e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky ++*split; 309e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky } 310d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_uuid(n, frm); 311d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 31264e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane case SDP_DE_URL: 313d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_STRING: 31464e42538f1acba75c4a8bae67ee1a39e2c854134Stephen Crane print_string(n, frm, de_type == SDP_DE_URL? "url": "str"); 315d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 316d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_SEQ: 31783c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane printf(" <"); 31883c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane print_des(de_type, level, n, frm, split); 31983c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane printf(" >"); 32083c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane break; 321d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_ALT: 32283c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane printf(" ["); 323e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky print_des(de_type, level, n, frm, split); 32483c0a2aa92e9e419cd952006f891afb4cd79f43eStephen Crane printf(" ]"); 325d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 326d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 327d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 328d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 329d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_srv_srch_pat(int level, struct frame *frm) 330d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 331d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int len = frm->len; 332d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n1; 333d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n2; 334d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 335ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 336d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("pat"); 337d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 338d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { 339d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky while (len - frm->len < n1 ) { 340d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm,&n2) == SDP_DE_UUID) { 341d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_uuid(n2, frm); 342d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 3431362b7f4b6b7c3e61e9b7f084d52c98da4f7f227Max Krasnyansky printf("\nERROR: Unexpected syntax (UUID)\n"); 344d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 345d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 346d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 347d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\n"); 348d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 3491362b7f4b6b7c3e61e9b7f084d52c98da4f7f227Max Krasnyansky printf("\nERROR: Unexpected syntax (SEQ)\n"); 350d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 351d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 352d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 353d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 354d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 355d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_attr_id_list(int level, struct frame *frm) 356d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 3570d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t attr_id; 3580d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint32_t attr_id_range; 359e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky int len = frm->len; 360e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky int n1, n2; 361d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 362ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 363d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("aid(s)"); 364d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 365d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { 366d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky while (len - frm->len <= n1 ) { 367d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Print AttributeID */ 368d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n2) == SDP_DE_UINT) { 3699bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane char *name; 370d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(n2) { 371d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: 372d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky attr_id = get_u16(frm); 3739bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane name = get_attr_id_name(attr_id); 3749bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane if (!name) 3759bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane name = "unknown"; 3769bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane printf(" 0x%04x (%s)", attr_id, name); 377d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 378d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: 379d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky attr_id_range = get_u32(frm); 380c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai printf(" 0x%04x - 0x%04x", 381d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky (attr_id_range >> 16), 382d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky (attr_id_range & 0xFFFF)); 383d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 384d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 385d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 386d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 387d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 388d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 389d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 390d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\n"); 391d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 392d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 393d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 394d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 395d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 396d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 397d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_attr_list(int level, struct frame *frm) 398d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 3990d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t attr_id; 400e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky int n1, n2, split; 401d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int len = frm->len; 402d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 403d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { 404d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky while (len - frm->len < n1 ) { 405d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Print AttributeID */ 4069bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane if (parse_de_hdr(frm, &n2) == SDP_DE_UINT && n2 == sizeof(attr_id)) { 407b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane char *name; 408d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky attr_id = get_u16(frm); 40965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 410b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane name = get_attr_id_name(attr_id); 411b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane if (!name) 412b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane name = "unknown"; 413b17b30c75d9615835074d28c1072a1f694df51dfStephen Crane printf("aid 0x%04x (%s)\n", attr_id, name); 4149bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane split = (attr_id != SDP_ATTR_ID_PROTOCOL_DESCRIPTOR_LIST); 415e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky 416d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Print AttributeValue */ 417e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky p_indent(level + 1, 0); 418e2ecd2340182074db66ad360283ce0fd609e6a3eMax Krasnyansky print_de(level + 1, frm, split ? NULL: &split); 4190a7b156a76a997be7f4093f2f16943b5d7ae2bc5Max Krasnyansky printf("\n"); 420d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 421d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 422d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 423d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 424d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 425d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 426d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\n"); 427d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 428d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 429d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 430d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 431d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 432d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 433d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 434c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasaistatic inline void print_attr_lists(int level, struct frame *frm, int len) 435d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 436d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n; 437d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int cnt = 0; 438d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 439d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n) == SDP_DE_SEQ) { 4409bb66ea99724230c43776d960ebcf634aea42e61Stephen Crane// printf(" len 0x%x frm->len 0x%x n 0x%x\n", len, frm->len, n); 441d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky while (len - frm->len < n ) { 44265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 443d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("srv rec #%d\n", cnt++); 444d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_attr_list(level+1, frm); 445d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 446d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 447d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 448d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 449d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 450d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 451d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 452d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 4530d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmannstatic inline void err_rsp(int level, uint16_t tid, uint16_t len, struct frame *frm) 454d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 455d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP Error Rsp: tid 0x%x len 0x%x\n", tid, len); 456d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 45765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, 0); 4581362b7f4b6b7c3e61e9b7f084d52c98da4f7f227Max Krasnyansky printf("ec 0x%x info ", get_u16(frm)); 459d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (frm->len > 0) { 460d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(0, frm); 461d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 462d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("none\n"); 463d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 464d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 465d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 466d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 4670d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmannstatic inline void ss_req(int level, uint16_t tid, uint16_t len, struct frame *frm) 468d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 469d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SS Req: tid 0x%x len 0x%x\n", tid, len); 470d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 471d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse ServiceSearchPattern */ 472d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_srv_srch_pat(++level, frm); 473d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 474d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse MaximumServiceRecordCount */ 47565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 476d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("max 0x%x\n", get_u16(frm)); 477d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 478d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 4790d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmannstatic inline void ss_rsp(int level, uint16_t tid, uint16_t len, struct frame *frm) 480d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 481d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky register int i; 4820d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t cur_srv_rec_cnt = get_u16(frm); /* Parse CurrentServiceRecordCount */ 4830d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t tot_srv_rec_cnt = get_u16(frm); /* Parse TotalServiceRecordCount */ 484d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 485d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SS Rsp: tid 0x%x len 0x%x\n", tid, len); 486d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 48765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, 0); 488d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("cur 0x%x tot 0x%x", cur_srv_rec_cnt, tot_srv_rec_cnt); 489d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 490d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse service record handle(s) */ 491d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (cur_srv_rec_cnt > 0) { 492d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" hndl"); 493d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky for (i = 0; i < cur_srv_rec_cnt; i++) { 494d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" 0x%x", get_u32(frm)); 495d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 496d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 497d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\n"); 498d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 499d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 5000d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmannstatic inline void sa_req(int level, uint16_t tid, uint16_t len, struct frame *frm) 501d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 502d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SA Req: tid 0x%x len 0x%x\n", tid, len); 503d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 504d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse ServiceRecordHandle */ 50565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, 0); 506d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("hndl 0x%x\n", get_u32(frm)); 507d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 508d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse MaximumAttributeByteCount */ 50965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 510d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("max 0x%x\n", get_u16(frm)); 511d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 512d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse ServiceSearchPattern */ 513d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_attr_id_list(level, frm); 514d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 515d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 5160d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmannstatic inline void sa_rsp(int level, uint16_t tid, uint16_t len, struct frame *frm) 517d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 518d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SA Rsp: tid 0x%x len 0x%x\n", tid, len); 519d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 520d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse AttributeByteCount */ 52165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, 0); 522d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("cnt 0x%x\n", get_u16(frm)); 523d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 524d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse AttributeList */ 525d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_attr_list(level, frm); 526d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 527d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 5280d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmannstatic inline void ssa_req(int level, uint16_t tid, uint16_t len, struct frame *frm) 529d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 530d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SSA Req: tid 0x%x len 0x%x\n", tid, len); 531d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 532d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse ServiceSearchPattern */ 533d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_srv_srch_pat(++level, frm); 534d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 535d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse MaximumAttributeByteCount */ 53665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 5371362b7f4b6b7c3e61e9b7f084d52c98da4f7f227Max Krasnyansky printf("max 0x%x\n", get_u16(frm)); 538d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 539d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse AttributeList */ 540d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_attr_id_list(level, frm); 541d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 542d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 5430d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmannstatic inline void ssa_rsp(int level, uint16_t tid, uint16_t len, struct frame *frm) 544d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 545c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai int cnt; 546d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SSA Rsp: tid 0x%x len 0x%x\n", tid, len); 547d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 548d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse AttributeByteCount */ 54965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, 0); 550c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai cnt = get_u16(frm); 551c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai printf("cnt 0x%x\n", cnt); 552d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 553d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse AttributeLists */ 554c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai print_attr_lists(level, frm, cnt); 555d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 556d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 557d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskyvoid sdp_dump(int level, struct frame *frm) 558d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 559d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky sdp_pdu_hdr *hdr = frm->ptr; 5600d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t tid = ntohs(hdr->tid); 5610d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t len = ntohs(hdr->len); 562d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 563d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += SDP_PDU_HDR_SIZE; 564d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= SDP_PDU_HDR_SIZE; 565d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 566ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 567d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 5681362b7f4b6b7c3e61e9b7f084d52c98da4f7f227Max Krasnyansky switch (hdr->pid) { 569d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_ERROR_RSP: 570d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky err_rsp(level, tid, len, frm); 571d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 572d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_REQ: 573d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky ss_req(level, tid, len, frm); 574d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 575d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_RSP: 576d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky ss_rsp(level, tid, len, frm); 577d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 578d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_ATTR_REQ: 579d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky sa_req(level, tid, len, frm); 580d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 581d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_ATTR_RSP: 582d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky sa_rsp(level, tid, len, frm); 583d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 584d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_ATTR_REQ: 585d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky ssa_req(level, tid, len, frm); 586d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 587d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_ATTR_RSP: 588d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky ssa_rsp(level, tid, len, frm); 589d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 590d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky default: 591d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("ERROR: Unknown PDU ID: 0x%x\n", hdr->pid); 592d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(++level, frm); 593d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return; 594d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 595d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 596d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky if (hdr->pid != SDP_ERROR_RSP) { 597d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse ContinuationState */ 598c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai int i; 599c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai unsigned char *buf = frm->ptr; 600c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai p_indent(++level, frm); 601c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai printf("cont "); 602c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai for (i=0; i < frm->len; i++) { 603c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai printf("%2.2X ", buf[i]); 604d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 605c166a7a08bf511a0eec4712811f8342a17d6ccc3Takashi Sasai printf("\n"); 606d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 607d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 608