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