bluez/lib/bluetooth.c
2014-03-11 09:32:13 -07:00

882 lines
18 KiB
C

/*
*
* BlueZ - Bluetooth protocol stack for Linux
*
* Copyright (C) 2000-2001 Qualcomm Incorporated
* Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
* Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include "bluetooth.h"
#include "hci.h"
void baswap(bdaddr_t *dst, const bdaddr_t *src)
{
register unsigned char *d = (unsigned char *) dst;
register const unsigned char *s = (const unsigned char *) src;
register int i;
for (i = 0; i < 6; i++)
d[i] = s[5-i];
}
char *batostr(const bdaddr_t *ba)
{
char *str = bt_malloc(18);
if (!str)
return NULL;
sprintf(str, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
ba->b[0], ba->b[1], ba->b[2],
ba->b[3], ba->b[4], ba->b[5]);
return str;
}
bdaddr_t *strtoba(const char *str)
{
bdaddr_t b;
bdaddr_t *ba = bt_malloc(sizeof(*ba));
if (ba) {
str2ba(str, &b);
baswap(ba, &b);
}
return ba;
}
int ba2str(const bdaddr_t *ba, char *str)
{
return sprintf(str, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
ba->b[5], ba->b[4], ba->b[3], ba->b[2], ba->b[1], ba->b[0]);
}
int str2ba(const char *str, bdaddr_t *ba)
{
int i;
if (bachk(str) < 0) {
memset(ba, 0, sizeof(*ba));
return -1;
}
for (i = 5; i >= 0; i--, str += 3)
ba->b[i] = strtol(str, NULL, 16);
return 0;
}
int ba2oui(const bdaddr_t *ba, char *str)
{
return sprintf(str, "%2.2X-%2.2X-%2.2X", ba->b[5], ba->b[4], ba->b[3]);
}
int bachk(const char *str)
{
if (!str)
return -1;
if (strlen(str) != 17)
return -1;
while (*str) {
if (!isxdigit(*str++))
return -1;
if (!isxdigit(*str++))
return -1;
if (*str == 0)
break;
if (*str++ != ':')
return -1;
}
return 0;
}
int baprintf(const char *format, ...)
{
va_list ap;
int len;
va_start(ap, format);
len = vprintf(format, ap);
va_end(ap);
return len;
}
int bafprintf(FILE *stream, const char *format, ...)
{
va_list ap;
int len;
va_start(ap, format);
len = vfprintf(stream, format, ap);
va_end(ap);
return len;
}
int basprintf(char *str, const char *format, ...)
{
va_list ap;
int len;
va_start(ap, format);
len = vsnprintf(str, (~0U) >> 1, format, ap);
va_end(ap);
return len;
}
int basnprintf(char *str, size_t size, const char *format, ...)
{
va_list ap;
int len;
va_start(ap, format);
len = vsnprintf(str, size, format, ap);
va_end(ap);
return len;
}
void *bt_malloc(size_t size)
{
return malloc(size);
}
void bt_free(void *ptr)
{
free(ptr);
}
/* Bluetooth error codes to Unix errno mapping */
int bt_error(uint16_t code)
{
switch (code) {
case 0:
return 0;
case HCI_UNKNOWN_COMMAND:
return EBADRQC;
case HCI_NO_CONNECTION:
return ENOTCONN;
case HCI_HARDWARE_FAILURE:
return EIO;
case HCI_PAGE_TIMEOUT:
return EHOSTDOWN;
case HCI_AUTHENTICATION_FAILURE:
return EACCES;
case HCI_PIN_OR_KEY_MISSING:
return EINVAL;
case HCI_MEMORY_FULL:
return ENOMEM;
case HCI_CONNECTION_TIMEOUT:
return ETIMEDOUT;
case HCI_MAX_NUMBER_OF_CONNECTIONS:
case HCI_MAX_NUMBER_OF_SCO_CONNECTIONS:
return EMLINK;
case HCI_ACL_CONNECTION_EXISTS:
return EALREADY;
case HCI_COMMAND_DISALLOWED:
case HCI_TRANSACTION_COLLISION:
case HCI_ROLE_SWITCH_PENDING:
return EBUSY;
case HCI_REJECTED_LIMITED_RESOURCES:
case HCI_REJECTED_PERSONAL:
case HCI_QOS_REJECTED:
return ECONNREFUSED;
case HCI_HOST_TIMEOUT:
return ETIMEDOUT;
case HCI_UNSUPPORTED_FEATURE:
case HCI_QOS_NOT_SUPPORTED:
case HCI_PAIRING_NOT_SUPPORTED:
case HCI_CLASSIFICATION_NOT_SUPPORTED:
case HCI_UNSUPPORTED_LMP_PARAMETER_VALUE:
case HCI_PARAMETER_OUT_OF_RANGE:
case HCI_QOS_UNACCEPTABLE_PARAMETER:
return EOPNOTSUPP;
case HCI_INVALID_PARAMETERS:
case HCI_SLOT_VIOLATION:
return EINVAL;
case HCI_OE_USER_ENDED_CONNECTION:
case HCI_OE_LOW_RESOURCES:
case HCI_OE_POWER_OFF:
return ECONNRESET;
case HCI_CONNECTION_TERMINATED:
return ECONNABORTED;
case HCI_REPEATED_ATTEMPTS:
return ELOOP;
case HCI_REJECTED_SECURITY:
case HCI_PAIRING_NOT_ALLOWED:
case HCI_INSUFFICIENT_SECURITY:
return EACCES;
case HCI_UNSUPPORTED_REMOTE_FEATURE:
return EPROTONOSUPPORT;
case HCI_SCO_OFFSET_REJECTED:
return ECONNREFUSED;
case HCI_UNKNOWN_LMP_PDU:
case HCI_INVALID_LMP_PARAMETERS:
case HCI_LMP_ERROR_TRANSACTION_COLLISION:
case HCI_LMP_PDU_NOT_ALLOWED:
case HCI_ENCRYPTION_MODE_NOT_ACCEPTED:
return EPROTO;
default:
return ENOSYS;
}
}
const char *bt_compidtostr(int compid)
{
switch (compid) {
case 0:
return "Ericsson Technology Licensing";
case 1:
return "Nokia Mobile Phones";
case 2:
return "Intel Corp.";
case 3:
return "IBM Corp.";
case 4:
return "Toshiba Corp.";
case 5:
return "3Com";
case 6:
return "Microsoft";
case 7:
return "Lucent";
case 8:
return "Motorola";
case 9:
return "Infineon Technologies AG";
case 10:
return "Cambridge Silicon Radio";
case 11:
return "Silicon Wave";
case 12:
return "Digianswer A/S";
case 13:
return "Texas Instruments Inc.";
case 14:
return "Ceva, Inc. (formerly Parthus Technologies, Inc.)";
case 15:
return "Broadcom Corporation";
case 16:
return "Mitel Semiconductor";
case 17:
return "Widcomm, Inc";
case 18:
return "Zeevo, Inc.";
case 19:
return "Atmel Corporation";
case 20:
return "Mitsubishi Electric Corporation";
case 21:
return "RTX Telecom A/S";
case 22:
return "KC Technology Inc.";
case 23:
return "NewLogic";
case 24:
return "Transilica, Inc.";
case 25:
return "Rohde & Schwarz GmbH & Co. KG";
case 26:
return "TTPCom Limited";
case 27:
return "Signia Technologies, Inc.";
case 28:
return "Conexant Systems Inc.";
case 29:
return "Qualcomm";
case 30:
return "Inventel";
case 31:
return "AVM Berlin";
case 32:
return "BandSpeed, Inc.";
case 33:
return "Mansella Ltd";
case 34:
return "NEC Corporation";
case 35:
return "WavePlus Technology Co., Ltd.";
case 36:
return "Alcatel";
case 37:
return "Philips Semiconductors";
case 38:
return "C Technologies";
case 39:
return "Open Interface";
case 40:
return "R F Micro Devices";
case 41:
return "Hitachi Ltd";
case 42:
return "Symbol Technologies, Inc.";
case 43:
return "Tenovis";
case 44:
return "Macronix International Co. Ltd.";
case 45:
return "GCT Semiconductor";
case 46:
return "Norwood Systems";
case 47:
return "MewTel Technology Inc.";
case 48:
return "ST Microelectronics";
case 49:
return "Synopsis";
case 50:
return "Red-M (Communications) Ltd";
case 51:
return "Commil Ltd";
case 52:
return "Computer Access Technology Corporation (CATC)";
case 53:
return "Eclipse (HQ Espana) S.L.";
case 54:
return "Renesas Technology Corp.";
case 55:
return "Mobilian Corporation";
case 56:
return "Terax";
case 57:
return "Integrated System Solution Corp.";
case 58:
return "Matsushita Electric Industrial Co., Ltd.";
case 59:
return "Gennum Corporation";
case 60:
return "Research In Motion";
case 61:
return "IPextreme, Inc.";
case 62:
return "Systems and Chips, Inc.";
case 63:
return "Bluetooth SIG, Inc.";
case 64:
return "Seiko Epson Corporation";
case 65:
return "Integrated Silicon Solution Taiwan, Inc.";
case 66:
return "CONWISE Technology Corporation Ltd";
case 67:
return "PARROT SA";
case 68:
return "Socket Mobile";
case 69:
return "Atheros Communications, Inc.";
case 70:
return "MediaTek, Inc.";
case 71:
return "Bluegiga";
case 72:
return "Marvell Technology Group Ltd.";
case 73:
return "3DSP Corporation";
case 74:
return "Accel Semiconductor Ltd.";
case 75:
return "Continental Automotive Systems";
case 76:
return "Apple, Inc.";
case 77:
return "Staccato Communications, Inc.";
case 78:
return "Avago Technologies";
case 79:
return "APT Licensing Ltd.";
case 80:
return "SiRF Technology";
case 81:
return "Tzero Technologies, Inc.";
case 82:
return "J&M Corporation";
case 83:
return "Free2move AB";
case 84:
return "3DiJoy Corporation";
case 85:
return "Plantronics, Inc.";
case 86:
return "Sony Ericsson Mobile Communications";
case 87:
return "Harman International Industries, Inc.";
case 88:
return "Vizio, Inc.";
case 89:
return "Nordic Semiconductor ASA";
case 90:
return "EM Microelectronic-Marin SA";
case 91:
return "Ralink Technology Corporation";
case 92:
return "Belkin International, Inc.";
case 93:
return "Realtek Semiconductor Corporation";
case 94:
return "Stonestreet One, LLC";
case 95:
return "Wicentric, Inc.";
case 96:
return "RivieraWaves S.A.S";
case 97:
return "RDA Microelectronics";
case 98:
return "Gibson Guitars";
case 99:
return "MiCommand Inc.";
case 100:
return "Band XI International, LLC";
case 101:
return "Hewlett-Packard Company";
case 102:
return "9Solutions Oy";
case 103:
return "GN Netcom A/S";
case 104:
return "General Motors";
case 105:
return "A&D Engineering, Inc.";
case 106:
return "MindTree Ltd.";
case 107:
return "Polar Electro OY";
case 108:
return "Beautiful Enterprise Co., Ltd.";
case 109:
return "BriarTek, Inc.";
case 110:
return "Summit Data Communications, Inc.";
case 111:
return "Sound ID";
case 112:
return "Monster, LLC";
case 113:
return "connectBlue AB";
case 114:
return "ShangHai Super Smart Electronics Co. Ltd.";
case 115:
return "Group Sense Ltd.";
case 116:
return "Zomm, LLC";
case 117:
return "Samsung Electronics Co. Ltd.";
case 118:
return "Creative Technology Ltd.";
case 119:
return "Laird Technologies";
case 120:
return "Nike, Inc.";
case 121:
return "lesswire AG";
case 122:
return "MStar Semiconductor, Inc.";
case 123:
return "Hanlynn Technologies";
case 124:
return "A & R Cambridge";
case 125:
return "Seers Technology Co. Ltd";
case 126:
return "Sports Tracking Technologies Ltd.";
case 127:
return "Autonet Mobile";
case 128:
return "DeLorme Publishing Company, Inc.";
case 129:
return "WuXi Vimicro";
case 130:
return "Sennheiser Communications A/S";
case 131:
return "TimeKeeping Systems, Inc.";
case 132:
return "Ludus Helsinki Ltd.";
case 133:
return "BlueRadios, Inc.";
case 134:
return "equinox AG";
case 135:
return "Garmin International, Inc.";
case 136:
return "Ecotest";
case 137:
return "GN ReSound A/S";
case 138:
return "Jawbone";
case 139:
return "Topcorn Positioning Systems, LLC";
case 140:
return "Qualcomm Retail Solutions, Inc. (formerly Qualcomm Labs, Inc.)";
case 141:
return "Zscan Software";
case 142:
return "Quintic Corp.";
case 143:
return "Stollman E+V GmbH";
case 144:
return "Funai Electric Co., Ltd.";
case 145:
return "Advanced PANMOBIL Systems GmbH & Co. KG";
case 146:
return "ThinkOptics, Inc.";
case 147:
return "Universal Electronics, Inc.";
case 148:
return "Airoha Technology Corp.";
case 149:
return "NEC Lighting, Ltd.";
case 150:
return "ODM Technology, Inc.";
case 151:
return "ConnecteDevice Ltd.";
case 152:
return "zer01.tv GmbH";
case 153:
return "i.Tech Dynamic Global Distribution Ltd.";
case 154:
return "Alpwise";
case 155:
return "Jiangsu Toppower Automotive Electronics Co., Ltd.";
case 156:
return "Colorfy, Inc.";
case 157:
return "Geoforce Inc.";
case 158:
return "Bose Corporation";
case 159:
return "Suunto Oy";
case 160:
return "Kensington Computer Products Group";
case 161:
return "SR-Medizinelektronik";
case 162:
return "Vertu Corporation Limited";
case 163:
return "Meta Watch Ltd.";
case 164:
return "LINAK A/S";
case 165:
return "OTL Dynamics LLC";
case 166:
return "Panda Ocean Inc.";
case 167:
return "Visteon Corporation";
case 168:
return "ARP Devices Limited";
case 169:
return "Magneti Marelli S.p.A";
case 170:
return "CAEN RFID srl";
case 171:
return "Ingenieur-Systemgruppe Zahn GmbH";
case 172:
return "Green Throttle Games";
case 173:
return "Peter Systemtechnik GmbH";
case 174:
return "Omegawave Oy";
case 175:
return "Cinetix";
case 176:
return "Passif Semiconductor Corp";
case 177:
return "Saris Cycling Group, Inc";
case 178:
return "Bekey A/S";
case 179:
return "Clarinox Technologies Pty. Ltd.";
case 180:
return "BDE Technology Co., Ltd.";
case 181:
return "Swirl Networks";
case 182:
return "Meso international";
case 183:
return "TreLab Ltd";
case 184:
return "Qualcomm Innovation Center, Inc. (QuIC)";
case 185:
return "Johnson Controls, Inc.";
case 186:
return "Starkey Laboratories Inc.";
case 187:
return "S-Power Electronics Limited";
case 188:
return "Ace Sensor Inc";
case 189:
return "Aplix Corporation";
case 190:
return "AAMP of America";
case 191:
return "Stalmart Technology Limited";
case 192:
return "AMICCOM Electronics Corporation";
case 193:
return "Shenzhen Excelsecu Data Technology Co.,Ltd";
case 194:
return "Geneq Inc.";
case 195:
return "adidas AG";
case 196:
return "LG Electronics";
case 197:
return "Onset Computer Corporation";
case 198:
return "Selfly BV";
case 199:
return "Quuppa Oy.";
case 200:
return "GeLo Inc";
case 201:
return "Evluma";
case 202:
return "MC10";
case 203:
return "Binauric SE";
case 204:
return "Beats Electronics";
case 205:
return "Microchip Technology Inc.";
case 206:
return "Elgato Systems GmbH";
case 207:
return "ARCHOS SA";
case 208:
return "Dexcom, Inc.";
case 209:
return "Polar Electro Europe B.V.";
case 210:
return "Dialog Semiconductor B.V.";
case 211:
return "Taixingbang Technology (HK) Co,. LTD.";
case 212:
return "Kawantech";
case 213:
return "Austco Communication Systems";
case 214:
return "Timex Group USA, Inc.";
case 215:
return "Qualcomm Technologies, Inc.";
case 216:
return "Qualcomm Connected Experiences, Inc.";
case 217:
return "Voyetra Turtle Beach";
case 218:
return "txtr GmbH";
case 219:
return "Biosentronics";
case 220:
return "Procter & Gamble";
case 221:
return "Hosiden Corporation";
case 222:
return "Muzik LLC";
case 223:
return "Misfit Wearables Corp";
case 224:
return "Google";
case 225:
return "Danlers Ltd";
case 226:
return "Semilink Inc";
case 227:
return "inMusic Brands, Inc";
case 228:
return "L.S. Research Inc.";
case 229:
return "Eden Software Consultants Ltd.";
case 230:
return "Freshtemp";
case 231:
return "KS Technologies";
case 232:
return "ACTS Technologies";
case 233:
return "Vtrack Systems";
case 234:
return "Nielsen-Kellerman Company";
case 235:
return "Server Technology, Inc.";
case 236:
return "BioResearch Associates";
case 237:
return "Jolly Logic, LLC";
case 238:
return "Above Average Outcomes, Inc.";
case 239:
return "Bitsplitters GmbH";
case 240:
return "PayPal, Inc.";
case 241:
return "Witron Technology Limited";
case 242:
return "Morse Project Inc.";
case 243:
return "Kent Displays Inc.";
case 244:
return "Nautilus Inc.";
case 245:
return "Smartifier Oy";
case 246:
return "Elcometer Limited";
case 247:
return "VSN Technologies Inc.";
case 248:
return "AceUni Corp., Ltd.";
case 249:
return "StickNFind";
case 250:
return "Crystal Code AB";
case 251:
return "KOUKAAM a.s.";
case 252:
return "Delphi Corporation";
case 253:
return "ValenceTech Limited";
case 254:
return "Reserved";
case 255:
return "Typo Products, LLC";
case 256:
return "TomTom International BV";
case 257:
return "Fugoo, Inc";
case 258:
return "Keiser Corporation";
case 259:
return "Bang & Olufsen A/S";
case 260:
return "PLUS Locations Systems Pty Ltd";
case 261:
return "Ubiquitous Computing Technology Corporation";
case 262:
return "Innovative Yachtter Solutions";
case 263:
return "William Demant Holding A/S";
case 264:
return "Chicony Electronics Co., Ltd.";
case 265:
return "Atus BV";
case 266:
return "Codegate Ltd.";
case 267:
return "ERi, Inc.";
case 268:
return "Transducers Direct, LLC";
case 269:
return "Fujitsu Ten Limited";
case 270:
return "Audi AG";
case 271:
return "HiSilicon Technologies Co., Ltd.";
case 272:
return "Nippon Seiki Co., Ltd.";
case 273:
return "Steelseries ApS";
case 274:
return "vyzybl Inc.";
case 275:
return "Openbrain Technologies, Co., Ltd.";
case 276:
return "Xensr";
case 277:
return "e.solutions";
case 278:
return "1OAK Technologies";
case 279:
return "Wimoto Technologies Inc";
case 280:
return "Radius Networks, Inc.";
case 281:
return "Wize Technology Co., Ltd.";
case 282:
return "Qualcomm Labs, Inc.";
case 283:
return "Aruba Networks";
case 284:
return "Baidu";
case 285:
return "Arendi AG";
case 286:
return "Skoda Auto a.s.";
case 287:
return "Volkswagon AG";
case 288:
return "Porsche AG";
case 289:
return "Sino Wealth Electronic Ltd.";
case 290:
return "AirTurn, Inc.";
case 291:
return "Kinsa, Inc.";
case 292:
return "HID Global";
case 293:
return "SEAT es";
case 294:
return "Promethean Ltd.";
case 295:
return "Salutica Allied Solutions";
case 296:
return "GPSI Group Pty Ltd";
case 297:
return "Nimble Devices Oy";
case 298:
return "Changzhou Yongse Infotech Co., Ltd";
case 299:
return "SportIQ";
case 300:
return "TEMEC Instruments B.V.";
case 301:
return "Sony Corporation";
case 302:
return "ASSA ABLOY";
case 303:
return "Clarion Co., Ltd.";
case 304:
return "Warehouse Innovations";
case 305:
return "Cypress Semiconductor Corporation";
case 65535:
return "internal use";
default:
return "not assigned";
}
}