sdp.c revision 65eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfb
1d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky/* 2d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky HCIDump - HCI packet analyzer 3d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky Copyright (C) 2000-2001 Maxim Krasnyansky <maxk@qualcomm.com> 4d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 5d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky This program is free software; you can redistribute it and/or modify 6d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky it under the terms of the GNU General Public License version 2 as 7d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky published by the Free Software Foundation; 8d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 9d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 10d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 11d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. 12d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM, 13d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER 14d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 15d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE 16d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky USE OR PERFORMANCE OF THIS SOFTWARE. 17d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 18d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS, 19d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 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/socket.h> 38d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <sys/types.h> 39d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <asm/types.h> 40d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <netinet/in.h> 41d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 42d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <bluetooth/bluetooth.h> 43d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <bluetooth/hci.h> 44d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include <bluetooth/l2cap.h> 45d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 46d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include "parser.h" 47d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky#include "sdp.h" 48d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 49d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_de(int, struct frame*); 50d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 51d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskysdp_siz_idx_lookup_table_t sdp_siz_idx_lookup_table[] = { 52d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 1 }, /* Size index = 0 */ 53d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 2 }, /* 1 */ 54d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 4 }, /* 2 */ 55d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 8 }, /* 3 */ 56d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 0, 16 }, /* 4 */ 57d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 1, 1 }, /* 5 */ 58d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 1, 2 }, /* 6 */ 59d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 1, 4 }, /* 7 */ 60d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky}; 61d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 62d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskysdp_uuid_nam_lookup_table_t sdp_uuid_nam_lookup_table[] = { 63d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_SDP, "SDP" }, 64d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_UDP, "UDP" }, 65d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_RFCOMM, "RFCOMM" }, 66d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_TCP, "TCP" }, 67d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_TCS_BIN, "TCS-BIN" }, 68d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_TCS_AT, "TCS-AT" }, 69d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_OBEX, "OBEX" }, 70d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_IP, "IP" }, 71d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_FTP, "FTP" }, 72d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_HTTP, "HTTP" }, 73d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_WSP, "WSP" }, 74d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_L2CAP, "L2CAP" }, 75d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_SERVICE_DISCOVERY_SERVER, "SDServer" }, 76d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_BROWSE_GROUP_DESCRIPTOR, "BrwsGrpDesc" }, 77d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_PUBLIC_BROWSE_GROUP, "PubBrwsGrp" }, 78d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_SERIAL_PORT, "SP" }, 79d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_LAN_ACCESS_PPP, "LAN" }, 80d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_DIALUP_NETWORKING, "DUN" }, 81d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_IR_MC_SYNC, "IRMCSync" }, 82d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_OBEX_OBJECT_PUSH, "OBEXObjPush" }, 83d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_OBEX_FILE_TRANSFER, "OBEXObjTrnsf" }, 84d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_IR_MC_SYNC_COMMAND, "IRMCSyncCmd" }, 85d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_HEADSET, "Headset" }, 86d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_CORDLESS_TELEPHONY, "CordlessTel" }, 87d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_INTERCOM, "Intercom" }, 88d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_FAX, "Fax" }, 89d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_HEADSET_AUDIO_GATEWAY, "AG" }, 90d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_PNP_INFORMATION, "PNPInfo" }, 91d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_GENERIC_NETWORKING, "Networking" }, 92d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_GENERIC_FILE_TRANSFER, "FileTrnsf" }, 93d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_GENERIC_AUDIO, "Audio" }, 94d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_UUID_GENERIC_TELEPHONY, "Telephony" } 95d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky}; 96d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 97d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskysdp_attr_id_nam_lookup_table_t sdp_attr_id_nam_lookup_table[] = { 98d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_RECORD_HANDLE, "SrvRecHndl" }, 99d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_CLASS_ID_LIST, "SrvClassIDList" }, 100d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_RECORD_STATE, "SrvRecState" }, 101d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_SERVICE_ID, "SrvID" }, 102d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_PROTOCOL_DESCRIPTOR_LIST, "ProtocolDescList" }, 103d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_BROWSE_GROUP_LIST, "BrwGrpList" }, 104d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_LANGUAGE_BASE_ATTRIBUTE_ID_LIST, "LangBaseAttrIDList" }, 105d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_INFO_TIME_TO_LIVE, "SrvInfoTimeToLive" }, 106d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_AVAILABILITY, "SrvAvail" }, 107d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_BLUETOOTH_PROFILE_DESCRIPTOR_LIST, "BTProfileDescList" }, 108d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_DOCUMENTATION_URL, "DocURL" }, 109d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_CLIENT_EXECUTABLE_URL, "ClientExeURL" }, 110d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_ICON_10, "Icon10" }, 111d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_ICON_URL, "IconURL" }, 112d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_NAME, "SrvName" }, 113d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_DESCRIPTION, "SrvDesc" }, 114d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_PROVIDER_NAME, "ProviderName" }, 115d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_VERSION_NUMBER_LIST, "VersionNumList" }, 116d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_GROUP_ID, "GrpID" }, 117d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_DATABASE_STATE, "SrvDBState" }, 118d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { SDP_ATTR_ID_SERVICE_VERSION, "SrvVersion" } 119d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky}; 120d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 121d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline __u8 get_u8(struct frame *frm) 122d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 123d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u8 *u8_ptr = frm->ptr; 124d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += 1; 125d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= 1; 126d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return *u8_ptr; 127d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 128d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 129d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline __u16 get_u16(struct frame *frm) 130d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 131d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u16 *u16_ptr = frm->ptr; 132d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += 2; 133d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= 2; 134d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return ntohs(*u16_ptr); 135d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 136d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 137d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline __u32 get_u32(struct frame *frm) 138d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 139d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u32 *u32_ptr = frm->ptr; 140d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += 4; 141d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= 4; 142d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return ntohl(*u32_ptr); 143d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 144d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 145d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 146d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline char* get_uuid_name(int uuid) 147d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 148d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int i; 149d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 150d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky for (i = 0; i < SDP_UUID_NAM_LOOKUP_TABLE_SIZE; i++) 151d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 152d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (sdp_uuid_nam_lookup_table[i].uuid == uuid) 153d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 154d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return sdp_uuid_nam_lookup_table[i].name; 155d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 156d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 157d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 158d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return 0; 159d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 160d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 161d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline char* get_attr_id_name(int attr_id) 162d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 163d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int i; 164d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 165d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky for (i = 0; i < SDP_ATTR_ID_NAM_LOOKUP_TABLE_SIZE; i++) 166d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 167d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (sdp_attr_id_nam_lookup_table[i].attr_id == attr_id) 168d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 169d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return sdp_attr_id_nam_lookup_table[i].name; 170d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 171d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 172d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 173d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return 0; 174d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 175d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 176d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline __u8 parse_de_hdr(struct frame *frm, int* n) 177d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 178d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u8 de_hdr = get_u8(frm); 179d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u8 de_type = de_hdr >> 3; 180d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u8 siz_idx = de_hdr & 0x07; 181d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 182d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Get the number of bytes */ 183d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (sdp_siz_idx_lookup_table[siz_idx].addl_bits) { 184d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(sdp_siz_idx_lookup_table[siz_idx].num_bytes) { 185d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 1: 186d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = get_u8(frm); break; 187d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: 188d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = get_u16(frm); break; 189d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: 190d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = get_u32(frm); break; 191d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 192d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 193d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky *n = sdp_siz_idx_lookup_table[siz_idx].num_bytes; 194d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 195d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 196d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return de_type; 197d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 198d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 199d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_des(__u8 de_type, int level, int n, struct frame *frm) 200d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 201d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int len = frm->len; 202d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 203d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky while (len - frm->len < n ) { 204d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_de(level, frm); 205d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 206d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 207d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 208d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_int(__u8 de_type, int level, int n, struct frame *frm) 209d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 210d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u64 val; 211d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 212d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(de_type) { 213d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_UINT: 214d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" uint"); 215d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 216d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_INT: 217d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" int"); 218d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 219d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_BOOL: 220d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" bool"); 221d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 222d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 223d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 224d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(n) { 225d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 1: /* 8-bit */ 226d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky val = get_u8(frm); 227d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 228d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: /* 16-bit */ 229d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky val = get_u16(frm); 230d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 231d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: /* 32-bit */ 232d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky val = get_u32(frm); 233d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 234d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 8: /* 64-bit */ 235d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Not supported yet */ 236d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky val = 0; 237d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 238d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky default: /* syntax error */ 239d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" err"); 240d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += n; 241d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= n; 242d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return; 243d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 244d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 245d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" 0x%llx", val); 246d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 247d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 248d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_uuid(int n, struct frame *frm) 249d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 250d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u32 uuid = 0; 251d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky char* s; 252d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 253d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(n) { 254d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: /* 16-bit UUID */ 255d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky uuid = get_u16(frm); 256d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 257d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: /* 32_bit UUID */ 258d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky uuid = get_u32(frm); 259d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 260d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 16: /* 128-bit UUID */ 261d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky uuid = get_u32(frm); 262d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += 12; 263d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= 12; 264d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 265d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky default: /* syntax error */ 266d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" *err*"); 267d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += n; 268d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= n; 269d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return; 270d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 271d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 272d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" 0x%x", uuid); 273d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if ((s = get_uuid_name(uuid)) != 0) 274d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 275d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" (%s)", s); 276d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 277d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 278d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 279d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_string(int n, struct frame *frm) 280d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 281d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky char *s; 282d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 283d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" str"); 284d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if ((s = malloc(n + 1))) { 285d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky s = frm->ptr; 286d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky s[n] = '\0'; 287d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" \"%s\"", s); 288d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 289d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky perror("Can't allocate string buffer"); 290d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 291d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 292d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += n; 293d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= n; 294d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 295d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 296d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_de(int level, struct frame *frm) 297d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 298d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n; 299d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u8 de_type = parse_de_hdr(frm, &n); 300d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 301d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(de_type) { 302d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_NULL: 303d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("null"); 304d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 305d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_UINT: 306d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_INT: 307d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_BOOL: 308d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_int(de_type, level, n, frm); 309d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 310d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_UUID: 311d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_uuid(n, frm); 312d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 313d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_STRING: 314d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_string(n, frm); 315d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 316d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_SEQ: 317d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_ALT: 318d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_des(de_type, ++level, n, frm); 319d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 320d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_DE_URL: 321d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 322d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 323d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 324d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 325d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 326d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_srv_srch_pat(int level, struct frame *frm) 327d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 328d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int len = frm->len; 329d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n1; 330d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n2; 331d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 33265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, frm->in); 333d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("pat"); 334d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 335d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { 336d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky while (len - frm->len < n1 ) { 337d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm,&n2) == SDP_DE_UUID) { 338d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_uuid(n2, frm); 339d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 340d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 341d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 342d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 343d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 344d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\n"); 345d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 346d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 347d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 348d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 349d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 350d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 351d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 352d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_attr_id_list(int level, struct frame *frm) 353d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 354d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u16 attr_id; 355d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u32 attr_id_range; 356d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n1; 357d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n2; 358d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int len = frm->len; 359d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 36065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, frm->in); 361d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("aid(s)"); 362d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 363d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { 364d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky while (len - frm->len < n1 ) { 365d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Print AttributeID */ 366d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n2) == SDP_DE_UINT) { 367d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(n2) { 368d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 2: 369d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky attr_id = get_u16(frm); 370d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" 0x%x (%s)", attr_id, get_attr_id_name(attr_id)); 371d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 372d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case 4: 373d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky attr_id_range = get_u32(frm); 374d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" 0x%x--0x%x", 375d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky (attr_id_range >> 16), 376d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky (attr_id_range & 0x00FF)); 377d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 378d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 379d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 380d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 381d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 382d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 383d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 384d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\n"); 385d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 386d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 387d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 388d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 389d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 390d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 391d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 392d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_attr_list(int level, struct frame *frm) 393d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 394d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u16 attr_id; 395d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n1; 396d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n2; 397d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int len = frm->len; 398d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 399d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) { 400d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky while (len - frm->len < n1 ) { 401d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Print AttributeID */ 402d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if ((parse_de_hdr(frm, &n2) == SDP_DE_UINT) && 403d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky (n2 == sizeof(attr_id))) { 404d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky attr_id = get_u16(frm); 40565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 406d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("aid 0x%x (%s)\n", attr_id, get_attr_id_name(attr_id)); 407d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 408d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Print AttributeValue */ 40965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, 0); 410d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_de(level, frm); 411d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 412d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 413d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 414d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 415d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 416d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 417d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\n"); 418d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 419d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 420d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 421d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 422d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 423d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 424d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 425d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void print_attr_lists(int level, struct frame *frm) 426d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 427d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int n; 428d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int cnt = 0; 429d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky int len = frm->len; 430d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 431d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (parse_de_hdr(frm, &n) == SDP_DE_SEQ) { 432d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky while (len - frm->len < n ) { 43365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 434d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("srv rec #%d\n", cnt++); 435d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_attr_list(level+1, frm); 436d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 437d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 438d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\nERROR: Unexpected syntax\n"); 439d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(level, frm); 440d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 441d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 442d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 443d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 444d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void err_rsp(int level, __u16 tid, __u16 len, struct frame *frm) 445d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 446d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP Error Rsp: tid 0x%x len 0x%x\n", tid, len); 447d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 44865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, 0); 449d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("ec 0x%x info ", get_u16(frm)); 450d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (frm->len > 0) { 451d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(0, frm); 452d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } else { 453d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("none\n"); 454d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 455d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 456d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 457d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 458d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void ss_req(int level, __u16 tid, __u16 len, struct frame *frm) 459d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 460d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SS Req: tid 0x%x len 0x%x\n", tid, len); 461d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 462d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse ServiceSearchPattern */ 463d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_srv_srch_pat(++level, frm); 464d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 465d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse MaximumServiceRecordCount */ 46665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 467d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("max 0x%x\n", get_u16(frm)); 468d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 469d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 470d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void ss_rsp(int level, __u16 tid, __u16 len, struct frame *frm) 471d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 472d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky register int i; 473d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u16 cur_srv_rec_cnt = get_u16(frm); /* Parse CurrentServiceRecordCount */ 474d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u16 tot_srv_rec_cnt = get_u16(frm); /* Parse TotalServiceRecordCount */ 475d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 476d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SS Rsp: tid 0x%x len 0x%x\n", tid, len); 477d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 47865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, 0); 479d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("cur 0x%x tot 0x%x", cur_srv_rec_cnt, tot_srv_rec_cnt); 480d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 481d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse service record handle(s) */ 482d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (cur_srv_rec_cnt > 0) { 483d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" hndl"); 484d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky for (i = 0; i < cur_srv_rec_cnt; i++) { 485d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf(" 0x%x", get_u32(frm)); 486d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 487d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 488d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("\n"); 489d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 490d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 491d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void sa_req(int level, __u16 tid, __u16 len, struct frame *frm) 492d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 493d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SA Req: tid 0x%x len 0x%x\n", tid, len); 494d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 495d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse ServiceRecordHandle */ 49665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, 0); 497d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("hndl 0x%x\n", get_u32(frm)); 498d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 499d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse MaximumAttributeByteCount */ 50065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 501d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("max 0x%x\n", get_u16(frm)); 502d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 503d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse ServiceSearchPattern */ 504d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_attr_id_list(level, frm); 505d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 506d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 507d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void sa_rsp(int level, __u16 tid, __u16 len, struct frame *frm) 508d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 509d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SA Rsp: tid 0x%x len 0x%x\n", tid, len); 510d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 511d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse AttributeByteCount */ 51265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, 0); 513d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("cnt 0x%x\n", get_u16(frm)); 514d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 515d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse AttributeList */ 516d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_attr_list(level, frm); 517d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 518d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 519d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void ssa_req(int level, __u16 tid, __u16 len, struct frame *frm) 520d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 521d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SSA Req: tid 0x%x len 0x%x\n", tid, len); 522d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 523d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse ServiceSearchPattern */ 524d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_srv_srch_pat(++level, frm); 525d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 526d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse MaximumAttributeByteCount */ 52765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(level, 0); 528d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("max 0x%x\n", get_u16(frm)); 529d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 530d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse AttributeList */ 531d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_attr_id_list(level, frm); 532d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 533d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 534d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskystatic inline void ssa_rsp(int level, __u16 tid, __u16 len, struct frame *frm) 535d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 536d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("SDP SSA Rsp: tid 0x%x len 0x%x\n", tid, len); 537d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 538d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse AttributeByteCount */ 53965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, 0); 540d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("cnt 0x%x\n", get_u16(frm)); 541d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 542d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse AttributeLists */ 543d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky print_attr_lists(level, frm); 544d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 545d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 546d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyanskyvoid sdp_dump(int level, struct frame *frm) 547d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky{ 548d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky sdp_pdu_hdr *hdr = frm->ptr; 549d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u16 tid = ntohs(hdr->tid); 550d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky __u16 len = ntohs(hdr->len); 551d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 552d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->ptr += SDP_PDU_HDR_SIZE; 553d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky frm->len -= SDP_PDU_HDR_SIZE; 554d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 55565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, frm->in); 556d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 557d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky switch(hdr->pid) { 558d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_ERROR_RSP: 559d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky err_rsp(level, tid, len, frm); 560d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 561d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_REQ: 562d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky ss_req(level, tid, len, frm); 563d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 564d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_RSP: 565d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky ss_rsp(level, tid, len, frm); 566d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 567d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_ATTR_REQ: 568d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky sa_req(level, tid, len, frm); 569d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 570d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_ATTR_RSP: 571d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky sa_rsp(level, tid, len, frm); 572d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 573d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_ATTR_REQ: 574d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky ssa_req(level, tid, len, frm); 575d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 576d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky case SDP_SERVICE_SEARCH_ATTR_RSP: 577d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky ssa_rsp(level, tid, len, frm); 578d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky break; 579d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky default: 580d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("ERROR: Unknown PDU ID: 0x%x\n", hdr->pid); 581d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(++level, frm); 582d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky return; 583d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 584d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky 585d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (hdr->pid != SDP_ERROR_RSP) 586d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky { 587d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky /* Parse ContinuationState */ 588d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky if (*(__u8*) frm->ptr) { 58965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky p_indent(++level, frm->in); 590d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky printf("cont "); 591d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky raw_dump(0, frm); 592d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 593d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky } 594d2214ceffa8f235a26ff0c6ab4b17f0a05f5d455Max Krasnyansky} 595