btio.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2009-2010 Marcel Holtmann <marcel@holtmann.org>
  7. * Copyright (C) 2009-2010 Nokia Corporation
  8. *
  9. *
  10. */
  11. #ifdef HAVE_CONFIG_H
  12. #include <config.h>
  13. #endif
  14. #include <stdarg.h>
  15. #include <stdlib.h>
  16. #include <unistd.h>
  17. #include <errno.h>
  18. #include <poll.h>
  19. #include <sys/types.h>
  20. #include <sys/socket.h>
  21. #include <glib.h>
  22. #include "lib/bluetooth.h"
  23. #include "lib/l2cap.h"
  24. #include "lib/rfcomm.h"
  25. #include "lib/sco.h"
  26. #include "btio.h"
  27. #ifndef BT_FLUSHABLE
  28. #define BT_FLUSHABLE 8
  29. #endif
  30. #define ERROR_FAILED(gerr, str, err) \
  31. g_set_error(gerr, BT_IO_ERROR, err, \
  32. str ": %s (%d)", strerror(err), err)
  33. #define DEFAULT_DEFER_TIMEOUT 30
  34. typedef enum {
  35. BT_IO_L2CAP,
  36. BT_IO_RFCOMM,
  37. BT_IO_SCO,
  38. BT_IO_INVALID,
  39. } BtIOType;
  40. struct set_opts {
  41. bdaddr_t src;
  42. bdaddr_t dst;
  43. BtIOType type;
  44. uint8_t src_type;
  45. uint8_t dst_type;
  46. int defer;
  47. int sec_level;
  48. uint8_t channel;
  49. uint16_t psm;
  50. uint16_t cid;
  51. uint16_t mtu;
  52. uint16_t imtu;
  53. uint16_t omtu;
  54. int central;
  55. uint8_t mode;
  56. int flushable;
  57. uint32_t priority;
  58. uint16_t voice;
  59. };
  60. struct connect {
  61. BtIOConnect connect;
  62. gpointer user_data;
  63. GDestroyNotify destroy;
  64. bdaddr_t dst;
  65. };
  66. struct accept {
  67. BtIOConnect connect;
  68. gpointer user_data;
  69. GDestroyNotify destroy;
  70. };
  71. struct server {
  72. BtIOConnect connect;
  73. BtIOConfirm confirm;
  74. gpointer user_data;
  75. GDestroyNotify destroy;
  76. };
  77. static BtIOType bt_io_get_type(GIOChannel *io, GError **gerr)
  78. {
  79. int sk = g_io_channel_unix_get_fd(io);
  80. int domain, proto, err;
  81. socklen_t len;
  82. domain = 0;
  83. len = sizeof(domain);
  84. err = getsockopt(sk, SOL_SOCKET, SO_DOMAIN, &domain, &len);
  85. if (err < 0) {
  86. ERROR_FAILED(gerr, "getsockopt(SO_DOMAIN)", errno);
  87. return BT_IO_INVALID;
  88. }
  89. if (domain != AF_BLUETOOTH) {
  90. g_set_error(gerr, BT_IO_ERROR, EINVAL,
  91. "BtIO socket domain not AF_BLUETOOTH");
  92. return BT_IO_INVALID;
  93. }
  94. proto = 0;
  95. len = sizeof(proto);
  96. err = getsockopt(sk, SOL_SOCKET, SO_PROTOCOL, &proto, &len);
  97. if (err < 0) {
  98. ERROR_FAILED(gerr, "getsockopt(SO_PROTOCOL)", errno);
  99. return BT_IO_INVALID;
  100. }
  101. switch (proto) {
  102. case BTPROTO_RFCOMM:
  103. return BT_IO_RFCOMM;
  104. case BTPROTO_SCO:
  105. return BT_IO_SCO;
  106. case BTPROTO_L2CAP:
  107. return BT_IO_L2CAP;
  108. default:
  109. g_set_error(gerr, BT_IO_ERROR, EINVAL,
  110. "Unknown BtIO socket type");
  111. return BT_IO_INVALID;
  112. }
  113. }
  114. static void server_remove(struct server *server)
  115. {
  116. if (server->destroy)
  117. server->destroy(server->user_data);
  118. g_free(server);
  119. }
  120. static void connect_remove(struct connect *conn)
  121. {
  122. if (conn->destroy)
  123. conn->destroy(conn->user_data);
  124. g_free(conn);
  125. }
  126. static void accept_remove(struct accept *accept)
  127. {
  128. if (accept->destroy)
  129. accept->destroy(accept->user_data);
  130. g_free(accept);
  131. }
  132. static gboolean check_nval(GIOChannel *io)
  133. {
  134. struct pollfd fds;
  135. memset(&fds, 0, sizeof(fds));
  136. fds.fd = g_io_channel_unix_get_fd(io);
  137. fds.events = POLLNVAL;
  138. if (poll(&fds, 1, 0) > 0 && (fds.revents & POLLNVAL))
  139. return TRUE;
  140. return FALSE;
  141. }
  142. static gboolean accept_cb(GIOChannel *io, GIOCondition cond,
  143. gpointer user_data)
  144. {
  145. struct accept *accept = user_data;
  146. GError *gerr = NULL;
  147. /* If the user aborted this accept attempt */
  148. if ((cond & G_IO_NVAL) || check_nval(io))
  149. return FALSE;
  150. if (cond & (G_IO_HUP | G_IO_ERR)) {
  151. int err, sk_err, sock = g_io_channel_unix_get_fd(io);
  152. socklen_t len = sizeof(sk_err);
  153. if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &sk_err, &len) < 0)
  154. err = -errno;
  155. else
  156. err = -sk_err;
  157. if (err < 0)
  158. ERROR_FAILED(&gerr, "HUP or ERR on socket", -err);
  159. }
  160. accept->connect(io, gerr, accept->user_data);
  161. g_clear_error(&gerr);
  162. return FALSE;
  163. }
  164. static gboolean connect_cb(GIOChannel *io, GIOCondition cond,
  165. gpointer user_data)
  166. {
  167. struct connect *conn = user_data;
  168. GError *gerr = NULL;
  169. int err, sk_err, sock;
  170. socklen_t len = sizeof(sk_err);
  171. char addr[18];
  172. /* If the user aborted this connect attempt */
  173. if ((cond & G_IO_NVAL) || check_nval(io))
  174. return FALSE;
  175. sock = g_io_channel_unix_get_fd(io);
  176. if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &sk_err, &len) < 0)
  177. err = -errno;
  178. else
  179. err = -sk_err;
  180. if (err < 0) {
  181. ba2str(&conn->dst, addr);
  182. g_set_error(&gerr, BT_IO_ERROR, -err,
  183. "connect to %s: %s (%d)", addr, strerror(-err), -err);
  184. }
  185. conn->connect(io, gerr, conn->user_data);
  186. g_clear_error(&gerr);
  187. return FALSE;
  188. }
  189. static gboolean server_cb(GIOChannel *io, GIOCondition cond,
  190. gpointer user_data)
  191. {
  192. struct server *server = user_data;
  193. int srv_sock, cli_sock;
  194. GIOChannel *cli_io;
  195. /* If the user closed the server */
  196. if ((cond & G_IO_NVAL) || check_nval(io))
  197. return FALSE;
  198. srv_sock = g_io_channel_unix_get_fd(io);
  199. cli_sock = accept(srv_sock, NULL, NULL);
  200. if (cli_sock < 0)
  201. return TRUE;
  202. cli_io = g_io_channel_unix_new(cli_sock);
  203. g_io_channel_set_close_on_unref(cli_io, TRUE);
  204. g_io_channel_set_flags(cli_io, G_IO_FLAG_NONBLOCK, NULL);
  205. if (server->confirm)
  206. server->confirm(cli_io, server->user_data);
  207. else
  208. server->connect(cli_io, NULL, server->user_data);
  209. g_io_channel_unref(cli_io);
  210. return TRUE;
  211. }
  212. static void server_add(GIOChannel *io, BtIOConnect connect,
  213. BtIOConfirm confirm, gpointer user_data,
  214. GDestroyNotify destroy)
  215. {
  216. struct server *server;
  217. GIOCondition cond;
  218. server = g_new0(struct server, 1);
  219. server->connect = connect;
  220. server->confirm = confirm;
  221. server->user_data = user_data;
  222. server->destroy = destroy;
  223. cond = G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
  224. g_io_add_watch_full(io, G_PRIORITY_HIGH, cond, server_cb, server,
  225. (GDestroyNotify) server_remove);
  226. }
  227. static void connect_add(GIOChannel *io, BtIOConnect connect, bdaddr_t dst,
  228. gpointer user_data, GDestroyNotify destroy)
  229. {
  230. struct connect *conn;
  231. GIOCondition cond;
  232. conn = g_new0(struct connect, 1);
  233. conn->connect = connect;
  234. conn->user_data = user_data;
  235. conn->destroy = destroy;
  236. conn->dst = dst;
  237. cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
  238. g_io_add_watch_full(io, G_PRIORITY_HIGH, cond, connect_cb, conn,
  239. (GDestroyNotify) connect_remove);
  240. }
  241. static void accept_add(GIOChannel *io, BtIOConnect connect, gpointer user_data,
  242. GDestroyNotify destroy)
  243. {
  244. struct accept *accept;
  245. GIOCondition cond;
  246. accept = g_new0(struct accept, 1);
  247. accept->connect = connect;
  248. accept->user_data = user_data;
  249. accept->destroy = destroy;
  250. cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
  251. g_io_add_watch_full(io, G_PRIORITY_HIGH, cond, accept_cb, accept,
  252. (GDestroyNotify) accept_remove);
  253. }
  254. static int l2cap_bind(int sock, const bdaddr_t *src, uint8_t src_type,
  255. uint16_t psm, uint16_t cid, GError **err)
  256. {
  257. struct sockaddr_l2 addr;
  258. memset(&addr, 0, sizeof(addr));
  259. addr.l2_family = AF_BLUETOOTH;
  260. bacpy(&addr.l2_bdaddr, src);
  261. if (cid)
  262. addr.l2_cid = htobs(cid);
  263. else
  264. addr.l2_psm = htobs(psm);
  265. addr.l2_bdaddr_type = src_type;
  266. if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
  267. int error = -errno;
  268. ERROR_FAILED(err, "l2cap_bind", errno);
  269. return error;
  270. }
  271. return 0;
  272. }
  273. static int l2cap_connect(int sock, const bdaddr_t *dst, uint8_t dst_type,
  274. uint16_t psm, uint16_t cid)
  275. {
  276. int err;
  277. struct sockaddr_l2 addr;
  278. memset(&addr, 0, sizeof(addr));
  279. addr.l2_family = AF_BLUETOOTH;
  280. bacpy(&addr.l2_bdaddr, dst);
  281. if (cid)
  282. addr.l2_cid = htobs(cid);
  283. else
  284. addr.l2_psm = htobs(psm);
  285. addr.l2_bdaddr_type = dst_type;
  286. err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
  287. if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
  288. return -errno;
  289. return 0;
  290. }
  291. static int l2cap_set_central(int sock, int central)
  292. {
  293. int flags;
  294. socklen_t len;
  295. len = sizeof(flags);
  296. if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags, &len) < 0)
  297. return -errno;
  298. if (central) {
  299. if (flags & L2CAP_LM_MASTER)
  300. return 0;
  301. flags |= L2CAP_LM_MASTER;
  302. } else {
  303. if (!(flags & L2CAP_LM_MASTER))
  304. return 0;
  305. flags &= ~L2CAP_LM_MASTER;
  306. }
  307. if (setsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags, sizeof(flags)) < 0)
  308. return -errno;
  309. return 0;
  310. }
  311. static int rfcomm_set_central(int sock, int central)
  312. {
  313. int flags;
  314. socklen_t len;
  315. len = sizeof(flags);
  316. if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags, &len) < 0)
  317. return -errno;
  318. if (central) {
  319. if (flags & RFCOMM_LM_MASTER)
  320. return 0;
  321. flags |= RFCOMM_LM_MASTER;
  322. } else {
  323. if (!(flags & RFCOMM_LM_MASTER))
  324. return 0;
  325. flags &= ~RFCOMM_LM_MASTER;
  326. }
  327. if (setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags, sizeof(flags)) < 0)
  328. return -errno;
  329. return 0;
  330. }
  331. static int l2cap_set_lm(int sock, int level)
  332. {
  333. int lm_map[] = {
  334. 0,
  335. L2CAP_LM_AUTH,
  336. L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT,
  337. L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT | L2CAP_LM_SECURE,
  338. }, opt = lm_map[level];
  339. if (setsockopt(sock, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)) < 0)
  340. return -errno;
  341. return 0;
  342. }
  343. static int rfcomm_set_lm(int sock, int level)
  344. {
  345. int lm_map[] = {
  346. 0,
  347. RFCOMM_LM_AUTH,
  348. RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT,
  349. RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT | RFCOMM_LM_SECURE,
  350. }, opt = lm_map[level];
  351. if (setsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, sizeof(opt)) < 0)
  352. return -errno;
  353. return 0;
  354. }
  355. static gboolean set_sec_level(int sock, BtIOType type, int level, GError **err)
  356. {
  357. struct bt_security sec;
  358. int ret;
  359. if (level < BT_SECURITY_LOW || level > BT_SECURITY_HIGH) {
  360. g_set_error(err, BT_IO_ERROR, EINVAL,
  361. "Valid security level range is %d-%d",
  362. BT_SECURITY_LOW, BT_SECURITY_HIGH);
  363. return FALSE;
  364. }
  365. memset(&sec, 0, sizeof(sec));
  366. sec.level = level;
  367. if (setsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec,
  368. sizeof(sec)) == 0)
  369. return TRUE;
  370. if (errno != ENOPROTOOPT) {
  371. ERROR_FAILED(err, "setsockopt(BT_SECURITY)", errno);
  372. return FALSE;
  373. }
  374. if (type == BT_IO_L2CAP)
  375. ret = l2cap_set_lm(sock, level);
  376. else
  377. ret = rfcomm_set_lm(sock, level);
  378. if (ret < 0) {
  379. ERROR_FAILED(err, "setsockopt(LM)", -ret);
  380. return FALSE;
  381. }
  382. return TRUE;
  383. }
  384. static int l2cap_get_lm(int sock, int *sec_level)
  385. {
  386. int opt;
  387. socklen_t len;
  388. len = sizeof(opt);
  389. if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &opt, &len) < 0)
  390. return -errno;
  391. *sec_level = 0;
  392. if (opt & L2CAP_LM_AUTH)
  393. *sec_level = BT_SECURITY_LOW;
  394. if (opt & L2CAP_LM_ENCRYPT)
  395. *sec_level = BT_SECURITY_MEDIUM;
  396. if (opt & L2CAP_LM_SECURE)
  397. *sec_level = BT_SECURITY_HIGH;
  398. return 0;
  399. }
  400. static int rfcomm_get_lm(int sock, int *sec_level)
  401. {
  402. int opt;
  403. socklen_t len;
  404. len = sizeof(opt);
  405. if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &opt, &len) < 0)
  406. return -errno;
  407. *sec_level = 0;
  408. if (opt & RFCOMM_LM_AUTH)
  409. *sec_level = BT_SECURITY_LOW;
  410. if (opt & RFCOMM_LM_ENCRYPT)
  411. *sec_level = BT_SECURITY_MEDIUM;
  412. if (opt & RFCOMM_LM_SECURE)
  413. *sec_level = BT_SECURITY_HIGH;
  414. return 0;
  415. }
  416. static gboolean get_sec_level(int sock, BtIOType type, int *level,
  417. GError **err)
  418. {
  419. struct bt_security sec;
  420. socklen_t len;
  421. int ret;
  422. memset(&sec, 0, sizeof(sec));
  423. len = sizeof(sec);
  424. if (getsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec, &len) == 0) {
  425. *level = sec.level;
  426. return TRUE;
  427. }
  428. if (errno != ENOPROTOOPT) {
  429. ERROR_FAILED(err, "getsockopt(BT_SECURITY)", errno);
  430. return FALSE;
  431. }
  432. if (type == BT_IO_L2CAP)
  433. ret = l2cap_get_lm(sock, level);
  434. else
  435. ret = rfcomm_get_lm(sock, level);
  436. if (ret < 0) {
  437. ERROR_FAILED(err, "getsockopt(LM)", -ret);
  438. return FALSE;
  439. }
  440. return TRUE;
  441. }
  442. static int l2cap_set_flushable(int sock, gboolean flushable)
  443. {
  444. int f;
  445. f = flushable;
  446. if (setsockopt(sock, SOL_BLUETOOTH, BT_FLUSHABLE, &f, sizeof(f)) < 0)
  447. return -errno;
  448. return 0;
  449. }
  450. static int set_priority(int sock, uint32_t prio)
  451. {
  452. if (setsockopt(sock, SOL_SOCKET, SO_PRIORITY, &prio, sizeof(prio)) < 0)
  453. return -errno;
  454. return 0;
  455. }
  456. static gboolean get_key_size(int sock, int *size, GError **err)
  457. {
  458. struct bt_security sec;
  459. socklen_t len;
  460. memset(&sec, 0, sizeof(sec));
  461. len = sizeof(sec);
  462. if (getsockopt(sock, SOL_BLUETOOTH, BT_SECURITY, &sec, &len) == 0) {
  463. *size = sec.key_size;
  464. return TRUE;
  465. }
  466. return FALSE;
  467. }
  468. static uint8_t mode_l2mode(uint8_t mode)
  469. {
  470. switch (mode) {
  471. case BT_IO_MODE_BASIC:
  472. return L2CAP_MODE_BASIC;
  473. case BT_IO_MODE_ERTM:
  474. return L2CAP_MODE_ERTM;
  475. case BT_IO_MODE_STREAMING:
  476. return L2CAP_MODE_STREAMING;
  477. default:
  478. return UINT8_MAX;
  479. }
  480. }
  481. static gboolean set_l2opts(int sock, uint16_t imtu, uint16_t omtu,
  482. uint8_t mode, GError **err)
  483. {
  484. struct l2cap_options l2o;
  485. socklen_t len;
  486. memset(&l2o, 0, sizeof(l2o));
  487. len = sizeof(l2o);
  488. if (getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &len) < 0) {
  489. ERROR_FAILED(err, "getsockopt(L2CAP_OPTIONS)", errno);
  490. return FALSE;
  491. }
  492. if (imtu)
  493. l2o.imtu = imtu;
  494. if (omtu)
  495. l2o.omtu = omtu;
  496. if (mode) {
  497. l2o.mode = mode_l2mode(mode);
  498. if (l2o.mode == UINT8_MAX) {
  499. ERROR_FAILED(err, "Unsupported mode", errno);
  500. return FALSE;
  501. }
  502. }
  503. if (setsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o, sizeof(l2o)) < 0) {
  504. ERROR_FAILED(err, "setsockopt(L2CAP_OPTIONS)", errno);
  505. return FALSE;
  506. }
  507. return TRUE;
  508. }
  509. static gboolean set_le_imtu(int sock, uint16_t imtu, GError **err)
  510. {
  511. if (setsockopt(sock, SOL_BLUETOOTH, BT_RCVMTU, &imtu,
  512. sizeof(imtu)) < 0) {
  513. ERROR_FAILED(err, "setsockopt(BT_RCVMTU)", errno);
  514. return FALSE;
  515. }
  516. return TRUE;
  517. }
  518. static gboolean set_le_mode(int sock, uint8_t mode, GError **err)
  519. {
  520. if (setsockopt(sock, SOL_BLUETOOTH, BT_MODE, &mode,
  521. sizeof(mode)) < 0) {
  522. ERROR_FAILED(err, "setsockopt(BT_MODE)", errno);
  523. return FALSE;
  524. }
  525. return TRUE;
  526. }
  527. static gboolean l2cap_set(int sock, uint8_t src_type, int sec_level,
  528. uint16_t imtu, uint16_t omtu, uint8_t mode,
  529. int central, int flushable, uint32_t priority,
  530. GError **err)
  531. {
  532. if (imtu || omtu || mode) {
  533. gboolean ret = FALSE;
  534. if (src_type == BDADDR_BREDR)
  535. ret = set_l2opts(sock, imtu, omtu, mode, err);
  536. else {
  537. if (imtu)
  538. ret = set_le_imtu(sock, imtu, err);
  539. if (ret && mode)
  540. ret = set_le_mode(sock, mode, err);
  541. }
  542. if (!ret)
  543. return ret;
  544. }
  545. if (central >= 0 && l2cap_set_central(sock, central) < 0) {
  546. ERROR_FAILED(err, "l2cap_set_central", errno);
  547. return FALSE;
  548. }
  549. if (flushable >= 0 && l2cap_set_flushable(sock, flushable) < 0) {
  550. ERROR_FAILED(err, "l2cap_set_flushable", errno);
  551. return FALSE;
  552. }
  553. if (priority > 0 && set_priority(sock, priority) < 0) {
  554. ERROR_FAILED(err, "set_priority", errno);
  555. return FALSE;
  556. }
  557. if (sec_level && !set_sec_level(sock, BT_IO_L2CAP, sec_level, err))
  558. return FALSE;
  559. return TRUE;
  560. }
  561. static int rfcomm_bind(int sock,
  562. const bdaddr_t *src, uint8_t channel, GError **err)
  563. {
  564. struct sockaddr_rc addr;
  565. memset(&addr, 0, sizeof(addr));
  566. addr.rc_family = AF_BLUETOOTH;
  567. bacpy(&addr.rc_bdaddr, src);
  568. addr.rc_channel = channel;
  569. if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
  570. int error = -errno;
  571. ERROR_FAILED(err, "rfcomm_bind", errno);
  572. return error;
  573. }
  574. return 0;
  575. }
  576. static int rfcomm_connect(int sock, const bdaddr_t *dst, uint8_t channel)
  577. {
  578. int err;
  579. struct sockaddr_rc addr;
  580. memset(&addr, 0, sizeof(addr));
  581. addr.rc_family = AF_BLUETOOTH;
  582. bacpy(&addr.rc_bdaddr, dst);
  583. addr.rc_channel = channel;
  584. err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
  585. if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
  586. return -errno;
  587. return 0;
  588. }
  589. static gboolean rfcomm_set(int sock, int sec_level, int central, GError **err)
  590. {
  591. if (sec_level && !set_sec_level(sock, BT_IO_RFCOMM, sec_level, err))
  592. return FALSE;
  593. if (central >= 0 && rfcomm_set_central(sock, central) < 0) {
  594. ERROR_FAILED(err, "rfcomm_set_central", errno);
  595. return FALSE;
  596. }
  597. return TRUE;
  598. }
  599. static int sco_bind(int sock, const bdaddr_t *src, GError **err)
  600. {
  601. struct sockaddr_sco addr;
  602. memset(&addr, 0, sizeof(addr));
  603. addr.sco_family = AF_BLUETOOTH;
  604. bacpy(&addr.sco_bdaddr, src);
  605. if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
  606. int error = -errno;
  607. ERROR_FAILED(err, "sco_bind", errno);
  608. return error;
  609. }
  610. return 0;
  611. }
  612. static int sco_connect(int sock, const bdaddr_t *dst)
  613. {
  614. struct sockaddr_sco addr;
  615. int err;
  616. memset(&addr, 0, sizeof(addr));
  617. addr.sco_family = AF_BLUETOOTH;
  618. bacpy(&addr.sco_bdaddr, dst);
  619. err = connect(sock, (struct sockaddr *) &addr, sizeof(addr));
  620. if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS))
  621. return -errno;
  622. return 0;
  623. }
  624. static gboolean sco_set(int sock, uint16_t mtu, uint16_t voice, GError **err)
  625. {
  626. struct sco_options sco_opt;
  627. struct bt_voice bt_voice;
  628. socklen_t len;
  629. if (!mtu)
  630. goto voice;
  631. len = sizeof(sco_opt);
  632. memset(&sco_opt, 0, len);
  633. if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) {
  634. ERROR_FAILED(err, "getsockopt(SCO_OPTIONS)", errno);
  635. return FALSE;
  636. }
  637. sco_opt.mtu = mtu;
  638. if (setsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt,
  639. sizeof(sco_opt)) < 0) {
  640. ERROR_FAILED(err, "setsockopt(SCO_OPTIONS)", errno);
  641. return FALSE;
  642. }
  643. voice:
  644. if (!voice)
  645. return TRUE;
  646. memset(&bt_voice, 0, sizeof(bt_voice));
  647. bt_voice.setting = voice;
  648. if (setsockopt(sock, SOL_BLUETOOTH, BT_VOICE, &bt_voice,
  649. sizeof(bt_voice)) < 0) {
  650. ERROR_FAILED(err, "setsockopt(BT_VOICE)", errno);
  651. return FALSE;
  652. }
  653. return TRUE;
  654. }
  655. static gboolean parse_set_opts(struct set_opts *opts, GError **err,
  656. BtIOOption opt1, va_list args)
  657. {
  658. BtIOOption opt = opt1;
  659. const char *str;
  660. memset(opts, 0, sizeof(*opts));
  661. /* Set defaults */
  662. opts->type = BT_IO_SCO;
  663. opts->defer = DEFAULT_DEFER_TIMEOUT;
  664. opts->central = -1;
  665. opts->mode = L2CAP_MODE_BASIC;
  666. opts->flushable = -1;
  667. opts->priority = 0;
  668. opts->src_type = BDADDR_BREDR;
  669. opts->dst_type = BDADDR_BREDR;
  670. while (opt != BT_IO_OPT_INVALID) {
  671. switch (opt) {
  672. case BT_IO_OPT_SOURCE:
  673. str = va_arg(args, const char *);
  674. str2ba(str, &opts->src);
  675. break;
  676. case BT_IO_OPT_SOURCE_BDADDR:
  677. bacpy(&opts->src, va_arg(args, const bdaddr_t *));
  678. break;
  679. case BT_IO_OPT_SOURCE_TYPE:
  680. opts->src_type = va_arg(args, int);
  681. break;
  682. case BT_IO_OPT_DEST:
  683. str2ba(va_arg(args, const char *), &opts->dst);
  684. break;
  685. case BT_IO_OPT_DEST_BDADDR:
  686. bacpy(&opts->dst, va_arg(args, const bdaddr_t *));
  687. break;
  688. case BT_IO_OPT_DEST_TYPE:
  689. opts->dst_type = va_arg(args, int);
  690. break;
  691. case BT_IO_OPT_DEFER_TIMEOUT:
  692. opts->defer = va_arg(args, int);
  693. break;
  694. case BT_IO_OPT_SEC_LEVEL:
  695. opts->sec_level = va_arg(args, int);
  696. break;
  697. case BT_IO_OPT_CHANNEL:
  698. opts->type = BT_IO_RFCOMM;
  699. opts->channel = va_arg(args, int);
  700. break;
  701. case BT_IO_OPT_PSM:
  702. opts->type = BT_IO_L2CAP;
  703. opts->psm = va_arg(args, int);
  704. break;
  705. case BT_IO_OPT_CID:
  706. opts->type = BT_IO_L2CAP;
  707. opts->cid = va_arg(args, int);
  708. break;
  709. case BT_IO_OPT_MTU:
  710. opts->mtu = va_arg(args, int);
  711. opts->imtu = opts->mtu;
  712. opts->omtu = opts->mtu;
  713. break;
  714. case BT_IO_OPT_OMTU:
  715. opts->omtu = va_arg(args, int);
  716. if (!opts->mtu)
  717. opts->mtu = opts->omtu;
  718. break;
  719. case BT_IO_OPT_IMTU:
  720. opts->imtu = va_arg(args, int);
  721. if (!opts->mtu)
  722. opts->mtu = opts->imtu;
  723. break;
  724. case BT_IO_OPT_CENTRAL:
  725. opts->central = va_arg(args, gboolean);
  726. break;
  727. case BT_IO_OPT_MODE:
  728. opts->mode = va_arg(args, int);
  729. break;
  730. case BT_IO_OPT_FLUSHABLE:
  731. opts->flushable = va_arg(args, gboolean);
  732. break;
  733. case BT_IO_OPT_PRIORITY:
  734. opts->priority = va_arg(args, int);
  735. break;
  736. case BT_IO_OPT_VOICE:
  737. opts->voice = va_arg(args, int);
  738. break;
  739. case BT_IO_OPT_INVALID:
  740. case BT_IO_OPT_KEY_SIZE:
  741. case BT_IO_OPT_SOURCE_CHANNEL:
  742. case BT_IO_OPT_DEST_CHANNEL:
  743. case BT_IO_OPT_HANDLE:
  744. case BT_IO_OPT_CLASS:
  745. case BT_IO_OPT_PHY:
  746. default:
  747. g_set_error(err, BT_IO_ERROR, EINVAL,
  748. "Unknown option %d", opt);
  749. return FALSE;
  750. }
  751. opt = va_arg(args, int);
  752. }
  753. return TRUE;
  754. }
  755. static gboolean get_src(int sock, void *src, socklen_t len, GError **err)
  756. {
  757. socklen_t olen;
  758. memset(src, 0, len);
  759. olen = len;
  760. if (getsockname(sock, src, &olen) < 0) {
  761. ERROR_FAILED(err, "getsockname", errno);
  762. return FALSE;
  763. }
  764. return TRUE;
  765. }
  766. static gboolean get_dst(int sock, void *dst, socklen_t len, GError **err)
  767. {
  768. socklen_t olen;
  769. memset(dst, 0, len);
  770. olen = len;
  771. if (getpeername(sock, dst, &olen) < 0) {
  772. ERROR_FAILED(err, "getpeername", errno);
  773. return FALSE;
  774. }
  775. return TRUE;
  776. }
  777. static int l2cap_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
  778. {
  779. struct l2cap_conninfo info;
  780. socklen_t len;
  781. len = sizeof(info);
  782. if (getsockopt(sock, SOL_L2CAP, L2CAP_CONNINFO, &info, &len) < 0)
  783. return -errno;
  784. if (handle)
  785. *handle = info.hci_handle;
  786. if (dev_class)
  787. memcpy(dev_class, info.dev_class, 3);
  788. return 0;
  789. }
  790. static int l2cap_get_flushable(int sock, gboolean *flushable)
  791. {
  792. int f;
  793. socklen_t len;
  794. f = 0;
  795. len = sizeof(f);
  796. if (getsockopt(sock, SOL_BLUETOOTH, BT_FLUSHABLE, &f, &len) < 0)
  797. return -errno;
  798. if (f)
  799. *flushable = TRUE;
  800. else
  801. *flushable = FALSE;
  802. return 0;
  803. }
  804. static int get_priority(int sock, uint32_t *prio)
  805. {
  806. socklen_t len;
  807. len = sizeof(*prio);
  808. if (getsockopt(sock, SOL_SOCKET, SO_PRIORITY, prio, &len) < 0)
  809. return -errno;
  810. return 0;
  811. }
  812. static int get_phy(int sock, uint32_t *phy)
  813. {
  814. socklen_t len;
  815. len = sizeof(*phy);
  816. if (getsockopt(sock, SOL_BLUETOOTH, BT_PHY, phy, &len) < 0)
  817. return -errno;
  818. return 0;
  819. }
  820. static int get_le_imtu(int sock, uint16_t *mtu)
  821. {
  822. socklen_t len;
  823. len = sizeof(*mtu);
  824. if (getsockopt(sock, SOL_BLUETOOTH, BT_RCVMTU, mtu, &len) < 0)
  825. return -errno;
  826. return 0;
  827. }
  828. static int get_le_mode(int sock, uint8_t *mode)
  829. {
  830. socklen_t len;
  831. len = sizeof(*mode);
  832. if (getsockopt(sock, SOL_BLUETOOTH, BT_MODE, mode, &len) < 0)
  833. return -errno;
  834. return 0;
  835. }
  836. static gboolean l2cap_get(int sock, GError **err, BtIOOption opt1,
  837. va_list args)
  838. {
  839. BtIOOption opt = opt1;
  840. struct sockaddr_l2 src, dst;
  841. struct l2cap_options l2o;
  842. int flags;
  843. uint8_t dev_class[3];
  844. uint16_t handle = 0;
  845. socklen_t len;
  846. gboolean flushable = FALSE, have_dst = FALSE;
  847. uint32_t priority, phy;
  848. if (!get_src(sock, &src, sizeof(src), err))
  849. return FALSE;
  850. memset(&l2o, 0, sizeof(l2o));
  851. if (src.l2_bdaddr_type != BDADDR_BREDR) {
  852. if (get_le_imtu(sock, &l2o.imtu) == 0) {
  853. /* Older kernels may not support BT_MODE */
  854. get_le_mode(sock, &l2o.mode);
  855. goto parse_opts;
  856. }
  857. /* Non-LE CoC enabled kernels will return one of these
  858. * in which case we need to fall back to L2CAP_OPTIONS.
  859. */
  860. if (errno != EPROTONOSUPPORT && errno != ENOPROTOOPT) {
  861. ERROR_FAILED(err, "getsockopt(BT_RCVMTU)", errno);
  862. return FALSE;
  863. }
  864. }
  865. len = sizeof(l2o);
  866. if (getsockopt(sock, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &len) < 0) {
  867. ERROR_FAILED(err, "getsockopt(L2CAP_OPTIONS)", errno);
  868. return FALSE;
  869. }
  870. parse_opts:
  871. while (opt != BT_IO_OPT_INVALID) {
  872. switch (opt) {
  873. case BT_IO_OPT_SOURCE:
  874. ba2str(&src.l2_bdaddr, va_arg(args, char *));
  875. break;
  876. case BT_IO_OPT_SOURCE_BDADDR:
  877. bacpy(va_arg(args, bdaddr_t *), &src.l2_bdaddr);
  878. break;
  879. case BT_IO_OPT_DEST:
  880. if (!have_dst)
  881. have_dst = get_dst(sock, &dst, sizeof(dst),
  882. err);
  883. if (!have_dst)
  884. return FALSE;
  885. ba2str(&dst.l2_bdaddr, va_arg(args, char *));
  886. break;
  887. case BT_IO_OPT_DEST_BDADDR:
  888. if (!have_dst)
  889. have_dst = get_dst(sock, &dst, sizeof(dst),
  890. err);
  891. if (!have_dst)
  892. return FALSE;
  893. bacpy(va_arg(args, bdaddr_t *), &dst.l2_bdaddr);
  894. break;
  895. case BT_IO_OPT_DEST_TYPE:
  896. if (!have_dst)
  897. have_dst = get_dst(sock, &dst, sizeof(dst),
  898. err);
  899. if (!have_dst)
  900. return FALSE;
  901. *(va_arg(args, uint8_t *)) = dst.l2_bdaddr_type;
  902. break;
  903. case BT_IO_OPT_DEFER_TIMEOUT:
  904. len = sizeof(int);
  905. if (getsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
  906. va_arg(args, int *), &len) < 0) {
  907. ERROR_FAILED(err, "getsockopt(DEFER_SETUP)",
  908. errno);
  909. return FALSE;
  910. }
  911. break;
  912. case BT_IO_OPT_SEC_LEVEL:
  913. if (!get_sec_level(sock, BT_IO_L2CAP,
  914. va_arg(args, int *), err))
  915. return FALSE;
  916. break;
  917. case BT_IO_OPT_KEY_SIZE:
  918. if (!get_key_size(sock, va_arg(args, int *), err))
  919. return FALSE;
  920. break;
  921. case BT_IO_OPT_PSM:
  922. if (src.l2_psm) {
  923. *(va_arg(args, uint16_t *)) = btohs(src.l2_psm);
  924. break;
  925. }
  926. if (!have_dst)
  927. have_dst = get_dst(sock, &dst, sizeof(dst),
  928. err);
  929. if (!have_dst)
  930. return FALSE;
  931. *(va_arg(args, uint16_t *)) = btohs(dst.l2_psm);
  932. break;
  933. case BT_IO_OPT_CID:
  934. if (src.l2_cid) {
  935. *(va_arg(args, uint16_t *)) = btohs(src.l2_cid);
  936. break;
  937. }
  938. if (!have_dst)
  939. have_dst = get_dst(sock, &dst, sizeof(dst),
  940. err);
  941. if (!have_dst)
  942. return FALSE;
  943. *(va_arg(args, uint16_t *)) = btohs(dst.l2_cid);
  944. break;
  945. case BT_IO_OPT_OMTU:
  946. if (src.l2_bdaddr_type == BDADDR_BREDR) {
  947. *(va_arg(args, uint16_t *)) = l2o.omtu;
  948. break;
  949. }
  950. len = sizeof(l2o.omtu);
  951. if (getsockopt(sock, SOL_BLUETOOTH, BT_SNDMTU,
  952. &l2o.omtu, &len) < 0) {
  953. ERROR_FAILED(err, "getsockopt(BT_SNDMTU)",
  954. errno);
  955. return FALSE;
  956. }
  957. *(va_arg(args, uint16_t *)) = l2o.omtu;
  958. break;
  959. case BT_IO_OPT_IMTU:
  960. *(va_arg(args, uint16_t *)) = l2o.imtu;
  961. break;
  962. case BT_IO_OPT_CENTRAL:
  963. len = sizeof(flags);
  964. if (getsockopt(sock, SOL_L2CAP, L2CAP_LM, &flags,
  965. &len) < 0) {
  966. ERROR_FAILED(err, "getsockopt(L2CAP_LM)",
  967. errno);
  968. return FALSE;
  969. }
  970. *(va_arg(args, gboolean *)) =
  971. (flags & L2CAP_LM_MASTER) ? TRUE : FALSE;
  972. break;
  973. case BT_IO_OPT_HANDLE:
  974. if (l2cap_get_info(sock, &handle, dev_class) < 0) {
  975. ERROR_FAILED(err, "L2CAP_CONNINFO", errno);
  976. return FALSE;
  977. }
  978. *(va_arg(args, uint16_t *)) = handle;
  979. break;
  980. case BT_IO_OPT_CLASS:
  981. if (l2cap_get_info(sock, &handle, dev_class) < 0) {
  982. ERROR_FAILED(err, "L2CAP_CONNINFO", errno);
  983. return FALSE;
  984. }
  985. memcpy(va_arg(args, uint8_t *), dev_class, 3);
  986. break;
  987. case BT_IO_OPT_MODE:
  988. *(va_arg(args, uint8_t *)) = l2o.mode;
  989. break;
  990. case BT_IO_OPT_FLUSHABLE:
  991. if (l2cap_get_flushable(sock, &flushable) < 0) {
  992. ERROR_FAILED(err, "get_flushable", errno);
  993. return FALSE;
  994. }
  995. *(va_arg(args, gboolean *)) = flushable;
  996. break;
  997. case BT_IO_OPT_PRIORITY:
  998. if (get_priority(sock, &priority) < 0) {
  999. ERROR_FAILED(err, "get_priority", errno);
  1000. return FALSE;
  1001. }
  1002. *(va_arg(args, uint32_t *)) = priority;
  1003. break;
  1004. case BT_IO_OPT_PHY:
  1005. if (get_phy(sock, &phy) < 0) {
  1006. ERROR_FAILED(err, "get_phy", errno);
  1007. return FALSE;
  1008. }
  1009. *(va_arg(args, uint32_t *)) = phy;
  1010. break;
  1011. case BT_IO_OPT_INVALID:
  1012. case BT_IO_OPT_SOURCE_TYPE:
  1013. case BT_IO_OPT_CHANNEL:
  1014. case BT_IO_OPT_SOURCE_CHANNEL:
  1015. case BT_IO_OPT_DEST_CHANNEL:
  1016. case BT_IO_OPT_MTU:
  1017. case BT_IO_OPT_VOICE:
  1018. default:
  1019. g_set_error(err, BT_IO_ERROR, EINVAL,
  1020. "Unknown option %d", opt);
  1021. return FALSE;
  1022. }
  1023. opt = va_arg(args, int);
  1024. }
  1025. return TRUE;
  1026. }
  1027. static int rfcomm_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
  1028. {
  1029. struct rfcomm_conninfo info;
  1030. socklen_t len;
  1031. len = sizeof(info);
  1032. if (getsockopt(sock, SOL_RFCOMM, RFCOMM_CONNINFO, &info, &len) < 0)
  1033. return -errno;
  1034. if (handle)
  1035. *handle = info.hci_handle;
  1036. if (dev_class)
  1037. memcpy(dev_class, info.dev_class, 3);
  1038. return 0;
  1039. }
  1040. static gboolean rfcomm_get(int sock, GError **err, BtIOOption opt1,
  1041. va_list args)
  1042. {
  1043. BtIOOption opt = opt1;
  1044. struct sockaddr_rc src, dst;
  1045. gboolean have_dst = FALSE;
  1046. int flags;
  1047. socklen_t len;
  1048. uint8_t dev_class[3];
  1049. uint16_t handle = 0;
  1050. uint32_t phy;
  1051. if (!get_src(sock, &src, sizeof(src), err))
  1052. return FALSE;
  1053. while (opt != BT_IO_OPT_INVALID) {
  1054. switch (opt) {
  1055. case BT_IO_OPT_SOURCE:
  1056. ba2str(&src.rc_bdaddr, va_arg(args, char *));
  1057. break;
  1058. case BT_IO_OPT_SOURCE_BDADDR:
  1059. bacpy(va_arg(args, bdaddr_t *), &src.rc_bdaddr);
  1060. break;
  1061. case BT_IO_OPT_DEST:
  1062. if (!have_dst)
  1063. have_dst = get_dst(sock, &dst, sizeof(dst),
  1064. err);
  1065. if (!have_dst)
  1066. return FALSE;
  1067. ba2str(&dst.rc_bdaddr, va_arg(args, char *));
  1068. break;
  1069. case BT_IO_OPT_DEST_BDADDR:
  1070. if (!have_dst)
  1071. have_dst = get_dst(sock, &dst, sizeof(dst),
  1072. err);
  1073. if (!have_dst)
  1074. return FALSE;
  1075. bacpy(va_arg(args, bdaddr_t *), &dst.rc_bdaddr);
  1076. break;
  1077. case BT_IO_OPT_DEFER_TIMEOUT:
  1078. len = sizeof(int);
  1079. if (getsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
  1080. va_arg(args, int *), &len) < 0) {
  1081. ERROR_FAILED(err, "getsockopt(DEFER_SETUP)",
  1082. errno);
  1083. return FALSE;
  1084. }
  1085. break;
  1086. case BT_IO_OPT_SEC_LEVEL:
  1087. if (!get_sec_level(sock, BT_IO_RFCOMM,
  1088. va_arg(args, int *), err))
  1089. return FALSE;
  1090. break;
  1091. case BT_IO_OPT_CHANNEL:
  1092. if (src.rc_channel) {
  1093. *(va_arg(args, uint8_t *)) = src.rc_channel;
  1094. break;
  1095. }
  1096. if (!have_dst)
  1097. have_dst = get_dst(sock, &dst, sizeof(dst),
  1098. err);
  1099. if (!have_dst)
  1100. return FALSE;
  1101. *(va_arg(args, uint8_t *)) = dst.rc_channel;
  1102. break;
  1103. case BT_IO_OPT_SOURCE_CHANNEL:
  1104. *(va_arg(args, uint8_t *)) = src.rc_channel;
  1105. break;
  1106. case BT_IO_OPT_DEST_CHANNEL:
  1107. if (!have_dst)
  1108. have_dst = get_dst(sock, &dst, sizeof(dst),
  1109. err);
  1110. if (!have_dst)
  1111. return FALSE;
  1112. *(va_arg(args, uint8_t *)) = dst.rc_channel;
  1113. break;
  1114. case BT_IO_OPT_CENTRAL:
  1115. len = sizeof(flags);
  1116. if (getsockopt(sock, SOL_RFCOMM, RFCOMM_LM, &flags,
  1117. &len) < 0) {
  1118. ERROR_FAILED(err, "getsockopt(RFCOMM_LM)",
  1119. errno);
  1120. return FALSE;
  1121. }
  1122. *(va_arg(args, gboolean *)) =
  1123. (flags & RFCOMM_LM_MASTER) ? TRUE : FALSE;
  1124. break;
  1125. case BT_IO_OPT_HANDLE:
  1126. if (rfcomm_get_info(sock, &handle, dev_class) < 0) {
  1127. ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
  1128. return FALSE;
  1129. }
  1130. *(va_arg(args, uint16_t *)) = handle;
  1131. break;
  1132. case BT_IO_OPT_CLASS:
  1133. if (rfcomm_get_info(sock, &handle, dev_class) < 0) {
  1134. ERROR_FAILED(err, "RFCOMM_CONNINFO", errno);
  1135. return FALSE;
  1136. }
  1137. memcpy(va_arg(args, uint8_t *), dev_class, 3);
  1138. break;
  1139. case BT_IO_OPT_PHY:
  1140. if (get_phy(sock, &phy) < 0) {
  1141. ERROR_FAILED(err, "get_phy", errno);
  1142. return FALSE;
  1143. }
  1144. *(va_arg(args, uint32_t *)) = phy;
  1145. break;
  1146. case BT_IO_OPT_SOURCE_TYPE:
  1147. case BT_IO_OPT_DEST_TYPE:
  1148. case BT_IO_OPT_KEY_SIZE:
  1149. case BT_IO_OPT_PSM:
  1150. case BT_IO_OPT_CID:
  1151. case BT_IO_OPT_MTU:
  1152. case BT_IO_OPT_OMTU:
  1153. case BT_IO_OPT_IMTU:
  1154. case BT_IO_OPT_MODE:
  1155. case BT_IO_OPT_FLUSHABLE:
  1156. case BT_IO_OPT_PRIORITY:
  1157. case BT_IO_OPT_VOICE:
  1158. case BT_IO_OPT_INVALID:
  1159. default:
  1160. g_set_error(err, BT_IO_ERROR, EINVAL,
  1161. "Unknown option %d", opt);
  1162. return FALSE;
  1163. }
  1164. opt = va_arg(args, int);
  1165. }
  1166. return TRUE;
  1167. }
  1168. static int sco_get_info(int sock, uint16_t *handle, uint8_t *dev_class)
  1169. {
  1170. struct sco_conninfo info;
  1171. socklen_t len;
  1172. len = sizeof(info);
  1173. if (getsockopt(sock, SOL_SCO, SCO_CONNINFO, &info, &len) < 0)
  1174. return -errno;
  1175. if (handle)
  1176. *handle = info.hci_handle;
  1177. if (dev_class)
  1178. memcpy(dev_class, info.dev_class, 3);
  1179. return 0;
  1180. }
  1181. static gboolean sco_get(int sock, GError **err, BtIOOption opt1, va_list args)
  1182. {
  1183. BtIOOption opt = opt1;
  1184. struct sockaddr_sco src, dst;
  1185. struct sco_options sco_opt;
  1186. socklen_t len;
  1187. uint8_t dev_class[3];
  1188. uint16_t handle = 0;
  1189. uint32_t phy;
  1190. len = sizeof(sco_opt);
  1191. memset(&sco_opt, 0, len);
  1192. if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) {
  1193. ERROR_FAILED(err, "getsockopt(SCO_OPTIONS)", errno);
  1194. return FALSE;
  1195. }
  1196. if (!get_src(sock, &src, sizeof(src), err))
  1197. return FALSE;
  1198. if (!get_dst(sock, &dst, sizeof(dst), err))
  1199. return FALSE;
  1200. while (opt != BT_IO_OPT_INVALID) {
  1201. switch (opt) {
  1202. case BT_IO_OPT_SOURCE:
  1203. ba2str(&src.sco_bdaddr, va_arg(args, char *));
  1204. break;
  1205. case BT_IO_OPT_SOURCE_BDADDR:
  1206. bacpy(va_arg(args, bdaddr_t *), &src.sco_bdaddr);
  1207. break;
  1208. case BT_IO_OPT_DEST:
  1209. ba2str(&dst.sco_bdaddr, va_arg(args, char *));
  1210. break;
  1211. case BT_IO_OPT_DEST_BDADDR:
  1212. bacpy(va_arg(args, bdaddr_t *), &dst.sco_bdaddr);
  1213. break;
  1214. case BT_IO_OPT_MTU:
  1215. case BT_IO_OPT_IMTU:
  1216. case BT_IO_OPT_OMTU:
  1217. *(va_arg(args, uint16_t *)) = sco_opt.mtu;
  1218. break;
  1219. case BT_IO_OPT_HANDLE:
  1220. if (sco_get_info(sock, &handle, dev_class) < 0) {
  1221. ERROR_FAILED(err, "SCO_CONNINFO", errno);
  1222. return FALSE;
  1223. }
  1224. *(va_arg(args, uint16_t *)) = handle;
  1225. break;
  1226. case BT_IO_OPT_CLASS:
  1227. if (sco_get_info(sock, &handle, dev_class) < 0) {
  1228. ERROR_FAILED(err, "SCO_CONNINFO", errno);
  1229. return FALSE;
  1230. }
  1231. memcpy(va_arg(args, uint8_t *), dev_class, 3);
  1232. break;
  1233. case BT_IO_OPT_PHY:
  1234. if (get_phy(sock, &phy) < 0) {
  1235. ERROR_FAILED(err, "get_phy", errno);
  1236. return FALSE;
  1237. }
  1238. *(va_arg(args, uint32_t *)) = phy;
  1239. break;
  1240. case BT_IO_OPT_SOURCE_TYPE:
  1241. case BT_IO_OPT_DEST_TYPE:
  1242. case BT_IO_OPT_DEFER_TIMEOUT:
  1243. case BT_IO_OPT_SEC_LEVEL:
  1244. case BT_IO_OPT_KEY_SIZE:
  1245. case BT_IO_OPT_CHANNEL:
  1246. case BT_IO_OPT_SOURCE_CHANNEL:
  1247. case BT_IO_OPT_DEST_CHANNEL:
  1248. case BT_IO_OPT_PSM:
  1249. case BT_IO_OPT_CID:
  1250. case BT_IO_OPT_CENTRAL:
  1251. case BT_IO_OPT_MODE:
  1252. case BT_IO_OPT_FLUSHABLE:
  1253. case BT_IO_OPT_PRIORITY:
  1254. case BT_IO_OPT_VOICE:
  1255. case BT_IO_OPT_INVALID:
  1256. default:
  1257. g_set_error(err, BT_IO_ERROR, EINVAL,
  1258. "Unknown option %d", opt);
  1259. return FALSE;
  1260. }
  1261. opt = va_arg(args, int);
  1262. }
  1263. return TRUE;
  1264. }
  1265. static gboolean get_valist(GIOChannel *io, BtIOType type, GError **err,
  1266. BtIOOption opt1, va_list args)
  1267. {
  1268. int sock;
  1269. sock = g_io_channel_unix_get_fd(io);
  1270. switch (type) {
  1271. case BT_IO_L2CAP:
  1272. return l2cap_get(sock, err, opt1, args);
  1273. case BT_IO_RFCOMM:
  1274. return rfcomm_get(sock, err, opt1, args);
  1275. case BT_IO_SCO:
  1276. return sco_get(sock, err, opt1, args);
  1277. case BT_IO_INVALID:
  1278. default:
  1279. g_set_error(err, BT_IO_ERROR, EINVAL,
  1280. "Unknown BtIO type %d", type);
  1281. return FALSE;
  1282. }
  1283. }
  1284. gboolean bt_io_accept(GIOChannel *io, BtIOConnect connect, gpointer user_data,
  1285. GDestroyNotify destroy, GError **err)
  1286. {
  1287. int sock;
  1288. char c;
  1289. struct pollfd pfd;
  1290. sock = g_io_channel_unix_get_fd(io);
  1291. memset(&pfd, 0, sizeof(pfd));
  1292. pfd.fd = sock;
  1293. pfd.events = POLLOUT;
  1294. if (poll(&pfd, 1, 0) < 0) {
  1295. ERROR_FAILED(err, "poll", errno);
  1296. return FALSE;
  1297. }
  1298. if (!(pfd.revents & POLLOUT)) {
  1299. if (read(sock, &c, 1) < 0) {
  1300. ERROR_FAILED(err, "read", errno);
  1301. return FALSE;
  1302. }
  1303. }
  1304. accept_add(io, connect, user_data, destroy);
  1305. return TRUE;
  1306. }
  1307. gboolean bt_io_set(GIOChannel *io, GError **err, BtIOOption opt1, ...)
  1308. {
  1309. va_list args;
  1310. gboolean ret;
  1311. struct set_opts opts;
  1312. int sock;
  1313. BtIOType type;
  1314. va_start(args, opt1);
  1315. ret = parse_set_opts(&opts, err, opt1, args);
  1316. va_end(args);
  1317. if (!ret)
  1318. return ret;
  1319. type = bt_io_get_type(io, err);
  1320. if (type == BT_IO_INVALID)
  1321. return FALSE;
  1322. sock = g_io_channel_unix_get_fd(io);
  1323. switch (type) {
  1324. case BT_IO_L2CAP:
  1325. return l2cap_set(sock, opts.src_type, opts.sec_level, opts.imtu,
  1326. opts.omtu, opts.mode, opts.central,
  1327. opts.flushable, opts.priority, err);
  1328. case BT_IO_RFCOMM:
  1329. return rfcomm_set(sock, opts.sec_level, opts.central, err);
  1330. case BT_IO_SCO:
  1331. return sco_set(sock, opts.mtu, opts.voice, err);
  1332. case BT_IO_INVALID:
  1333. default:
  1334. g_set_error(err, BT_IO_ERROR, EINVAL,
  1335. "Unknown BtIO type %d", type);
  1336. return FALSE;
  1337. }
  1338. }
  1339. gboolean bt_io_get(GIOChannel *io, GError **err, BtIOOption opt1, ...)
  1340. {
  1341. va_list args;
  1342. gboolean ret;
  1343. BtIOType type;
  1344. type = bt_io_get_type(io, err);
  1345. if (type == BT_IO_INVALID)
  1346. return FALSE;
  1347. va_start(args, opt1);
  1348. ret = get_valist(io, type, err, opt1, args);
  1349. va_end(args);
  1350. return ret;
  1351. }
  1352. static GIOChannel *create_io(gboolean server, struct set_opts *opts,
  1353. GError **err)
  1354. {
  1355. int sock;
  1356. GIOChannel *io;
  1357. switch (opts->type) {
  1358. case BT_IO_L2CAP:
  1359. sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
  1360. if (sock < 0) {
  1361. ERROR_FAILED(err, "socket(SEQPACKET, L2CAP)", errno);
  1362. return NULL;
  1363. }
  1364. if (l2cap_bind(sock, &opts->src, opts->src_type,
  1365. server ? opts->psm : 0, opts->cid, err) < 0)
  1366. goto failed;
  1367. if (!l2cap_set(sock, opts->src_type, opts->sec_level,
  1368. opts->imtu, opts->omtu, opts->mode,
  1369. opts->central, opts->flushable, opts->priority,
  1370. err))
  1371. goto failed;
  1372. break;
  1373. case BT_IO_RFCOMM:
  1374. sock = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
  1375. if (sock < 0) {
  1376. ERROR_FAILED(err, "socket(STREAM, RFCOMM)", errno);
  1377. return NULL;
  1378. }
  1379. if (rfcomm_bind(sock, &opts->src,
  1380. server ? opts->channel : 0, err) < 0)
  1381. goto failed;
  1382. if (!rfcomm_set(sock, opts->sec_level, opts->central, err))
  1383. goto failed;
  1384. break;
  1385. case BT_IO_SCO:
  1386. sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
  1387. if (sock < 0) {
  1388. ERROR_FAILED(err, "socket(SEQPACKET, SCO)", errno);
  1389. return NULL;
  1390. }
  1391. if (sco_bind(sock, &opts->src, err) < 0)
  1392. goto failed;
  1393. if (!sco_set(sock, opts->mtu, opts->voice, err))
  1394. goto failed;
  1395. break;
  1396. case BT_IO_INVALID:
  1397. default:
  1398. g_set_error(err, BT_IO_ERROR, EINVAL,
  1399. "Unknown BtIO type %d", opts->type);
  1400. return NULL;
  1401. }
  1402. io = g_io_channel_unix_new(sock);
  1403. g_io_channel_set_close_on_unref(io, TRUE);
  1404. g_io_channel_set_flags(io, G_IO_FLAG_NONBLOCK, NULL);
  1405. return io;
  1406. failed:
  1407. close(sock);
  1408. return NULL;
  1409. }
  1410. GIOChannel *bt_io_connect(BtIOConnect connect, gpointer user_data,
  1411. GDestroyNotify destroy, GError **gerr,
  1412. BtIOOption opt1, ...)
  1413. {
  1414. GIOChannel *io;
  1415. va_list args;
  1416. struct set_opts opts;
  1417. int err, sock;
  1418. gboolean ret;
  1419. char addr[18];
  1420. va_start(args, opt1);
  1421. ret = parse_set_opts(&opts, gerr, opt1, args);
  1422. va_end(args);
  1423. if (ret == FALSE)
  1424. return NULL;
  1425. io = create_io(FALSE, &opts, gerr);
  1426. if (io == NULL)
  1427. return NULL;
  1428. sock = g_io_channel_unix_get_fd(io);
  1429. /* Use DEFER_SETUP when connecting using Ext-Flowctl */
  1430. if (opts.mode == BT_IO_MODE_EXT_FLOWCTL && opts.defer) {
  1431. if (setsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
  1432. &opts.defer, sizeof(opts.defer)) < 0) {
  1433. ERROR_FAILED(gerr, "setsockopt(BT_DEFER_SETUP)", errno);
  1434. return NULL;
  1435. }
  1436. }
  1437. switch (opts.type) {
  1438. case BT_IO_L2CAP:
  1439. err = l2cap_connect(sock, &opts.dst, opts.dst_type,
  1440. opts.psm, opts.cid);
  1441. break;
  1442. case BT_IO_RFCOMM:
  1443. err = rfcomm_connect(sock, &opts.dst, opts.channel);
  1444. break;
  1445. case BT_IO_SCO:
  1446. err = sco_connect(sock, &opts.dst);
  1447. break;
  1448. case BT_IO_INVALID:
  1449. default:
  1450. g_set_error(gerr, BT_IO_ERROR, EINVAL,
  1451. "Unknown BtIO type %d", opts.type);
  1452. return NULL;
  1453. }
  1454. if (err < 0) {
  1455. ba2str(&opts.dst, addr);
  1456. g_set_error(gerr, BT_IO_ERROR, -err,
  1457. "connect to %s: %s (%d)", addr, strerror(-err),
  1458. -err);
  1459. g_io_channel_unref(io);
  1460. return NULL;
  1461. }
  1462. connect_add(io, connect, opts.dst, user_data, destroy);
  1463. return io;
  1464. }
  1465. GIOChannel *bt_io_listen(BtIOConnect connect, BtIOConfirm confirm,
  1466. gpointer user_data, GDestroyNotify destroy,
  1467. GError **err, BtIOOption opt1, ...)
  1468. {
  1469. GIOChannel *io;
  1470. va_list args;
  1471. struct set_opts opts;
  1472. int sock;
  1473. gboolean ret;
  1474. va_start(args, opt1);
  1475. ret = parse_set_opts(&opts, err, opt1, args);
  1476. va_end(args);
  1477. if (ret == FALSE)
  1478. return NULL;
  1479. io = create_io(TRUE, &opts, err);
  1480. if (io == NULL)
  1481. return NULL;
  1482. sock = g_io_channel_unix_get_fd(io);
  1483. if (confirm)
  1484. if (setsockopt(sock, SOL_BLUETOOTH, BT_DEFER_SETUP,
  1485. &opts.defer, sizeof(opts.defer)) < 0) {
  1486. ERROR_FAILED(err, "setsockopt(BT_DEFER_SETUP)", errno);
  1487. return NULL;
  1488. }
  1489. if (listen(sock, 5) < 0) {
  1490. ERROR_FAILED(err, "listen", errno);
  1491. g_io_channel_unref(io);
  1492. return NULL;
  1493. }
  1494. server_add(io, connect, confirm, user_data, destroy);
  1495. return io;
  1496. }
  1497. GQuark bt_io_error_quark(void)
  1498. {
  1499. return g_quark_from_static_string("bt-io-error-quark");
  1500. }