mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-12-15 23:14:38 +08:00
4b273e5d98
Reverse loop iteration so that baswap call is not needed.
568 lines
12 KiB
C
568 lines
12 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;
|
|
}
|
|
}
|
|
|
|
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 "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 & Schwartz 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 "Synopsys";
|
|
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 Taiwain, Inc.";
|
|
case 66:
|
|
return "CONWISE Technology Corporation Ltd";
|
|
case 67:
|
|
return "PARROT SA";
|
|
case 68:
|
|
return "Socket Communications";
|
|
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 Ltd.";
|
|
case 80:
|
|
return "SiRF Technology, Inc.";
|
|
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 "equinux 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 "Topcon Positioning Systems, LLC";
|
|
case 140:
|
|
return "Qualcomm Labs, Inc.";
|
|
case 141:
|
|
return "Zscan Software";
|
|
case 142:
|
|
return "Quintic Corp.";
|
|
case 143:
|
|
return "Stollmann 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 65535:
|
|
return "internal use";
|
|
default:
|
|
return "not assigned";
|
|
}
|
|
}
|