15e53a4f9SPedro F. Giffuni /*-
20986ab12SMaksim Yevmenkin * util.c
30986ab12SMaksim Yevmenkin *
4*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
55e53a4f9SPedro F. Giffuni *
60986ab12SMaksim Yevmenkin * Copyright (c) 2001-2003 Maksim Yevmenkin <m_evmenkin@yahoo.com>
70986ab12SMaksim Yevmenkin * All rights reserved.
80986ab12SMaksim Yevmenkin *
90986ab12SMaksim Yevmenkin * Redistribution and use in source and binary forms, with or without
100986ab12SMaksim Yevmenkin * modification, are permitted provided that the following conditions
110986ab12SMaksim Yevmenkin * are met:
120986ab12SMaksim Yevmenkin * 1. Redistributions of source code must retain the above copyright
130986ab12SMaksim Yevmenkin * notice, this list of conditions and the following disclaimer.
140986ab12SMaksim Yevmenkin * 2. Redistributions in binary form must reproduce the above copyright
150986ab12SMaksim Yevmenkin * notice, this list of conditions and the following disclaimer in the
160986ab12SMaksim Yevmenkin * documentation and/or other materials provided with the distribution.
170986ab12SMaksim Yevmenkin *
180986ab12SMaksim Yevmenkin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
190986ab12SMaksim Yevmenkin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
200986ab12SMaksim Yevmenkin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
210986ab12SMaksim Yevmenkin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
220986ab12SMaksim Yevmenkin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
230986ab12SMaksim Yevmenkin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
240986ab12SMaksim Yevmenkin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
250986ab12SMaksim Yevmenkin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
260986ab12SMaksim Yevmenkin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
270986ab12SMaksim Yevmenkin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
280986ab12SMaksim Yevmenkin * SUCH DAMAGE.
290986ab12SMaksim Yevmenkin *
300986ab12SMaksim Yevmenkin * $Id: util.c,v 1.5 2003/09/08 02:29:35 max Exp $
310986ab12SMaksim Yevmenkin */
320986ab12SMaksim Yevmenkin
3343d33de9SMaksim Yevmenkin #include <netinet/in.h>
348d6f425dSTakanori Watanabe #define L2CAP_SOCKET_CHECKED
350986ab12SMaksim Yevmenkin #include <bluetooth.h>
360986ab12SMaksim Yevmenkin #include <stdio.h>
370986ab12SMaksim Yevmenkin #include <sdp.h>
380986ab12SMaksim Yevmenkin
390986ab12SMaksim Yevmenkin /*
400986ab12SMaksim Yevmenkin * SDP attribute description
410986ab12SMaksim Yevmenkin */
420986ab12SMaksim Yevmenkin
430986ab12SMaksim Yevmenkin struct sdp_attr_desc {
446aae6f7eSMaksim Yevmenkin uint32_t attr;
450986ab12SMaksim Yevmenkin char const *desc;
460986ab12SMaksim Yevmenkin };
470986ab12SMaksim Yevmenkin typedef struct sdp_attr_desc sdp_attr_desc_t;
480986ab12SMaksim Yevmenkin typedef struct sdp_attr_desc * sdp_attr_desc_p;
490986ab12SMaksim Yevmenkin
500986ab12SMaksim Yevmenkin static sdp_attr_desc_t sdp_uuids_desc[] = {
510986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_SDP, "SDP", },
520986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_UDP, "UDP", },
530986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_RFCOMM, "RFCOMM", },
540986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_TCP, "TCP", },
550986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_TCS_BIN, "TCS BIN", },
560986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_TCS_AT, "TCS AT", },
570986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_OBEX, "OBEX", },
580986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_IP, "IP", },
590986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_FTP, "FTP", },
600986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_HTTP, "HTTP", },
610986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_WSP, "WSP", },
620986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_BNEP, "BNEP", },
630986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_UPNP, "UPNP", },
640986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_HIDP, "HIDP", },
650986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_HARDCOPY_CONTROL_CHANNEL, "Hardcopy Control Channel", },
660986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_HARDCOPY_DATA_CHANNEL, "Hardcopy Data Channel", },
670986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_HARDCOPY_NOTIFICATION, "Hardcopy Notification", },
680986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_AVCTP, "AVCTP", },
690986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_AVDTP, "AVDTP", },
700986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_CMPT, "CMPT", },
710986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_UDI_C_PLANE, "UDI C-Plane", },
720986ab12SMaksim Yevmenkin { SDP_UUID_PROTOCOL_L2CAP, "L2CAP", },
730986ab12SMaksim Yevmenkin /* Service Class IDs/Bluetooth Profile IDs */
740986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_SERVICE_DISCOVERY_SERVER, "Service Discovery Server", },
750986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_BROWSE_GROUP_DESCRIPTOR, "Browse Group Descriptor", },
760986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_PUBLIC_BROWSE_GROUP, "Public Browse Group", },
770986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_SERIAL_PORT, "Serial Port", },
780986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_LAN_ACCESS_USING_PPP, "LAN Access Using PPP", },
790eff7205SMaksim Yevmenkin { SDP_SERVICE_CLASS_DIALUP_NETWORKING, "Dial-Up Networking", },
800986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_IR_MC_SYNC, "IrMC Sync", },
810986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_OBEX_OBJECT_PUSH, "OBEX Object Push", },
820986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_OBEX_FILE_TRANSFER, "OBEX File Transfer", },
830986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_IR_MC_SYNC_COMMAND, "IrMC Sync Command", },
840986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_HEADSET, "Headset", },
850986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_CORDLESS_TELEPHONY, "Cordless Telephony", },
860986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_AUDIO_SOURCE, "Audio Source", },
870986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_AUDIO_SINK, "Audio Sink", },
880986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_AV_REMOTE_CONTROL_TARGET, "A/V Remote Control Target", },
890986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_ADVANCED_AUDIO_DISTRIBUTION, "Advanced Audio Distribution", },
900986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_AV_REMOTE_CONTROL, "A/V Remote Control", },
910986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_VIDEO_CONFERENCING, "Video Conferencing", },
920986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_INTERCOM, "Intercom", },
930986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_FAX, "Fax", },
940986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_HEADSET_AUDIO_GATEWAY, "Headset Audio Gateway", },
950986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_WAP, "WAP", },
960986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_WAP_CLIENT, "WAP Client", },
970986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_PANU, "PANU", },
980986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_NAP, "Network Access Point", },
990986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_GN, "GN", },
1000986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_DIRECT_PRINTING, "Direct Printing", },
1010986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_REFERENCE_PRINTING, "Reference Printing", },
1020986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_IMAGING, "Imaging", },
1030986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_IMAGING_RESPONDER, "Imaging Responder", },
1040986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_IMAGING_AUTOMATIC_ARCHIVE, "Imaging Automatic Archive", },
1050986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_IMAGING_REFERENCED_OBJECTS, "Imaging Referenced Objects", },
1060986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_HANDSFREE, "Handsfree", },
1070986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_HANDSFREE_AUDIO_GATEWAY, "Handsfree Audio Gateway", },
1080986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_DIRECT_PRINTING_REFERENCE_OBJECTS, "Direct Printing Reference Objects", },
1090986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_REFLECTED_UI, "Reflected UI", },
1100986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_BASIC_PRINTING, "Basic Printing", },
1110986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_PRINTING_STATUS, "Printing Status", },
1120986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_HUMAN_INTERFACE_DEVICE, "Human Interface Device", },
1130986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_HARDCOPY_CABLE_REPLACEMENT, "Hardcopy Cable Replacement", },
1140986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_HCR_PRINT, "HCR Print", },
1150986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_HCR_SCAN, "HCR Scan", },
1160986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_COMMON_ISDN_ACCESS, "Common ISDN Access", },
1170986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_VIDEO_CONFERENCING_GW, "Video Conferencing Gateway", },
1180986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_UDI_MT, "UDI MT", },
1190986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_UDI_TA, "UDI TA", },
1200986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_AUDIO_VIDEO, "Audio/Video", },
1210986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_SIM_ACCESS, "SIM Access", },
1225b22d1e6SMarkus Brueffer { SDP_SERVICE_CLASS_PHONEBOOK_ACCESS_PCE, "Phonebook Access - PCE", },
1235b22d1e6SMarkus Brueffer { SDP_SERVICE_CLASS_PHONEBOOK_ACCESS_PSE, "Phonebook Access - PSE", },
1245b22d1e6SMarkus Brueffer { SDP_SERVICE_CLASS_PHONEBOOK_ACCESS, "Phonebook Access", },
1250986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_PNP_INFORMATION, "PNP Information", },
1260986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_GENERIC_NETWORKING, "Generic Networking", },
1270986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_GENERIC_FILE_TRANSFER, "Generic File Transfer", },
1280986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_GENERIC_AUDIO, "Generic Audio", },
1290986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_GENERIC_TELEPHONY, "Generic Telephony", },
1300986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_UPNP, "UPNP", },
1310986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_UPNP_IP, "UPNP IP", },
1320986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_ESDP_UPNP_IP_PAN, "ESDP UPNP IP PAN", },
1330986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_ESDP_UPNP_IP_LAP, "ESDP UPNP IP LAP", },
1340986ab12SMaksim Yevmenkin { SDP_SERVICE_CLASS_ESDP_UPNP_L2CAP, "ESDP UPNP L2CAP", },
1355b22d1e6SMarkus Brueffer { SDP_SERVICE_CLASS_VIDEO_SOURCE, "Video Source", },
1365b22d1e6SMarkus Brueffer { SDP_SERVICE_CLASS_VIDEO_SINK, "Video Sink", },
1375b22d1e6SMarkus Brueffer { SDP_SERVICE_CLASS_VIDEO_DISTRIBUTION, "Video Distribution", },
1380986ab12SMaksim Yevmenkin { 0xffff, NULL, }
1390986ab12SMaksim Yevmenkin };
1400986ab12SMaksim Yevmenkin
1410986ab12SMaksim Yevmenkin static sdp_attr_desc_t sdp_attrs_desc[] = {
1420986ab12SMaksim Yevmenkin { SDP_ATTR_SERVICE_RECORD_HANDLE,
1430986ab12SMaksim Yevmenkin "Record handle",
1440986ab12SMaksim Yevmenkin },
1450986ab12SMaksim Yevmenkin { SDP_ATTR_SERVICE_CLASS_ID_LIST,
1460986ab12SMaksim Yevmenkin "Service Class ID list",
1470986ab12SMaksim Yevmenkin },
1480986ab12SMaksim Yevmenkin { SDP_ATTR_SERVICE_RECORD_STATE,
1490986ab12SMaksim Yevmenkin "Service Record State",
1500986ab12SMaksim Yevmenkin },
1510986ab12SMaksim Yevmenkin { SDP_ATTR_SERVICE_ID,
1520986ab12SMaksim Yevmenkin "Service ID",
1530986ab12SMaksim Yevmenkin },
1540986ab12SMaksim Yevmenkin { SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST,
1550986ab12SMaksim Yevmenkin "Protocol Descriptor List",
1560986ab12SMaksim Yevmenkin },
1570986ab12SMaksim Yevmenkin { SDP_ATTR_BROWSE_GROUP_LIST,
1580986ab12SMaksim Yevmenkin "Browse Group List",
1590986ab12SMaksim Yevmenkin },
1600986ab12SMaksim Yevmenkin { SDP_ATTR_LANGUAGE_BASE_ATTRIBUTE_ID_LIST,
1610986ab12SMaksim Yevmenkin "Language Base Attribute ID List",
1620986ab12SMaksim Yevmenkin },
1630986ab12SMaksim Yevmenkin { SDP_ATTR_SERVICE_INFO_TIME_TO_LIVE,
1640986ab12SMaksim Yevmenkin "Service Info Time-To-Live",
1650986ab12SMaksim Yevmenkin },
1660986ab12SMaksim Yevmenkin { SDP_ATTR_SERVICE_AVAILABILITY,
1670986ab12SMaksim Yevmenkin "Service Availability",
1680986ab12SMaksim Yevmenkin },
1690986ab12SMaksim Yevmenkin { SDP_ATTR_BLUETOOTH_PROFILE_DESCRIPTOR_LIST,
1700986ab12SMaksim Yevmenkin "Bluetooh Profile Descriptor List",
1710986ab12SMaksim Yevmenkin },
1720986ab12SMaksim Yevmenkin { SDP_ATTR_DOCUMENTATION_URL,
1730986ab12SMaksim Yevmenkin "Documentation URL",
1740986ab12SMaksim Yevmenkin },
1750986ab12SMaksim Yevmenkin { SDP_ATTR_CLIENT_EXECUTABLE_URL,
1760986ab12SMaksim Yevmenkin "Client Executable URL",
1770986ab12SMaksim Yevmenkin },
1780986ab12SMaksim Yevmenkin { SDP_ATTR_ICON_URL,
1790986ab12SMaksim Yevmenkin "Icon URL",
1800986ab12SMaksim Yevmenkin },
1810986ab12SMaksim Yevmenkin { SDP_ATTR_ADDITIONAL_PROTOCOL_DESCRIPTOR_LISTS,
1820986ab12SMaksim Yevmenkin "Additional Protocol Descriptor Lists" },
1830986ab12SMaksim Yevmenkin { SDP_ATTR_GROUP_ID,
1840986ab12SMaksim Yevmenkin /*SDP_ATTR_IP_SUBNET,
1850986ab12SMaksim Yevmenkin SDP_ATTR_VERSION_NUMBER_LIST*/
1860986ab12SMaksim Yevmenkin "Group ID/IP Subnet/Version Number List",
1870986ab12SMaksim Yevmenkin },
1880986ab12SMaksim Yevmenkin { SDP_ATTR_SERVICE_DATABASE_STATE,
1890986ab12SMaksim Yevmenkin "Service Database State",
1900986ab12SMaksim Yevmenkin },
1910986ab12SMaksim Yevmenkin { SDP_ATTR_SERVICE_VERSION,
1920986ab12SMaksim Yevmenkin "Service Version",
1930986ab12SMaksim Yevmenkin },
1940986ab12SMaksim Yevmenkin { SDP_ATTR_EXTERNAL_NETWORK,
1950986ab12SMaksim Yevmenkin /*SDP_ATTR_NETWORK,
1960986ab12SMaksim Yevmenkin SDP_ATTR_SUPPORTED_DATA_STORES_LIST*/
1970986ab12SMaksim Yevmenkin "External Network/Network/Supported Data Stores List",
1980986ab12SMaksim Yevmenkin },
1990986ab12SMaksim Yevmenkin { SDP_ATTR_FAX_CLASS1_SUPPORT,
2000986ab12SMaksim Yevmenkin /*SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL*/
2010986ab12SMaksim Yevmenkin "Fax Class1 Support/Remote Audio Volume Control",
2020986ab12SMaksim Yevmenkin },
2030986ab12SMaksim Yevmenkin { SDP_ATTR_FAX_CLASS20_SUPPORT,
2040986ab12SMaksim Yevmenkin /*SDP_ATTR_SUPPORTED_FORMATS_LIST*/
2050986ab12SMaksim Yevmenkin "Fax Class20 Support/Supported Formats List",
2060986ab12SMaksim Yevmenkin },
2070986ab12SMaksim Yevmenkin { SDP_ATTR_FAX_CLASS2_SUPPORT,
2080986ab12SMaksim Yevmenkin "Fax Class2 Support",
2090986ab12SMaksim Yevmenkin },
2100986ab12SMaksim Yevmenkin { SDP_ATTR_AUDIO_FEEDBACK_SUPPORT,
2110986ab12SMaksim Yevmenkin "Audio Feedback Support",
2120986ab12SMaksim Yevmenkin },
2130986ab12SMaksim Yevmenkin { SDP_ATTR_NETWORK_ADDRESS,
2140986ab12SMaksim Yevmenkin "Network Address",
2150986ab12SMaksim Yevmenkin },
2160986ab12SMaksim Yevmenkin { SDP_ATTR_WAP_GATEWAY,
2170986ab12SMaksim Yevmenkin "WAP Gateway",
2180986ab12SMaksim Yevmenkin },
2190986ab12SMaksim Yevmenkin { SDP_ATTR_HOME_PAGE_URL,
2200986ab12SMaksim Yevmenkin "Home Page URL",
2210986ab12SMaksim Yevmenkin },
2220986ab12SMaksim Yevmenkin { SDP_ATTR_WAP_STACK_TYPE,
2230986ab12SMaksim Yevmenkin "WAP Stack Type",
2240986ab12SMaksim Yevmenkin },
2250986ab12SMaksim Yevmenkin { SDP_ATTR_SECURITY_DESCRIPTION,
2260986ab12SMaksim Yevmenkin "Security Description",
2270986ab12SMaksim Yevmenkin },
2280986ab12SMaksim Yevmenkin { SDP_ATTR_NET_ACCESS_TYPE,
2290986ab12SMaksim Yevmenkin "Net Access Type",
2300986ab12SMaksim Yevmenkin },
2310986ab12SMaksim Yevmenkin { SDP_ATTR_MAX_NET_ACCESS_RATE,
2320986ab12SMaksim Yevmenkin "Max Net Access Rate",
2330986ab12SMaksim Yevmenkin },
2340986ab12SMaksim Yevmenkin { SDP_ATTR_IPV4_SUBNET,
2350986ab12SMaksim Yevmenkin "IPv4 Subnet",
2360986ab12SMaksim Yevmenkin },
2370986ab12SMaksim Yevmenkin { SDP_ATTR_IPV6_SUBNET,
2380986ab12SMaksim Yevmenkin "IPv6 Subnet",
2390986ab12SMaksim Yevmenkin },
2400986ab12SMaksim Yevmenkin { SDP_ATTR_SUPPORTED_CAPABALITIES,
2410986ab12SMaksim Yevmenkin "Supported Capabalities",
2420986ab12SMaksim Yevmenkin },
2430986ab12SMaksim Yevmenkin { SDP_ATTR_SUPPORTED_FEATURES,
2440986ab12SMaksim Yevmenkin "Supported Features",
2450986ab12SMaksim Yevmenkin },
2460986ab12SMaksim Yevmenkin { SDP_ATTR_SUPPORTED_FUNCTIONS,
2470986ab12SMaksim Yevmenkin "Supported Functions",
2480986ab12SMaksim Yevmenkin },
2490986ab12SMaksim Yevmenkin { SDP_ATTR_TOTAL_IMAGING_DATA_CAPACITY,
2500986ab12SMaksim Yevmenkin "Total Imaging Data Capacity",
2510986ab12SMaksim Yevmenkin },
2525b22d1e6SMarkus Brueffer { SDP_ATTR_SUPPORTED_REPOSITORIES,
2535b22d1e6SMarkus Brueffer "Supported Repositories",
2545b22d1e6SMarkus Brueffer },
2550986ab12SMaksim Yevmenkin { 0xffff, NULL, }
2560986ab12SMaksim Yevmenkin };
2570986ab12SMaksim Yevmenkin
25884ab9306SMaksim Yevmenkin char const *
sdp_attr2desc(uint16_t attr)2596aae6f7eSMaksim Yevmenkin sdp_attr2desc(uint16_t attr)
2600986ab12SMaksim Yevmenkin {
2610986ab12SMaksim Yevmenkin register sdp_attr_desc_p a = sdp_attrs_desc;
2620986ab12SMaksim Yevmenkin
2630986ab12SMaksim Yevmenkin for (; a->desc != NULL; a++)
2640986ab12SMaksim Yevmenkin if (attr == a->attr)
2650986ab12SMaksim Yevmenkin break;
2660986ab12SMaksim Yevmenkin
2670986ab12SMaksim Yevmenkin return ((a->desc != NULL)? a->desc : "Unknown");
2680986ab12SMaksim Yevmenkin }
2690986ab12SMaksim Yevmenkin
27084ab9306SMaksim Yevmenkin char const *
sdp_uuid2desc(uint16_t uuid)2716aae6f7eSMaksim Yevmenkin sdp_uuid2desc(uint16_t uuid)
2720986ab12SMaksim Yevmenkin {
2730986ab12SMaksim Yevmenkin register sdp_attr_desc_p a = sdp_uuids_desc;
2740986ab12SMaksim Yevmenkin
2750986ab12SMaksim Yevmenkin for (; a->desc != NULL; a++)
2760986ab12SMaksim Yevmenkin if (uuid == a->attr)
2770986ab12SMaksim Yevmenkin break;
2780986ab12SMaksim Yevmenkin
2790986ab12SMaksim Yevmenkin return ((a->desc != NULL)? a->desc : "Unknown");
2800986ab12SMaksim Yevmenkin }
2810986ab12SMaksim Yevmenkin
2820986ab12SMaksim Yevmenkin void
sdp_print(uint32_t level,uint8_t const * start,uint8_t const * end)2836aae6f7eSMaksim Yevmenkin sdp_print(uint32_t level, uint8_t const *start, uint8_t const *end)
2840986ab12SMaksim Yevmenkin {
2850986ab12SMaksim Yevmenkin union {
2860986ab12SMaksim Yevmenkin int8_t int8;
2870986ab12SMaksim Yevmenkin int16_t int16;
2880986ab12SMaksim Yevmenkin int32_t int32;
2890986ab12SMaksim Yevmenkin int64_t int64;
2900986ab12SMaksim Yevmenkin int128_t int128;
2910986ab12SMaksim Yevmenkin uint8_t uint8;
2920986ab12SMaksim Yevmenkin uint16_t uint16;
2930986ab12SMaksim Yevmenkin uint32_t uint32;
2940986ab12SMaksim Yevmenkin uint64_t uint64;
2950986ab12SMaksim Yevmenkin } value;
2966aae6f7eSMaksim Yevmenkin uint8_t type;
2976aae6f7eSMaksim Yevmenkin uint32_t i;
2980986ab12SMaksim Yevmenkin
2990986ab12SMaksim Yevmenkin if (start == NULL || end == NULL)
3000986ab12SMaksim Yevmenkin return;
3010986ab12SMaksim Yevmenkin
3020986ab12SMaksim Yevmenkin while (start < end) {
3030986ab12SMaksim Yevmenkin for (i = 0; i < level; i++)
3040986ab12SMaksim Yevmenkin printf("\t");
3050986ab12SMaksim Yevmenkin
3060986ab12SMaksim Yevmenkin SDP_GET8(type, start);
3070986ab12SMaksim Yevmenkin
3080986ab12SMaksim Yevmenkin switch (type) {
3090986ab12SMaksim Yevmenkin case SDP_DATA_NIL:
3100986ab12SMaksim Yevmenkin printf("nil\n");
3110986ab12SMaksim Yevmenkin break;
3120986ab12SMaksim Yevmenkin
3130986ab12SMaksim Yevmenkin case SDP_DATA_UINT8:
3140986ab12SMaksim Yevmenkin SDP_GET8(value.uint8, start);
3150986ab12SMaksim Yevmenkin printf("uint8 %u\n", value.uint8);
3160986ab12SMaksim Yevmenkin break;
3170986ab12SMaksim Yevmenkin case SDP_DATA_UINT16:
3180986ab12SMaksim Yevmenkin SDP_GET16(value.uint16, start);
3190986ab12SMaksim Yevmenkin printf("uint16 %u\n", value.uint16);
3200986ab12SMaksim Yevmenkin break;
3210986ab12SMaksim Yevmenkin case SDP_DATA_UINT32:
3220986ab12SMaksim Yevmenkin SDP_GET32(value.uint32, start);
3230986ab12SMaksim Yevmenkin printf("uint32 %u\n", value.uint32);
3240986ab12SMaksim Yevmenkin break;
3250986ab12SMaksim Yevmenkin case SDP_DATA_UINT64:
3260986ab12SMaksim Yevmenkin SDP_GET64(value.uint64, start);
3274ae439a3SMaksim Yevmenkin printf("uint64 %ju\n", value.uint64);
3280986ab12SMaksim Yevmenkin break;
3290986ab12SMaksim Yevmenkin
3300986ab12SMaksim Yevmenkin case SDP_DATA_UINT128:
3310986ab12SMaksim Yevmenkin case SDP_DATA_INT128:
3320986ab12SMaksim Yevmenkin SDP_GET128(&value.int128, start);
33343d33de9SMaksim Yevmenkin printf("u/int128 %#8.8x%8.8x%8.8x%8.8x\n",
3346aae6f7eSMaksim Yevmenkin *(uint32_t *)&value.int128.b[0],
33543d33de9SMaksim Yevmenkin *(uint32_t *)&value.int128.b[4],
33643d33de9SMaksim Yevmenkin *(uint32_t *)&value.int128.b[8],
3376aae6f7eSMaksim Yevmenkin *(uint32_t *)&value.int128.b[12]);
3380986ab12SMaksim Yevmenkin break;
3390986ab12SMaksim Yevmenkin
34043d33de9SMaksim Yevmenkin case SDP_DATA_UUID128:
34143d33de9SMaksim Yevmenkin SDP_GET_UUID128(&value.int128, start);
34243d33de9SMaksim Yevmenkin printf("uuid128 %#8.8x-%4.4x-%4.4x-%4.4x-%4.4x%8.8x\n",
34343d33de9SMaksim Yevmenkin ntohl(*(uint32_t *)&value.int128.b[0]),
34443d33de9SMaksim Yevmenkin ntohs(*(uint16_t *)&value.int128.b[4]),
34543d33de9SMaksim Yevmenkin ntohs(*(uint16_t *)&value.int128.b[6]),
34643d33de9SMaksim Yevmenkin ntohs(*(uint16_t *)&value.int128.b[8]),
34743d33de9SMaksim Yevmenkin ntohs(*(uint16_t *)&value.int128.b[10]),
34843d33de9SMaksim Yevmenkin ntohl(*(uint32_t *)&value.int128.b[12]));
34943d33de9SMaksim Yevmenkin break;
35043d33de9SMaksim Yevmenkin
3510986ab12SMaksim Yevmenkin case SDP_DATA_INT8:
3520986ab12SMaksim Yevmenkin SDP_GET8(value.int8, start);
3530986ab12SMaksim Yevmenkin printf("int8 %d\n", value.int8);
3540986ab12SMaksim Yevmenkin break;
3550986ab12SMaksim Yevmenkin case SDP_DATA_INT16:
3560986ab12SMaksim Yevmenkin SDP_GET16(value.int16, start);
3570986ab12SMaksim Yevmenkin printf("int16 %d\n", value.int16);
3580986ab12SMaksim Yevmenkin break;
3590986ab12SMaksim Yevmenkin case SDP_DATA_INT32:
3600986ab12SMaksim Yevmenkin SDP_GET32(value.int32, start);
3610986ab12SMaksim Yevmenkin printf("int32 %d\n", value.int32);
3620986ab12SMaksim Yevmenkin break;
3630986ab12SMaksim Yevmenkin case SDP_DATA_INT64:
3640986ab12SMaksim Yevmenkin SDP_GET64(value.int64, start);
3654ae439a3SMaksim Yevmenkin printf("int64 %ju\n", value.int64);
3660986ab12SMaksim Yevmenkin break;
3670986ab12SMaksim Yevmenkin
3680986ab12SMaksim Yevmenkin case SDP_DATA_UUID16:
3690986ab12SMaksim Yevmenkin SDP_GET16(value.uint16, start);
3700986ab12SMaksim Yevmenkin printf("uuid16 %#4.4x - %s\n", value.uint16,
3710986ab12SMaksim Yevmenkin sdp_uuid2desc(value.uint16));
3720986ab12SMaksim Yevmenkin break;
3730986ab12SMaksim Yevmenkin case SDP_DATA_UUID32:
3740986ab12SMaksim Yevmenkin SDP_GET32(value.uint32, start);
3750986ab12SMaksim Yevmenkin printf("uuid32 %#8.8x\n", value.uint32);
3760986ab12SMaksim Yevmenkin break;
3770986ab12SMaksim Yevmenkin
3780986ab12SMaksim Yevmenkin case SDP_DATA_STR8:
3790986ab12SMaksim Yevmenkin SDP_GET8(value.uint8, start);
3800986ab12SMaksim Yevmenkin printf("str8 %*.*s\n", value.uint8, value.uint8, start);
3810986ab12SMaksim Yevmenkin start += value.uint8;
3820986ab12SMaksim Yevmenkin break;
3830986ab12SMaksim Yevmenkin case SDP_DATA_STR16:
3840986ab12SMaksim Yevmenkin SDP_GET16(value.uint16, start);
3850986ab12SMaksim Yevmenkin printf("str16 %*.*s\n", value.uint16, value.uint16, start);
3860986ab12SMaksim Yevmenkin start += value.uint16;
3870986ab12SMaksim Yevmenkin break;
3880986ab12SMaksim Yevmenkin case SDP_DATA_STR32:
3890986ab12SMaksim Yevmenkin SDP_GET32(value.uint32, start);
3900986ab12SMaksim Yevmenkin printf("str32 %*.*s\n", value.uint32, value.uint32, start);
3910986ab12SMaksim Yevmenkin start += value.uint32;
3920986ab12SMaksim Yevmenkin break;
3930986ab12SMaksim Yevmenkin
3940986ab12SMaksim Yevmenkin case SDP_DATA_BOOL:
3950986ab12SMaksim Yevmenkin SDP_GET8(value.uint8, start);
3960986ab12SMaksim Yevmenkin printf("bool %d\n", value.uint8);
3970986ab12SMaksim Yevmenkin break;
3980986ab12SMaksim Yevmenkin
3990986ab12SMaksim Yevmenkin case SDP_DATA_SEQ8:
4000986ab12SMaksim Yevmenkin SDP_GET8(value.uint8, start);
4010986ab12SMaksim Yevmenkin printf("seq8 %d\n", value.uint8);
4020986ab12SMaksim Yevmenkin sdp_print(level + 1, start, start + value.uint8);
4030986ab12SMaksim Yevmenkin start += value.uint8;
4040986ab12SMaksim Yevmenkin break;
4050986ab12SMaksim Yevmenkin case SDP_DATA_SEQ16:
4060986ab12SMaksim Yevmenkin SDP_GET16(value.uint16, start);
4070986ab12SMaksim Yevmenkin printf("seq16 %d\n", value.uint16);
4080986ab12SMaksim Yevmenkin sdp_print(level + 1, start, start + value.uint16);
4090986ab12SMaksim Yevmenkin start += value.uint16;
4100986ab12SMaksim Yevmenkin break;
4110986ab12SMaksim Yevmenkin case SDP_DATA_SEQ32:
4120986ab12SMaksim Yevmenkin SDP_GET32(value.uint32, start);
4130986ab12SMaksim Yevmenkin printf("seq32 %d\n", value.uint32);
4140986ab12SMaksim Yevmenkin sdp_print(level + 1, start, start + value.uint32);
4150986ab12SMaksim Yevmenkin start += value.uint32;
4160986ab12SMaksim Yevmenkin break;
4170986ab12SMaksim Yevmenkin
4180986ab12SMaksim Yevmenkin case SDP_DATA_ALT8:
4190986ab12SMaksim Yevmenkin SDP_GET8(value.uint8, start);
4200986ab12SMaksim Yevmenkin printf("alt8 %d\n", value.uint8);
4210986ab12SMaksim Yevmenkin sdp_print(level + 1, start, start + value.uint8);
4220986ab12SMaksim Yevmenkin start += value.uint8;
4230986ab12SMaksim Yevmenkin break;
4240986ab12SMaksim Yevmenkin case SDP_DATA_ALT16:
4250986ab12SMaksim Yevmenkin SDP_GET16(value.uint16, start);
4260986ab12SMaksim Yevmenkin printf("alt16 %d\n", value.uint16);
4270986ab12SMaksim Yevmenkin sdp_print(level + 1, start, start + value.uint16);
4280986ab12SMaksim Yevmenkin start += value.uint16;
4290986ab12SMaksim Yevmenkin break;
4300986ab12SMaksim Yevmenkin case SDP_DATA_ALT32:
4310986ab12SMaksim Yevmenkin SDP_GET32(value.uint32, start);
4320986ab12SMaksim Yevmenkin printf("alt32 %d\n", value.uint32);
4330986ab12SMaksim Yevmenkin sdp_print(level + 1, start, start + value.uint32);
4340986ab12SMaksim Yevmenkin start += value.uint32;
4350986ab12SMaksim Yevmenkin break;
4360986ab12SMaksim Yevmenkin
4370986ab12SMaksim Yevmenkin case SDP_DATA_URL8:
4380986ab12SMaksim Yevmenkin SDP_GET8(value.uint8, start);
4390986ab12SMaksim Yevmenkin printf("url8 %*.*s\n", value.uint8, value.uint8, start);
4400986ab12SMaksim Yevmenkin start += value.uint8;
4410986ab12SMaksim Yevmenkin break;
4420986ab12SMaksim Yevmenkin case SDP_DATA_URL16:
4430986ab12SMaksim Yevmenkin SDP_GET16(value.uint16, start);
4440986ab12SMaksim Yevmenkin printf("url16 %*.*s\n", value.uint16, value.uint16, start);
4450986ab12SMaksim Yevmenkin start += value.uint16;
4460986ab12SMaksim Yevmenkin break;
4470986ab12SMaksim Yevmenkin case SDP_DATA_URL32:
4480986ab12SMaksim Yevmenkin SDP_GET32(value.uint32, start);
4490986ab12SMaksim Yevmenkin printf("url32 %*.*s\n", value.uint32, value.uint32, start);
4500986ab12SMaksim Yevmenkin start += value.uint32;
4510986ab12SMaksim Yevmenkin break;
4520986ab12SMaksim Yevmenkin
4530986ab12SMaksim Yevmenkin default:
4540986ab12SMaksim Yevmenkin printf("unknown data type: %#02x\n", *start ++);
4550986ab12SMaksim Yevmenkin break;
4560986ab12SMaksim Yevmenkin }
4570986ab12SMaksim Yevmenkin }
4580986ab12SMaksim Yevmenkin }
4590986ab12SMaksim Yevmenkin
460