38#include <sys/kernel.h>
39#include <sys/malloc.h>
84 sizeof(*ep), M_NOWAIT);
88 bcopy(&l2cap->
bdaddr, &ep->
addr,
sizeof(bdaddr_t));
95"%s: %s - failed to send HOOK_INFO message to hook \"%s\", error=%d\n",
108 static int fake_con_handle = 0x0f00;
135 if (fake_con_handle > 0x0fff)
136 fake_con_handle = 0x0f00;
143 TAILQ_INIT(&con->cmd_list);
146 LIST_INSERT_HEAD(&l2cap->con_list, con, next);
164"%s: %s - bad auto disconnect timeout, state=%d, flags=%#x\n",
212"%s: %s - invalid timeout, state=%d, flags=%#x\n",
234"%s: %s - no disconnect timeout, state=%d, flags=%#x\n",
241 con->
flags &= ~NG_L2CAP_CON_AUTO_DISCON_TIMO;
257 while (con->
tx_pkt != NULL) {
258 struct mbuf *m = con->
tx_pkt->m_nextpkt;
266 for (f = LIST_FIRST(&con->
l2cap->chan_list); f != NULL; ) {
267 n = LIST_NEXT(f, next);
275 while (!TAILQ_EMPTY(&con->cmd_list)) {
286"%s: %s - timeout pending! state=%d, flags=%#x\n",
290 LIST_REMOVE(con, next);
292 bzero(con,
sizeof(*con));
305 LIST_FOREACH(con, &l2cap->con_list, next)
306 if ((bcmp(bdaddr, &con->
remote,
sizeof(con->
remote)) == 0)&&
322 LIST_FOREACH(con, &l2cap->con_list, next)
369 LIST_INSERT_HEAD(&l2cap->chan_list, ch, next);
373 bzero(ch,
sizeof(*ch));
391 LIST_FOREACH(ch, &l2cap->chan_list, next){
406 u_int16_t con_handle)
410 LIST_FOREACH(ch, &l2cap->chan_list, next){
427 f = TAILQ_FIRST(&ch->
con->cmd_list);
430 n = TAILQ_NEXT(f, next);
442 LIST_REMOVE(ch, next);
446 bzero(ch,
sizeof(*ch));
456 u_int8_t code, u_int32_t token)
460 KASSERT((ch == NULL || ch->
con == con),
461(
"%s: %s - invalid channel pointer!\n",
488 TAILQ_FOREACH(
cmd, &con->cmd_list, next) {
490 KASSERT((
cmd->con == con),
491(
"%s: %s - invalid connection pointer!\n",
511"%s: %s - invalid timeout, state=%d, flags=%#x\n",
533"%s: %s - no LP connection timeout, state=%d, flags=%#x\n",
540 con->
flags &= ~NG_L2CAP_CON_LP_TIMO;
557"%s: %s - duplicated command timeout, code=%#x, flags=%#x\n",
561 arg = ((
cmd->ident << 16) |
cmd->con->con_handle);
578"%s: %s - no command timeout, code=%#x, flags=%#x\n",
585 cmd->flags &= ~NG_L2CAP_CMD_PENDING;
597 M_PREPEND(m, size, M_NOWAIT);
598 if (m == NULL || (m->m_len < size && (m = m_pullup(m, size)) == NULL))
611 static ng_l2cap_flow_t default_flow = {
621 return (&default_flow);
637 endcid = l2cap->
lecid;
647 cid = (endcid+1) & mask;
652 while (cid != endcid) {
679 u_int8_t ident = con->
ident + 1;
684 while (ident != con->
ident) {
#define NG_HOOK_NOT_VALID(hook)
#define NG_NODE_NOT_VALID(node)
#define NG_NODE_NAME(node)
#define ng_callout_init(c)
int ng_uncallout(struct callout *c, node_p node)
#define NG_HOOK_NAME(hook)
#define NG_NODE_PRIVATE(node)
#define NG_SEND_MSG_HOOK(error, here, msg, hook, retaddr)
int ng_callout(struct callout *c, node_p node, hook_p hook, int ticks, ng_item_fn *fn, void *arg1, int arg2)
u_int32_t bluetooth_hci_connect_timeout(void)
#define NG_HCI_BDADDR_ANY
#define NG_HCI_SERVICE_TYPE_BEST_EFFORT
ng_l2cap_flow_t * ng_l2cap_flow_p
#define NG_L2CAP_CON_LP_TIMO
#define NG_L2CAP_L2CA_IDTYPE_LE
#define NG_L2CAP_L2CA_IDTYPE_BREDR
#define NG_L2CAP_L2CA_IDTYPE_SMP
#define NG_L2CAP_NULL_CID
#define NG_L2CAP_FLUSH_TIMO_DEFAULT
#define NG_L2CAP_LELAST_CID
#define NG_L2CAP_CON_AUTO_DISCON_TIMO
#define NG_L2CAP_CON_OUTGOING
#define NG_L2CAP_CON_OPEN
#define NG_L2CAP_CON_DYING
#define NG_L2CAP_MTU_DEFAULT
#define NG_L2CAP_L2CA_IDTYPE_ATT
#define NG_L2CAP_CON_CLOSED
#define NG_L2CAP_LAST_CID
#define NG_L2CAP_LINK_TIMO_DEFAULT
#define NGM_L2CAP_NODE_HOOK_INFO
#define NG_L2CAP_FIRST_CID
void ng_l2cap_process_command_timeout(node_p node, hook_p hook, void *arg1, int arg2)
void ng_l2cap_process_discon_timeout(node_p node, hook_p hook, void *arg1, int con_handle)
void ng_l2cap_process_lp_timeout(node_p node, hook_p hook, void *arg1, int con_handle)
void ng_l2cap_free_con(ng_l2cap_con_p con)
int ng_l2cap_discon_timeout(ng_l2cap_con_p con)
ng_l2cap_cmd_p ng_l2cap_cmd_by_ident(ng_l2cap_con_p con, u_int8_t ident)
void ng_l2cap_free_chan(ng_l2cap_chan_p ch)
u_int8_t ng_l2cap_get_ident(ng_l2cap_con_p con)
void ng_l2cap_con_ref(ng_l2cap_con_p con)
ng_l2cap_con_p ng_l2cap_con_by_handle(ng_l2cap_p l2cap, u_int16_t con_handle)
void ng_l2cap_send_hook_info(node_p node, hook_p hook, void *arg1, int arg2)
ng_l2cap_con_p ng_l2cap_con_by_addr(ng_l2cap_p l2cap, bdaddr_p bdaddr, unsigned int type)
int ng_l2cap_discon_untimeout(ng_l2cap_con_p con)
int ng_l2cap_lp_timeout(ng_l2cap_con_p con)
ng_l2cap_con_p ng_l2cap_new_con(ng_l2cap_p l2cap, bdaddr_p bdaddr, int type)
int ng_l2cap_command_untimeout(ng_l2cap_cmd_p cmd)
void ng_l2cap_con_unref(ng_l2cap_con_p con)
int ng_l2cap_lp_untimeout(ng_l2cap_con_p con)
int ng_l2cap_command_timeout(ng_l2cap_cmd_p cmd, int timo)
static u_int16_t ng_l2cap_get_cid(ng_l2cap_p, int)
struct mbuf * ng_l2cap_prepend(struct mbuf *m, int size)
ng_l2cap_flow_p ng_l2cap_default_flow(void)
ng_l2cap_cmd_p ng_l2cap_new_cmd(ng_l2cap_con_p con, ng_l2cap_chan_p ch, u_int8_t ident, u_int8_t code, u_int32_t token)
ng_l2cap_chan_p ng_l2cap_chan_by_conhandle(ng_l2cap_p l2cap, uint16_t scid, u_int16_t con_handle)
ng_l2cap_chan_p ng_l2cap_new_chan(ng_l2cap_p l2cap, ng_l2cap_con_p con, u_int16_t psm, int idtype)
ng_l2cap_chan_p ng_l2cap_chan_by_scid(ng_l2cap_p l2cap, u_int16_t scid, int idtype)
#define ng_l2cap_unlink_cmd(cmd)
#define ng_l2cap_free_cmd(cmd)
#define NG_L2CAP_FIRST_IDENT
#define NG_L2CAP_NULL_IDENT
#define NG_L2CAP_CMD_PENDING
#define NG_MKMESSAGE(msg, cookie, cmdid, len, how)
ng_l2cap_node_auto_discon_ep discon_timo