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