• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *  BlueZ - Bluetooth protocol stack for Linux
4  *
5  *  Copyright (C) 2000-2001  Qualcomm Incorporated
6  *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com>
7  *  Copyright (C) 2002-2010  Marcel Holtmann <marcel@holtmann.org>
8  *
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
23  *
24  */
25 
26 #ifdef HAVE_CONFIG_H
27 #include <config.h>
28 #endif
29 
30 #include <stdio.h>
31 #include <errno.h>
32 #include <ctype.h>
33 #include <stdarg.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <sys/socket.h>
37 
38 #include "bluetooth.h"
39 #include "hci.h"
40 
baswap(bdaddr_t * dst,const bdaddr_t * src)41 void baswap(bdaddr_t *dst, const bdaddr_t *src)
42 {
43 	register unsigned char *d = (unsigned char *) dst;
44 	register const unsigned char *s = (const unsigned char *) src;
45 	register int i;
46 
47 	for (i = 0; i < 6; i++)
48 		d[i] = s[5-i];
49 }
50 
batostr(const bdaddr_t * ba)51 char *batostr(const bdaddr_t *ba)
52 {
53 	char *str = bt_malloc(18);
54 	if (!str)
55 		return NULL;
56 
57 	sprintf(str, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
58 		ba->b[0], ba->b[1], ba->b[2],
59 		ba->b[3], ba->b[4], ba->b[5]);
60 
61 	return str;
62 }
63 
strtoba(const char * str)64 bdaddr_t *strtoba(const char *str)
65 {
66 	bdaddr_t b;
67 	bdaddr_t *ba = bt_malloc(sizeof(*ba));
68 
69 	if (ba) {
70 		str2ba(str, &b);
71 		baswap(ba, &b);
72 	}
73 
74 	return ba;
75 }
76 
ba2str(const bdaddr_t * ba,char * str)77 int ba2str(const bdaddr_t *ba, char *str)
78 {
79 	return sprintf(str, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
80 		ba->b[5], ba->b[4], ba->b[3], ba->b[2], ba->b[1], ba->b[0]);
81 }
82 
str2ba(const char * str,bdaddr_t * ba)83 int str2ba(const char *str, bdaddr_t *ba)
84 {
85 	bdaddr_t b;
86 	int i;
87 
88 	if (bachk(str) < 0) {
89 		memset(ba, 0, sizeof(*ba));
90 		return -1;
91 	}
92 
93 	for (i = 0; i < 6; i++, str += 3)
94 		b.b[i] = strtol(str, NULL, 16);
95 
96 	baswap(ba, &b);
97 
98 	return 0;
99 }
100 
ba2oui(const bdaddr_t * ba,char * str)101 int ba2oui(const bdaddr_t *ba, char *str)
102 {
103 	return sprintf(str, "%2.2X-%2.2X-%2.2X", ba->b[5], ba->b[4], ba->b[3]);
104 }
105 
bachk(const char * str)106 int bachk(const char *str)
107 {
108 	if (!str)
109 		return -1;
110 
111 	if (strlen(str) != 17)
112 		return -1;
113 
114 	while (*str) {
115 		if (!isxdigit(*str++))
116 			return -1;
117 
118 		if (!isxdigit(*str++))
119 			return -1;
120 
121 		if (*str == 0)
122 			break;
123 
124 		if (*str++ != ':')
125 			return -1;
126 	}
127 
128 	return 0;
129 }
130 
baprintf(const char * format,...)131 int baprintf(const char *format, ...)
132 {
133 	va_list ap;
134 	int len;
135 
136 	va_start(ap, format);
137 	len = vprintf(format, ap);
138 	va_end(ap);
139 
140 	return len;
141 }
142 
bafprintf(FILE * stream,const char * format,...)143 int bafprintf(FILE *stream, const char *format, ...)
144 {
145 	va_list ap;
146 	int len;
147 
148 	va_start(ap, format);
149 	len = vfprintf(stream, format, ap);
150 	va_end(ap);
151 
152 	return len;
153 }
154 
basprintf(char * str,const char * format,...)155 int basprintf(char *str, const char *format, ...)
156 {
157 	va_list ap;
158 	int len;
159 
160 	va_start(ap, format);
161 	len = vsnprintf(str, (~0U) >> 1, format, ap);
162 	va_end(ap);
163 
164 	return len;
165 }
166 
basnprintf(char * str,size_t size,const char * format,...)167 int basnprintf(char *str, size_t size, const char *format, ...)
168 {
169 	va_list ap;
170 	int len;
171 
172 	va_start(ap, format);
173 	len = vsnprintf(str, size, format, ap);
174 	va_end(ap);
175 
176 	return len;
177 }
178 
bt_malloc(size_t size)179 void *bt_malloc(size_t size)
180 {
181 	return malloc(size);
182 }
183 
bt_free(void * ptr)184 void bt_free(void *ptr)
185 {
186 	free(ptr);
187 }
188 
189 /* Bluetooth error codes to Unix errno mapping */
bt_error(uint16_t code)190 int bt_error(uint16_t code)
191 {
192 	switch (code) {
193 	case 0:
194 		return 0;
195 	case HCI_UNKNOWN_COMMAND:
196 		return EBADRQC;
197 	case HCI_NO_CONNECTION:
198 		return ENOTCONN;
199 	case HCI_HARDWARE_FAILURE:
200 		return EIO;
201 	case HCI_PAGE_TIMEOUT:
202 		return EHOSTDOWN;
203 	case HCI_AUTHENTICATION_FAILURE:
204 		return EACCES;
205 	case HCI_PIN_OR_KEY_MISSING:
206 		return EINVAL;
207 	case HCI_MEMORY_FULL:
208 		return ENOMEM;
209 	case HCI_CONNECTION_TIMEOUT:
210 		return ETIMEDOUT;
211 	case HCI_MAX_NUMBER_OF_CONNECTIONS:
212 	case HCI_MAX_NUMBER_OF_SCO_CONNECTIONS:
213 		return EMLINK;
214 	case HCI_ACL_CONNECTION_EXISTS:
215 		return EALREADY;
216 	case HCI_COMMAND_DISALLOWED:
217 	case HCI_TRANSACTION_COLLISION:
218 	case HCI_ROLE_SWITCH_PENDING:
219 		return EBUSY;
220 	case HCI_REJECTED_LIMITED_RESOURCES:
221 	case HCI_REJECTED_PERSONAL:
222 	case HCI_QOS_REJECTED:
223 		return ECONNREFUSED;
224 	case HCI_HOST_TIMEOUT:
225 		return ETIMEDOUT;
226 	case HCI_UNSUPPORTED_FEATURE:
227 	case HCI_QOS_NOT_SUPPORTED:
228 	case HCI_PAIRING_NOT_SUPPORTED:
229 	case HCI_CLASSIFICATION_NOT_SUPPORTED:
230 	case HCI_UNSUPPORTED_LMP_PARAMETER_VALUE:
231 	case HCI_PARAMETER_OUT_OF_RANGE:
232 	case HCI_QOS_UNACCEPTABLE_PARAMETER:
233 		return EOPNOTSUPP;
234 	case HCI_INVALID_PARAMETERS:
235 	case HCI_SLOT_VIOLATION:
236 		return EINVAL;
237 	case HCI_OE_USER_ENDED_CONNECTION:
238 	case HCI_OE_LOW_RESOURCES:
239 	case HCI_OE_POWER_OFF:
240 		return ECONNRESET;
241 	case HCI_CONNECTION_TERMINATED:
242 		return ECONNABORTED;
243 	case HCI_REPEATED_ATTEMPTS:
244 		return ELOOP;
245 	case HCI_REJECTED_SECURITY:
246 	case HCI_PAIRING_NOT_ALLOWED:
247 	case HCI_INSUFFICIENT_SECURITY:
248 		return EACCES;
249 	case HCI_UNSUPPORTED_REMOTE_FEATURE:
250 		return EPROTONOSUPPORT;
251 	case HCI_SCO_OFFSET_REJECTED:
252 		return ECONNREFUSED;
253 	case HCI_UNKNOWN_LMP_PDU:
254 	case HCI_INVALID_LMP_PARAMETERS:
255 	case HCI_LMP_ERROR_TRANSACTION_COLLISION:
256 	case HCI_LMP_PDU_NOT_ALLOWED:
257 	case HCI_ENCRYPTION_MODE_NOT_ACCEPTED:
258 		return EPROTO;
259 	default:
260 		return ENOSYS;
261 	}
262 }
263 
bt_compidtostr(int compid)264 char *bt_compidtostr(int compid)
265 {
266 	switch (compid) {
267 	case 0:
268 		return "Ericsson Technology Licensing";
269 	case 1:
270 		return "Nokia Mobile Phones";
271 	case 2:
272 		return "Intel Corp.";
273 	case 3:
274 		return "IBM Corp.";
275 	case 4:
276 		return "Toshiba Corp.";
277 	case 5:
278 		return "3Com";
279 	case 6:
280 		return "Microsoft";
281 	case 7:
282 		return "Lucent";
283 	case 8:
284 		return "Motorola";
285 	case 9:
286 		return "Infineon Technologies AG";
287 	case 10:
288 		return "Cambridge Silicon Radio";
289 	case 11:
290 		return "Silicon Wave";
291 	case 12:
292 		return "Digianswer A/S";
293 	case 13:
294 		return "Texas Instruments Inc.";
295 	case 14:
296 		return "Parthus Technologies Inc.";
297 	case 15:
298 		return "Broadcom Corporation";
299 	case 16:
300 		return "Mitel Semiconductor";
301 	case 17:
302 		return "Widcomm, Inc.";
303 	case 18:
304 		return "Zeevo, Inc.";
305 	case 19:
306 		return "Atmel Corporation";
307 	case 20:
308 		return "Mitsubishi Electric Corporation";
309 	case 21:
310 		return "RTX Telecom A/S";
311 	case 22:
312 		return "KC Technology Inc.";
313 	case 23:
314 		return "Newlogic";
315 	case 24:
316 		return "Transilica, Inc.";
317 	case 25:
318 		return "Rohde & Schwartz GmbH & Co. KG";
319 	case 26:
320 		return "TTPCom Limited";
321 	case 27:
322 		return "Signia Technologies, Inc.";
323 	case 28:
324 		return "Conexant Systems Inc.";
325 	case 29:
326 		return "Qualcomm";
327 	case 30:
328 		return "Inventel";
329 	case 31:
330 		return "AVM Berlin";
331 	case 32:
332 		return "BandSpeed, Inc.";
333 	case 33:
334 		return "Mansella Ltd";
335 	case 34:
336 		return "NEC Corporation";
337 	case 35:
338 		return "WavePlus Technology Co., Ltd.";
339 	case 36:
340 		return "Alcatel";
341 	case 37:
342 		return "Philips Semiconductors";
343 	case 38:
344 		return "C Technologies";
345 	case 39:
346 		return "Open Interface";
347 	case 40:
348 		return "R F Micro Devices";
349 	case 41:
350 		return "Hitachi Ltd";
351 	case 42:
352 		return "Symbol Technologies, Inc.";
353 	case 43:
354 		return "Tenovis";
355 	case 44:
356 		return "Macronix International Co. Ltd.";
357 	case 45:
358 		return "GCT Semiconductor";
359 	case 46:
360 		return "Norwood Systems";
361 	case 47:
362 		return "MewTel Technology Inc.";
363 	case 48:
364 		return "ST Microelectronics";
365 	case 49:
366 		return "Synopsys";
367 	case 50:
368 		return "Red-M (Communications) Ltd";
369 	case 51:
370 		return "Commil Ltd";
371 	case 52:
372 		return "Computer Access Technology Corporation (CATC)";
373 	case 53:
374 		return "Eclipse (HQ Espana) S.L.";
375 	case 54:
376 		return "Renesas Technology Corp.";
377 	case 55:
378 		return "Mobilian Corporation";
379 	case 56:
380 		return "Terax";
381 	case 57:
382 		return "Integrated System Solution Corp.";
383 	case 58:
384 		return "Matsushita Electric Industrial Co., Ltd.";
385 	case 59:
386 		return "Gennum Corporation";
387 	case 60:
388 		return "Research In Motion";
389 	case 61:
390 		return "IPextreme, Inc.";
391 	case 62:
392 		return "Systems and Chips, Inc";
393 	case 63:
394 		return "Bluetooth SIG, Inc";
395 	case 64:
396 		return "Seiko Epson Corporation";
397 	case 65:
398 		return "Integrated Silicon Solution Taiwain, Inc.";
399 	case 66:
400 		return "CONWISE Technology Corporation Ltd";
401 	case 67:
402 		return "PARROT SA";
403 	case 68:
404 		return "Socket Communications";
405 	case 69:
406 		return "Atheros Communications, Inc.";
407 	case 70:
408 		return "MediaTek, Inc.";
409 	case 71:
410 		return "Bluegiga";
411 	case 72:
412 		return "Marvell Technology Group Ltd.";
413 	case 73:
414 		return "3DSP Corporation";
415 	case 74:
416 		return "Accel Semiconductor Ltd.";
417 	case 75:
418 		return "Continental Automotive Systems";
419 	case 76:
420 		return "Apple, Inc.";
421 	case 77:
422 		return "Staccato Communications, Inc.";
423 	case 78:
424 		return "Avago Technologies";
425 	case 79:
426 		return "APT Ltd.";
427 	case 80:
428 		return "SiRF Technology, Inc.";
429 	case 81:
430 		return "Tzero Technologies, Inc.";
431 	case 82:
432 		return "J&M Corporation";
433 	case 83:
434 		return "Free2move AB";
435 	case 84:
436 		return "3DiJoy Corporation";
437 	case 85:
438 		return "Plantronics, Inc.";
439 	case 86:
440 		return "Sony Ericsson Mobile Communications";
441 	case 87:
442 		return "Harman International Industries, Inc.";
443 	case 88:
444 		return "Vizio, Inc.";
445 	case 89:
446 		return "Nordic Semiconductor ASA";
447 	case 90:
448 		return "EM Microelectronic-Marin SA";
449 	case 91:
450 		return "Ralink Technology Corporation";
451 	case 92:
452 		return "Belkin International, Inc.";
453 	case 93:
454 		return "Realtek Semiconductor Corporation";
455 	case 94:
456 		return "Stonestreet One, LLC";
457 	case 95:
458 		return "Wicentric, Inc.";
459 	case 96:
460 		return "RivieraWaves S.A.S";
461 	case 97:
462 		return "RDA Microelectronics";
463 	case 98:
464 		return "Gibson Guitars";
465 	case 65535:
466 		return "internal use";
467 	default:
468 		return "not assigned";
469 	}
470 }
471