avdtp.c 80 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2006-2010 Nokia Corporation
  7. * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
  8. *
  9. *
  10. */
  11. #ifdef HAVE_CONFIG_H
  12. #include <config.h>
  13. #endif
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. #include <stdint.h>
  17. #include <stdbool.h>
  18. #include <errno.h>
  19. #include <unistd.h>
  20. #include <assert.h>
  21. #include <string.h>
  22. #include <sys/socket.h>
  23. #include <netinet/in.h>
  24. #include <glib.h>
  25. #include "lib/bluetooth.h"
  26. #include "src/log.h"
  27. #include "src/shared/util.h"
  28. #include "src/shared/queue.h"
  29. #include "avdtp.h"
  30. #include "../profiles/audio/a2dp-codecs.h"
  31. #define MAX_SEID 0x3E
  32. static uint64_t seids;
  33. #ifndef MAX
  34. # define MAX(x, y) ((x) > (y) ? (x) : (y))
  35. #endif
  36. #define AVDTP_DISCOVER 0x01
  37. #define AVDTP_GET_CAPABILITIES 0x02
  38. #define AVDTP_SET_CONFIGURATION 0x03
  39. #define AVDTP_GET_CONFIGURATION 0x04
  40. #define AVDTP_RECONFIGURE 0x05
  41. #define AVDTP_OPEN 0x06
  42. #define AVDTP_START 0x07
  43. #define AVDTP_CLOSE 0x08
  44. #define AVDTP_SUSPEND 0x09
  45. #define AVDTP_ABORT 0x0A
  46. #define AVDTP_SECURITY_CONTROL 0x0B
  47. #define AVDTP_GET_ALL_CAPABILITIES 0x0C
  48. #define AVDTP_DELAY_REPORT 0x0D
  49. #define AVDTP_PKT_TYPE_SINGLE 0x00
  50. #define AVDTP_PKT_TYPE_START 0x01
  51. #define AVDTP_PKT_TYPE_CONTINUE 0x02
  52. #define AVDTP_PKT_TYPE_END 0x03
  53. #define AVDTP_MSG_TYPE_COMMAND 0x00
  54. #define AVDTP_MSG_TYPE_GEN_REJECT 0x01
  55. #define AVDTP_MSG_TYPE_ACCEPT 0x02
  56. #define AVDTP_MSG_TYPE_REJECT 0x03
  57. #define REQ_TIMEOUT 6
  58. #define ABORT_TIMEOUT 2
  59. #define DISCONNECT_TIMEOUT 1
  60. #define START_TIMEOUT 1
  61. #if __BYTE_ORDER == __LITTLE_ENDIAN
  62. struct avdtp_common_header {
  63. uint8_t message_type:2;
  64. uint8_t packet_type:2;
  65. uint8_t transaction:4;
  66. } __attribute__ ((packed));
  67. struct avdtp_single_header {
  68. uint8_t message_type:2;
  69. uint8_t packet_type:2;
  70. uint8_t transaction:4;
  71. uint8_t signal_id:6;
  72. uint8_t rfa0:2;
  73. } __attribute__ ((packed));
  74. struct avdtp_start_header {
  75. uint8_t message_type:2;
  76. uint8_t packet_type:2;
  77. uint8_t transaction:4;
  78. uint8_t no_of_packets;
  79. uint8_t signal_id:6;
  80. uint8_t rfa0:2;
  81. } __attribute__ ((packed));
  82. struct avdtp_continue_header {
  83. uint8_t message_type:2;
  84. uint8_t packet_type:2;
  85. uint8_t transaction:4;
  86. } __attribute__ ((packed));
  87. struct seid_info {
  88. uint8_t rfa0:1;
  89. uint8_t inuse:1;
  90. uint8_t seid:6;
  91. uint8_t rfa2:3;
  92. uint8_t type:1;
  93. uint8_t media_type:4;
  94. } __attribute__ ((packed));
  95. struct seid {
  96. uint8_t rfa0:2;
  97. uint8_t seid:6;
  98. } __attribute__ ((packed));
  99. #elif __BYTE_ORDER == __BIG_ENDIAN
  100. struct avdtp_common_header {
  101. uint8_t transaction:4;
  102. uint8_t packet_type:2;
  103. uint8_t message_type:2;
  104. } __attribute__ ((packed));
  105. struct avdtp_single_header {
  106. uint8_t transaction:4;
  107. uint8_t packet_type:2;
  108. uint8_t message_type:2;
  109. uint8_t rfa0:2;
  110. uint8_t signal_id:6;
  111. } __attribute__ ((packed));
  112. struct avdtp_start_header {
  113. uint8_t transaction:4;
  114. uint8_t packet_type:2;
  115. uint8_t message_type:2;
  116. uint8_t no_of_packets;
  117. uint8_t rfa0:2;
  118. uint8_t signal_id:6;
  119. } __attribute__ ((packed));
  120. struct avdtp_continue_header {
  121. uint8_t transaction:4;
  122. uint8_t packet_type:2;
  123. uint8_t message_type:2;
  124. } __attribute__ ((packed));
  125. struct seid_info {
  126. uint8_t seid:6;
  127. uint8_t inuse:1;
  128. uint8_t rfa0:1;
  129. uint8_t media_type:4;
  130. uint8_t type:1;
  131. uint8_t rfa2:3;
  132. } __attribute__ ((packed));
  133. struct seid {
  134. uint8_t seid:6;
  135. uint8_t rfa0:2;
  136. } __attribute__ ((packed));
  137. #else
  138. #error "Unknown byte order"
  139. #endif
  140. /* packets */
  141. struct discover_resp {
  142. struct seid_info seps[0];
  143. } __attribute__ ((packed));
  144. struct getcap_resp {
  145. uint8_t caps[0];
  146. } __attribute__ ((packed));
  147. struct start_req {
  148. struct seid first_seid;
  149. struct seid other_seids[0];
  150. } __attribute__ ((packed));
  151. struct suspend_req {
  152. struct seid first_seid;
  153. struct seid other_seids[0];
  154. } __attribute__ ((packed));
  155. struct seid_rej {
  156. uint8_t error;
  157. } __attribute__ ((packed));
  158. struct conf_rej {
  159. uint8_t category;
  160. uint8_t error;
  161. } __attribute__ ((packed));
  162. #if __BYTE_ORDER == __LITTLE_ENDIAN
  163. struct seid_req {
  164. uint8_t rfa0:2;
  165. uint8_t acp_seid:6;
  166. } __attribute__ ((packed));
  167. struct setconf_req {
  168. uint8_t rfa0:2;
  169. uint8_t acp_seid:6;
  170. uint8_t rfa1:2;
  171. uint8_t int_seid:6;
  172. uint8_t caps[0];
  173. } __attribute__ ((packed));
  174. struct stream_rej {
  175. uint8_t rfa0:2;
  176. uint8_t acp_seid:6;
  177. uint8_t error;
  178. } __attribute__ ((packed));
  179. struct reconf_req {
  180. uint8_t rfa0:2;
  181. uint8_t acp_seid:6;
  182. uint8_t serv_cap;
  183. uint8_t serv_cap_len;
  184. uint8_t caps[0];
  185. } __attribute__ ((packed));
  186. struct delay_req {
  187. uint8_t rfa0:2;
  188. uint8_t acp_seid:6;
  189. uint16_t delay;
  190. } __attribute__ ((packed));
  191. #elif __BYTE_ORDER == __BIG_ENDIAN
  192. struct seid_req {
  193. uint8_t acp_seid:6;
  194. uint8_t rfa0:2;
  195. } __attribute__ ((packed));
  196. struct setconf_req {
  197. uint8_t acp_seid:6;
  198. uint8_t rfa0:2;
  199. uint8_t int_seid:6;
  200. uint8_t rfa1:2;
  201. uint8_t caps[0];
  202. } __attribute__ ((packed));
  203. struct stream_rej {
  204. uint8_t acp_seid:6;
  205. uint8_t rfa0:2;
  206. uint8_t error;
  207. } __attribute__ ((packed));
  208. struct reconf_req {
  209. uint8_t acp_seid:6;
  210. uint8_t rfa0:2;
  211. uint8_t serv_cap;
  212. uint8_t serv_cap_len;
  213. uint8_t caps[0];
  214. } __attribute__ ((packed));
  215. struct delay_req {
  216. uint8_t acp_seid:6;
  217. uint8_t rfa0:2;
  218. uint16_t delay;
  219. } __attribute__ ((packed));
  220. #else
  221. #error "Unknown byte order"
  222. #endif
  223. struct in_buf {
  224. gboolean active;
  225. int no_of_packets;
  226. uint8_t transaction;
  227. uint8_t message_type;
  228. uint8_t signal_id;
  229. uint8_t buf[1024];
  230. uint8_t data_size;
  231. };
  232. struct pending_req {
  233. uint8_t transaction;
  234. uint8_t signal_id;
  235. void *data;
  236. size_t data_size;
  237. struct avdtp_stream *stream; /* Set if the request targeted a stream */
  238. guint timeout;
  239. gboolean collided;
  240. };
  241. struct avdtp_remote_sep {
  242. uint8_t seid;
  243. uint8_t type;
  244. uint8_t media_type;
  245. struct avdtp_service_capability *codec;
  246. gboolean delay_reporting;
  247. GSList *caps; /* of type struct avdtp_service_capability */
  248. struct avdtp_stream *stream;
  249. };
  250. struct avdtp_local_sep {
  251. avdtp_state_t state;
  252. struct avdtp_stream *stream;
  253. struct seid_info info;
  254. uint8_t codec;
  255. uint32_t vndcodec_vendor;
  256. uint16_t vndcodec_codec;
  257. gboolean delay_reporting;
  258. GSList *caps;
  259. struct avdtp_sep_ind *ind;
  260. struct avdtp_sep_cfm *cfm;
  261. void *user_data;
  262. };
  263. struct stream_callback {
  264. avdtp_stream_state_cb cb;
  265. void *user_data;
  266. unsigned int id;
  267. };
  268. struct discover_callback {
  269. unsigned int id;
  270. avdtp_discover_cb_t cb;
  271. void *user_data;
  272. };
  273. struct disconnect_callback {
  274. unsigned int id;
  275. avdtp_disconnect_cb_t cb;
  276. void *user_data;
  277. };
  278. struct avdtp_stream {
  279. GIOChannel *io;
  280. uint16_t imtu;
  281. uint16_t omtu;
  282. struct avdtp *session;
  283. struct avdtp_local_sep *lsep;
  284. uint8_t rseid;
  285. GSList *caps;
  286. GSList *callbacks;
  287. struct avdtp_service_capability *codec;
  288. guint io_id; /* Transport GSource ID */
  289. guint timer; /* Waiting for other side to close or open
  290. * the transport channel */
  291. gboolean open_acp; /* If we are in ACT role for Open */
  292. gboolean close_int; /* If we are in INT role for Close */
  293. gboolean abort_int; /* If we are in INT role for Abort */
  294. guint start_timer; /* Wait START command timer */
  295. gboolean delay_reporting;
  296. uint16_t delay; /* AVDTP 1.3 Delay Reporting feature */
  297. gboolean starting; /* only valid while sep state == OPEN */
  298. };
  299. /* Structure describing an AVDTP connection between two devices */
  300. struct avdtp {
  301. unsigned int ref;
  302. uint16_t version;
  303. guint auth_id;
  304. GIOChannel *io;
  305. guint io_id;
  306. GSList *seps; /* Elements of type struct avdtp_remote_sep * */
  307. struct queue *lseps; /* Elements of type struct avdtp_local_sep * */
  308. GSList *streams; /* Elements of type struct avdtp_stream * */
  309. GSList *req_queue; /* Elements of type struct pending_req * */
  310. GSList *prio_queue; /* Same as req_queue but is processed before it */
  311. struct avdtp_stream *pending_open;
  312. uint16_t imtu;
  313. uint16_t omtu;
  314. struct in_buf in;
  315. char *buf;
  316. struct discover_callback *discover;
  317. struct pending_req *req;
  318. GSList *disconnect;
  319. bool shutdown;
  320. };
  321. static int send_request(struct avdtp *session, gboolean priority,
  322. struct avdtp_stream *stream, uint8_t signal_id,
  323. void *buffer, size_t size);
  324. static gboolean avdtp_parse_resp(struct avdtp *session,
  325. struct avdtp_stream *stream,
  326. uint8_t transaction, uint8_t signal_id,
  327. void *buf, int size);
  328. static gboolean avdtp_parse_rej(struct avdtp *session,
  329. struct avdtp_stream *stream,
  330. uint8_t transaction, uint8_t signal_id,
  331. void *buf, int size);
  332. static int process_queue(struct avdtp *session);
  333. static void avdtp_sep_set_state(struct avdtp *session,
  334. struct avdtp_local_sep *sep,
  335. avdtp_state_t state);
  336. static const char *avdtp_statestr(avdtp_state_t state)
  337. {
  338. switch (state) {
  339. case AVDTP_STATE_IDLE:
  340. return "IDLE";
  341. case AVDTP_STATE_CONFIGURED:
  342. return "CONFIGURED";
  343. case AVDTP_STATE_OPEN:
  344. return "OPEN";
  345. case AVDTP_STATE_STREAMING:
  346. return "STREAMING";
  347. case AVDTP_STATE_CLOSING:
  348. return "CLOSING";
  349. case AVDTP_STATE_ABORTING:
  350. return "ABORTING";
  351. default:
  352. return "<unknown state>";
  353. }
  354. }
  355. static gboolean try_send(int sk, void *data, size_t len)
  356. {
  357. int err;
  358. do {
  359. err = send(sk, data, len, 0);
  360. } while (err < 0 && errno == EINTR);
  361. if (err < 0) {
  362. error("send: %s (%d)", strerror(errno), errno);
  363. return FALSE;
  364. } else if ((size_t) err != len) {
  365. error("try_send: complete buffer not sent (%d/%zu bytes)",
  366. err, len);
  367. return FALSE;
  368. }
  369. return TRUE;
  370. }
  371. static gboolean avdtp_send(struct avdtp *session, uint8_t transaction,
  372. uint8_t message_type, uint8_t signal_id,
  373. void *data, size_t len)
  374. {
  375. unsigned int cont_fragments, sent;
  376. struct avdtp_start_header start;
  377. struct avdtp_continue_header cont;
  378. int sock;
  379. if (session->io == NULL) {
  380. error("avdtp_send: session is closed");
  381. return FALSE;
  382. }
  383. sock = g_io_channel_unix_get_fd(session->io);
  384. /* Single packet - no fragmentation */
  385. if (sizeof(struct avdtp_single_header) + len <= session->omtu) {
  386. struct avdtp_single_header single;
  387. memset(&single, 0, sizeof(single));
  388. single.transaction = transaction;
  389. single.packet_type = AVDTP_PKT_TYPE_SINGLE;
  390. single.message_type = message_type;
  391. single.signal_id = signal_id;
  392. memcpy(session->buf, &single, sizeof(single));
  393. memcpy(session->buf + sizeof(single), data, len);
  394. return try_send(sock, session->buf, sizeof(single) + len);
  395. }
  396. /* Check if there is enough space to start packet */
  397. if (session->omtu < sizeof(start)) {
  398. error("No enough space to fragment packet");
  399. return FALSE;
  400. }
  401. /* Count the number of needed fragments */
  402. cont_fragments = (len - (session->omtu - sizeof(start))) /
  403. (session->omtu - sizeof(cont)) + 1;
  404. DBG("%zu bytes split into %d fragments", len, cont_fragments + 1);
  405. /* Send the start packet */
  406. memset(&start, 0, sizeof(start));
  407. start.transaction = transaction;
  408. start.packet_type = AVDTP_PKT_TYPE_START;
  409. start.message_type = message_type;
  410. start.no_of_packets = cont_fragments + 1;
  411. start.signal_id = signal_id;
  412. memcpy(session->buf, &start, sizeof(start));
  413. memcpy(session->buf + sizeof(start), data,
  414. session->omtu - sizeof(start));
  415. if (!try_send(sock, session->buf, session->omtu))
  416. return FALSE;
  417. DBG("first packet with %zu bytes sent", session->omtu - sizeof(start));
  418. sent = session->omtu - sizeof(start);
  419. /* Send the continue fragments and the end packet */
  420. while (sent < len) {
  421. int left, to_copy;
  422. left = len - sent;
  423. if (left + sizeof(cont) > session->omtu) {
  424. cont.packet_type = AVDTP_PKT_TYPE_CONTINUE;
  425. to_copy = session->omtu - sizeof(cont);
  426. DBG("sending continue with %d bytes", to_copy);
  427. } else {
  428. cont.packet_type = AVDTP_PKT_TYPE_END;
  429. to_copy = left;
  430. DBG("sending end with %d bytes", to_copy);
  431. }
  432. cont.transaction = transaction;
  433. cont.message_type = message_type;
  434. memcpy(session->buf, &cont, sizeof(cont));
  435. memcpy(session->buf + sizeof(cont), data + sent, to_copy);
  436. if (!try_send(sock, session->buf, to_copy + sizeof(cont)))
  437. return FALSE;
  438. sent += to_copy;
  439. }
  440. return TRUE;
  441. }
  442. static void pending_req_free(void *data)
  443. {
  444. struct pending_req *req = data;
  445. if (req->timeout)
  446. g_source_remove(req->timeout);
  447. g_free(req->data);
  448. g_free(req);
  449. }
  450. static void close_stream(struct avdtp_stream *stream)
  451. {
  452. int sock;
  453. if (stream->io == NULL)
  454. return;
  455. sock = g_io_channel_unix_get_fd(stream->io);
  456. shutdown(sock, SHUT_RDWR);
  457. g_io_channel_shutdown(stream->io, FALSE, NULL);
  458. g_io_channel_unref(stream->io);
  459. stream->io = NULL;
  460. }
  461. static gboolean stream_close_timeout(gpointer user_data)
  462. {
  463. struct avdtp_stream *stream = user_data;
  464. DBG("Timed out waiting for peer to close the transport channel");
  465. stream->timer = 0;
  466. close_stream(stream);
  467. return FALSE;
  468. }
  469. static gboolean stream_open_timeout(gpointer user_data)
  470. {
  471. struct avdtp_stream *stream = user_data;
  472. DBG("Timed out waiting for peer to open the transport channel");
  473. stream->timer = 0;
  474. stream->session->pending_open = NULL;
  475. avdtp_abort(stream->session, stream);
  476. return FALSE;
  477. }
  478. void avdtp_error_init(struct avdtp_error *err, uint8_t category, int id)
  479. {
  480. err->category = category;
  481. if (category == AVDTP_ERRNO)
  482. err->err.posix_errno = id;
  483. else
  484. err->err.error_code = id;
  485. }
  486. uint8_t avdtp_error_category(struct avdtp_error *err)
  487. {
  488. return err->category;
  489. }
  490. int avdtp_error_error_code(struct avdtp_error *err)
  491. {
  492. assert(err->category != AVDTP_ERRNO);
  493. return err->err.error_code;
  494. }
  495. int avdtp_error_posix_errno(struct avdtp_error *err)
  496. {
  497. assert(err->category == AVDTP_ERRNO);
  498. return err->err.posix_errno;
  499. }
  500. static struct avdtp_stream *find_stream_by_rseid(struct avdtp *session,
  501. uint8_t rseid)
  502. {
  503. GSList *l;
  504. for (l = session->streams; l != NULL; l = g_slist_next(l)) {
  505. struct avdtp_stream *stream = l->data;
  506. if (stream->rseid == rseid)
  507. return stream;
  508. }
  509. return NULL;
  510. }
  511. static struct avdtp_remote_sep *find_remote_sep(GSList *seps, uint8_t seid)
  512. {
  513. GSList *l;
  514. for (l = seps; l != NULL; l = g_slist_next(l)) {
  515. struct avdtp_remote_sep *sep = l->data;
  516. if (sep->seid == seid)
  517. return sep;
  518. }
  519. return NULL;
  520. }
  521. static void stream_free(void *data)
  522. {
  523. struct avdtp_stream *stream = data;
  524. struct avdtp_remote_sep *rsep;
  525. stream->lsep->info.inuse = 0;
  526. stream->lsep->stream = NULL;
  527. rsep = find_remote_sep(stream->session->seps, stream->rseid);
  528. if (rsep)
  529. rsep->stream = NULL;
  530. if (stream->timer)
  531. g_source_remove(stream->timer);
  532. if (stream->start_timer > 0)
  533. g_source_remove(stream->start_timer);
  534. if (stream->io)
  535. close_stream(stream);
  536. if (stream->io_id)
  537. g_source_remove(stream->io_id);
  538. g_slist_free_full(stream->callbacks, g_free);
  539. g_slist_free_full(stream->caps, g_free);
  540. g_free(stream);
  541. }
  542. static gboolean transport_cb(GIOChannel *chan, GIOCondition cond,
  543. gpointer data)
  544. {
  545. struct avdtp_stream *stream = data;
  546. struct avdtp_local_sep *sep = stream->lsep;
  547. if (stream->close_int && sep->cfm && sep->cfm->close)
  548. sep->cfm->close(stream->session, sep, stream, NULL,
  549. sep->user_data);
  550. if (!(cond & G_IO_NVAL))
  551. close_stream(stream);
  552. stream->io_id = 0;
  553. if (!stream->abort_int)
  554. avdtp_sep_set_state(stream->session, sep, AVDTP_STATE_IDLE);
  555. return FALSE;
  556. }
  557. static void handle_transport_connect(struct avdtp *session, GIOChannel *io,
  558. uint16_t imtu, uint16_t omtu)
  559. {
  560. struct avdtp_stream *stream = session->pending_open;
  561. struct avdtp_local_sep *sep = stream->lsep;
  562. session->pending_open = NULL;
  563. if (stream->timer) {
  564. g_source_remove(stream->timer);
  565. stream->timer = 0;
  566. }
  567. if (io == NULL)
  568. return;
  569. if (stream->io == NULL)
  570. stream->io = g_io_channel_ref(io);
  571. stream->omtu = omtu;
  572. stream->imtu = imtu;
  573. avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN);
  574. stream->io_id = g_io_add_watch(io, G_IO_ERR | G_IO_HUP | G_IO_NVAL,
  575. (GIOFunc) transport_cb, stream);
  576. }
  577. static int pending_req_cmp(gconstpointer a, gconstpointer b)
  578. {
  579. const struct pending_req *req = a;
  580. const struct avdtp_stream *stream = b;
  581. if (req->stream == stream)
  582. return 0;
  583. return -1;
  584. }
  585. static void cleanup_queue(struct avdtp *session, struct avdtp_stream *stream)
  586. {
  587. GSList *l;
  588. struct pending_req *req;
  589. while ((l = g_slist_find_custom(session->prio_queue, stream,
  590. pending_req_cmp))) {
  591. req = l->data;
  592. pending_req_free(req);
  593. session->prio_queue = g_slist_remove(session->prio_queue, req);
  594. }
  595. while ((l = g_slist_find_custom(session->req_queue, stream,
  596. pending_req_cmp))) {
  597. req = l->data;
  598. pending_req_free(req);
  599. session->req_queue = g_slist_remove(session->req_queue, req);
  600. }
  601. }
  602. static void handle_unanswered_req(struct avdtp *session,
  603. struct avdtp_stream *stream)
  604. {
  605. struct pending_req *req;
  606. struct avdtp_local_sep *lsep;
  607. struct avdtp_error err;
  608. if (!session->req->timeout)
  609. /* Request is in process */
  610. return;
  611. if (session->req->signal_id == AVDTP_ABORT) {
  612. /* Avoid freeing the Abort request here */
  613. DBG("handle_unanswered_req: Abort req, returning");
  614. session->req->stream = NULL;
  615. return;
  616. }
  617. req = session->req;
  618. session->req = NULL;
  619. avdtp_error_init(&err, AVDTP_ERRNO, EIO);
  620. lsep = stream->lsep;
  621. switch (req->signal_id) {
  622. case AVDTP_RECONFIGURE:
  623. error("No reply to Reconfigure request");
  624. if (lsep && lsep->cfm && lsep->cfm->reconfigure)
  625. lsep->cfm->reconfigure(session, lsep, stream, &err,
  626. lsep->user_data);
  627. break;
  628. case AVDTP_OPEN:
  629. error("No reply to Open request");
  630. if (lsep && lsep->cfm && lsep->cfm->open)
  631. lsep->cfm->open(session, lsep, stream, &err,
  632. lsep->user_data);
  633. break;
  634. case AVDTP_START:
  635. error("No reply to Start request");
  636. if (lsep && lsep->cfm && lsep->cfm->start)
  637. lsep->cfm->start(session, lsep, stream, &err,
  638. lsep->user_data);
  639. break;
  640. case AVDTP_SUSPEND:
  641. error("No reply to Suspend request");
  642. if (lsep && lsep->cfm && lsep->cfm->suspend)
  643. lsep->cfm->suspend(session, lsep, stream, &err,
  644. lsep->user_data);
  645. break;
  646. case AVDTP_CLOSE:
  647. error("No reply to Close request");
  648. if (lsep && lsep->cfm && lsep->cfm->close)
  649. lsep->cfm->close(session, lsep, stream, &err,
  650. lsep->user_data);
  651. break;
  652. case AVDTP_SET_CONFIGURATION:
  653. error("No reply to SetConfiguration request");
  654. if (lsep && lsep->cfm && lsep->cfm->set_configuration)
  655. lsep->cfm->set_configuration(session, lsep, stream,
  656. &err, lsep->user_data);
  657. }
  658. pending_req_free(req);
  659. }
  660. static void avdtp_sep_set_state(struct avdtp *session,
  661. struct avdtp_local_sep *sep,
  662. avdtp_state_t state)
  663. {
  664. struct avdtp_stream *stream = sep->stream;
  665. avdtp_state_t old_state;
  666. struct avdtp_error err, *err_ptr = NULL;
  667. GSList *l;
  668. if (!stream) {
  669. error("Error changing sep state: stream not available");
  670. return;
  671. }
  672. if (sep->state == state) {
  673. avdtp_error_init(&err, AVDTP_ERRNO, EIO);
  674. DBG("stream state change failed: %s", avdtp_strerror(&err));
  675. err_ptr = &err;
  676. } else {
  677. err_ptr = NULL;
  678. DBG("stream state changed: %s -> %s",
  679. avdtp_statestr(sep->state),
  680. avdtp_statestr(state));
  681. }
  682. old_state = sep->state;
  683. sep->state = state;
  684. switch (state) {
  685. case AVDTP_STATE_CONFIGURED:
  686. if (sep->info.type == AVDTP_SEP_TYPE_SINK)
  687. avdtp_delay_report(session, stream, stream->delay);
  688. break;
  689. case AVDTP_STATE_OPEN:
  690. stream->starting = FALSE;
  691. break;
  692. case AVDTP_STATE_STREAMING:
  693. if (stream->start_timer) {
  694. g_source_remove(stream->start_timer);
  695. stream->start_timer = 0;
  696. }
  697. stream->open_acp = FALSE;
  698. break;
  699. case AVDTP_STATE_CLOSING:
  700. case AVDTP_STATE_ABORTING:
  701. if (stream->start_timer) {
  702. g_source_remove(stream->start_timer);
  703. stream->start_timer = 0;
  704. }
  705. break;
  706. case AVDTP_STATE_IDLE:
  707. if (stream->start_timer) {
  708. g_source_remove(stream->start_timer);
  709. stream->start_timer = 0;
  710. }
  711. if (session->pending_open == stream)
  712. handle_transport_connect(session, NULL, 0, 0);
  713. if (session->req && session->req->stream == stream)
  714. handle_unanswered_req(session, stream);
  715. /* Remove pending commands for this stream from the queue */
  716. cleanup_queue(session, stream);
  717. break;
  718. default:
  719. break;
  720. }
  721. l = stream->callbacks;
  722. while (l != NULL) {
  723. struct stream_callback *cb = l->data;
  724. l = g_slist_next(l);
  725. cb->cb(stream, old_state, state, err_ptr, cb->user_data);
  726. }
  727. if (state == AVDTP_STATE_IDLE &&
  728. g_slist_find(session->streams, stream)) {
  729. session->streams = g_slist_remove(session->streams, stream);
  730. stream_free(stream);
  731. }
  732. if (session->io && session->shutdown && session->streams == NULL) {
  733. int sock = g_io_channel_unix_get_fd(session->io);
  734. shutdown(sock, SHUT_RDWR);
  735. }
  736. }
  737. static void finalize_discovery(struct avdtp *session, int err)
  738. {
  739. struct discover_callback *discover = session->discover;
  740. struct avdtp_error avdtp_err;
  741. if (!discover)
  742. return;
  743. session->discover = NULL;
  744. avdtp_error_init(&avdtp_err, AVDTP_ERRNO, err);
  745. if (discover->id > 0)
  746. g_source_remove(discover->id);
  747. if (discover->cb)
  748. discover->cb(session, session->seps, err ? &avdtp_err : NULL,
  749. discover->user_data);
  750. g_free(discover);
  751. }
  752. static void release_stream(struct avdtp_stream *stream, struct avdtp *session)
  753. {
  754. struct avdtp_local_sep *sep = stream->lsep;
  755. if (sep->cfm && sep->cfm->abort &&
  756. (sep->state != AVDTP_STATE_ABORTING ||
  757. stream->abort_int))
  758. sep->cfm->abort(session, sep, stream, NULL, sep->user_data);
  759. avdtp_sep_set_state(session, sep, AVDTP_STATE_IDLE);
  760. }
  761. static void sep_free(gpointer data)
  762. {
  763. struct avdtp_remote_sep *sep = data;
  764. g_slist_free_full(sep->caps, g_free);
  765. g_free(sep);
  766. }
  767. static void avdtp_free(void *data)
  768. {
  769. struct avdtp *session = data;
  770. DBG("%p", session);
  771. g_slist_free_full(session->streams, stream_free);
  772. if (session->io) {
  773. g_io_channel_shutdown(session->io, FALSE, NULL);
  774. g_io_channel_unref(session->io);
  775. }
  776. if (session->io_id) {
  777. g_source_remove(session->io_id);
  778. session->io_id = 0;
  779. }
  780. if (session->req)
  781. pending_req_free(session->req);
  782. g_slist_free_full(session->req_queue, pending_req_free);
  783. g_slist_free_full(session->prio_queue, pending_req_free);
  784. g_slist_free_full(session->seps, sep_free);
  785. g_slist_free_full(session->disconnect, g_free);
  786. /* Free copy of the SEP list */
  787. session->lseps = NULL;
  788. g_free(session->buf);
  789. g_free(session);
  790. }
  791. static void process_disconnect(void *data)
  792. {
  793. struct disconnect_callback *callback = data;
  794. callback->cb(callback->user_data);
  795. g_free(callback);
  796. }
  797. static void connection_lost(struct avdtp *session, int err)
  798. {
  799. DBG("Disconnected: %s (%d)", strerror(err), err);
  800. g_slist_foreach(session->streams, (GFunc) release_stream, session);
  801. session->streams = NULL;
  802. avdtp_ref(session);
  803. finalize_discovery(session, err);
  804. g_slist_free_full(session->disconnect, process_disconnect);
  805. session->disconnect = NULL;
  806. avdtp_unref(session);
  807. }
  808. void avdtp_unref(struct avdtp *session)
  809. {
  810. if (!session)
  811. return;
  812. session->ref--;
  813. DBG("%p: ref=%d", session, session->ref);
  814. if (session->ref > 0)
  815. return;
  816. finalize_discovery(session, ECONNABORTED);
  817. avdtp_free(session);
  818. }
  819. struct avdtp *avdtp_ref(struct avdtp *session)
  820. {
  821. session->ref++;
  822. DBG("%p: ref=%d", session, session->ref);
  823. return session;
  824. }
  825. static bool match_by_seid(const void *data, const void *user_data)
  826. {
  827. const struct avdtp_local_sep *sep = data;
  828. uint8_t seid = PTR_TO_UINT(user_data);
  829. return sep->info.seid == seid;
  830. }
  831. static struct avdtp_local_sep *find_local_sep_by_seid(struct avdtp *session,
  832. uint8_t seid)
  833. {
  834. return queue_find(session->lseps, match_by_seid, INT_TO_PTR(seid));
  835. }
  836. struct avdtp_remote_sep *avdtp_find_remote_sep(struct avdtp *session,
  837. struct avdtp_local_sep *lsep)
  838. {
  839. GSList *l;
  840. if (lsep->info.inuse)
  841. return NULL;
  842. for (l = session->seps; l != NULL; l = g_slist_next(l)) {
  843. struct avdtp_remote_sep *sep = l->data;
  844. struct avdtp_service_capability *cap;
  845. struct avdtp_media_codec_capability *codec_data;
  846. /* Type must be different: source <-> sink */
  847. if (sep->type == lsep->info.type)
  848. continue;
  849. if (sep->media_type != lsep->info.media_type)
  850. continue;
  851. if (!sep->codec)
  852. continue;
  853. cap = sep->codec;
  854. codec_data = (void *) cap->data;
  855. if (codec_data->media_codec_type != lsep->codec)
  856. continue;
  857. /* FIXME: Add Vendor Specific Codec match to SEP callback */
  858. if (lsep->codec == A2DP_CODEC_VENDOR) {
  859. a2dp_vendor_codec_t *vndcodec =
  860. (void *) codec_data->data;
  861. if (A2DP_GET_VENDOR_ID(*vndcodec) !=
  862. lsep->vndcodec_vendor)
  863. continue;
  864. if (A2DP_GET_CODEC_ID(*vndcodec) !=
  865. lsep->vndcodec_codec)
  866. continue;
  867. }
  868. if (sep->stream == NULL)
  869. return sep;
  870. }
  871. return NULL;
  872. }
  873. static GSList *caps_to_list(uint8_t *data, int size,
  874. struct avdtp_service_capability **codec,
  875. gboolean *delay_reporting)
  876. {
  877. GSList *caps;
  878. int processed;
  879. if (delay_reporting)
  880. *delay_reporting = FALSE;
  881. for (processed = 0, caps = NULL; processed + 2 <= size;) {
  882. struct avdtp_service_capability *cap;
  883. uint8_t length, category;
  884. category = data[0];
  885. length = data[1];
  886. if (processed + 2 + length > size) {
  887. error("Invalid capability data in getcap resp");
  888. break;
  889. }
  890. cap = g_malloc(sizeof(struct avdtp_service_capability) +
  891. length);
  892. memcpy(cap, data, 2 + length);
  893. processed += 2 + length;
  894. data += 2 + length;
  895. caps = g_slist_append(caps, cap);
  896. if (category == AVDTP_MEDIA_CODEC &&
  897. length >=
  898. sizeof(struct avdtp_media_codec_capability))
  899. *codec = cap;
  900. else if (category == AVDTP_DELAY_REPORTING && delay_reporting)
  901. *delay_reporting = TRUE;
  902. }
  903. return caps;
  904. }
  905. static gboolean avdtp_unknown_cmd(struct avdtp *session, uint8_t transaction,
  906. uint8_t signal_id)
  907. {
  908. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_GEN_REJECT,
  909. signal_id, NULL, 0);
  910. }
  911. static void copy_seps(void *data, void *user_data)
  912. {
  913. struct avdtp_local_sep *sep = data;
  914. struct seid_info **p = user_data;
  915. memcpy(*p, &sep->info, sizeof(struct seid_info));
  916. *p = *p + 1;
  917. }
  918. static gboolean avdtp_discover_cmd(struct avdtp *session, uint8_t transaction,
  919. void *buf, int size)
  920. {
  921. unsigned int rsp_size, sep_count;
  922. struct seid_info *seps, *p;
  923. gboolean ret;
  924. sep_count = queue_length(session->lseps);
  925. if (sep_count == 0) {
  926. uint8_t err = AVDTP_NOT_SUPPORTED_COMMAND;
  927. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
  928. AVDTP_DISCOVER, &err, sizeof(err));
  929. }
  930. rsp_size = sep_count * sizeof(struct seid_info);
  931. seps = g_new0(struct seid_info, sep_count);
  932. p = seps;
  933. queue_foreach(session->lseps, copy_seps, &p);
  934. ret = avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
  935. AVDTP_DISCOVER, seps, rsp_size);
  936. g_free(seps);
  937. return ret;
  938. }
  939. static gboolean avdtp_getcap_cmd(struct avdtp *session, uint8_t transaction,
  940. struct seid_req *req, unsigned int size,
  941. gboolean get_all)
  942. {
  943. GSList *l, *caps;
  944. struct avdtp_local_sep *sep = NULL;
  945. unsigned int rsp_size;
  946. uint8_t err, buf[1024], *ptr = buf;
  947. uint8_t cmd;
  948. cmd = get_all ? AVDTP_GET_ALL_CAPABILITIES : AVDTP_GET_CAPABILITIES;
  949. if (size < sizeof(struct seid_req)) {
  950. err = AVDTP_BAD_LENGTH;
  951. goto failed;
  952. }
  953. sep = find_local_sep_by_seid(session, req->acp_seid);
  954. if (!sep) {
  955. err = AVDTP_BAD_ACP_SEID;
  956. goto failed;
  957. }
  958. if (!sep->ind->get_capability(session, sep, &caps, &err,
  959. sep->user_data))
  960. goto failed;
  961. for (l = caps, rsp_size = 0; l != NULL; l = g_slist_next(l)) {
  962. struct avdtp_service_capability *cap = l->data;
  963. if (rsp_size + cap->length + 2 > sizeof(buf))
  964. break;
  965. memcpy(ptr, cap, cap->length + 2);
  966. rsp_size += cap->length + 2;
  967. ptr += cap->length + 2;
  968. g_free(cap);
  969. }
  970. if (get_all && sep->delay_reporting) {
  971. ptr[0] = AVDTP_DELAY_REPORTING;
  972. ptr[1] = 0x00;
  973. rsp_size += 2;
  974. }
  975. g_slist_free(caps);
  976. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT, cmd,
  977. buf, rsp_size);
  978. failed:
  979. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT, cmd,
  980. &err, sizeof(err));
  981. }
  982. static void setconf_cb(struct avdtp *session, struct avdtp_stream *stream,
  983. struct avdtp_error *err)
  984. {
  985. struct conf_rej rej;
  986. struct avdtp_local_sep *sep;
  987. if (err != NULL) {
  988. rej.error = AVDTP_UNSUPPORTED_CONFIGURATION;
  989. rej.category = err->err.error_code;
  990. avdtp_send(session, session->in.transaction,
  991. AVDTP_MSG_TYPE_REJECT, AVDTP_SET_CONFIGURATION,
  992. &rej, sizeof(rej));
  993. return;
  994. }
  995. if (!avdtp_send(session, session->in.transaction, AVDTP_MSG_TYPE_ACCEPT,
  996. AVDTP_SET_CONFIGURATION, NULL, 0)) {
  997. stream_free(stream);
  998. return;
  999. }
  1000. sep = stream->lsep;
  1001. sep->stream = stream;
  1002. sep->info.inuse = 1;
  1003. session->streams = g_slist_append(session->streams, stream);
  1004. avdtp_sep_set_state(session, sep, AVDTP_STATE_CONFIGURED);
  1005. }
  1006. static gboolean avdtp_setconf_cmd(struct avdtp *session, uint8_t transaction,
  1007. struct setconf_req *req, unsigned int size)
  1008. {
  1009. struct conf_rej rej;
  1010. struct avdtp_local_sep *sep;
  1011. struct avdtp_stream *stream;
  1012. uint8_t err, category = 0x00;
  1013. GSList *l;
  1014. if (size < sizeof(struct setconf_req)) {
  1015. error("Too short getcap request");
  1016. return FALSE;
  1017. }
  1018. sep = find_local_sep_by_seid(session, req->acp_seid);
  1019. if (!sep) {
  1020. err = AVDTP_BAD_ACP_SEID;
  1021. goto failed;
  1022. }
  1023. if (sep->stream) {
  1024. err = AVDTP_SEP_IN_USE;
  1025. goto failed;
  1026. }
  1027. stream = g_new0(struct avdtp_stream, 1);
  1028. stream->session = session;
  1029. stream->lsep = sep;
  1030. stream->rseid = req->int_seid;
  1031. stream->caps = caps_to_list(req->caps,
  1032. size - sizeof(struct setconf_req),
  1033. &stream->codec,
  1034. &stream->delay_reporting);
  1035. /*
  1036. * Verify that the Media Transport capability's length = 0.
  1037. * Reject otherwise
  1038. */
  1039. for (l = stream->caps; l != NULL; l = g_slist_next(l)) {
  1040. struct avdtp_service_capability *cap = l->data;
  1041. if (cap->category == AVDTP_MEDIA_TRANSPORT &&
  1042. cap->length != 0) {
  1043. err = AVDTP_BAD_MEDIA_TRANSPORT_FORMAT;
  1044. goto failed_stream;
  1045. }
  1046. }
  1047. if (stream->delay_reporting && session->version < 0x0103)
  1048. session->version = 0x0103;
  1049. if (sep->ind && sep->ind->set_configuration) {
  1050. if (!sep->ind->set_configuration(session, sep, stream,
  1051. stream->caps,
  1052. setconf_cb,
  1053. sep->user_data)) {
  1054. err = AVDTP_UNSUPPORTED_CONFIGURATION;
  1055. category = 0x00;
  1056. goto failed_stream;
  1057. }
  1058. } else {
  1059. if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
  1060. AVDTP_SET_CONFIGURATION, NULL, 0)) {
  1061. stream_free(stream);
  1062. return FALSE;
  1063. }
  1064. sep->stream = stream;
  1065. sep->info.inuse = 1;
  1066. session->streams = g_slist_append(session->streams, stream);
  1067. avdtp_sep_set_state(session, sep, AVDTP_STATE_CONFIGURED);
  1068. }
  1069. return TRUE;
  1070. failed_stream:
  1071. stream_free(stream);
  1072. failed:
  1073. rej.error = err;
  1074. rej.category = category;
  1075. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
  1076. AVDTP_SET_CONFIGURATION, &rej, sizeof(rej));
  1077. }
  1078. static gboolean avdtp_getconf_cmd(struct avdtp *session, uint8_t transaction,
  1079. struct seid_req *req, int size)
  1080. {
  1081. GSList *l;
  1082. struct avdtp_local_sep *sep = NULL;
  1083. int rsp_size;
  1084. uint8_t err;
  1085. uint8_t buf[1024];
  1086. uint8_t *ptr = buf;
  1087. if (size < (int) sizeof(struct seid_req)) {
  1088. error("Too short getconf request");
  1089. return FALSE;
  1090. }
  1091. memset(buf, 0, sizeof(buf));
  1092. sep = find_local_sep_by_seid(session, req->acp_seid);
  1093. if (!sep) {
  1094. err = AVDTP_BAD_ACP_SEID;
  1095. goto failed;
  1096. }
  1097. if (!sep->stream || !sep->stream->caps) {
  1098. err = AVDTP_UNSUPPORTED_CONFIGURATION;
  1099. goto failed;
  1100. }
  1101. for (l = sep->stream->caps, rsp_size = 0; l; l = g_slist_next(l)) {
  1102. struct avdtp_service_capability *cap = l->data;
  1103. if (rsp_size + cap->length + 2 > (int) sizeof(buf))
  1104. break;
  1105. memcpy(ptr, cap, cap->length + 2);
  1106. rsp_size += cap->length + 2;
  1107. ptr += cap->length + 2;
  1108. }
  1109. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
  1110. AVDTP_GET_CONFIGURATION, buf, rsp_size);
  1111. failed:
  1112. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
  1113. AVDTP_GET_CONFIGURATION, &err, sizeof(err));
  1114. }
  1115. static gboolean avdtp_reconf_cmd(struct avdtp *session, uint8_t transaction,
  1116. struct seid_req *req, int size)
  1117. {
  1118. struct conf_rej rej;
  1119. rej.error = AVDTP_NOT_SUPPORTED_COMMAND;
  1120. rej.category = 0x00;
  1121. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
  1122. AVDTP_RECONFIGURE, &rej, sizeof(rej));
  1123. }
  1124. static void check_seid_collision(struct pending_req *req, uint8_t id)
  1125. {
  1126. struct seid_req *seid = req->data;
  1127. if (seid->acp_seid == id)
  1128. req->collided = TRUE;
  1129. }
  1130. static void check_start_collision(struct pending_req *req, uint8_t id)
  1131. {
  1132. struct start_req *start = req->data;
  1133. struct seid *seid = &start->first_seid;
  1134. int count = 1 + req->data_size - sizeof(struct start_req);
  1135. int i;
  1136. for (i = 0; i < count; i++, seid++) {
  1137. if (seid->seid == id) {
  1138. req->collided = TRUE;
  1139. return;
  1140. }
  1141. }
  1142. }
  1143. static void check_suspend_collision(struct pending_req *req, uint8_t id)
  1144. {
  1145. struct suspend_req *suspend = req->data;
  1146. struct seid *seid = &suspend->first_seid;
  1147. int count = 1 + req->data_size - sizeof(struct suspend_req);
  1148. int i;
  1149. for (i = 0; i < count; i++, seid++) {
  1150. if (seid->seid == id) {
  1151. req->collided = TRUE;
  1152. return;
  1153. }
  1154. }
  1155. }
  1156. static void avdtp_check_collision(struct avdtp *session, uint8_t cmd,
  1157. struct avdtp_stream *stream)
  1158. {
  1159. struct pending_req *req = session->req;
  1160. if (req == NULL || (req->signal_id != cmd && cmd != AVDTP_ABORT))
  1161. return;
  1162. if (cmd == AVDTP_ABORT)
  1163. cmd = req->signal_id;
  1164. switch (cmd) {
  1165. case AVDTP_OPEN:
  1166. case AVDTP_CLOSE:
  1167. check_seid_collision(req, stream->rseid);
  1168. break;
  1169. case AVDTP_START:
  1170. check_start_collision(req, stream->rseid);
  1171. break;
  1172. case AVDTP_SUSPEND:
  1173. check_suspend_collision(req, stream->rseid);
  1174. break;
  1175. }
  1176. }
  1177. static gboolean avdtp_open_cmd(struct avdtp *session, uint8_t transaction,
  1178. struct seid_req *req, unsigned int size)
  1179. {
  1180. struct avdtp_local_sep *sep;
  1181. struct avdtp_stream *stream;
  1182. uint8_t err;
  1183. if (size < sizeof(struct seid_req)) {
  1184. error("Too short abort request");
  1185. return FALSE;
  1186. }
  1187. sep = find_local_sep_by_seid(session, req->acp_seid);
  1188. if (!sep) {
  1189. err = AVDTP_BAD_ACP_SEID;
  1190. goto failed;
  1191. }
  1192. if (sep->state != AVDTP_STATE_CONFIGURED) {
  1193. err = AVDTP_BAD_STATE;
  1194. goto failed;
  1195. }
  1196. stream = sep->stream;
  1197. if (sep->ind && sep->ind->open) {
  1198. if (!sep->ind->open(session, sep, stream, &err,
  1199. sep->user_data))
  1200. goto failed;
  1201. }
  1202. avdtp_check_collision(session, AVDTP_OPEN, stream);
  1203. if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
  1204. AVDTP_OPEN, NULL, 0))
  1205. return FALSE;
  1206. stream->open_acp = TRUE;
  1207. session->pending_open = stream;
  1208. stream->timer = g_timeout_add_seconds(REQ_TIMEOUT,
  1209. stream_open_timeout,
  1210. stream);
  1211. return TRUE;
  1212. failed:
  1213. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
  1214. AVDTP_OPEN, &err, sizeof(err));
  1215. }
  1216. static gboolean avdtp_start_cmd(struct avdtp *session, uint8_t transaction,
  1217. struct start_req *req, unsigned int size)
  1218. {
  1219. struct avdtp_local_sep *sep;
  1220. struct avdtp_stream *stream;
  1221. struct stream_rej rej;
  1222. struct seid *seid;
  1223. uint8_t err, failed_seid;
  1224. int seid_count, i;
  1225. if (size < sizeof(struct start_req)) {
  1226. error("Too short start request");
  1227. return FALSE;
  1228. }
  1229. seid_count = 1 + size - sizeof(struct start_req);
  1230. seid = &req->first_seid;
  1231. for (i = 0; i < seid_count; i++, seid++) {
  1232. failed_seid = seid->seid;
  1233. sep = find_local_sep_by_seid(session, seid->seid);
  1234. if (!sep || !sep->stream) {
  1235. err = AVDTP_BAD_ACP_SEID;
  1236. goto failed;
  1237. }
  1238. stream = sep->stream;
  1239. /* Also reject start cmd if state is not open */
  1240. if (sep->state != AVDTP_STATE_OPEN) {
  1241. err = AVDTP_BAD_STATE;
  1242. goto failed;
  1243. }
  1244. stream->starting = TRUE;
  1245. if (sep->ind && sep->ind->start) {
  1246. if (!sep->ind->start(session, sep, stream, &err,
  1247. sep->user_data))
  1248. goto failed;
  1249. }
  1250. avdtp_check_collision(session, AVDTP_START, stream);
  1251. avdtp_sep_set_state(session, sep, AVDTP_STATE_STREAMING);
  1252. }
  1253. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
  1254. AVDTP_START, NULL, 0);
  1255. failed:
  1256. DBG("Rejecting (%d)", err);
  1257. memset(&rej, 0, sizeof(rej));
  1258. rej.acp_seid = failed_seid;
  1259. rej.error = err;
  1260. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
  1261. AVDTP_START, &rej, sizeof(rej));
  1262. }
  1263. static gboolean avdtp_close_cmd(struct avdtp *session, uint8_t transaction,
  1264. struct seid_req *req, unsigned int size)
  1265. {
  1266. struct avdtp_local_sep *sep;
  1267. struct avdtp_stream *stream;
  1268. uint8_t err;
  1269. if (size < sizeof(struct seid_req)) {
  1270. error("Too short close request");
  1271. return FALSE;
  1272. }
  1273. sep = find_local_sep_by_seid(session, req->acp_seid);
  1274. if (!sep || !sep->stream) {
  1275. err = AVDTP_BAD_ACP_SEID;
  1276. goto failed;
  1277. }
  1278. if (sep->state != AVDTP_STATE_OPEN &&
  1279. sep->state != AVDTP_STATE_STREAMING) {
  1280. err = AVDTP_BAD_STATE;
  1281. goto failed;
  1282. }
  1283. stream = sep->stream;
  1284. if (sep->ind && sep->ind->close) {
  1285. if (!sep->ind->close(session, sep, stream, &err,
  1286. sep->user_data))
  1287. goto failed;
  1288. }
  1289. avdtp_check_collision(session, AVDTP_CLOSE, stream);
  1290. avdtp_sep_set_state(session, sep, AVDTP_STATE_CLOSING);
  1291. if (!avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
  1292. AVDTP_CLOSE, NULL, 0))
  1293. return FALSE;
  1294. stream->timer = g_timeout_add_seconds(REQ_TIMEOUT,
  1295. stream_close_timeout,
  1296. stream);
  1297. return TRUE;
  1298. failed:
  1299. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
  1300. AVDTP_CLOSE, &err, sizeof(err));
  1301. }
  1302. static gboolean avdtp_suspend_cmd(struct avdtp *session, uint8_t transaction,
  1303. struct suspend_req *req, unsigned int size)
  1304. {
  1305. struct avdtp_local_sep *sep;
  1306. struct avdtp_stream *stream;
  1307. struct stream_rej rej;
  1308. struct seid *seid;
  1309. uint8_t err, failed_seid;
  1310. int seid_count, i;
  1311. if (size < sizeof(struct suspend_req)) {
  1312. error("Too short suspend request");
  1313. return FALSE;
  1314. }
  1315. seid_count = 1 + size - sizeof(struct suspend_req);
  1316. seid = &req->first_seid;
  1317. for (i = 0; i < seid_count; i++, seid++) {
  1318. failed_seid = seid->seid;
  1319. sep = find_local_sep_by_seid(session, seid->seid);
  1320. if (!sep || !sep->stream) {
  1321. err = AVDTP_BAD_ACP_SEID;
  1322. goto failed;
  1323. }
  1324. stream = sep->stream;
  1325. if (sep->state != AVDTP_STATE_STREAMING) {
  1326. err = AVDTP_BAD_STATE;
  1327. goto failed;
  1328. }
  1329. if (sep->ind && sep->ind->suspend) {
  1330. if (!sep->ind->suspend(session, sep, stream, &err,
  1331. sep->user_data))
  1332. goto failed;
  1333. }
  1334. avdtp_check_collision(session, AVDTP_SUSPEND, stream);
  1335. avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN);
  1336. }
  1337. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
  1338. AVDTP_SUSPEND, NULL, 0);
  1339. failed:
  1340. memset(&rej, 0, sizeof(rej));
  1341. rej.acp_seid = failed_seid;
  1342. rej.error = err;
  1343. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
  1344. AVDTP_SUSPEND, &rej, sizeof(rej));
  1345. }
  1346. static gboolean avdtp_abort_cmd(struct avdtp *session, uint8_t transaction,
  1347. struct seid_req *req, unsigned int size)
  1348. {
  1349. struct avdtp_local_sep *sep;
  1350. uint8_t err;
  1351. gboolean ret;
  1352. if (size < sizeof(struct seid_req)) {
  1353. error("Too short abort request");
  1354. return FALSE;
  1355. }
  1356. sep = find_local_sep_by_seid(session, req->acp_seid);
  1357. if (!sep || !sep->stream)
  1358. return TRUE;
  1359. if (sep->ind && sep->ind->abort)
  1360. sep->ind->abort(session, sep, sep->stream, &err,
  1361. sep->user_data);
  1362. avdtp_check_collision(session, AVDTP_ABORT, sep->stream);
  1363. ret = avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
  1364. AVDTP_ABORT, NULL, 0);
  1365. if (ret)
  1366. avdtp_sep_set_state(session, sep, AVDTP_STATE_ABORTING);
  1367. return ret;
  1368. }
  1369. static gboolean avdtp_secctl_cmd(struct avdtp *session, uint8_t transaction,
  1370. struct seid_req *req, int size)
  1371. {
  1372. return avdtp_unknown_cmd(session, transaction, AVDTP_SECURITY_CONTROL);
  1373. }
  1374. static gboolean avdtp_delayreport_cmd(struct avdtp *session,
  1375. uint8_t transaction,
  1376. struct delay_req *req,
  1377. unsigned int size)
  1378. {
  1379. struct avdtp_local_sep *sep;
  1380. struct avdtp_stream *stream;
  1381. uint8_t err;
  1382. if (size < sizeof(struct delay_req)) {
  1383. error("Too short delay report request");
  1384. return FALSE;
  1385. }
  1386. sep = find_local_sep_by_seid(session, req->acp_seid);
  1387. if (!sep || !sep->stream) {
  1388. err = AVDTP_BAD_ACP_SEID;
  1389. goto failed;
  1390. }
  1391. stream = sep->stream;
  1392. switch (sep->state) {
  1393. case AVDTP_STATE_IDLE:
  1394. case AVDTP_STATE_ABORTING:
  1395. case AVDTP_STATE_CLOSING:
  1396. err = AVDTP_BAD_STATE;
  1397. goto failed;
  1398. case AVDTP_STATE_CONFIGURED:
  1399. case AVDTP_STATE_OPEN:
  1400. case AVDTP_STATE_STREAMING:
  1401. default:
  1402. break;
  1403. }
  1404. stream->delay = ntohs(req->delay);
  1405. if (sep->ind && sep->ind->delayreport) {
  1406. if (!sep->ind->delayreport(session, sep, stream->rseid,
  1407. stream->delay, &err,
  1408. sep->user_data))
  1409. goto failed;
  1410. }
  1411. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_ACCEPT,
  1412. AVDTP_DELAY_REPORT, NULL, 0);
  1413. failed:
  1414. return avdtp_send(session, transaction, AVDTP_MSG_TYPE_REJECT,
  1415. AVDTP_DELAY_REPORT, &err, sizeof(err));
  1416. }
  1417. static gboolean avdtp_parse_cmd(struct avdtp *session, uint8_t transaction,
  1418. uint8_t signal_id, void *buf, int size)
  1419. {
  1420. switch (signal_id) {
  1421. case AVDTP_DISCOVER:
  1422. DBG("Received DISCOVER_CMD");
  1423. return avdtp_discover_cmd(session, transaction, buf, size);
  1424. case AVDTP_GET_CAPABILITIES:
  1425. DBG("Received GET_CAPABILITIES_CMD");
  1426. return avdtp_getcap_cmd(session, transaction, buf, size,
  1427. FALSE);
  1428. case AVDTP_GET_ALL_CAPABILITIES:
  1429. DBG("Received GET_ALL_CAPABILITIES_CMD");
  1430. return avdtp_getcap_cmd(session, transaction, buf, size, TRUE);
  1431. case AVDTP_SET_CONFIGURATION:
  1432. DBG("Received SET_CONFIGURATION_CMD");
  1433. return avdtp_setconf_cmd(session, transaction, buf, size);
  1434. case AVDTP_GET_CONFIGURATION:
  1435. DBG("Received GET_CONFIGURATION_CMD");
  1436. return avdtp_getconf_cmd(session, transaction, buf, size);
  1437. case AVDTP_RECONFIGURE:
  1438. DBG("Received RECONFIGURE_CMD");
  1439. return avdtp_reconf_cmd(session, transaction, buf, size);
  1440. case AVDTP_OPEN:
  1441. DBG("Received OPEN_CMD");
  1442. return avdtp_open_cmd(session, transaction, buf, size);
  1443. case AVDTP_START:
  1444. DBG("Received START_CMD");
  1445. return avdtp_start_cmd(session, transaction, buf, size);
  1446. case AVDTP_CLOSE:
  1447. DBG("Received CLOSE_CMD");
  1448. return avdtp_close_cmd(session, transaction, buf, size);
  1449. case AVDTP_SUSPEND:
  1450. DBG("Received SUSPEND_CMD");
  1451. return avdtp_suspend_cmd(session, transaction, buf, size);
  1452. case AVDTP_ABORT:
  1453. DBG("Received ABORT_CMD");
  1454. return avdtp_abort_cmd(session, transaction, buf, size);
  1455. case AVDTP_SECURITY_CONTROL:
  1456. DBG("Received SECURITY_CONTROL_CMD");
  1457. return avdtp_secctl_cmd(session, transaction, buf, size);
  1458. case AVDTP_DELAY_REPORT:
  1459. DBG("Received DELAY_REPORT_CMD");
  1460. return avdtp_delayreport_cmd(session, transaction, buf, size);
  1461. default:
  1462. DBG("Received unknown request id %u", signal_id);
  1463. return avdtp_unknown_cmd(session, transaction, signal_id);
  1464. }
  1465. }
  1466. enum avdtp_parse_result { PARSE_ERROR, PARSE_FRAGMENT, PARSE_SUCCESS };
  1467. static enum avdtp_parse_result avdtp_parse_data(struct avdtp *session,
  1468. void *buf, size_t size)
  1469. {
  1470. struct avdtp_common_header *header = buf;
  1471. struct avdtp_single_header *single = (void *) session->buf;
  1472. struct avdtp_start_header *start = (void *) session->buf;
  1473. void *payload;
  1474. gsize payload_size;
  1475. switch (header->packet_type) {
  1476. case AVDTP_PKT_TYPE_SINGLE:
  1477. if (size < sizeof(*single)) {
  1478. error("Received too small single packet (%zu bytes)",
  1479. size);
  1480. return PARSE_ERROR;
  1481. }
  1482. if (session->in.active) {
  1483. error("SINGLE: Invalid AVDTP packet fragmentation");
  1484. return PARSE_ERROR;
  1485. }
  1486. payload = session->buf + sizeof(*single);
  1487. payload_size = size - sizeof(*single);
  1488. session->in.active = TRUE;
  1489. session->in.data_size = 0;
  1490. session->in.no_of_packets = 1;
  1491. session->in.transaction = header->transaction;
  1492. session->in.message_type = header->message_type;
  1493. session->in.signal_id = single->signal_id;
  1494. break;
  1495. case AVDTP_PKT_TYPE_START:
  1496. if (size < sizeof(*start)) {
  1497. error("Received too small start packet (%zu bytes)",
  1498. size);
  1499. return PARSE_ERROR;
  1500. }
  1501. if (session->in.active) {
  1502. error("START: Invalid AVDTP packet fragmentation");
  1503. return PARSE_ERROR;
  1504. }
  1505. session->in.active = TRUE;
  1506. session->in.data_size = 0;
  1507. session->in.transaction = header->transaction;
  1508. session->in.message_type = header->message_type;
  1509. session->in.no_of_packets = start->no_of_packets;
  1510. session->in.signal_id = start->signal_id;
  1511. payload = session->buf + sizeof(*start);
  1512. payload_size = size - sizeof(*start);
  1513. break;
  1514. case AVDTP_PKT_TYPE_CONTINUE:
  1515. if (size < sizeof(struct avdtp_continue_header)) {
  1516. error("Received too small continue packet (%zu bytes)",
  1517. size);
  1518. return PARSE_ERROR;
  1519. }
  1520. if (!session->in.active) {
  1521. error("CONTINUE: Invalid AVDTP packet fragmentation");
  1522. return PARSE_ERROR;
  1523. }
  1524. if (session->in.transaction != header->transaction) {
  1525. error("Continue transaction id doesn't match");
  1526. return PARSE_ERROR;
  1527. }
  1528. if (session->in.no_of_packets <= 1) {
  1529. error("Too few continue packets");
  1530. return PARSE_ERROR;
  1531. }
  1532. payload = session->buf + sizeof(struct avdtp_continue_header);
  1533. payload_size = size - sizeof(struct avdtp_continue_header);
  1534. break;
  1535. case AVDTP_PKT_TYPE_END:
  1536. if (size < sizeof(struct avdtp_continue_header)) {
  1537. error("Received too small end packet (%zu bytes)",
  1538. size);
  1539. return PARSE_ERROR;
  1540. }
  1541. if (!session->in.active) {
  1542. error("END: Invalid AVDTP packet fragmentation");
  1543. return PARSE_ERROR;
  1544. }
  1545. if (session->in.transaction != header->transaction) {
  1546. error("End transaction id doesn't match");
  1547. return PARSE_ERROR;
  1548. }
  1549. if (session->in.no_of_packets > 1) {
  1550. error("Got an end packet too early");
  1551. return PARSE_ERROR;
  1552. }
  1553. payload = session->buf + sizeof(struct avdtp_continue_header);
  1554. payload_size = size - sizeof(struct avdtp_continue_header);
  1555. break;
  1556. default:
  1557. error("Invalid AVDTP packet type 0x%02X", header->packet_type);
  1558. return PARSE_ERROR;
  1559. }
  1560. if (session->in.data_size + payload_size >
  1561. sizeof(session->in.buf)) {
  1562. error("Not enough incoming buffer space!");
  1563. return PARSE_ERROR;
  1564. }
  1565. memcpy(session->in.buf + session->in.data_size, payload, payload_size);
  1566. session->in.data_size += payload_size;
  1567. if (session->in.no_of_packets > 1) {
  1568. session->in.no_of_packets--;
  1569. DBG("Received AVDTP fragment. %d to go",
  1570. session->in.no_of_packets);
  1571. return PARSE_FRAGMENT;
  1572. }
  1573. session->in.active = FALSE;
  1574. return PARSE_SUCCESS;
  1575. }
  1576. static gboolean session_cb(GIOChannel *chan, GIOCondition cond,
  1577. gpointer data)
  1578. {
  1579. struct avdtp *session = data;
  1580. struct avdtp_common_header *header;
  1581. ssize_t size;
  1582. int fd;
  1583. DBG("");
  1584. if (cond & G_IO_NVAL) {
  1585. session->io_id = 0;
  1586. return FALSE;
  1587. }
  1588. header = (void *) session->buf;
  1589. if (cond & (G_IO_HUP | G_IO_ERR))
  1590. goto failed;
  1591. fd = g_io_channel_unix_get_fd(chan);
  1592. size = read(fd, session->buf, session->imtu);
  1593. if (size < 0) {
  1594. error("IO Channel read error");
  1595. goto failed;
  1596. }
  1597. if ((size_t) size < sizeof(struct avdtp_common_header)) {
  1598. error("Received too small packet (%zu bytes)", size);
  1599. goto failed;
  1600. }
  1601. switch (avdtp_parse_data(session, session->buf, size)) {
  1602. case PARSE_ERROR:
  1603. goto failed;
  1604. case PARSE_FRAGMENT:
  1605. return TRUE;
  1606. case PARSE_SUCCESS:
  1607. break;
  1608. }
  1609. /* Take a reference to protect against callback destroying session */
  1610. avdtp_ref(session);
  1611. if (session->in.message_type == AVDTP_MSG_TYPE_COMMAND) {
  1612. if (!avdtp_parse_cmd(session, session->in.transaction,
  1613. session->in.signal_id,
  1614. session->in.buf,
  1615. session->in.data_size)) {
  1616. error("Unable to handle command. Disconnecting");
  1617. goto failed;
  1618. }
  1619. if (session->req && session->req->collided) {
  1620. DBG("Collision detected");
  1621. goto next;
  1622. }
  1623. avdtp_unref(session);
  1624. return TRUE;
  1625. }
  1626. if (session->req == NULL) {
  1627. error("No pending request, ignoring message");
  1628. avdtp_unref(session);
  1629. return TRUE;
  1630. }
  1631. if (header->transaction != session->req->transaction) {
  1632. error("Transaction label doesn't match");
  1633. avdtp_unref(session);
  1634. return TRUE;
  1635. }
  1636. if (session->in.signal_id != session->req->signal_id) {
  1637. error("Response signal doesn't match");
  1638. avdtp_unref(session);
  1639. return TRUE;
  1640. }
  1641. g_source_remove(session->req->timeout);
  1642. session->req->timeout = 0;
  1643. switch (header->message_type) {
  1644. case AVDTP_MSG_TYPE_ACCEPT:
  1645. if (!avdtp_parse_resp(session, session->req->stream,
  1646. session->in.transaction,
  1647. session->in.signal_id,
  1648. session->in.buf,
  1649. session->in.data_size)) {
  1650. error("Unable to parse accept response");
  1651. goto failed;
  1652. }
  1653. break;
  1654. case AVDTP_MSG_TYPE_REJECT:
  1655. if (!avdtp_parse_rej(session, session->req->stream,
  1656. session->in.transaction,
  1657. session->in.signal_id,
  1658. session->in.buf,
  1659. session->in.data_size)) {
  1660. error("Unable to parse reject response");
  1661. goto failed;
  1662. }
  1663. break;
  1664. case AVDTP_MSG_TYPE_GEN_REJECT:
  1665. error("Received a General Reject message");
  1666. break;
  1667. default:
  1668. error("Unknown message type 0x%02X", header->message_type);
  1669. break;
  1670. }
  1671. next:
  1672. pending_req_free(session->req);
  1673. session->req = NULL;
  1674. if (session->ref > 1)
  1675. process_queue(session);
  1676. avdtp_unref(session);
  1677. return TRUE;
  1678. failed:
  1679. session->io_id = 0;
  1680. connection_lost(session, EIO);
  1681. return FALSE;
  1682. }
  1683. static int set_priority(int fd, int priority)
  1684. {
  1685. int err;
  1686. err = setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority,
  1687. sizeof(priority));
  1688. if (err == 0 || errno == ENOTSOCK)
  1689. return 0;
  1690. err = -errno;
  1691. error("setsockopt(SO_PRIORITY): %s (%d)", strerror(-err), -err);
  1692. return err;
  1693. }
  1694. struct avdtp *avdtp_new(int fd, size_t imtu, size_t omtu, uint16_t version,
  1695. struct queue *lseps)
  1696. {
  1697. struct avdtp *session;
  1698. GIOCondition cond = G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
  1699. int new_fd;
  1700. if (!lseps)
  1701. return NULL;
  1702. new_fd = dup(fd);
  1703. if (new_fd < 0) {
  1704. error("dup(): %s (%d)", strerror(errno), errno);
  1705. return NULL;
  1706. }
  1707. if (set_priority(new_fd, 6) < 0)
  1708. return NULL;
  1709. session = g_new0(struct avdtp, 1);
  1710. session->io = g_io_channel_unix_new(new_fd);
  1711. session->version = version;
  1712. session->imtu = imtu;
  1713. session->omtu = omtu;
  1714. session->buf = g_malloc0(MAX(session->imtu, session->omtu));
  1715. /* This watch should be low priority since otherwise the
  1716. * connect callback might be dispatched before the session
  1717. * callback if the kernel wakes us up at the same time for
  1718. * them. This could happen if a headset is very quick in
  1719. * sending the Start command after connecting the stream
  1720. * transport channel.
  1721. */
  1722. session->io_id = g_io_add_watch_full(session->io, G_PRIORITY_LOW, cond,
  1723. (GIOFunc) session_cb, session,
  1724. NULL);
  1725. session->lseps = lseps;
  1726. return avdtp_ref(session);
  1727. }
  1728. unsigned int avdtp_add_disconnect_cb(struct avdtp *session,
  1729. avdtp_disconnect_cb_t cb,
  1730. void *user_data)
  1731. {
  1732. struct disconnect_callback *callback;
  1733. static unsigned int id = 0;
  1734. callback = g_new0(struct disconnect_callback, 1);
  1735. callback->id = ++id;
  1736. callback->cb = cb;
  1737. callback->user_data = user_data;
  1738. session->disconnect = g_slist_append(session->disconnect, callback);
  1739. return id;
  1740. }
  1741. gboolean avdtp_remove_disconnect_cb(struct avdtp *session, unsigned int id)
  1742. {
  1743. GSList *l;
  1744. for (l = session->disconnect; l; l = g_slist_next(l)) {
  1745. struct disconnect_callback *callback = l->data;
  1746. if (callback->id != id)
  1747. continue;
  1748. session->disconnect = g_slist_remove(session->disconnect,
  1749. callback);
  1750. g_free(callback);
  1751. return TRUE;
  1752. }
  1753. return FALSE;
  1754. }
  1755. void avdtp_shutdown(struct avdtp *session)
  1756. {
  1757. GSList *l;
  1758. bool aborting = false;
  1759. if (!session->io)
  1760. return;
  1761. for (l = session->streams; l; l = g_slist_next(l)) {
  1762. struct avdtp_stream *stream = l->data;
  1763. if (stream->abort_int ||
  1764. avdtp_close(session, stream, TRUE) == 0)
  1765. aborting = true;
  1766. }
  1767. if (aborting) {
  1768. /* defer shutdown until all streams are aborted properly */
  1769. session->shutdown = true;
  1770. } else {
  1771. int sock = g_io_channel_unix_get_fd(session->io);
  1772. shutdown(sock, SHUT_RDWR);
  1773. }
  1774. }
  1775. static void queue_request(struct avdtp *session, struct pending_req *req,
  1776. gboolean priority)
  1777. {
  1778. if (priority)
  1779. session->prio_queue = g_slist_append(session->prio_queue, req);
  1780. else
  1781. session->req_queue = g_slist_append(session->req_queue, req);
  1782. }
  1783. static uint8_t req_get_seid(struct pending_req *req)
  1784. {
  1785. if (req->signal_id == AVDTP_DISCOVER)
  1786. return 0;
  1787. return ((struct seid_req *) (req->data))->acp_seid;
  1788. }
  1789. static int cancel_request(struct avdtp *session, int err)
  1790. {
  1791. struct pending_req *req;
  1792. struct seid_req sreq;
  1793. struct avdtp_local_sep *lsep;
  1794. struct avdtp_stream *stream;
  1795. uint8_t seid;
  1796. struct avdtp_error averr;
  1797. req = session->req;
  1798. session->req = NULL;
  1799. avdtp_error_init(&averr, AVDTP_ERRNO, err);
  1800. seid = req_get_seid(req);
  1801. if (seid)
  1802. stream = find_stream_by_rseid(session, seid);
  1803. else
  1804. stream = NULL;
  1805. if (stream) {
  1806. stream->abort_int = TRUE;
  1807. lsep = stream->lsep;
  1808. } else
  1809. lsep = NULL;
  1810. switch (req->signal_id) {
  1811. case AVDTP_RECONFIGURE:
  1812. error("Reconfigure: %s (%d)", strerror(err), err);
  1813. if (lsep && lsep->cfm && lsep->cfm->reconfigure)
  1814. lsep->cfm->reconfigure(session, lsep, stream, &averr,
  1815. lsep->user_data);
  1816. break;
  1817. case AVDTP_OPEN:
  1818. error("Open: %s (%d)", strerror(err), err);
  1819. if (lsep && lsep->cfm && lsep->cfm->open)
  1820. lsep->cfm->open(session, lsep, stream, &averr,
  1821. lsep->user_data);
  1822. break;
  1823. case AVDTP_START:
  1824. error("Start: %s (%d)", strerror(err), err);
  1825. if (lsep && lsep->cfm && lsep->cfm->start) {
  1826. lsep->cfm->start(session, lsep, stream, &averr,
  1827. lsep->user_data);
  1828. if (stream)
  1829. stream->starting = FALSE;
  1830. }
  1831. break;
  1832. case AVDTP_SUSPEND:
  1833. error("Suspend: %s (%d)", strerror(err), err);
  1834. if (lsep && lsep->cfm && lsep->cfm->suspend)
  1835. lsep->cfm->suspend(session, lsep, stream, &averr,
  1836. lsep->user_data);
  1837. break;
  1838. case AVDTP_CLOSE:
  1839. error("Close: %s (%d)", strerror(err), err);
  1840. if (lsep && lsep->cfm && lsep->cfm->close) {
  1841. lsep->cfm->close(session, lsep, stream, &averr,
  1842. lsep->user_data);
  1843. if (stream)
  1844. stream->close_int = FALSE;
  1845. }
  1846. break;
  1847. case AVDTP_SET_CONFIGURATION:
  1848. error("SetConfiguration: %s (%d)", strerror(err), err);
  1849. if (lsep && lsep->cfm && lsep->cfm->set_configuration)
  1850. lsep->cfm->set_configuration(session, lsep, stream,
  1851. &averr, lsep->user_data);
  1852. goto failed;
  1853. case AVDTP_DISCOVER:
  1854. error("Discover: %s (%d)", strerror(err), err);
  1855. goto failed;
  1856. case AVDTP_GET_CAPABILITIES:
  1857. error("GetCapabilities: %s (%d)", strerror(err), err);
  1858. goto failed;
  1859. case AVDTP_ABORT:
  1860. error("Abort: %s (%d)", strerror(err), err);
  1861. goto failed;
  1862. }
  1863. if (!stream)
  1864. goto failed;
  1865. memset(&sreq, 0, sizeof(sreq));
  1866. sreq.acp_seid = seid;
  1867. err = send_request(session, TRUE, stream, AVDTP_ABORT, &sreq,
  1868. sizeof(sreq));
  1869. if (err < 0) {
  1870. error("Unable to send abort request");
  1871. goto failed;
  1872. }
  1873. goto done;
  1874. failed:
  1875. connection_lost(session, err);
  1876. done:
  1877. pending_req_free(req);
  1878. return err;
  1879. }
  1880. static gboolean request_timeout(gpointer user_data)
  1881. {
  1882. struct avdtp *session = user_data;
  1883. cancel_request(session, ETIMEDOUT);
  1884. return FALSE;
  1885. }
  1886. static int send_req(struct avdtp *session, gboolean priority,
  1887. struct pending_req *req)
  1888. {
  1889. static int transaction = 0;
  1890. int err;
  1891. if (session->req != NULL) {
  1892. queue_request(session, req, priority);
  1893. return 0;
  1894. }
  1895. req->transaction = transaction++;
  1896. transaction %= 16;
  1897. /* FIXME: Should we retry to send if the buffer
  1898. was not totally sent or in case of EINTR? */
  1899. if (!avdtp_send(session, req->transaction, AVDTP_MSG_TYPE_COMMAND,
  1900. req->signal_id, req->data, req->data_size)) {
  1901. err = -EIO;
  1902. goto failed;
  1903. }
  1904. session->req = req;
  1905. req->timeout = g_timeout_add_seconds(req->signal_id == AVDTP_ABORT ?
  1906. ABORT_TIMEOUT : REQ_TIMEOUT,
  1907. request_timeout,
  1908. session);
  1909. return 0;
  1910. failed:
  1911. g_free(req->data);
  1912. g_free(req);
  1913. return err;
  1914. }
  1915. static int send_request(struct avdtp *session, gboolean priority,
  1916. struct avdtp_stream *stream, uint8_t signal_id,
  1917. void *buffer, size_t size)
  1918. {
  1919. struct pending_req *req;
  1920. if (size > 0 && !buffer) {
  1921. DBG("Invalid buffer %p", buffer);
  1922. return -EINVAL;
  1923. }
  1924. if (stream && stream->abort_int && signal_id != AVDTP_ABORT) {
  1925. DBG("Unable to send requests while aborting");
  1926. return -EINVAL;
  1927. }
  1928. req = g_new0(struct pending_req, 1);
  1929. req->signal_id = signal_id;
  1930. req->data_size = size;
  1931. req->stream = stream;
  1932. if (size > 0) {
  1933. req->data = g_malloc(size);
  1934. memcpy(req->data, buffer, size);
  1935. }
  1936. return send_req(session, priority, req);
  1937. }
  1938. static gboolean avdtp_discover_resp(struct avdtp *session,
  1939. struct discover_resp *resp, int size)
  1940. {
  1941. int sep_count, i;
  1942. uint8_t getcap_cmd;
  1943. int ret = 0;
  1944. gboolean getcap_pending = FALSE;
  1945. if (session->version >= 0x0103)
  1946. getcap_cmd = AVDTP_GET_ALL_CAPABILITIES;
  1947. else
  1948. getcap_cmd = AVDTP_GET_CAPABILITIES;
  1949. sep_count = size / sizeof(struct seid_info);
  1950. for (i = 0; i < sep_count; i++) {
  1951. struct avdtp_remote_sep *sep;
  1952. struct avdtp_stream *stream;
  1953. struct seid_req req;
  1954. DBG("seid %d type %d media %d in use %d",
  1955. resp->seps[i].seid, resp->seps[i].type,
  1956. resp->seps[i].media_type, resp->seps[i].inuse);
  1957. stream = find_stream_by_rseid(session, resp->seps[i].seid);
  1958. sep = find_remote_sep(session->seps, resp->seps[i].seid);
  1959. if (!sep) {
  1960. if (resp->seps[i].inuse && !stream)
  1961. continue;
  1962. sep = g_new0(struct avdtp_remote_sep, 1);
  1963. session->seps = g_slist_append(session->seps, sep);
  1964. }
  1965. sep->stream = stream;
  1966. sep->seid = resp->seps[i].seid;
  1967. sep->type = resp->seps[i].type;
  1968. sep->media_type = resp->seps[i].media_type;
  1969. memset(&req, 0, sizeof(req));
  1970. req.acp_seid = sep->seid;
  1971. ret = send_request(session, TRUE, NULL, getcap_cmd,
  1972. &req, sizeof(req));
  1973. if (ret < 0)
  1974. break;
  1975. getcap_pending = TRUE;
  1976. }
  1977. if (!getcap_pending)
  1978. finalize_discovery(session, -ret);
  1979. return TRUE;
  1980. }
  1981. static gboolean avdtp_get_capabilities_resp(struct avdtp *session,
  1982. struct getcap_resp *resp,
  1983. unsigned int size)
  1984. {
  1985. struct avdtp_remote_sep *sep;
  1986. uint8_t seid;
  1987. /* Check for minimum required packet size includes:
  1988. * 1. getcap resp header
  1989. * 2. media transport capability (2 bytes)
  1990. * 3. media codec capability type + length (2 bytes)
  1991. * 4. the actual media codec elements
  1992. * */
  1993. if (size < (sizeof(struct getcap_resp) + 4 +
  1994. sizeof(struct avdtp_media_codec_capability))) {
  1995. error("Too short getcap resp packet");
  1996. return FALSE;
  1997. }
  1998. seid = ((struct seid_req *) session->req->data)->acp_seid;
  1999. sep = find_remote_sep(session->seps, seid);
  2000. DBG("seid %d type %d media %d", sep->seid,
  2001. sep->type, sep->media_type);
  2002. if (sep->caps) {
  2003. g_slist_free_full(sep->caps, g_free);
  2004. sep->caps = NULL;
  2005. sep->codec = NULL;
  2006. sep->delay_reporting = FALSE;
  2007. }
  2008. sep->caps = caps_to_list(resp->caps, size - sizeof(struct getcap_resp),
  2009. &sep->codec, &sep->delay_reporting);
  2010. return TRUE;
  2011. }
  2012. static gboolean avdtp_set_configuration_resp(struct avdtp *session,
  2013. struct avdtp_stream *stream,
  2014. struct avdtp_single_header *resp,
  2015. int size)
  2016. {
  2017. struct avdtp_local_sep *sep = stream->lsep;
  2018. avdtp_sep_set_state(session, sep, AVDTP_STATE_CONFIGURED);
  2019. if (sep->cfm && sep->cfm->set_configuration)
  2020. sep->cfm->set_configuration(session, sep, stream, NULL,
  2021. sep->user_data);
  2022. return TRUE;
  2023. }
  2024. static gboolean avdtp_reconfigure_resp(struct avdtp *session,
  2025. struct avdtp_stream *stream,
  2026. struct avdtp_single_header *resp,
  2027. int size)
  2028. {
  2029. return TRUE;
  2030. }
  2031. static gboolean avdtp_open_resp(struct avdtp *session,
  2032. struct avdtp_stream *stream,
  2033. struct seid_rej *resp, int size)
  2034. {
  2035. struct avdtp_local_sep *sep = stream->lsep;
  2036. session->pending_open = stream;
  2037. if (!stream->open_acp && sep->cfm && sep->cfm->open)
  2038. sep->cfm->open(session, sep, stream, NULL, sep->user_data);
  2039. return TRUE;
  2040. }
  2041. static gboolean avdtp_start_resp(struct avdtp *session,
  2042. struct avdtp_stream *stream,
  2043. struct seid_rej *resp, int size)
  2044. {
  2045. struct avdtp_local_sep *sep = stream->lsep;
  2046. /* We might be in STREAMING already if both sides send START_CMD at the
  2047. * same time and the one in SNK role doesn't reject it as it should */
  2048. if (sep->state != AVDTP_STATE_STREAMING)
  2049. avdtp_sep_set_state(session, sep, AVDTP_STATE_STREAMING);
  2050. if (sep->cfm && sep->cfm->start)
  2051. sep->cfm->start(session, sep, stream, NULL, sep->user_data);
  2052. return TRUE;
  2053. }
  2054. static gboolean avdtp_close_resp(struct avdtp *session,
  2055. struct avdtp_stream *stream,
  2056. struct seid_rej *resp, int size)
  2057. {
  2058. struct avdtp_local_sep *sep = stream->lsep;
  2059. avdtp_sep_set_state(session, sep, AVDTP_STATE_CLOSING);
  2060. close_stream(stream);
  2061. return TRUE;
  2062. }
  2063. static gboolean avdtp_suspend_resp(struct avdtp *session,
  2064. struct avdtp_stream *stream,
  2065. void *data, int size)
  2066. {
  2067. struct avdtp_local_sep *sep = stream->lsep;
  2068. avdtp_sep_set_state(session, sep, AVDTP_STATE_OPEN);
  2069. if (sep->cfm && sep->cfm->suspend)
  2070. sep->cfm->suspend(session, sep, stream, NULL, sep->user_data);
  2071. return TRUE;
  2072. }
  2073. static gboolean avdtp_abort_resp(struct avdtp *session,
  2074. struct avdtp_stream *stream,
  2075. struct seid_rej *resp, int size)
  2076. {
  2077. struct avdtp_local_sep *sep = stream->lsep;
  2078. avdtp_sep_set_state(session, sep, AVDTP_STATE_ABORTING);
  2079. if (sep->cfm && sep->cfm->abort)
  2080. sep->cfm->abort(session, sep, stream, NULL, sep->user_data);
  2081. avdtp_sep_set_state(session, sep, AVDTP_STATE_IDLE);
  2082. return TRUE;
  2083. }
  2084. static gboolean avdtp_delay_report_resp(struct avdtp *session,
  2085. struct avdtp_stream *stream,
  2086. void *data, int size)
  2087. {
  2088. struct avdtp_local_sep *sep = stream->lsep;
  2089. if (sep->cfm && sep->cfm->delay_report)
  2090. sep->cfm->delay_report(session, sep, stream, NULL,
  2091. sep->user_data);
  2092. return TRUE;
  2093. }
  2094. static gboolean avdtp_parse_resp(struct avdtp *session,
  2095. struct avdtp_stream *stream,
  2096. uint8_t transaction, uint8_t signal_id,
  2097. void *buf, int size)
  2098. {
  2099. struct pending_req *next;
  2100. const char *get_all = "";
  2101. if (session->prio_queue)
  2102. next = session->prio_queue->data;
  2103. else if (session->req_queue)
  2104. next = session->req_queue->data;
  2105. else
  2106. next = NULL;
  2107. switch (signal_id) {
  2108. case AVDTP_DISCOVER:
  2109. DBG("DISCOVER request succeeded");
  2110. return avdtp_discover_resp(session, buf, size);
  2111. case AVDTP_GET_ALL_CAPABILITIES:
  2112. get_all = "ALL_";
  2113. /* fall through */
  2114. case AVDTP_GET_CAPABILITIES:
  2115. DBG("GET_%sCAPABILITIES request succeeded", get_all);
  2116. if (!avdtp_get_capabilities_resp(session, buf, size))
  2117. return FALSE;
  2118. if (!(next && (next->signal_id == AVDTP_GET_CAPABILITIES ||
  2119. next->signal_id == AVDTP_GET_ALL_CAPABILITIES)))
  2120. finalize_discovery(session, 0);
  2121. return TRUE;
  2122. }
  2123. /* The remaining commands require an existing stream so bail out
  2124. * here if the stream got unexpectedly disconnected */
  2125. if (!stream) {
  2126. DBG("AVDTP: stream was closed while waiting for reply");
  2127. return TRUE;
  2128. }
  2129. switch (signal_id) {
  2130. case AVDTP_SET_CONFIGURATION:
  2131. DBG("SET_CONFIGURATION request succeeded");
  2132. return avdtp_set_configuration_resp(session, stream,
  2133. buf, size);
  2134. case AVDTP_RECONFIGURE:
  2135. DBG("RECONFIGURE request succeeded");
  2136. return avdtp_reconfigure_resp(session, stream, buf, size);
  2137. case AVDTP_OPEN:
  2138. DBG("OPEN request succeeded");
  2139. return avdtp_open_resp(session, stream, buf, size);
  2140. case AVDTP_SUSPEND:
  2141. DBG("SUSPEND request succeeded");
  2142. return avdtp_suspend_resp(session, stream, buf, size);
  2143. case AVDTP_START:
  2144. DBG("START request succeeded");
  2145. return avdtp_start_resp(session, stream, buf, size);
  2146. case AVDTP_CLOSE:
  2147. DBG("CLOSE request succeeded");
  2148. return avdtp_close_resp(session, stream, buf, size);
  2149. case AVDTP_ABORT:
  2150. DBG("ABORT request succeeded");
  2151. return avdtp_abort_resp(session, stream, buf, size);
  2152. case AVDTP_DELAY_REPORT:
  2153. DBG("DELAY_REPORT request succeeded");
  2154. return avdtp_delay_report_resp(session, stream, buf, size);
  2155. }
  2156. error("Unknown signal id in accept response: %u", signal_id);
  2157. return TRUE;
  2158. }
  2159. static gboolean seid_rej_to_err(struct seid_rej *rej, unsigned int size,
  2160. struct avdtp_error *err)
  2161. {
  2162. if (size < sizeof(struct seid_rej)) {
  2163. error("Too small packet for seid_rej");
  2164. return FALSE;
  2165. }
  2166. avdtp_error_init(err, 0x00, rej->error);
  2167. return TRUE;
  2168. }
  2169. static gboolean conf_rej_to_err(struct conf_rej *rej, unsigned int size,
  2170. struct avdtp_error *err)
  2171. {
  2172. if (size < sizeof(struct conf_rej)) {
  2173. error("Too small packet for conf_rej");
  2174. return FALSE;
  2175. }
  2176. avdtp_error_init(err, rej->category, rej->error);
  2177. return TRUE;
  2178. }
  2179. static gboolean stream_rej_to_err(struct stream_rej *rej, unsigned int size,
  2180. struct avdtp_error *err,
  2181. uint8_t *acp_seid)
  2182. {
  2183. if (size < sizeof(struct stream_rej)) {
  2184. error("Too small packet for stream_rej");
  2185. return FALSE;
  2186. }
  2187. avdtp_error_init(err, 0x00, rej->error);
  2188. if (acp_seid)
  2189. *acp_seid = rej->acp_seid;
  2190. return TRUE;
  2191. }
  2192. static gboolean avdtp_parse_rej(struct avdtp *session,
  2193. struct avdtp_stream *stream,
  2194. uint8_t transaction, uint8_t signal_id,
  2195. void *buf, int size)
  2196. {
  2197. struct avdtp_error err;
  2198. uint8_t acp_seid;
  2199. struct avdtp_local_sep *sep = stream ? stream->lsep : NULL;
  2200. switch (signal_id) {
  2201. case AVDTP_DISCOVER:
  2202. case AVDTP_GET_CAPABILITIES:
  2203. case AVDTP_GET_ALL_CAPABILITIES:
  2204. if (!seid_rej_to_err(buf, size, &err))
  2205. return FALSE;
  2206. error("%s request rejected: %s (%d)",
  2207. signal_id == AVDTP_DISCOVER ? "DISCOVER" :
  2208. signal_id == AVDTP_GET_CAPABILITIES ?
  2209. "GET_CAPABILITIES" : "GET_ALL_CAPABILITIES",
  2210. avdtp_strerror(&err), err.err.error_code);
  2211. if (session->discover) {
  2212. session->discover->cb(session, session->seps, &err,
  2213. session->discover->user_data);
  2214. g_free(session->discover);
  2215. session->discover = NULL;
  2216. }
  2217. return TRUE;
  2218. case AVDTP_OPEN:
  2219. if (!seid_rej_to_err(buf, size, &err))
  2220. return FALSE;
  2221. error("OPEN request rejected: %s (%d)",
  2222. avdtp_strerror(&err), err.err.error_code);
  2223. if (sep && sep->cfm && sep->cfm->open)
  2224. sep->cfm->open(session, sep, stream, &err,
  2225. sep->user_data);
  2226. return TRUE;
  2227. case AVDTP_SET_CONFIGURATION:
  2228. if (!conf_rej_to_err(buf, size, &err))
  2229. return FALSE;
  2230. error("SET_CONFIGURATION request rejected: %s (%d)",
  2231. avdtp_strerror(&err), err.err.error_code);
  2232. if (sep && sep->cfm && sep->cfm->set_configuration)
  2233. sep->cfm->set_configuration(session, sep, stream,
  2234. &err, sep->user_data);
  2235. return TRUE;
  2236. case AVDTP_GET_CONFIGURATION:
  2237. if (!seid_rej_to_err(buf, size, &err))
  2238. return FALSE;
  2239. error("GET_CONFIGURATION request rejected: %s (%d)",
  2240. avdtp_strerror(&err), err.err.error_code);
  2241. if (sep && sep->cfm && sep->cfm->get_configuration)
  2242. sep->cfm->get_configuration(session, sep, stream, &err,
  2243. sep->user_data);
  2244. return TRUE;
  2245. case AVDTP_RECONFIGURE:
  2246. if (!conf_rej_to_err(buf, size, &err))
  2247. return FALSE;
  2248. error("RECONFIGURE request rejected: %s (%d)",
  2249. avdtp_strerror(&err), err.err.error_code);
  2250. if (sep && sep->cfm && sep->cfm->reconfigure)
  2251. sep->cfm->reconfigure(session, sep, stream, &err,
  2252. sep->user_data);
  2253. return TRUE;
  2254. case AVDTP_START:
  2255. if (!stream_rej_to_err(buf, size, &err, &acp_seid))
  2256. return FALSE;
  2257. error("START request rejected: %s (%d)",
  2258. avdtp_strerror(&err), err.err.error_code);
  2259. if (sep && sep->cfm && sep->cfm->start) {
  2260. stream->starting = FALSE;
  2261. sep->cfm->start(session, sep, stream, &err,
  2262. sep->user_data);
  2263. }
  2264. return TRUE;
  2265. case AVDTP_SUSPEND:
  2266. if (!stream_rej_to_err(buf, size, &err, &acp_seid))
  2267. return FALSE;
  2268. error("SUSPEND request rejected: %s (%d)",
  2269. avdtp_strerror(&err), err.err.error_code);
  2270. if (sep && sep->cfm && sep->cfm->suspend)
  2271. sep->cfm->suspend(session, sep, stream, &err,
  2272. sep->user_data);
  2273. return TRUE;
  2274. case AVDTP_CLOSE:
  2275. if (!stream_rej_to_err(buf, size, &err, &acp_seid))
  2276. return FALSE;
  2277. error("CLOSE request rejected: %s (%d)",
  2278. avdtp_strerror(&err), err.err.error_code);
  2279. if (sep && sep->cfm && sep->cfm->close) {
  2280. sep->cfm->close(session, sep, stream, &err,
  2281. sep->user_data);
  2282. stream->close_int = FALSE;
  2283. }
  2284. return TRUE;
  2285. case AVDTP_ABORT:
  2286. if (!stream_rej_to_err(buf, size, &err, &acp_seid))
  2287. return FALSE;
  2288. error("ABORT request rejected: %s (%d)",
  2289. avdtp_strerror(&err), err.err.error_code);
  2290. if (sep && sep->cfm && sep->cfm->abort)
  2291. sep->cfm->abort(session, sep, stream, &err,
  2292. sep->user_data);
  2293. return FALSE;
  2294. case AVDTP_DELAY_REPORT:
  2295. if (!stream_rej_to_err(buf, size, &err, &acp_seid))
  2296. return FALSE;
  2297. error("DELAY_REPORT request rejected: %s (%d)",
  2298. avdtp_strerror(&err), err.err.error_code);
  2299. if (sep && sep->cfm && sep->cfm->delay_report)
  2300. sep->cfm->delay_report(session, sep, stream, &err,
  2301. sep->user_data);
  2302. return TRUE;
  2303. default:
  2304. error("Unknown reject response signal id: %u", signal_id);
  2305. return TRUE;
  2306. }
  2307. }
  2308. struct avdtp_service_capability *avdtp_stream_get_codec(
  2309. struct avdtp_stream *stream)
  2310. {
  2311. GSList *l;
  2312. for (l = stream->caps; l; l = l->next) {
  2313. struct avdtp_service_capability *cap = l->data;
  2314. if (cap->category == AVDTP_MEDIA_CODEC)
  2315. return cap;
  2316. }
  2317. return NULL;
  2318. }
  2319. static gboolean avdtp_stream_has_capability(struct avdtp_stream *stream,
  2320. struct avdtp_service_capability *cap)
  2321. {
  2322. GSList *l;
  2323. struct avdtp_service_capability *stream_cap;
  2324. for (l = stream->caps; l; l = g_slist_next(l)) {
  2325. stream_cap = l->data;
  2326. if (stream_cap->category != cap->category ||
  2327. stream_cap->length != cap->length)
  2328. continue;
  2329. if (memcmp(stream_cap->data, cap->data, cap->length) == 0)
  2330. return TRUE;
  2331. }
  2332. return FALSE;
  2333. }
  2334. gboolean avdtp_stream_has_capabilities(struct avdtp_stream *stream,
  2335. GSList *caps)
  2336. {
  2337. for (; caps; caps = g_slist_next(caps)) {
  2338. struct avdtp_service_capability *cap = caps->data;
  2339. if (!avdtp_stream_has_capability(stream, cap))
  2340. return FALSE;
  2341. }
  2342. return TRUE;
  2343. }
  2344. struct avdtp_remote_sep *avdtp_stream_get_remote_sep(
  2345. struct avdtp_stream *stream)
  2346. {
  2347. GSList *l;
  2348. for (l = stream->session->seps; l; l = l->next) {
  2349. struct avdtp_remote_sep *sep = l->data;
  2350. if (sep->seid == stream->rseid)
  2351. return sep;
  2352. }
  2353. return NULL;
  2354. }
  2355. gboolean avdtp_stream_set_transport(struct avdtp_stream *stream, int fd,
  2356. size_t imtu, size_t omtu)
  2357. {
  2358. GIOChannel *io;
  2359. if (stream != stream->session->pending_open)
  2360. return FALSE;
  2361. if (set_priority(fd, 5) < 0)
  2362. return FALSE;
  2363. io = g_io_channel_unix_new(fd);
  2364. handle_transport_connect(stream->session, io, imtu, omtu);
  2365. g_io_channel_unref(io);
  2366. return TRUE;
  2367. }
  2368. gboolean avdtp_stream_get_transport(struct avdtp_stream *stream, int *sock,
  2369. uint16_t *imtu, uint16_t *omtu,
  2370. GSList **caps)
  2371. {
  2372. if (stream->io == NULL)
  2373. return FALSE;
  2374. if (sock)
  2375. *sock = g_io_channel_unix_get_fd(stream->io);
  2376. if (omtu)
  2377. *omtu = stream->omtu;
  2378. if (imtu)
  2379. *imtu = stream->imtu;
  2380. if (caps)
  2381. *caps = stream->caps;
  2382. return TRUE;
  2383. }
  2384. static int process_queue(struct avdtp *session)
  2385. {
  2386. GSList **queue, *l;
  2387. struct pending_req *req;
  2388. if (session->req)
  2389. return 0;
  2390. if (session->prio_queue)
  2391. queue = &session->prio_queue;
  2392. else
  2393. queue = &session->req_queue;
  2394. if (!*queue)
  2395. return 0;
  2396. l = *queue;
  2397. req = l->data;
  2398. *queue = g_slist_remove(*queue, req);
  2399. return send_req(session, FALSE, req);
  2400. }
  2401. struct avdtp_service_capability *avdtp_get_codec(struct avdtp_remote_sep *sep)
  2402. {
  2403. return sep->codec;
  2404. }
  2405. struct avdtp_service_capability *avdtp_service_cap_new(uint8_t category,
  2406. const void *data,
  2407. int length)
  2408. {
  2409. struct avdtp_service_capability *cap;
  2410. if (category < AVDTP_MEDIA_TRANSPORT ||
  2411. category > AVDTP_DELAY_REPORTING)
  2412. return NULL;
  2413. if (length > 0 && !data)
  2414. return NULL;
  2415. cap = g_malloc(sizeof(struct avdtp_service_capability) + length);
  2416. cap->category = category;
  2417. cap->length = length;
  2418. if (length > 0)
  2419. memcpy(cap->data, data, length);
  2420. return cap;
  2421. }
  2422. static gboolean process_discover(gpointer data)
  2423. {
  2424. struct avdtp *session = data;
  2425. session->discover->id = 0;
  2426. finalize_discovery(session, 0);
  2427. return FALSE;
  2428. }
  2429. int avdtp_discover(struct avdtp *session, avdtp_discover_cb_t cb,
  2430. void *user_data)
  2431. {
  2432. int err;
  2433. if (session->discover)
  2434. return -EBUSY;
  2435. session->discover = g_new0(struct discover_callback, 1);
  2436. if (session->seps) {
  2437. session->discover->cb = cb;
  2438. session->discover->user_data = user_data;
  2439. session->discover->id = g_idle_add(process_discover, session);
  2440. return 0;
  2441. }
  2442. err = send_request(session, FALSE, NULL, AVDTP_DISCOVER, NULL, 0);
  2443. if (err == 0) {
  2444. session->discover->cb = cb;
  2445. session->discover->user_data = user_data;
  2446. }
  2447. return err;
  2448. }
  2449. gboolean avdtp_stream_remove_cb(struct avdtp *session,
  2450. struct avdtp_stream *stream,
  2451. unsigned int id)
  2452. {
  2453. GSList *l;
  2454. struct stream_callback *cb;
  2455. if (!stream)
  2456. return FALSE;
  2457. for (cb = NULL, l = stream->callbacks; l != NULL; l = l->next) {
  2458. struct stream_callback *tmp = l->data;
  2459. if (tmp && tmp->id == id) {
  2460. cb = tmp;
  2461. break;
  2462. }
  2463. }
  2464. if (!cb)
  2465. return FALSE;
  2466. stream->callbacks = g_slist_remove(stream->callbacks, cb);
  2467. g_free(cb);
  2468. return TRUE;
  2469. }
  2470. unsigned int avdtp_stream_add_cb(struct avdtp *session,
  2471. struct avdtp_stream *stream,
  2472. avdtp_stream_state_cb cb, void *data)
  2473. {
  2474. struct stream_callback *stream_cb;
  2475. static unsigned int id = 0;
  2476. stream_cb = g_new(struct stream_callback, 1);
  2477. stream_cb->cb = cb;
  2478. stream_cb->user_data = data;
  2479. stream_cb->id = ++id;
  2480. stream->callbacks = g_slist_append(stream->callbacks, stream_cb);
  2481. return stream_cb->id;
  2482. }
  2483. int avdtp_get_configuration(struct avdtp *session, struct avdtp_stream *stream)
  2484. {
  2485. struct seid_req req;
  2486. memset(&req, 0, sizeof(req));
  2487. req.acp_seid = stream->rseid;
  2488. return send_request(session, FALSE, stream, AVDTP_GET_CONFIGURATION,
  2489. &req, sizeof(req));
  2490. }
  2491. static void copy_capabilities(gpointer data, gpointer user_data)
  2492. {
  2493. struct avdtp_service_capability *src_cap = data;
  2494. struct avdtp_service_capability *dst_cap;
  2495. GSList **l = user_data;
  2496. dst_cap = avdtp_service_cap_new(src_cap->category, src_cap->data,
  2497. src_cap->length);
  2498. *l = g_slist_append(*l, dst_cap);
  2499. }
  2500. int avdtp_set_configuration(struct avdtp *session,
  2501. struct avdtp_remote_sep *rsep,
  2502. struct avdtp_local_sep *lsep,
  2503. GSList *caps,
  2504. struct avdtp_stream **stream)
  2505. {
  2506. struct setconf_req *req;
  2507. struct avdtp_stream *new_stream;
  2508. unsigned char *ptr;
  2509. int err, caps_len;
  2510. struct avdtp_service_capability *cap;
  2511. GSList *l;
  2512. if (!(lsep && rsep))
  2513. return -EINVAL;
  2514. DBG("%p: int_seid=%u, acp_seid=%u", session,
  2515. lsep->info.seid, rsep->seid);
  2516. new_stream = g_new0(struct avdtp_stream, 1);
  2517. new_stream->session = session;
  2518. new_stream->lsep = lsep;
  2519. new_stream->rseid = rsep->seid;
  2520. if (rsep->delay_reporting && lsep->delay_reporting) {
  2521. struct avdtp_service_capability *delay_reporting;
  2522. delay_reporting = avdtp_service_cap_new(AVDTP_DELAY_REPORTING,
  2523. NULL, 0);
  2524. caps = g_slist_append(caps, delay_reporting);
  2525. new_stream->delay_reporting = TRUE;
  2526. }
  2527. g_slist_foreach(caps, copy_capabilities, &new_stream->caps);
  2528. /* Calculate total size of request */
  2529. for (l = caps, caps_len = 0; l != NULL; l = g_slist_next(l)) {
  2530. cap = l->data;
  2531. caps_len += cap->length + 2;
  2532. }
  2533. req = g_malloc0(sizeof(struct setconf_req) + caps_len);
  2534. req->int_seid = lsep->info.seid;
  2535. req->acp_seid = rsep->seid;
  2536. /* Copy the capabilities into the request */
  2537. for (l = caps, ptr = req->caps; l != NULL; l = g_slist_next(l)) {
  2538. cap = l->data;
  2539. memcpy(ptr, cap, cap->length + 2);
  2540. ptr += cap->length + 2;
  2541. }
  2542. err = send_request(session, FALSE, new_stream,
  2543. AVDTP_SET_CONFIGURATION, req,
  2544. sizeof(struct setconf_req) + caps_len);
  2545. if (err < 0)
  2546. stream_free(new_stream);
  2547. else {
  2548. lsep->info.inuse = 1;
  2549. lsep->stream = new_stream;
  2550. rsep->stream = new_stream;
  2551. session->streams = g_slist_append(session->streams, new_stream);
  2552. if (stream)
  2553. *stream = new_stream;
  2554. }
  2555. g_free(req);
  2556. return err;
  2557. }
  2558. int avdtp_open(struct avdtp *session, struct avdtp_stream *stream)
  2559. {
  2560. struct seid_req req;
  2561. if (!g_slist_find(session->streams, stream))
  2562. return -EINVAL;
  2563. if (stream->lsep->state > AVDTP_STATE_CONFIGURED)
  2564. return -EINVAL;
  2565. memset(&req, 0, sizeof(req));
  2566. req.acp_seid = stream->rseid;
  2567. return send_request(session, FALSE, stream, AVDTP_OPEN,
  2568. &req, sizeof(req));
  2569. }
  2570. static gboolean start_timeout(gpointer user_data)
  2571. {
  2572. struct avdtp_stream *stream = user_data;
  2573. struct avdtp *session = stream->session;
  2574. stream->open_acp = FALSE;
  2575. if (avdtp_start(session, stream) < 0)
  2576. error("wait_timeout: avdtp_start failed");
  2577. stream->start_timer = 0;
  2578. return FALSE;
  2579. }
  2580. int avdtp_start(struct avdtp *session, struct avdtp_stream *stream)
  2581. {
  2582. struct start_req req;
  2583. int ret;
  2584. if (!g_slist_find(session->streams, stream))
  2585. return -EINVAL;
  2586. if (stream->lsep->state != AVDTP_STATE_OPEN)
  2587. return -EINVAL;
  2588. /* Recommendation 12:
  2589. * If the RD has configured and opened a stream it is also responsible
  2590. * to start the streaming via GAVDP_START.
  2591. */
  2592. if (stream->open_acp) {
  2593. /* If timer already active wait it */
  2594. if (stream->start_timer)
  2595. return 0;
  2596. stream->start_timer = g_timeout_add_seconds(START_TIMEOUT,
  2597. start_timeout,
  2598. stream);
  2599. return 0;
  2600. }
  2601. if (stream->close_int == TRUE) {
  2602. error("avdtp_start: rejecting start since close is initiated");
  2603. return -EINVAL;
  2604. }
  2605. if (stream->starting == TRUE) {
  2606. DBG("stream already started");
  2607. return -EINPROGRESS;
  2608. }
  2609. memset(&req, 0, sizeof(req));
  2610. req.first_seid.seid = stream->rseid;
  2611. ret = send_request(session, FALSE, stream, AVDTP_START,
  2612. &req, sizeof(req));
  2613. if (ret == 0)
  2614. stream->starting = TRUE;
  2615. return ret;
  2616. }
  2617. int avdtp_close(struct avdtp *session, struct avdtp_stream *stream,
  2618. gboolean immediate)
  2619. {
  2620. struct seid_req req;
  2621. int ret;
  2622. if (!g_slist_find(session->streams, stream))
  2623. return -EINVAL;
  2624. if (stream->close_int == TRUE) {
  2625. error("avdtp_close: rejecting since close is already initiated");
  2626. return -EINVAL;
  2627. }
  2628. /* If stream is not yet in the OPEN state, let's use ABORT_CMD */
  2629. if (stream->lsep->state < AVDTP_STATE_OPEN)
  2630. return avdtp_abort(session, stream);
  2631. if (immediate && session->req && stream == session->req->stream)
  2632. return avdtp_abort(session, stream);
  2633. memset(&req, 0, sizeof(req));
  2634. req.acp_seid = stream->rseid;
  2635. ret = send_request(session, FALSE, stream, AVDTP_CLOSE,
  2636. &req, sizeof(req));
  2637. if (ret == 0)
  2638. stream->close_int = TRUE;
  2639. return ret;
  2640. }
  2641. int avdtp_suspend(struct avdtp *session, struct avdtp_stream *stream)
  2642. {
  2643. struct seid_req req;
  2644. if (!g_slist_find(session->streams, stream))
  2645. return -EINVAL;
  2646. if (stream->lsep->state <= AVDTP_STATE_OPEN || stream->close_int)
  2647. return -EINVAL;
  2648. memset(&req, 0, sizeof(req));
  2649. req.acp_seid = stream->rseid;
  2650. return send_request(session, FALSE, stream, AVDTP_SUSPEND,
  2651. &req, sizeof(req));
  2652. }
  2653. int avdtp_abort(struct avdtp *session, struct avdtp_stream *stream)
  2654. {
  2655. struct seid_req req;
  2656. int ret;
  2657. if (!g_slist_find(session->streams, stream))
  2658. return -EINVAL;
  2659. if (stream->lsep->state == AVDTP_STATE_ABORTING)
  2660. return -EINVAL;
  2661. if (session->req && session->req->timeout > 0 &&
  2662. stream == session->req->stream)
  2663. return cancel_request(session, ECANCELED);
  2664. memset(&req, 0, sizeof(req));
  2665. req.acp_seid = stream->rseid;
  2666. ret = send_request(session, TRUE, stream, AVDTP_ABORT,
  2667. &req, sizeof(req));
  2668. if (ret == 0)
  2669. stream->abort_int = TRUE;
  2670. return ret;
  2671. }
  2672. int avdtp_delay_report(struct avdtp *session, struct avdtp_stream *stream,
  2673. uint16_t delay)
  2674. {
  2675. struct delay_req req;
  2676. if (!g_slist_find(session->streams, stream))
  2677. return -EINVAL;
  2678. if (stream->lsep->state != AVDTP_STATE_CONFIGURED &&
  2679. stream->lsep->state != AVDTP_STATE_STREAMING)
  2680. return -EINVAL;
  2681. if (!stream->delay_reporting || session->version < 0x0103)
  2682. return -EINVAL;
  2683. stream->delay = delay;
  2684. memset(&req, 0, sizeof(req));
  2685. req.acp_seid = stream->rseid;
  2686. req.delay = htons(delay);
  2687. return send_request(session, TRUE, stream, AVDTP_DELAY_REPORT,
  2688. &req, sizeof(req));
  2689. }
  2690. struct avdtp_local_sep *avdtp_register_sep(struct queue *lseps, uint8_t type,
  2691. uint8_t media_type,
  2692. uint8_t codec_type,
  2693. gboolean delay_reporting,
  2694. struct avdtp_sep_ind *ind,
  2695. struct avdtp_sep_cfm *cfm,
  2696. void *user_data)
  2697. {
  2698. struct avdtp_local_sep *sep;
  2699. uint8_t seid = util_get_uid(&seids, MAX_SEID);
  2700. if (!seid)
  2701. return NULL;
  2702. sep = g_new0(struct avdtp_local_sep, 1);
  2703. sep->state = AVDTP_STATE_IDLE;
  2704. sep->info.seid = seid;
  2705. sep->info.type = type;
  2706. sep->info.media_type = media_type;
  2707. sep->codec = codec_type;
  2708. sep->ind = ind;
  2709. sep->cfm = cfm;
  2710. sep->user_data = user_data;
  2711. sep->delay_reporting = delay_reporting;
  2712. DBG("SEP %p registered: type:%d codec:%d seid:%d", sep,
  2713. sep->info.type, sep->codec, sep->info.seid);
  2714. queue_push_tail(lseps, sep);
  2715. return sep;
  2716. }
  2717. void avdtp_sep_set_vendor_codec(struct avdtp_local_sep *sep, uint32_t vendor_id,
  2718. uint16_t codec_id)
  2719. {
  2720. sep->vndcodec_vendor = vendor_id;
  2721. sep->vndcodec_codec = codec_id;
  2722. }
  2723. int avdtp_unregister_sep(struct queue *lseps, struct avdtp_local_sep *sep)
  2724. {
  2725. if (!sep)
  2726. return -EINVAL;
  2727. if (sep->stream)
  2728. release_stream(sep->stream, sep->stream->session);
  2729. DBG("SEP %p unregistered: type:%d codec:%d seid:%d", sep,
  2730. sep->info.type, sep->codec, sep->info.seid);
  2731. util_clear_uid(&seids, sep->info.seid);
  2732. queue_remove(lseps, sep);
  2733. g_free(sep);
  2734. return 0;
  2735. }
  2736. const char *avdtp_strerror(struct avdtp_error *err)
  2737. {
  2738. if (err->category == AVDTP_ERRNO)
  2739. return strerror(err->err.posix_errno);
  2740. switch (err->err.error_code) {
  2741. case AVDTP_BAD_HEADER_FORMAT:
  2742. return "Bad Header Format";
  2743. case AVDTP_BAD_LENGTH:
  2744. return "Bad Packet Length";
  2745. case AVDTP_BAD_ACP_SEID:
  2746. return "Bad Acceptor SEID";
  2747. case AVDTP_SEP_IN_USE:
  2748. return "Stream End Point in Use";
  2749. case AVDTP_SEP_NOT_IN_USE:
  2750. return "Stream End Point Not in Use";
  2751. case AVDTP_BAD_SERV_CATEGORY:
  2752. return "Bad Service Category";
  2753. case AVDTP_BAD_PAYLOAD_FORMAT:
  2754. return "Bad Payload format";
  2755. case AVDTP_NOT_SUPPORTED_COMMAND:
  2756. return "Command Not Supported";
  2757. case AVDTP_INVALID_CAPABILITIES:
  2758. return "Invalid Capabilities";
  2759. case AVDTP_BAD_RECOVERY_TYPE:
  2760. return "Bad Recovery Type";
  2761. case AVDTP_BAD_MEDIA_TRANSPORT_FORMAT:
  2762. return "Bad Media Transport Format";
  2763. case AVDTP_BAD_RECOVERY_FORMAT:
  2764. return "Bad Recovery Format";
  2765. case AVDTP_BAD_ROHC_FORMAT:
  2766. return "Bad Header Compression Format";
  2767. case AVDTP_BAD_CP_FORMAT:
  2768. return "Bad Content Protection Format";
  2769. case AVDTP_BAD_MULTIPLEXING_FORMAT:
  2770. return "Bad Multiplexing Format";
  2771. case AVDTP_UNSUPPORTED_CONFIGURATION:
  2772. return "Configuration not supported";
  2773. case AVDTP_BAD_STATE:
  2774. return "Bad State";
  2775. default:
  2776. return "Unknown error";
  2777. }
  2778. }
  2779. avdtp_state_t avdtp_sep_get_state(struct avdtp_local_sep *sep)
  2780. {
  2781. return sep->state;
  2782. }
  2783. gboolean avdtp_has_stream(struct avdtp *session, struct avdtp_stream *stream)
  2784. {
  2785. return g_slist_find(session->streams, stream) ? TRUE : FALSE;
  2786. }