diff options
Diffstat (limited to 'net/bluetooth/l2cap.c')
| -rw-r--r-- | net/bluetooth/l2cap.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 9ba1e8eee37c..3e3cd9d4e52c 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -2527,6 +2527,10 @@ done: | |||
| 2527 | if (pi->imtu != L2CAP_DEFAULT_MTU) | 2527 | if (pi->imtu != L2CAP_DEFAULT_MTU) |
| 2528 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu); | 2528 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->imtu); |
| 2529 | 2529 | ||
| 2530 | if (!(pi->conn->feat_mask & L2CAP_FEAT_ERTM) && | ||
| 2531 | !(pi->conn->feat_mask & L2CAP_FEAT_STREAMING)) | ||
| 2532 | break; | ||
| 2533 | |||
| 2530 | rfc.mode = L2CAP_MODE_BASIC; | 2534 | rfc.mode = L2CAP_MODE_BASIC; |
| 2531 | rfc.txwin_size = 0; | 2535 | rfc.txwin_size = 0; |
| 2532 | rfc.max_transmit = 0; | 2536 | rfc.max_transmit = 0; |
| @@ -2534,6 +2538,8 @@ done: | |||
| 2534 | rfc.monitor_timeout = 0; | 2538 | rfc.monitor_timeout = 0; |
| 2535 | rfc.max_pdu_size = 0; | 2539 | rfc.max_pdu_size = 0; |
| 2536 | 2540 | ||
| 2541 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc), | ||
| 2542 | (unsigned long) &rfc); | ||
| 2537 | break; | 2543 | break; |
| 2538 | 2544 | ||
| 2539 | case L2CAP_MODE_ERTM: | 2545 | case L2CAP_MODE_ERTM: |
| @@ -2546,6 +2552,9 @@ done: | |||
| 2546 | if (L2CAP_DEFAULT_MAX_PDU_SIZE > pi->conn->mtu - 10) | 2552 | if (L2CAP_DEFAULT_MAX_PDU_SIZE > pi->conn->mtu - 10) |
| 2547 | rfc.max_pdu_size = cpu_to_le16(pi->conn->mtu - 10); | 2553 | rfc.max_pdu_size = cpu_to_le16(pi->conn->mtu - 10); |
| 2548 | 2554 | ||
| 2555 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc), | ||
| 2556 | (unsigned long) &rfc); | ||
| 2557 | |||
| 2549 | if (!(pi->conn->feat_mask & L2CAP_FEAT_FCS)) | 2558 | if (!(pi->conn->feat_mask & L2CAP_FEAT_FCS)) |
| 2550 | break; | 2559 | break; |
| 2551 | 2560 | ||
| @@ -2566,6 +2575,9 @@ done: | |||
| 2566 | if (L2CAP_DEFAULT_MAX_PDU_SIZE > pi->conn->mtu - 10) | 2575 | if (L2CAP_DEFAULT_MAX_PDU_SIZE > pi->conn->mtu - 10) |
| 2567 | rfc.max_pdu_size = cpu_to_le16(pi->conn->mtu - 10); | 2576 | rfc.max_pdu_size = cpu_to_le16(pi->conn->mtu - 10); |
| 2568 | 2577 | ||
| 2578 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc), | ||
| 2579 | (unsigned long) &rfc); | ||
| 2580 | |||
| 2569 | if (!(pi->conn->feat_mask & L2CAP_FEAT_FCS)) | 2581 | if (!(pi->conn->feat_mask & L2CAP_FEAT_FCS)) |
| 2570 | break; | 2582 | break; |
| 2571 | 2583 | ||
| @@ -2577,9 +2589,6 @@ done: | |||
| 2577 | break; | 2589 | break; |
| 2578 | } | 2590 | } |
| 2579 | 2591 | ||
| 2580 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, sizeof(rfc), | ||
| 2581 | (unsigned long) &rfc); | ||
| 2582 | |||
| 2583 | /* FIXME: Need actual value of the flush timeout */ | 2592 | /* FIXME: Need actual value of the flush timeout */ |
| 2584 | //if (flush_to != L2CAP_DEFAULT_FLUSH_TO) | 2593 | //if (flush_to != L2CAP_DEFAULT_FLUSH_TO) |
| 2585 | // l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, 2, pi->flush_to); | 2594 | // l2cap_add_conf_opt(&ptr, L2CAP_CONF_FLUSH_TO, 2, pi->flush_to); |
| @@ -3339,6 +3348,15 @@ static inline int l2cap_information_rsp(struct l2cap_conn *conn, struct l2cap_cm | |||
| 3339 | 3348 | ||
| 3340 | del_timer(&conn->info_timer); | 3349 | del_timer(&conn->info_timer); |
| 3341 | 3350 | ||
| 3351 | if (result != L2CAP_IR_SUCCESS) { | ||
| 3352 | conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; | ||
| 3353 | conn->info_ident = 0; | ||
| 3354 | |||
| 3355 | l2cap_conn_start(conn); | ||
| 3356 | |||
| 3357 | return 0; | ||
| 3358 | } | ||
| 3359 | |||
| 3342 | if (type == L2CAP_IT_FEAT_MASK) { | 3360 | if (type == L2CAP_IT_FEAT_MASK) { |
| 3343 | conn->feat_mask = get_unaligned_le32(rsp->data); | 3361 | conn->feat_mask = get_unaligned_le32(rsp->data); |
| 3344 | 3362 | ||
