| 240 | */ |
| 241 | |
| 242 | void |
| 243 | ng_l2cap_con_fail(ng_l2cap_con_p con, u_int16_t result) |
| 244 | { |
| 245 | ng_l2cap_p l2cap = con->l2cap; |
| 246 | ng_l2cap_cmd_p cmd = NULL; |
| 247 | ng_l2cap_chan_p ch = NULL; |
| 248 | |
| 249 | NG_L2CAP_INFO( |
| 250 | "%s: %s - ACL connection failed, result=%d\n", |
| 251 | __func__, NG_NODE_NAME(l2cap->node), result); |
| 252 | |
| 253 | /* Connection is dying */ |
| 254 | con->flags |= NG_L2CAP_CON_DYING; |
| 255 | |
| 256 | /* Clean command queue */ |
| 257 | while (!TAILQ_EMPTY(&con->cmd_list)) { |
| 258 | cmd = TAILQ_FIRST(&con->cmd_list); |
| 259 | |
| 260 | ng_l2cap_unlink_cmd(cmd); |
| 261 | if(cmd->flags & NG_L2CAP_CMD_PENDING) |
| 262 | ng_l2cap_command_untimeout(cmd); |
| 263 | |
| 264 | KASSERT((cmd->con == con), |
| 265 | ("%s: %s - invalid connection pointer!\n", |
| 266 | __func__, NG_NODE_NAME(l2cap->node))); |
| 267 | |
| 268 | switch (cmd->code) { |
| 269 | case NG_L2CAP_CMD_REJ: |
| 270 | case NG_L2CAP_DISCON_RSP: |
| 271 | case NG_L2CAP_ECHO_RSP: |
| 272 | case NG_L2CAP_INFO_RSP: |
| 273 | case NG_L2CAP_CMD_PARAM_UPDATE_RESPONSE: |
| 274 | break; |
| 275 | |
| 276 | case NG_L2CAP_CON_REQ: |
| 277 | ng_l2cap_l2ca_con_rsp(cmd->ch, cmd->token, result, 0); |
| 278 | break; |
| 279 | |
| 280 | case NG_L2CAP_CON_RSP: |
| 281 | if (cmd->ch != NULL) |
| 282 | ng_l2cap_l2ca_con_rsp_rsp(cmd->ch, cmd->token, |
| 283 | result); |
| 284 | break; |
| 285 | |
| 286 | case NG_L2CAP_CFG_REQ: |
| 287 | case NG_L2CAP_CFG_RSP: |
| 288 | case NGM_L2CAP_L2CA_WRITE: |
| 289 | ng_l2cap_l2ca_discon_ind(cmd->ch); |
| 290 | break; |
| 291 | |
| 292 | case NG_L2CAP_DISCON_REQ: |
| 293 | ng_l2cap_l2ca_discon_rsp(cmd->ch, cmd->token, |
| 294 | NG_L2CAP_SUCCESS); |
| 295 | break; |
| 296 | |
| 297 | case NG_L2CAP_ECHO_REQ: |
| 298 | ng_l2cap_l2ca_ping_rsp(cmd->con, cmd->token, |
| 299 | result, NULL); |
no test coverage detected