avct_lcb.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. /******************************************************************************
  2. *
  3. * Copyright (C) 2003-2012 Broadcom Corporation
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at:
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. ******************************************************************************/
  18. /******************************************************************************
  19. *
  20. * This module contains the link control state machine and functions which
  21. * operate on the link control block.
  22. *
  23. ******************************************************************************/
  24. #include <string.h>
  25. #include "stack/bt_types.h"
  26. #include "common/bt_target.h"
  27. #include "common/bt_defs.h"
  28. #include "stack/avct_api.h"
  29. #include "avct_int.h"
  30. #include "osi/allocator.h"
  31. #if (defined(AVCT_INCLUDED) && AVCT_INCLUDED == TRUE)
  32. /*****************************************************************************
  33. ** state machine constants and types
  34. *****************************************************************************/
  35. #if BT_TRACE_VERBOSE == TRUE
  36. /* verbose state strings for trace */
  37. const char *const avct_lcb_st_str[] = {
  38. "LCB_IDLE_ST",
  39. "LCB_OPENING_ST",
  40. "LCB_OPEN_ST",
  41. "LCB_CLOSING_ST"
  42. };
  43. /* verbose event strings for trace */
  44. const char *const avct_lcb_evt_str[] = {
  45. "UL_BIND_EVT",
  46. "UL_UNBIND_EVT",
  47. "UL_MSG_EVT",
  48. "INT_CLOSE_EVT",
  49. "LL_OPEN_EVT",
  50. "LL_CLOSE_EVT",
  51. "LL_MSG_EVT",
  52. "LL_CONG_EVT"
  53. };
  54. #endif
  55. /* lcb state machine states */
  56. enum {
  57. AVCT_LCB_IDLE_ST,
  58. AVCT_LCB_OPENING_ST,
  59. AVCT_LCB_OPEN_ST,
  60. AVCT_LCB_CLOSING_ST
  61. };
  62. /* state machine action enumeration list */
  63. enum {
  64. AVCT_LCB_CHNL_OPEN,
  65. AVCT_LCB_CHNL_DISC,
  66. AVCT_LCB_SEND_MSG,
  67. AVCT_LCB_OPEN_IND,
  68. AVCT_LCB_OPEN_FAIL,
  69. AVCT_LCB_CLOSE_IND,
  70. AVCT_LCB_CLOSE_CFM,
  71. AVCT_LCB_MSG_IND,
  72. AVCT_LCB_CONG_IND,
  73. AVCT_LCB_BIND_CONN,
  74. AVCT_LCB_BIND_FAIL,
  75. AVCT_LCB_UNBIND_DISC,
  76. AVCT_LCB_CHK_DISC,
  77. AVCT_LCB_DISCARD_MSG,
  78. AVCT_LCB_DEALLOC,
  79. AVCT_LCB_FREE_MSG_IND,
  80. AVCT_LCB_NUM_ACTIONS
  81. };
  82. #define AVCT_LCB_IGNORE AVCT_LCB_NUM_ACTIONS
  83. /* type for action functions */
  84. typedef void (*tAVCT_LCB_ACTION)(tAVCT_LCB *p_ccb, tAVCT_LCB_EVT *p_data);
  85. /* action function list */
  86. const tAVCT_LCB_ACTION avct_lcb_action[] = {
  87. avct_lcb_chnl_open,
  88. avct_lcb_chnl_disc,
  89. avct_lcb_send_msg,
  90. avct_lcb_open_ind,
  91. avct_lcb_open_fail,
  92. avct_lcb_close_ind,
  93. avct_lcb_close_cfm,
  94. avct_lcb_msg_ind,
  95. avct_lcb_cong_ind,
  96. avct_lcb_bind_conn,
  97. avct_lcb_bind_fail,
  98. avct_lcb_unbind_disc,
  99. avct_lcb_chk_disc,
  100. avct_lcb_discard_msg,
  101. avct_lcb_dealloc,
  102. avct_lcb_free_msg_ind
  103. };
  104. /* state table information */
  105. #define AVCT_LCB_ACTIONS 2 /* number of actions */
  106. #define AVCT_LCB_NEXT_STATE 2 /* position of next state */
  107. #define AVCT_LCB_NUM_COLS 3 /* number of columns in state tables */
  108. /* state table for idle state */
  109. const UINT8 avct_lcb_st_idle[][AVCT_LCB_NUM_COLS] = {
  110. /* Event Action 1 Action 2 Next state */
  111. /* UL_BIND_EVT */ {AVCT_LCB_CHNL_OPEN, AVCT_LCB_IGNORE, AVCT_LCB_OPENING_ST},
  112. /* UL_UNBIND_EVT */ {AVCT_LCB_UNBIND_DISC, AVCT_LCB_IGNORE, AVCT_LCB_IDLE_ST},
  113. /* UL_MSG_EVT */ {AVCT_LCB_DISCARD_MSG, AVCT_LCB_IGNORE, AVCT_LCB_IDLE_ST},
  114. /* INT_CLOSE_EVT */ {AVCT_LCB_IGNORE, AVCT_LCB_IGNORE, AVCT_LCB_IDLE_ST},
  115. /* LL_OPEN_EVT */ {AVCT_LCB_OPEN_IND, AVCT_LCB_IGNORE, AVCT_LCB_OPEN_ST},
  116. /* LL_CLOSE_EVT */ {AVCT_LCB_CLOSE_IND, AVCT_LCB_DEALLOC, AVCT_LCB_IDLE_ST},
  117. /* LL_MSG_EVT */ {AVCT_LCB_FREE_MSG_IND, AVCT_LCB_IGNORE, AVCT_LCB_IDLE_ST},
  118. /* LL_CONG_EVT */ {AVCT_LCB_IGNORE, AVCT_LCB_IGNORE, AVCT_LCB_IDLE_ST}
  119. };
  120. /* state table for opening state */
  121. const UINT8 avct_lcb_st_opening[][AVCT_LCB_NUM_COLS] = {
  122. /* Event Action 1 Action 2 Next state */
  123. /* UL_BIND_EVT */ {AVCT_LCB_IGNORE, AVCT_LCB_IGNORE, AVCT_LCB_OPENING_ST},
  124. /* UL_UNBIND_EVT */ {AVCT_LCB_UNBIND_DISC, AVCT_LCB_IGNORE, AVCT_LCB_OPENING_ST},
  125. /* UL_MSG_EVT */ {AVCT_LCB_DISCARD_MSG, AVCT_LCB_IGNORE, AVCT_LCB_OPENING_ST},
  126. /* INT_CLOSE_EVT */ {AVCT_LCB_CHNL_DISC, AVCT_LCB_IGNORE, AVCT_LCB_CLOSING_ST},
  127. /* LL_OPEN_EVT */ {AVCT_LCB_OPEN_IND, AVCT_LCB_IGNORE, AVCT_LCB_OPEN_ST},
  128. /* LL_CLOSE_EVT */ {AVCT_LCB_OPEN_FAIL, AVCT_LCB_DEALLOC, AVCT_LCB_IDLE_ST},
  129. /* LL_MSG_EVT */ {AVCT_LCB_FREE_MSG_IND, AVCT_LCB_IGNORE, AVCT_LCB_OPENING_ST},
  130. /* LL_CONG_EVT */ {AVCT_LCB_CONG_IND, AVCT_LCB_IGNORE, AVCT_LCB_OPENING_ST}
  131. };
  132. /* state table for open state */
  133. const UINT8 avct_lcb_st_open[][AVCT_LCB_NUM_COLS] = {
  134. /* Event Action 1 Action 2 Next state */
  135. /* UL_BIND_EVT */ {AVCT_LCB_BIND_CONN, AVCT_LCB_IGNORE, AVCT_LCB_OPEN_ST},
  136. /* UL_UNBIND_EVT */ {AVCT_LCB_CHK_DISC, AVCT_LCB_IGNORE, AVCT_LCB_OPEN_ST},
  137. /* UL_MSG_EVT */ {AVCT_LCB_SEND_MSG, AVCT_LCB_IGNORE, AVCT_LCB_OPEN_ST},
  138. /* INT_CLOSE_EVT */ {AVCT_LCB_CHNL_DISC, AVCT_LCB_IGNORE, AVCT_LCB_CLOSING_ST},
  139. /* LL_OPEN_EVT */ {AVCT_LCB_IGNORE, AVCT_LCB_IGNORE, AVCT_LCB_OPEN_ST},
  140. /* LL_CLOSE_EVT */ {AVCT_LCB_CLOSE_IND, AVCT_LCB_DEALLOC, AVCT_LCB_IDLE_ST},
  141. /* LL_MSG_EVT */ {AVCT_LCB_MSG_IND, AVCT_LCB_IGNORE, AVCT_LCB_OPEN_ST},
  142. /* LL_CONG_EVT */ {AVCT_LCB_CONG_IND, AVCT_LCB_IGNORE, AVCT_LCB_OPEN_ST}
  143. };
  144. /* state table for closing state */
  145. const UINT8 avct_lcb_st_closing[][AVCT_LCB_NUM_COLS] = {
  146. /* Event Action 1 Action 2 Next state */
  147. /* UL_BIND_EVT */ {AVCT_LCB_BIND_FAIL, AVCT_LCB_IGNORE, AVCT_LCB_CLOSING_ST},
  148. /* UL_UNBIND_EVT */ {AVCT_LCB_IGNORE, AVCT_LCB_IGNORE, AVCT_LCB_CLOSING_ST},
  149. /* UL_MSG_EVT */ {AVCT_LCB_DISCARD_MSG, AVCT_LCB_IGNORE, AVCT_LCB_CLOSING_ST},
  150. /* INT_CLOSE_EVT */ {AVCT_LCB_IGNORE, AVCT_LCB_IGNORE, AVCT_LCB_CLOSING_ST},
  151. /* LL_OPEN_EVT */ {AVCT_LCB_IGNORE, AVCT_LCB_IGNORE, AVCT_LCB_CLOSING_ST},
  152. /* LL_CLOSE_EVT */ {AVCT_LCB_CLOSE_CFM, AVCT_LCB_DEALLOC, AVCT_LCB_IDLE_ST},
  153. /* LL_MSG_EVT */ {AVCT_LCB_FREE_MSG_IND, AVCT_LCB_IGNORE, AVCT_LCB_CLOSING_ST},
  154. /* LL_CONG_EVT */ {AVCT_LCB_IGNORE, AVCT_LCB_IGNORE, AVCT_LCB_CLOSING_ST}
  155. };
  156. /* type for state table */
  157. typedef const UINT8 (*tAVCT_LCB_ST_TBL)[AVCT_LCB_NUM_COLS];
  158. /* state table */
  159. const tAVCT_LCB_ST_TBL avct_lcb_st_tbl[] = {
  160. avct_lcb_st_idle,
  161. avct_lcb_st_opening,
  162. avct_lcb_st_open,
  163. avct_lcb_st_closing
  164. };
  165. /*******************************************************************************
  166. **
  167. ** Function avct_lcb_event
  168. **
  169. ** Description State machine event handling function for lcb
  170. **
  171. **
  172. ** Returns Nothing.
  173. **
  174. *******************************************************************************/
  175. void avct_lcb_event(tAVCT_LCB *p_lcb, UINT8 event, tAVCT_LCB_EVT *p_data)
  176. {
  177. tAVCT_LCB_ST_TBL state_table;
  178. UINT8 action;
  179. int i;
  180. #if BT_TRACE_VERBOSE == TRUE
  181. AVCT_TRACE_EVENT("LCB lcb=%d event=%s state=%s", p_lcb->allocated, avct_lcb_evt_str[event], avct_lcb_st_str[p_lcb->state]);
  182. #else
  183. AVCT_TRACE_EVENT("LCB lcb=%d event=%d state=%d", p_lcb->allocated, event, p_lcb->state);
  184. #endif
  185. /* look up the state table for the current state */
  186. state_table = avct_lcb_st_tbl[p_lcb->state];
  187. /* set next state */
  188. p_lcb->state = state_table[event][AVCT_LCB_NEXT_STATE];
  189. /* execute action functions */
  190. for (i = 0; i < AVCT_LCB_ACTIONS; i++) {
  191. if ((action = state_table[event][i]) != AVCT_LCB_IGNORE) {
  192. (*avct_lcb_action[action])(p_lcb, p_data);
  193. } else {
  194. break;
  195. }
  196. }
  197. }
  198. /*******************************************************************************
  199. **
  200. ** Function avct_bcb_event
  201. **
  202. ** Description State machine event handling function for lcb
  203. **
  204. **
  205. ** Returns Nothing.
  206. **
  207. *******************************************************************************/
  208. #if (AVCT_BROWSE_INCLUDED == TRUE)
  209. void avct_bcb_event(tAVCT_BCB *p_bcb, UINT8 event, tAVCT_LCB_EVT *p_data)
  210. {
  211. tAVCT_LCB_ST_TBL state_table;
  212. UINT8 action;
  213. int i;
  214. #if BT_TRACE_VERBOSE == TRUE
  215. AVCT_TRACE_EVENT("BCB lcb=%d event=%s state=%s", p_bcb->allocated, avct_lcb_evt_str[event], avct_lcb_st_str[p_bcb->state]);
  216. #else
  217. AVCT_TRACE_EVENT("BCB lcb=%d event=%d state=%d", p_bcb->allocated, event, p_bcb->state);
  218. #endif
  219. /* look up the state table for the current state */
  220. state_table = avct_lcb_st_tbl[p_bcb->state];
  221. /* set next state */
  222. p_bcb->state = state_table[event][AVCT_LCB_NEXT_STATE];
  223. /* execute action functions */
  224. for (i = 0; i < AVCT_LCB_ACTIONS; i++) {
  225. if ((action = state_table[event][i]) != AVCT_LCB_IGNORE) {
  226. (*avct_bcb_action[action])(p_bcb, p_data);
  227. } else {
  228. break;
  229. }
  230. }
  231. }
  232. #endif
  233. /*******************************************************************************
  234. **
  235. ** Function avct_lcb_by_bd
  236. **
  237. ** Description This lookup function finds the lcb for a BD address.
  238. **
  239. **
  240. ** Returns pointer to the lcb, or NULL if none found.
  241. **
  242. *******************************************************************************/
  243. tAVCT_LCB *avct_lcb_by_bd(BD_ADDR bd_addr)
  244. {
  245. tAVCT_LCB *p_lcb = &avct_cb.lcb[0];
  246. int i;
  247. for (i = 0; i < AVCT_NUM_LINKS; i++, p_lcb++) {
  248. /* if allocated lcb has matching lcb */
  249. if (p_lcb->allocated && (!memcmp(p_lcb->peer_addr, bd_addr, BD_ADDR_LEN))) {
  250. break;
  251. }
  252. }
  253. if (i == AVCT_NUM_LINKS) {
  254. /* if no lcb found */
  255. p_lcb = NULL;
  256. AVCT_TRACE_DEBUG("No lcb for addr %02x-%02x-%02x-%02x-%02x-%02x",
  257. bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
  258. }
  259. return p_lcb;
  260. }
  261. /*******************************************************************************
  262. **
  263. ** Function avct_lcb_alloc
  264. **
  265. ** Description Allocate a link control block.
  266. **
  267. **
  268. ** Returns pointer to the lcb, or NULL if none could be allocated.
  269. **
  270. *******************************************************************************/
  271. tAVCT_LCB *avct_lcb_alloc(BD_ADDR bd_addr)
  272. {
  273. tAVCT_LCB *p_lcb = &avct_cb.lcb[0];
  274. int i;
  275. for (i = 0; i < AVCT_NUM_LINKS; i++, p_lcb++) {
  276. if (!p_lcb->allocated) {
  277. p_lcb->allocated = (UINT8)(i + 1);
  278. memcpy(p_lcb->peer_addr, bd_addr, BD_ADDR_LEN);
  279. AVCT_TRACE_DEBUG("avct_lcb_alloc %d", p_lcb->allocated);
  280. p_lcb->tx_q = fixed_queue_new(QUEUE_SIZE_MAX);
  281. break;
  282. }
  283. }
  284. if (i == AVCT_NUM_LINKS) {
  285. /* out of lcbs */
  286. p_lcb = NULL;
  287. AVCT_TRACE_WARNING("Out of lcbs");
  288. }
  289. return p_lcb;
  290. }
  291. /*******************************************************************************
  292. **
  293. ** Function avct_lcb_dealloc
  294. **
  295. ** Description Deallocate a link control block.
  296. **
  297. **
  298. ** Returns void.
  299. **
  300. *******************************************************************************/
  301. void avct_lcb_dealloc(tAVCT_LCB *p_lcb, tAVCT_LCB_EVT *p_data)
  302. {
  303. UNUSED(p_data);
  304. AVCT_TRACE_DEBUG("%s allocated: %d", __func__, p_lcb->allocated);
  305. // Check if the LCB is still referenced
  306. tAVCT_CCB *p_ccb = &avct_cb.ccb[0];
  307. for (size_t i = 0; i < AVCT_NUM_CONN; i++, p_ccb++)
  308. {
  309. if (p_ccb->allocated && p_ccb->p_lcb == p_lcb)
  310. {
  311. AVCT_TRACE_DEBUG("%s LCB in use; lcb index: %d", __func__, i);
  312. return;
  313. }
  314. }
  315. // If not, de-allocate now...
  316. AVCT_TRACE_DEBUG("%s Freeing LCB", __func__);
  317. osi_free(p_lcb->p_rx_msg);
  318. fixed_queue_free(p_lcb->tx_q, NULL);
  319. memset(p_lcb, 0, sizeof(tAVCT_LCB));
  320. }
  321. /*******************************************************************************
  322. **
  323. ** Function avct_lcb_by_lcid
  324. **
  325. ** Description Find the LCB associated with the L2CAP LCID
  326. **
  327. **
  328. ** Returns pointer to the lcb, or NULL if none found.
  329. **
  330. *******************************************************************************/
  331. tAVCT_LCB *avct_lcb_by_lcid(UINT16 lcid)
  332. {
  333. tAVCT_LCB *p_lcb = &avct_cb.lcb[0];
  334. int i;
  335. for (i = 0; i < AVCT_NUM_LINKS; i++, p_lcb++) {
  336. if (p_lcb->allocated && ((p_lcb->ch_lcid == lcid) || (p_lcb->conflict_lcid == lcid))) {
  337. break;
  338. }
  339. }
  340. if (i == AVCT_NUM_LINKS) {
  341. /* out of lcbs */
  342. p_lcb = NULL;
  343. AVCT_TRACE_WARNING("No lcb for lcid %x", lcid);
  344. }
  345. return p_lcb;
  346. }
  347. /*******************************************************************************
  348. **
  349. ** Function avct_lcb_has_pid
  350. **
  351. ** Description See if any ccbs on this lcb have a particular pid.
  352. **
  353. **
  354. ** Returns Pointer to CCB if PID found, NULL otherwise.
  355. **
  356. *******************************************************************************/
  357. tAVCT_CCB *avct_lcb_has_pid(tAVCT_LCB *p_lcb, UINT16 pid)
  358. {
  359. tAVCT_CCB *p_ccb = &avct_cb.ccb[0];
  360. int i;
  361. for (i = 0; i < AVCT_NUM_CONN; i++, p_ccb++) {
  362. if (p_ccb->allocated && (p_ccb->p_lcb == p_lcb) && (p_ccb->cc.pid == pid)) {
  363. return p_ccb;
  364. }
  365. }
  366. return NULL;
  367. }
  368. /*******************************************************************************
  369. **
  370. ** Function avct_lcb_last_ccb
  371. **
  372. ** Description See if given ccb is only one on the lcb.
  373. **
  374. **
  375. ** Returns TRUE if ccb is last, FALSE otherwise.
  376. **
  377. *******************************************************************************/
  378. BOOLEAN avct_lcb_last_ccb(tAVCT_LCB *p_lcb, tAVCT_CCB *p_ccb_last)
  379. {
  380. tAVCT_CCB *p_ccb = &avct_cb.ccb[0];
  381. int i;
  382. AVCT_TRACE_WARNING("avct_lcb_last_ccb");
  383. for (i = 0; i < AVCT_NUM_CONN; i++, p_ccb++) {
  384. AVCT_TRACE_WARNING("%x: aloc:%d, lcb:%p/%p, ccb:%p/%p",
  385. i, p_ccb->allocated, p_ccb->p_lcb, p_lcb, p_ccb, p_ccb_last);
  386. if (p_ccb->allocated && (p_ccb->p_lcb == p_lcb) && (p_ccb != p_ccb_last)) {
  387. return FALSE;
  388. }
  389. }
  390. return TRUE;
  391. }
  392. #endif /* #if (defined(AVCT_INCLUDED) && AVCT_INCLUDED == TRUE) */