Changeset View
Changeset View
Standalone View
Standalone View
head/sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.c
Show First 20 Lines • Show All 80 Lines • ▼ Show 20 Lines | if (cmd == NULL) | ||||
return; | return; | ||||
/* Detach command packet */ | /* Detach command packet */ | ||||
m = cmd->aux; | m = cmd->aux; | ||||
cmd->aux = NULL; | cmd->aux = NULL; | ||||
/* Process command */ | /* Process command */ | ||||
switch (cmd->code) { | switch (cmd->code) { | ||||
case NG_L2CAP_CMD_REJ: | |||||
case NG_L2CAP_DISCON_RSP: | case NG_L2CAP_DISCON_RSP: | ||||
case NG_L2CAP_ECHO_RSP: | case NG_L2CAP_ECHO_RSP: | ||||
case NG_L2CAP_INFO_RSP: | case NG_L2CAP_INFO_RSP: | ||||
/* | /* | ||||
* Do not check return ng_l2cap_lp_send() value, because | * Do not check return ng_l2cap_lp_send() value, because | ||||
* in these cases we do not really have a graceful way out. | * in these cases we do not really have a graceful way out. | ||||
* ECHO and INFO responses are internal to the stack and not | * ECHO and INFO responses are internal to the stack and not | ||||
* visible to user. REJect is just being nice to remote end | * visible to user. REJect is just being nice to remote end | ||||
* (otherwise remote end will timeout anyway). DISCON is | * (otherwise remote end will timeout anyway). DISCON is | ||||
* probably most interesting here, however, if it fails | * probably most interesting here, however, if it fails | ||||
* there is nothing we can do anyway. | * there is nothing we can do anyway. | ||||
*/ | */ | ||||
(void) ng_l2cap_lp_send(con, NG_L2CAP_SIGNAL_CID, m); | (void) ng_l2cap_lp_send(con, NG_L2CAP_SIGNAL_CID, m); | ||||
ng_l2cap_unlink_cmd(cmd); | ng_l2cap_unlink_cmd(cmd); | ||||
ng_l2cap_free_cmd(cmd); | ng_l2cap_free_cmd(cmd); | ||||
break; | break; | ||||
case NG_L2CAP_CMD_REJ: | |||||
(void) ng_l2cap_lp_send(con, | |||||
(con->linktype == NG_HCI_LINK_ACL)? | |||||
NG_L2CAP_SIGNAL_CID: | |||||
NG_L2CAP_LESIGNAL_CID | |||||
, m); | |||||
ng_l2cap_unlink_cmd(cmd); | |||||
ng_l2cap_free_cmd(cmd); | |||||
break; | |||||
case NG_L2CAP_CON_REQ: | case NG_L2CAP_CON_REQ: | ||||
error = ng_l2cap_lp_send(con, NG_L2CAP_SIGNAL_CID, m); | error = ng_l2cap_lp_send(con, NG_L2CAP_SIGNAL_CID, m); | ||||
if (error != 0) { | if (error != 0) { | ||||
ng_l2cap_l2ca_con_rsp(cmd->ch, cmd->token, | ng_l2cap_l2ca_con_rsp(cmd->ch, cmd->token, | ||||
NG_L2CAP_NO_RESOURCES, 0); | NG_L2CAP_NO_RESOURCES, 0); | ||||
ng_l2cap_free_chan(cmd->ch); /* will free commands */ | ng_l2cap_free_chan(cmd->ch); /* will free commands */ | ||||
} else | } else | ||||
ng_l2cap_command_timeout(cmd, | ng_l2cap_command_timeout(cmd, | ||||
bluetooth_l2cap_rtx_timeout()); | bluetooth_l2cap_rtx_timeout()); | ||||
break; | break; | ||||
case NG_L2CAP_CON_RSP: | case NG_L2CAP_CON_RSP: | ||||
error = ng_l2cap_lp_send(con, NG_L2CAP_SIGNAL_CID, m); | error = ng_l2cap_lp_send(con, NG_L2CAP_SIGNAL_CID, m); | ||||
ng_l2cap_unlink_cmd(cmd); | ng_l2cap_unlink_cmd(cmd); | ||||
if (cmd->ch != NULL) { | if (cmd->ch != NULL) { | ||||
ng_l2cap_l2ca_con_rsp_rsp(cmd->ch, cmd->token, | ng_l2cap_l2ca_con_rsp_rsp(cmd->ch, cmd->token, | ||||
(error == 0)? NG_L2CAP_SUCCESS : | (error == 0)? NG_L2CAP_SUCCESS : | ||||
NG_L2CAP_NO_RESOURCES); | NG_L2CAP_NO_RESOURCES); | ||||
if (error != 0) | if (error != 0) | ||||
▲ Show 20 Lines • Show All 76 Lines • ▼ Show 20 Lines | case NGM_L2CAP_L2CA_WRITE: { | ||||
ng_l2cap_l2ca_write_rsp(cmd->ch, cmd->token, | ng_l2cap_l2ca_write_rsp(cmd->ch, cmd->token, | ||||
(error == 0)? NG_L2CAP_SUCCESS : NG_L2CAP_NO_RESOURCES, | (error == 0)? NG_L2CAP_SUCCESS : NG_L2CAP_NO_RESOURCES, | ||||
length); | length); | ||||
ng_l2cap_unlink_cmd(cmd); | ng_l2cap_unlink_cmd(cmd); | ||||
ng_l2cap_free_cmd(cmd); | ng_l2cap_free_cmd(cmd); | ||||
} break; | } break; | ||||
case NG_L2CAP_CMD_PARAM_UPDATE_RESPONSE: | |||||
error = ng_l2cap_lp_send(con, NG_L2CAP_LESIGNAL_CID, m); | |||||
ng_l2cap_unlink_cmd(cmd); | |||||
ng_l2cap_free_cmd(cmd); | |||||
break; | |||||
case NG_L2CAP_CMD_PARAM_UPDATE_REQUEST: | |||||
/*TBD.*/ | |||||
/* XXX FIXME add other commands */ | /* XXX FIXME add other commands */ | ||||
default: | default: | ||||
panic( | panic( | ||||
"%s: %s - unknown command code=%d\n", | "%s: %s - unknown command code=%d\n", | ||||
__func__, NG_NODE_NAME(con->l2cap->node), cmd->code); | __func__, NG_NODE_NAME(con->l2cap->node), cmd->code); | ||||
break; | break; | ||||
} | } | ||||
} /* ng_l2cap_con_wakeup */ | } /* ng_l2cap_con_wakeup */ | ||||
Show All 29 Lines | |||||
("%s: %s - invalid connection pointer!\n", | ("%s: %s - invalid connection pointer!\n", | ||||
__func__, NG_NODE_NAME(l2cap->node))); | __func__, NG_NODE_NAME(l2cap->node))); | ||||
switch (cmd->code) { | switch (cmd->code) { | ||||
case NG_L2CAP_CMD_REJ: | case NG_L2CAP_CMD_REJ: | ||||
case NG_L2CAP_DISCON_RSP: | case NG_L2CAP_DISCON_RSP: | ||||
case NG_L2CAP_ECHO_RSP: | case NG_L2CAP_ECHO_RSP: | ||||
case NG_L2CAP_INFO_RSP: | case NG_L2CAP_INFO_RSP: | ||||
case NG_L2CAP_CMD_PARAM_UPDATE_RESPONSE: | |||||
break; | break; | ||||
case NG_L2CAP_CON_REQ: | case NG_L2CAP_CON_REQ: | ||||
ng_l2cap_l2ca_con_rsp(cmd->ch, cmd->token, result, 0); | ng_l2cap_l2ca_con_rsp(cmd->ch, cmd->token, result, 0); | ||||
break; | break; | ||||
case NG_L2CAP_CON_RSP: | case NG_L2CAP_CON_RSP: | ||||
if (cmd->ch != NULL) | if (cmd->ch != NULL) | ||||
▲ Show 20 Lines • Show All 132 Lines • Show Last 20 Lines |