avtest.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2007-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 <stdio.h>
  15. #include <errno.h>
  16. #include <unistd.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <getopt.h>
  20. #include <sys/socket.h>
  21. #include <netinet/in.h>
  22. #include "lib/bluetooth.h"
  23. #include "lib/hci.h"
  24. #include "lib/hci_lib.h"
  25. #include "lib/l2cap.h"
  26. #include "lib/sdp.h"
  27. #define AVDTP_PKT_TYPE_SINGLE 0x00
  28. #define AVDTP_PKT_TYPE_START 0x01
  29. #define AVDTP_PKT_TYPE_CONTINUE 0x02
  30. #define AVDTP_PKT_TYPE_END 0x03
  31. #define AVDTP_MSG_TYPE_COMMAND 0x00
  32. #define AVDTP_MSG_TYPE_GEN_REJECT 0x01
  33. #define AVDTP_MSG_TYPE_ACCEPT 0x02
  34. #define AVDTP_MSG_TYPE_REJECT 0x03
  35. #define AVDTP_DISCOVER 0x01
  36. #define AVDTP_GET_CAPABILITIES 0x02
  37. #define AVDTP_SET_CONFIGURATION 0x03
  38. #define AVDTP_GET_CONFIGURATION 0x04
  39. #define AVDTP_RECONFIGURE 0x05
  40. #define AVDTP_OPEN 0x06
  41. #define AVDTP_START 0x07
  42. #define AVDTP_CLOSE 0x08
  43. #define AVDTP_SUSPEND 0x09
  44. #define AVDTP_ABORT 0x0A
  45. #define AVDTP_SEP_TYPE_SOURCE 0x00
  46. #define AVDTP_SEP_TYPE_SINK 0x01
  47. #define AVDTP_MEDIA_TYPE_AUDIO 0x00
  48. #define AVDTP_MEDIA_TYPE_VIDEO 0x01
  49. #define AVDTP_MEDIA_TYPE_MULTIMEDIA 0x02
  50. #if __BYTE_ORDER == __LITTLE_ENDIAN
  51. struct avdtp_header {
  52. uint8_t message_type:2;
  53. uint8_t packet_type:2;
  54. uint8_t transaction:4;
  55. uint8_t signal_id:6;
  56. uint8_t rfa0:2;
  57. } __attribute__ ((packed));
  58. struct seid_info {
  59. uint8_t rfa0:1;
  60. uint8_t inuse:1;
  61. uint8_t seid:6;
  62. uint8_t rfa2:3;
  63. uint8_t type:1;
  64. uint8_t media_type:4;
  65. } __attribute__ ((packed));
  66. struct avdtp_start_header {
  67. uint8_t message_type:2;
  68. uint8_t packet_type:2;
  69. uint8_t transaction:4;
  70. uint8_t no_of_packets;
  71. uint8_t signal_id:6;
  72. uint8_t rfa0:2;
  73. } __attribute__ ((packed));
  74. struct avdtp_continue_header {
  75. uint8_t message_type:2;
  76. uint8_t packet_type:2;
  77. uint8_t transaction:4;
  78. } __attribute__ ((packed));
  79. struct avctp_header {
  80. uint8_t ipid:1;
  81. uint8_t cr:1;
  82. uint8_t packet_type:2;
  83. uint8_t transaction:4;
  84. uint16_t pid;
  85. } __attribute__ ((packed));
  86. #define AVCTP_HEADER_LENGTH 3
  87. #elif __BYTE_ORDER == __BIG_ENDIAN
  88. struct avdtp_header {
  89. uint8_t transaction:4;
  90. uint8_t packet_type:2;
  91. uint8_t message_type:2;
  92. uint8_t rfa0:2;
  93. uint8_t signal_id:6;
  94. } __attribute__ ((packed));
  95. struct seid_info {
  96. uint8_t seid:6;
  97. uint8_t inuse:1;
  98. uint8_t rfa0:1;
  99. uint8_t media_type:4;
  100. uint8_t type:1;
  101. uint8_t rfa2:3;
  102. } __attribute__ ((packed));
  103. struct avdtp_start_header {
  104. uint8_t transaction:4;
  105. uint8_t packet_type:2;
  106. uint8_t message_type:2;
  107. uint8_t no_of_packets;
  108. uint8_t rfa0:2;
  109. uint8_t signal_id:6;
  110. } __attribute__ ((packed));
  111. struct avdtp_continue_header {
  112. uint8_t transaction:4;
  113. uint8_t packet_type:2;
  114. uint8_t message_type:2;
  115. } __attribute__ ((packed));
  116. struct avctp_header {
  117. uint8_t transaction:4;
  118. uint8_t packet_type:2;
  119. uint8_t cr:1;
  120. uint8_t ipid:1;
  121. uint16_t pid;
  122. } __attribute__ ((packed));
  123. #define AVCTP_HEADER_LENGTH 3
  124. #else
  125. #error "Unknown byte order"
  126. #endif
  127. #define AVCTP_COMMAND 0
  128. #define AVCTP_RESPONSE 1
  129. #define AVCTP_PACKET_SINGLE 0
  130. static const unsigned char media_transport[] = {
  131. 0x01, /* Media transport category */
  132. 0x00,
  133. 0x07, /* Media codec category */
  134. 0x06,
  135. 0x00, /* Media type audio */
  136. 0x00, /* Codec SBC */
  137. 0x22, /* 44.1 kHz, stereo */
  138. 0x15, /* 16 blocks, 8 subbands */
  139. 0x02,
  140. 0x33,
  141. };
  142. static int media_sock = -1;
  143. static void dump_avctp_header(struct avctp_header *hdr)
  144. {
  145. printf("TL %d PT %d CR %d IPID %d PID 0x%04x\n", hdr->transaction,
  146. hdr->packet_type, hdr->cr, hdr->ipid, ntohs(hdr->pid));
  147. }
  148. static void dump_avdtp_header(struct avdtp_header *hdr)
  149. {
  150. printf("TL %d PT %d MT %d SI %d\n", hdr->transaction,
  151. hdr->packet_type, hdr->message_type, hdr->signal_id);
  152. }
  153. static void dump_buffer(const unsigned char *buf, int len)
  154. {
  155. int i;
  156. for (i = 0; i < len; i++)
  157. printf("%02x ", buf[i]);
  158. printf("\n");
  159. }
  160. static void process_avdtp(int srv_sk, int sk, unsigned char reject,
  161. int fragment)
  162. {
  163. unsigned char buf[672];
  164. ssize_t len;
  165. while (1) {
  166. struct avdtp_header *hdr = (void *) buf;
  167. len = read(sk, buf, sizeof(buf));
  168. if (len <= 0) {
  169. perror("Read failed");
  170. break;
  171. }
  172. dump_buffer(buf, len);
  173. dump_avdtp_header(hdr);
  174. if (hdr->packet_type != AVDTP_PKT_TYPE_SINGLE) {
  175. fprintf(stderr, "Only single packets are supported\n");
  176. break;
  177. }
  178. if (hdr->message_type != AVDTP_MSG_TYPE_COMMAND) {
  179. fprintf(stderr, "Ignoring non-command messages\n");
  180. continue;
  181. }
  182. switch (hdr->signal_id) {
  183. case AVDTP_DISCOVER:
  184. if (reject == AVDTP_DISCOVER) {
  185. hdr->message_type = AVDTP_MSG_TYPE_REJECT;
  186. buf[2] = 0x29; /* Unsupported configuration */
  187. printf("Rejecting discover command\n");
  188. len = write(sk, buf, 3);
  189. } else {
  190. struct seid_info *sei = (void *) (buf + 2);
  191. hdr->message_type = AVDTP_MSG_TYPE_ACCEPT;
  192. buf[2] = 0x00;
  193. buf[3] = 0x00;
  194. sei->seid = 0x01;
  195. sei->type = AVDTP_SEP_TYPE_SINK;
  196. sei->media_type = AVDTP_MEDIA_TYPE_AUDIO;
  197. printf("Accepting discover command\n");
  198. len = write(sk, buf, 4);
  199. }
  200. break;
  201. case AVDTP_GET_CAPABILITIES:
  202. if (reject == AVDTP_GET_CAPABILITIES) {
  203. hdr->message_type = AVDTP_MSG_TYPE_REJECT;
  204. buf[2] = 0x29; /* Unsupported configuration */
  205. printf("Rejecting get capabilties command\n");
  206. len = write(sk, buf, 3);
  207. } else if (fragment) {
  208. struct avdtp_start_header *start = (void *) buf;
  209. printf("Sending fragmented reply to getcap\n");
  210. hdr->message_type = AVDTP_MSG_TYPE_ACCEPT;
  211. /* Start packet */
  212. hdr->packet_type = AVDTP_PKT_TYPE_START;
  213. start->signal_id = AVDTP_GET_CAPABILITIES;
  214. start->no_of_packets = 3;
  215. memcpy(&buf[3], media_transport,
  216. sizeof(media_transport));
  217. len = write(sk, buf,
  218. 3 + sizeof(media_transport));
  219. /* Continue packet */
  220. hdr->packet_type = AVDTP_PKT_TYPE_CONTINUE;
  221. memcpy(&buf[1], media_transport,
  222. sizeof(media_transport));
  223. len = write(sk, buf,
  224. 1 + sizeof(media_transport));
  225. /* End packet */
  226. hdr->packet_type = AVDTP_PKT_TYPE_END;
  227. memcpy(&buf[1], media_transport,
  228. sizeof(media_transport));
  229. len = write(sk, buf,
  230. 1 + sizeof(media_transport));
  231. } else {
  232. hdr->message_type = AVDTP_MSG_TYPE_ACCEPT;
  233. memcpy(&buf[2], media_transport,
  234. sizeof(media_transport));
  235. printf("Accepting get capabilities command\n");
  236. len = write(sk, buf,
  237. 2 + sizeof(media_transport));
  238. }
  239. break;
  240. case AVDTP_SET_CONFIGURATION:
  241. if (reject == AVDTP_SET_CONFIGURATION) {
  242. hdr->message_type = AVDTP_MSG_TYPE_REJECT;
  243. buf[2] = buf[4];
  244. buf[3] = 0x13; /* SEP In Use */
  245. printf("Rejecting set configuration command\n");
  246. len = write(sk, buf, 4);
  247. } else {
  248. hdr->message_type = AVDTP_MSG_TYPE_ACCEPT;
  249. printf("Accepting set configuration command\n");
  250. len = write(sk, buf, 2);
  251. }
  252. break;
  253. case AVDTP_GET_CONFIGURATION:
  254. if (reject == AVDTP_GET_CONFIGURATION) {
  255. hdr->message_type = AVDTP_MSG_TYPE_REJECT;
  256. buf[2] = 0x12; /* Bad ACP SEID */
  257. printf("Rejecting get configuration command\n");
  258. len = write(sk, buf, 3);
  259. } else {
  260. hdr->message_type = AVDTP_MSG_TYPE_ACCEPT;
  261. printf("Accepting get configuration command\n");
  262. len = write(sk, buf, 2);
  263. }
  264. break;
  265. case AVDTP_OPEN:
  266. if (reject == AVDTP_OPEN) {
  267. hdr->message_type = AVDTP_MSG_TYPE_REJECT;
  268. buf[2] = 0x31; /* Bad State */
  269. printf("Rejecting open command\n");
  270. len = write(sk, buf, 3);
  271. } else {
  272. struct sockaddr_l2 addr;
  273. socklen_t optlen;
  274. hdr->message_type = AVDTP_MSG_TYPE_ACCEPT;
  275. printf("Accepting open command\n");
  276. len = write(sk, buf, 2);
  277. memset(&addr, 0, sizeof(addr));
  278. optlen = sizeof(addr);
  279. media_sock = accept(srv_sk,
  280. (struct sockaddr *) &addr,
  281. &optlen);
  282. if (media_sock < 0) {
  283. perror("Accept failed");
  284. break;
  285. }
  286. }
  287. break;
  288. case AVDTP_START:
  289. if (reject == AVDTP_ABORT)
  290. printf("Ignoring start to cause abort");
  291. else if (reject == AVDTP_START) {
  292. hdr->message_type = AVDTP_MSG_TYPE_REJECT;
  293. buf[3] = 0x31; /* Bad State */
  294. printf("Rejecting start command\n");
  295. len = write(sk, buf, 4);
  296. } else {
  297. hdr->message_type = AVDTP_MSG_TYPE_ACCEPT;
  298. printf("Accepting start command\n");
  299. len = write(sk, buf, 2);
  300. }
  301. break;
  302. case AVDTP_CLOSE:
  303. if (reject == AVDTP_CLOSE) {
  304. hdr->message_type = AVDTP_MSG_TYPE_REJECT;
  305. buf[2] = 0x31; /* Bad State */
  306. printf("Rejecting close command\n");
  307. len = write(sk, buf, 3);
  308. } else {
  309. hdr->message_type = AVDTP_MSG_TYPE_ACCEPT;
  310. printf("Accepting close command\n");
  311. len = write(sk, buf, 2);
  312. if (media_sock >= 0) {
  313. close(media_sock);
  314. media_sock = -1;
  315. }
  316. }
  317. break;
  318. case AVDTP_SUSPEND:
  319. if (reject == AVDTP_SUSPEND) {
  320. hdr->message_type = AVDTP_MSG_TYPE_REJECT;
  321. buf[3] = 0x31; /* Bad State */
  322. printf("Rejecting suspend command\n");
  323. len = write(sk, buf, 4);
  324. } else {
  325. hdr->message_type = AVDTP_MSG_TYPE_ACCEPT;
  326. printf("Accepting suspend command\n");
  327. len = write(sk, buf, 2);
  328. }
  329. break;
  330. case AVDTP_ABORT:
  331. hdr->message_type = AVDTP_MSG_TYPE_ACCEPT;
  332. printf("Accepting abort command\n");
  333. len = write(sk, buf, 2);
  334. if (media_sock >= 0) {
  335. close(media_sock);
  336. media_sock = -1;
  337. }
  338. break;
  339. default:
  340. buf[1] = 0x00;
  341. printf("Unknown command\n");
  342. len = write(sk, buf, 2);
  343. break;
  344. }
  345. }
  346. }
  347. static void process_avctp(int sk, int reject)
  348. {
  349. unsigned char buf[672];
  350. ssize_t len;
  351. while (1) {
  352. struct avctp_header *hdr = (void *) buf;
  353. len = read(sk, buf, sizeof(buf));
  354. if (len <= 0) {
  355. perror("Read failed");
  356. break;
  357. }
  358. dump_buffer(buf, len);
  359. if (len >= AVCTP_HEADER_LENGTH)
  360. dump_avctp_header(hdr);
  361. }
  362. }
  363. static int set_minimum_mtu(int sk)
  364. {
  365. struct l2cap_options l2o;
  366. socklen_t optlen;
  367. memset(&l2o, 0, sizeof(l2o));
  368. optlen = sizeof(l2o);
  369. if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &optlen) < 0) {
  370. perror("getsockopt");
  371. return -1;
  372. }
  373. l2o.imtu = 48;
  374. l2o.omtu = 48;
  375. if (setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &l2o, sizeof(l2o)) < 0) {
  376. perror("setsockopt");
  377. return -1;
  378. }
  379. return 0;
  380. }
  381. static void do_listen(const bdaddr_t *src, unsigned char reject, int fragment)
  382. {
  383. struct sockaddr_l2 addr;
  384. socklen_t optlen;
  385. int sk, nsk;
  386. sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
  387. if (sk < 0) {
  388. perror("Can't create socket");
  389. return;
  390. }
  391. memset(&addr, 0, sizeof(addr));
  392. addr.l2_family = AF_BLUETOOTH;
  393. bacpy(&addr.l2_bdaddr, src);
  394. addr.l2_psm = htobs(25);
  395. if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
  396. perror("Can't bind socket");
  397. goto error;
  398. }
  399. if (fragment)
  400. set_minimum_mtu(sk);
  401. if (listen(sk, 10)) {
  402. perror("Can't listen on the socket");
  403. goto error;
  404. }
  405. while (1) {
  406. memset(&addr, 0, sizeof(addr));
  407. optlen = sizeof(addr);
  408. nsk = accept(sk, (struct sockaddr *) &addr, &optlen);
  409. if (nsk < 0) {
  410. perror("Accept failed");
  411. continue;
  412. }
  413. process_avdtp(sk, nsk, reject, fragment);
  414. if (media_sock >= 0) {
  415. close(media_sock);
  416. media_sock = -1;
  417. }
  418. close(nsk);
  419. }
  420. error:
  421. close(sk);
  422. }
  423. static int do_connect(const bdaddr_t *src, const bdaddr_t *dst, int avctp,
  424. int fragment)
  425. {
  426. struct sockaddr_l2 addr;
  427. int sk, err;
  428. sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
  429. if (sk < 0) {
  430. perror("Can't create socket");
  431. return -1;
  432. }
  433. memset(&addr, 0, sizeof(addr));
  434. addr.l2_family = AF_BLUETOOTH;
  435. bacpy(&addr.l2_bdaddr, src);
  436. if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
  437. perror("Can't bind socket");
  438. goto error;
  439. }
  440. if (fragment)
  441. set_minimum_mtu(sk);
  442. memset(&addr, 0, sizeof(addr));
  443. addr.l2_family = AF_BLUETOOTH;
  444. bacpy(&addr.l2_bdaddr, dst);
  445. addr.l2_psm = htobs(avctp ? 23 : 25);
  446. err = connect(sk, (struct sockaddr *) &addr, sizeof(addr));
  447. if (err < 0) {
  448. perror("Unable to connect");
  449. goto error;
  450. }
  451. return sk;
  452. error:
  453. close(sk);
  454. return -1;
  455. }
  456. static void do_avdtp_send(int sk, const bdaddr_t *src, const bdaddr_t *dst,
  457. unsigned char cmd, int invalid, int preconf)
  458. {
  459. unsigned char buf[672];
  460. struct avdtp_header *hdr = (void *) buf;
  461. ssize_t len;
  462. memset(buf, 0, sizeof(buf));
  463. switch (cmd) {
  464. case AVDTP_DISCOVER:
  465. if (invalid)
  466. hdr->message_type = 0x01;
  467. else
  468. hdr->message_type = AVDTP_MSG_TYPE_COMMAND;
  469. hdr->packet_type = AVDTP_PKT_TYPE_SINGLE;
  470. hdr->signal_id = AVDTP_DISCOVER;
  471. len = write(sk, buf, 2);
  472. break;
  473. case AVDTP_GET_CAPABILITIES:
  474. hdr->message_type = AVDTP_MSG_TYPE_COMMAND;
  475. hdr->packet_type = AVDTP_PKT_TYPE_SINGLE;
  476. hdr->signal_id = AVDTP_GET_CAPABILITIES;
  477. buf[2] = 1 << 2; /* SEID 1 */
  478. len = write(sk, buf, invalid ? 2 : 3);
  479. break;
  480. case AVDTP_SET_CONFIGURATION:
  481. if (preconf)
  482. do_avdtp_send(sk, src, dst, cmd, 0, 0);
  483. hdr->message_type = AVDTP_MSG_TYPE_COMMAND;
  484. hdr->packet_type = AVDTP_PKT_TYPE_SINGLE;
  485. hdr->signal_id = AVDTP_SET_CONFIGURATION;
  486. buf[2] = 1 << 2; /* ACP SEID */
  487. buf[3] = 1 << 2; /* INT SEID */
  488. memcpy(&buf[4], media_transport, sizeof(media_transport));
  489. if (invalid)
  490. buf[5] = 0x01; /* LOSC != 0 */
  491. len = write(sk, buf, 4 + sizeof(media_transport));
  492. break;
  493. case AVDTP_GET_CONFIGURATION:
  494. if (preconf)
  495. do_avdtp_send(sk, src, dst, AVDTP_SET_CONFIGURATION, 0, 0);
  496. hdr->message_type = AVDTP_MSG_TYPE_COMMAND;
  497. hdr->packet_type = AVDTP_PKT_TYPE_SINGLE;
  498. hdr->signal_id = AVDTP_GET_CONFIGURATION;
  499. if (invalid)
  500. buf[2] = 13 << 2; /* Invalid ACP SEID */
  501. else
  502. buf[2] = 1 << 2; /* Valid ACP SEID */
  503. len = write(sk, buf, 3);
  504. break;
  505. case AVDTP_OPEN:
  506. if (preconf)
  507. do_avdtp_send(sk, src, dst, AVDTP_SET_CONFIGURATION, 0, 0);
  508. hdr->message_type = AVDTP_MSG_TYPE_COMMAND;
  509. hdr->packet_type = AVDTP_PKT_TYPE_SINGLE;
  510. hdr->signal_id = AVDTP_OPEN;
  511. buf[2] = 1 << 2; /* ACP SEID */
  512. len = write(sk, buf, 3);
  513. break;
  514. case AVDTP_START:
  515. if (preconf)
  516. do_avdtp_send(sk, src, dst, AVDTP_SET_CONFIGURATION, 0, 0);
  517. if (!invalid)
  518. do_avdtp_send(sk, src, dst, AVDTP_OPEN, 0, 0);
  519. hdr->message_type = AVDTP_MSG_TYPE_COMMAND;
  520. hdr->packet_type = AVDTP_PKT_TYPE_SINGLE;
  521. hdr->signal_id = AVDTP_START;
  522. buf[2] = 1 << 2; /* ACP SEID */
  523. len = write(sk, buf, 3);
  524. break;
  525. case AVDTP_CLOSE:
  526. if (preconf) {
  527. do_avdtp_send(sk, src, dst, AVDTP_SET_CONFIGURATION, 0, 0);
  528. do_avdtp_send(sk, src, dst, AVDTP_OPEN, 0, 0);
  529. }
  530. hdr->message_type = AVDTP_MSG_TYPE_COMMAND;
  531. hdr->packet_type = AVDTP_PKT_TYPE_SINGLE;
  532. hdr->signal_id = AVDTP_CLOSE;
  533. if (invalid)
  534. buf[2] = 13 << 2; /* Invalid ACP SEID */
  535. else
  536. buf[2] = 1 << 2; /* Valid ACP SEID */
  537. len = write(sk, buf, 3);
  538. break;
  539. case AVDTP_SUSPEND:
  540. if (invalid)
  541. do_avdtp_send(sk, src, dst, AVDTP_OPEN, 0, preconf);
  542. else
  543. do_avdtp_send(sk, src, dst, AVDTP_START, 0, preconf);
  544. hdr->message_type = AVDTP_MSG_TYPE_COMMAND;
  545. hdr->packet_type = AVDTP_PKT_TYPE_SINGLE;
  546. hdr->signal_id = AVDTP_SUSPEND;
  547. buf[2] = 1 << 2; /* ACP SEID */
  548. len = write(sk, buf, 3);
  549. break;
  550. case AVDTP_ABORT:
  551. do_avdtp_send(sk, src, dst, AVDTP_OPEN, 0, 1);
  552. hdr->message_type = AVDTP_MSG_TYPE_COMMAND;
  553. hdr->packet_type = AVDTP_PKT_TYPE_SINGLE;
  554. hdr->signal_id = AVDTP_ABORT;
  555. buf[2] = 1 << 2; /* ACP SEID */
  556. len = write(sk, buf, 3);
  557. break;
  558. default:
  559. hdr->message_type = AVDTP_MSG_TYPE_COMMAND;
  560. hdr->packet_type = AVDTP_PKT_TYPE_SINGLE;
  561. hdr->signal_id = cmd;
  562. len = write(sk, buf, 2);
  563. break;
  564. }
  565. do {
  566. len = read(sk, buf, sizeof(buf));
  567. dump_buffer(buf, len);
  568. dump_avdtp_header(hdr);
  569. } while (len < 2 || (hdr->message_type != AVDTP_MSG_TYPE_ACCEPT &&
  570. hdr->message_type != AVDTP_MSG_TYPE_REJECT &&
  571. hdr->message_type != AVDTP_MSG_TYPE_GEN_REJECT));
  572. if (cmd == AVDTP_OPEN && len >= 2 &&
  573. hdr->message_type == AVDTP_MSG_TYPE_ACCEPT)
  574. media_sock = do_connect(src, dst, 0, 0);
  575. }
  576. static void do_avctp_send(int sk, int invalid)
  577. {
  578. unsigned char buf[672];
  579. struct avctp_header *hdr = (void *) buf;
  580. unsigned char play_pressed[] = { 0x00, 0x48, 0x7c, 0x44, 0x00 };
  581. ssize_t len;
  582. memset(buf, 0, sizeof(buf));
  583. hdr->packet_type = AVCTP_PACKET_SINGLE;
  584. hdr->cr = AVCTP_COMMAND;
  585. if (invalid)
  586. hdr->pid = 0xffff;
  587. else
  588. hdr->pid = htons(AV_REMOTE_SVCLASS_ID);
  589. memcpy(&buf[AVCTP_HEADER_LENGTH], play_pressed, sizeof(play_pressed));
  590. len = write(sk, buf, AVCTP_HEADER_LENGTH + sizeof(play_pressed));
  591. len = read(sk, buf, sizeof(buf));
  592. dump_buffer(buf, len);
  593. if (len >= AVCTP_HEADER_LENGTH)
  594. dump_avctp_header(hdr);
  595. }
  596. static void usage(void)
  597. {
  598. printf("avtest - Audio/Video testing ver %s\n", VERSION);
  599. printf("Usage:\n"
  600. "\tavtest [options] [remote address]\n");
  601. printf("Options:\n"
  602. "\t--device <hcidev> HCI device\n"
  603. "\t--reject <command> Reject command\n"
  604. "\t--send <command> Send command\n"
  605. "\t--preconf Configure stream before actual command\n"
  606. "\t--wait <N> Wait N seconds before exiting\n"
  607. "\t--fragment Use minimum MTU and fragmented messages\n"
  608. "\t--invalid <command> Send invalid command\n");
  609. }
  610. static struct option main_options[] = {
  611. { "help", 0, 0, 'h' },
  612. { "device", 1, 0, 'i' },
  613. { "reject", 1, 0, 'r' },
  614. { "send", 1, 0, 's' },
  615. { "invalid", 1, 0, 'f' },
  616. { "preconf", 0, 0, 'c' },
  617. { "fragment", 0, 0, 'F' },
  618. { "avctp", 0, 0, 'C' },
  619. { "wait", 1, 0, 'w' },
  620. { 0, 0, 0, 0 }
  621. };
  622. static unsigned char parse_cmd(const char *arg)
  623. {
  624. if (!strncmp(arg, "discov", 6))
  625. return AVDTP_DISCOVER;
  626. else if (!strncmp(arg, "capa", 4))
  627. return AVDTP_GET_CAPABILITIES;
  628. else if (!strncmp(arg, "getcapa", 7))
  629. return AVDTP_GET_CAPABILITIES;
  630. else if (!strncmp(arg, "setconf", 7))
  631. return AVDTP_SET_CONFIGURATION;
  632. else if (!strncmp(arg, "getconf", 7))
  633. return AVDTP_GET_CONFIGURATION;
  634. else if (!strncmp(arg, "open", 4))
  635. return AVDTP_OPEN;
  636. else if (!strncmp(arg, "start", 5))
  637. return AVDTP_START;
  638. else if (!strncmp(arg, "close", 5))
  639. return AVDTP_CLOSE;
  640. else if (!strncmp(arg, "suspend", 7))
  641. return AVDTP_SUSPEND;
  642. else if (!strncmp(arg, "abort", 7))
  643. return AVDTP_ABORT;
  644. else
  645. return atoi(arg);
  646. }
  647. enum {
  648. MODE_NONE, MODE_REJECT, MODE_SEND,
  649. };
  650. int main(int argc, char *argv[])
  651. {
  652. unsigned char cmd = 0x00;
  653. bdaddr_t src, dst;
  654. int opt, mode = MODE_NONE, sk, invalid = 0, preconf = 0, fragment = 0;
  655. int avctp = 0, wait_before_exit = 0;
  656. bacpy(&src, BDADDR_ANY);
  657. bacpy(&dst, BDADDR_ANY);
  658. while ((opt = getopt_long(argc, argv, "+i:r:s:f:hcFCw:",
  659. main_options, NULL)) != EOF) {
  660. switch (opt) {
  661. case 'i':
  662. if (!strncmp(optarg, "hci", 3))
  663. hci_devba(atoi(optarg + 3), &src);
  664. else
  665. str2ba(optarg, &src);
  666. break;
  667. case 'r':
  668. mode = MODE_REJECT;
  669. cmd = parse_cmd(optarg);
  670. break;
  671. case 'f':
  672. invalid = 1;
  673. /* fall through */
  674. case 's':
  675. mode = MODE_SEND;
  676. cmd = parse_cmd(optarg);
  677. break;
  678. case 'c':
  679. preconf = 1;
  680. break;
  681. case 'F':
  682. fragment = 1;
  683. break;
  684. case 'C':
  685. avctp = 1;
  686. break;
  687. case 'w':
  688. wait_before_exit = atoi(optarg);
  689. break;
  690. case 'h':
  691. default:
  692. usage();
  693. exit(0);
  694. }
  695. }
  696. if (argv[optind])
  697. str2ba(argv[optind], &dst);
  698. if (avctp) {
  699. avctp = mode;
  700. mode = MODE_SEND;
  701. }
  702. switch (mode) {
  703. case MODE_REJECT:
  704. do_listen(&src, cmd, fragment);
  705. break;
  706. case MODE_SEND:
  707. sk = do_connect(&src, &dst, avctp, fragment);
  708. if (sk < 0)
  709. exit(1);
  710. if (avctp) {
  711. if (avctp == MODE_SEND)
  712. do_avctp_send(sk, invalid);
  713. else
  714. process_avctp(sk, cmd);
  715. } else
  716. do_avdtp_send(sk, &src, &dst, cmd, invalid, preconf);
  717. if (wait_before_exit) {
  718. printf("Waiting %d seconds before exiting\n", wait_before_exit);
  719. sleep(wait_before_exit);
  720. }
  721. if (media_sock >= 0)
  722. close(media_sock);
  723. close(sk);
  724. break;
  725. default:
  726. fprintf(stderr, "No operating mode specified!\n");
  727. exit(1);
  728. }
  729. return 0;
  730. }