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