aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMat Martineau <mathewm@codeaurora.org>2012-05-17 23:53:38 -0400
committerJohan Hedberg <johan.hedberg@intel.com>2012-06-04 23:34:03 -0400
commitf5dbb0772df3feb2bb5eda8a9f0e0acdeb25653f (patch)
treef533909d89af56e6abd9cf1a4ab95a8791162372
parent4b51dae96731c9d82f5634e75ac7ffd3b9c1b060 (diff)
Bluetooth: Remove receive code that has been superceded
This deletes the receive code that had handlers for each frame type at the top level, and then had logic to determine the receive state within each handler. Signed-off-by: Mat Martineau <mathewm@codeaurora.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
-rw-r--r--include/net/bluetooth/l2cap.h8
-rw-r--r--net/bluetooth/l2cap_core.c492
2 files changed, 0 insertions, 500 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index 452fcc4c0fff..7d1da5a7d11e 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -419,11 +419,6 @@ struct l2cap_seq_list {
419#define L2CAP_SEQ_LIST_CLEAR 0xFFFF 419#define L2CAP_SEQ_LIST_CLEAR 0xFFFF
420#define L2CAP_SEQ_LIST_TAIL 0x8000 420#define L2CAP_SEQ_LIST_TAIL 0x8000
421 421
422struct srej_list {
423 __u16 tx_seq;
424 struct list_head list;
425};
426
427struct l2cap_chan { 422struct l2cap_chan {
428 struct sock *sk; 423 struct sock *sk;
429 424
@@ -475,14 +470,12 @@ struct l2cap_chan {
475 __u16 expected_ack_seq; 470 __u16 expected_ack_seq;
476 __u16 expected_tx_seq; 471 __u16 expected_tx_seq;
477 __u16 buffer_seq; 472 __u16 buffer_seq;
478 __u16 buffer_seq_srej;
479 __u16 srej_save_reqseq; 473 __u16 srej_save_reqseq;
480 __u16 last_acked_seq; 474 __u16 last_acked_seq;
481 __u16 frames_sent; 475 __u16 frames_sent;
482 __u16 unacked_frames; 476 __u16 unacked_frames;
483 __u8 retry_count; 477 __u8 retry_count;
484 __u16 srej_queue_next; 478 __u16 srej_queue_next;
485 __u8 num_acked;
486 __u16 sdu_len; 479 __u16 sdu_len;
487 struct sk_buff *sdu; 480 struct sk_buff *sdu;
488 struct sk_buff *sdu_last_frag; 481 struct sk_buff *sdu_last_frag;
@@ -515,7 +508,6 @@ struct l2cap_chan {
515 struct sk_buff_head srej_q; 508 struct sk_buff_head srej_q;
516 struct l2cap_seq_list srej_list; 509 struct l2cap_seq_list srej_list;
517 struct l2cap_seq_list retrans_list; 510 struct l2cap_seq_list retrans_list;
518 struct list_head srej_l;
519 511
520 struct list_head list; 512 struct list_head list;
521 struct list_head global_l; 513 struct list_head global_l;
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 0a195ab4a385..d795d15cadf9 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -534,8 +534,6 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err)
534 skb_queue_purge(&chan->tx_q); 534 skb_queue_purge(&chan->tx_q);
535 535
536 if (chan->mode == L2CAP_MODE_ERTM) { 536 if (chan->mode == L2CAP_MODE_ERTM) {
537 struct srej_list *l, *tmp;
538
539 __clear_retrans_timer(chan); 537 __clear_retrans_timer(chan);
540 __clear_monitor_timer(chan); 538 __clear_monitor_timer(chan);
541 __clear_ack_timer(chan); 539 __clear_ack_timer(chan);
@@ -544,10 +542,6 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err)
544 542
545 l2cap_seq_list_free(&chan->srej_list); 543 l2cap_seq_list_free(&chan->srej_list);
546 l2cap_seq_list_free(&chan->retrans_list); 544 l2cap_seq_list_free(&chan->retrans_list);
547 list_for_each_entry_safe(l, tmp, &chan->srej_l, list) {
548 list_del(&l->list);
549 kfree(l);
550 }
551 } 545 }
552} 546}
553 547
@@ -1658,25 +1652,6 @@ static void l2cap_retrans_timeout(struct work_struct *work)
1658 l2cap_chan_put(chan); 1652 l2cap_chan_put(chan);
1659} 1653}
1660 1654
1661static void l2cap_drop_acked_frames(struct l2cap_chan *chan)
1662{
1663 struct sk_buff *skb;
1664
1665 while ((skb = skb_peek(&chan->tx_q)) &&
1666 chan->unacked_frames) {
1667 if (bt_cb(skb)->control.txseq == chan->expected_ack_seq)
1668 break;
1669
1670 skb = skb_dequeue(&chan->tx_q);
1671 kfree_skb(skb);
1672
1673 chan->unacked_frames--;
1674 }
1675
1676 if (!chan->unacked_frames)
1677 __clear_retrans_timer(chan);
1678}
1679
1680static int l2cap_streaming_send(struct l2cap_chan *chan, 1655static int l2cap_streaming_send(struct l2cap_chan *chan,
1681 struct sk_buff_head *skbs) 1656 struct sk_buff_head *skbs)
1682{ 1657{
@@ -1718,53 +1693,6 @@ static int l2cap_streaming_send(struct l2cap_chan *chan,
1718 return 0; 1693 return 0;
1719} 1694}
1720 1695
1721static void l2cap_retransmit_one_frame(struct l2cap_chan *chan, u16 tx_seq)
1722{
1723 struct sk_buff *skb, *tx_skb;
1724 u16 fcs;
1725 u32 control;
1726
1727 skb = skb_peek(&chan->tx_q);
1728 if (!skb)
1729 return;
1730
1731 while (bt_cb(skb)->control.txseq != tx_seq) {
1732 if (skb_queue_is_last(&chan->tx_q, skb))
1733 return;
1734
1735 skb = skb_queue_next(&chan->tx_q, skb);
1736 }
1737
1738 if (bt_cb(skb)->control.retries == chan->remote_max_tx &&
1739 chan->remote_max_tx) {
1740 l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED);
1741 return;
1742 }
1743
1744 tx_skb = skb_clone(skb, GFP_ATOMIC);
1745 bt_cb(skb)->control.retries++;
1746
1747 control = __get_control(chan, tx_skb->data + L2CAP_HDR_SIZE);
1748 control &= __get_sar_mask(chan);
1749
1750 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state))
1751 control |= __set_ctrl_final(chan);
1752
1753 control |= __set_reqseq(chan, chan->buffer_seq);
1754 control |= __set_txseq(chan, tx_seq);
1755
1756 __put_control(chan, control, tx_skb->data + L2CAP_HDR_SIZE);
1757
1758 if (chan->fcs == L2CAP_FCS_CRC16) {
1759 fcs = crc16(0, (u8 *)tx_skb->data,
1760 tx_skb->len - L2CAP_FCS_SIZE);
1761 put_unaligned_le16(fcs,
1762 tx_skb->data + tx_skb->len - L2CAP_FCS_SIZE);
1763 }
1764
1765 l2cap_do_send(chan, tx_skb);
1766}
1767
1768static int l2cap_ertm_send(struct l2cap_chan *chan) 1696static int l2cap_ertm_send(struct l2cap_chan *chan)
1769{ 1697{
1770 struct sk_buff *skb, *tx_skb; 1698 struct sk_buff *skb, *tx_skb;
@@ -1868,18 +1796,6 @@ static void l2cap_send_ack(struct l2cap_chan *chan)
1868 __l2cap_send_ack(chan); 1796 __l2cap_send_ack(chan);
1869} 1797}
1870 1798
1871static void l2cap_send_srejtail(struct l2cap_chan *chan)
1872{
1873 struct srej_list *tail;
1874 u32 control;
1875
1876 control = __set_ctrl_super(chan, L2CAP_SUPER_SREJ);
1877 control |= __set_ctrl_final(chan);
1878
1879 tail = list_entry((&chan->srej_l)->prev, struct srej_list, list);
1880 control |= __set_reqseq(chan, tail->tx_seq);
1881}
1882
1883static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan, 1799static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan,
1884 struct msghdr *msg, int len, 1800 struct msghdr *msg, int len,
1885 int count, struct sk_buff *skb) 1801 int count, struct sk_buff *skb)
@@ -2639,7 +2555,6 @@ static inline int l2cap_ertm_init(struct l2cap_chan *chan)
2639 chan->expected_ack_seq = 0; 2555 chan->expected_ack_seq = 0;
2640 chan->unacked_frames = 0; 2556 chan->unacked_frames = 0;
2641 chan->buffer_seq = 0; 2557 chan->buffer_seq = 0;
2642 chan->num_acked = 0;
2643 chan->frames_sent = 0; 2558 chan->frames_sent = 0;
2644 chan->last_acked_seq = 0; 2559 chan->last_acked_seq = 0;
2645 chan->sdu = NULL; 2560 chan->sdu = NULL;
@@ -2660,7 +2575,6 @@ static inline int l2cap_ertm_init(struct l2cap_chan *chan)
2660 2575
2661 skb_queue_head_init(&chan->srej_q); 2576 skb_queue_head_init(&chan->srej_q);
2662 2577
2663 INIT_LIST_HEAD(&chan->srej_l);
2664 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win); 2578 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win);
2665 if (err < 0) 2579 if (err < 0)
2666 return err; 2580 return err;
@@ -4277,41 +4191,6 @@ static inline void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan)
4277 } 4191 }
4278} 4192}
4279 4193
4280static int l2cap_add_to_srej_queue(struct l2cap_chan *chan, struct sk_buff *skb, u16 tx_seq, u8 sar)
4281{
4282 struct sk_buff *next_skb;
4283 int tx_seq_offset, next_tx_seq_offset;
4284
4285 bt_cb(skb)->control.txseq = tx_seq;
4286 bt_cb(skb)->control.sar = sar;
4287
4288 next_skb = skb_peek(&chan->srej_q);
4289
4290 tx_seq_offset = __seq_offset(chan, tx_seq, chan->buffer_seq);
4291
4292 while (next_skb) {
4293 if (bt_cb(next_skb)->control.txseq == tx_seq)
4294 return -EINVAL;
4295
4296 next_tx_seq_offset = __seq_offset(chan,
4297 bt_cb(next_skb)->control.txseq, chan->buffer_seq);
4298
4299 if (next_tx_seq_offset > tx_seq_offset) {
4300 __skb_queue_before(&chan->srej_q, next_skb, skb);
4301 return 0;
4302 }
4303
4304 if (skb_queue_is_last(&chan->srej_q, next_skb))
4305 next_skb = NULL;
4306 else
4307 next_skb = skb_queue_next(&chan->srej_q, next_skb);
4308 }
4309
4310 __skb_queue_tail(&chan->srej_q, skb);
4311
4312 return 0;
4313}
4314
4315static void append_skb_frag(struct sk_buff *skb, 4194static void append_skb_frag(struct sk_buff *skb,
4316 struct sk_buff *new_frag, struct sk_buff **last_frag) 4195 struct sk_buff *new_frag, struct sk_buff **last_frag)
4317{ 4196{
@@ -4457,377 +4336,6 @@ void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
4457 } 4336 }
4458} 4337}
4459 4338
4460static void l2cap_check_srej_gap(struct l2cap_chan *chan, u16 tx_seq)
4461{
4462 struct sk_buff *skb;
4463 u32 control;
4464
4465 while ((skb = skb_peek(&chan->srej_q)) &&
4466 !test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4467 int err;
4468
4469 if (bt_cb(skb)->control.txseq != tx_seq)
4470 break;
4471
4472 skb = skb_dequeue(&chan->srej_q);
4473 control = __set_ctrl_sar(chan, bt_cb(skb)->control.sar);
4474
4475 if (err < 0) {
4476 l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
4477 break;
4478 }
4479
4480 chan->buffer_seq_srej = __next_seq(chan, chan->buffer_seq_srej);
4481 tx_seq = __next_seq(chan, tx_seq);
4482 }
4483}
4484
4485static void l2cap_resend_srejframe(struct l2cap_chan *chan, u16 tx_seq)
4486{
4487 struct srej_list *l, *tmp;
4488 u32 control;
4489
4490 list_for_each_entry_safe(l, tmp, &chan->srej_l, list) {
4491 if (l->tx_seq == tx_seq) {
4492 list_del(&l->list);
4493 kfree(l);
4494 return;
4495 }
4496 control = __set_ctrl_super(chan, L2CAP_SUPER_SREJ);
4497 control |= __set_reqseq(chan, l->tx_seq);
4498 list_del(&l->list);
4499 list_add_tail(&l->list, &chan->srej_l);
4500 }
4501}
4502
4503static int l2cap_send_srejframe(struct l2cap_chan *chan, u16 tx_seq)
4504{
4505 struct srej_list *new;
4506 u32 control;
4507
4508 while (tx_seq != chan->expected_tx_seq) {
4509 control = __set_ctrl_super(chan, L2CAP_SUPER_SREJ);
4510 control |= __set_reqseq(chan, chan->expected_tx_seq);
4511 l2cap_seq_list_append(&chan->srej_list, chan->expected_tx_seq);
4512
4513 new = kzalloc(sizeof(struct srej_list), GFP_ATOMIC);
4514 if (!new)
4515 return -ENOMEM;
4516
4517 new->tx_seq = chan->expected_tx_seq;
4518
4519 chan->expected_tx_seq = __next_seq(chan, chan->expected_tx_seq);
4520
4521 list_add_tail(&new->list, &chan->srej_l);
4522 }
4523
4524 chan->expected_tx_seq = __next_seq(chan, chan->expected_tx_seq);
4525
4526 return 0;
4527}
4528
4529static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u32 rx_control, struct sk_buff *skb)
4530{
4531 u16 tx_seq = __get_txseq(chan, rx_control);
4532 u16 req_seq = __get_reqseq(chan, rx_control);
4533 u8 sar = __get_ctrl_sar(chan, rx_control);
4534 int tx_seq_offset, expected_tx_seq_offset;
4535 int num_to_ack = (chan->tx_win/6) + 1;
4536 int err = 0;
4537
4538 BT_DBG("chan %p len %d tx_seq %d rx_control 0x%8.8x", chan, skb->len,
4539 tx_seq, rx_control);
4540
4541 if (__is_ctrl_final(chan, rx_control) &&
4542 test_bit(CONN_WAIT_F, &chan->conn_state)) {
4543 __clear_monitor_timer(chan);
4544 if (chan->unacked_frames > 0)
4545 __set_retrans_timer(chan);
4546 clear_bit(CONN_WAIT_F, &chan->conn_state);
4547 }
4548
4549 chan->expected_ack_seq = req_seq;
4550 l2cap_drop_acked_frames(chan);
4551
4552 tx_seq_offset = __seq_offset(chan, tx_seq, chan->buffer_seq);
4553
4554 /* invalid tx_seq */
4555 if (tx_seq_offset >= chan->tx_win) {
4556 l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
4557 goto drop;
4558 }
4559
4560 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
4561 if (!test_bit(CONN_RNR_SENT, &chan->conn_state))
4562 l2cap_send_ack(chan);
4563 goto drop;
4564 }
4565
4566 if (tx_seq == chan->expected_tx_seq)
4567 goto expected;
4568
4569 if (test_bit(CONN_SREJ_SENT, &chan->conn_state)) {
4570 struct srej_list *first;
4571
4572 first = list_first_entry(&chan->srej_l,
4573 struct srej_list, list);
4574 if (tx_seq == first->tx_seq) {
4575 l2cap_add_to_srej_queue(chan, skb, tx_seq, sar);
4576 l2cap_check_srej_gap(chan, tx_seq);
4577
4578 list_del(&first->list);
4579 kfree(first);
4580
4581 if (list_empty(&chan->srej_l)) {
4582 chan->buffer_seq = chan->buffer_seq_srej;
4583 clear_bit(CONN_SREJ_SENT, &chan->conn_state);
4584 l2cap_send_ack(chan);
4585 BT_DBG("chan %p, Exit SREJ_SENT", chan);
4586 }
4587 } else {
4588 struct srej_list *l;
4589
4590 /* duplicated tx_seq */
4591 if (l2cap_add_to_srej_queue(chan, skb, tx_seq, sar) < 0)
4592 goto drop;
4593
4594 list_for_each_entry(l, &chan->srej_l, list) {
4595 if (l->tx_seq == tx_seq) {
4596 l2cap_resend_srejframe(chan, tx_seq);
4597 return 0;
4598 }
4599 }
4600
4601 err = l2cap_send_srejframe(chan, tx_seq);
4602 if (err < 0) {
4603 l2cap_send_disconn_req(chan->conn, chan, -err);
4604 return err;
4605 }
4606 }
4607 } else {
4608 expected_tx_seq_offset = __seq_offset(chan,
4609 chan->expected_tx_seq, chan->buffer_seq);
4610
4611 /* duplicated tx_seq */
4612 if (tx_seq_offset < expected_tx_seq_offset)
4613 goto drop;
4614
4615 set_bit(CONN_SREJ_SENT, &chan->conn_state);
4616
4617 BT_DBG("chan %p, Enter SREJ", chan);
4618
4619 INIT_LIST_HEAD(&chan->srej_l);
4620 chan->buffer_seq_srej = chan->buffer_seq;
4621
4622 __skb_queue_head_init(&chan->srej_q);
4623 l2cap_add_to_srej_queue(chan, skb, tx_seq, sar);
4624
4625 /* Set P-bit only if there are some I-frames to ack. */
4626 if (__clear_ack_timer(chan))
4627 set_bit(CONN_SEND_PBIT, &chan->conn_state);
4628
4629 err = l2cap_send_srejframe(chan, tx_seq);
4630 if (err < 0) {
4631 l2cap_send_disconn_req(chan->conn, chan, -err);
4632 return err;
4633 }
4634 }
4635 return 0;
4636
4637expected:
4638 chan->expected_tx_seq = __next_seq(chan, chan->expected_tx_seq);
4639
4640 if (test_bit(CONN_SREJ_SENT, &chan->conn_state)) {
4641 bt_cb(skb)->control.txseq = tx_seq;
4642 bt_cb(skb)->control.sar = sar;
4643 __skb_queue_tail(&chan->srej_q, skb);
4644 return 0;
4645 }
4646
4647 chan->buffer_seq = __next_seq(chan, chan->buffer_seq);
4648
4649 if (err < 0) {
4650 l2cap_send_disconn_req(chan->conn, chan, ECONNRESET);
4651 return err;
4652 }
4653
4654 if (__is_ctrl_final(chan, rx_control)) {
4655 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
4656 l2cap_retransmit_frames(chan);
4657 }
4658
4659
4660 chan->num_acked = (chan->num_acked + 1) % num_to_ack;
4661 if (chan->num_acked == num_to_ack - 1)
4662 l2cap_send_ack(chan);
4663 else
4664 __set_ack_timer(chan);
4665
4666 return 0;
4667
4668drop:
4669 kfree_skb(skb);
4670 return 0;
4671}
4672
4673static inline void l2cap_data_channel_rrframe(struct l2cap_chan *chan, u32 rx_control)
4674{
4675 BT_DBG("chan %p, req_seq %d ctrl 0x%8.8x", chan,
4676 __get_reqseq(chan, rx_control), rx_control);
4677
4678 chan->expected_ack_seq = __get_reqseq(chan, rx_control);
4679 l2cap_drop_acked_frames(chan);
4680
4681 if (__is_ctrl_poll(chan, rx_control)) {
4682 set_bit(CONN_SEND_FBIT, &chan->conn_state);
4683 if (test_bit(CONN_SREJ_SENT, &chan->conn_state)) {
4684 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
4685 (chan->unacked_frames > 0))
4686 __set_retrans_timer(chan);
4687
4688 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
4689 l2cap_send_srejtail(chan);
4690 } else {
4691 l2cap_send_i_or_rr_or_rnr(chan);
4692 }
4693
4694 } else if (__is_ctrl_final(chan, rx_control)) {
4695 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
4696
4697 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
4698 l2cap_retransmit_frames(chan);
4699
4700 } else {
4701 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state) &&
4702 (chan->unacked_frames > 0))
4703 __set_retrans_timer(chan);
4704
4705 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
4706 if (test_bit(CONN_SREJ_SENT, &chan->conn_state))
4707 l2cap_send_ack(chan);
4708 else
4709 l2cap_ertm_send(chan);
4710 }
4711}
4712
4713static inline void l2cap_data_channel_rejframe(struct l2cap_chan *chan, u32 rx_control)
4714{
4715 u16 tx_seq = __get_reqseq(chan, rx_control);
4716
4717 BT_DBG("chan %p, req_seq %d ctrl 0x%8.8x", chan, tx_seq, rx_control);
4718
4719 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
4720
4721 chan->expected_ack_seq = tx_seq;
4722 l2cap_drop_acked_frames(chan);
4723
4724 if (__is_ctrl_final(chan, rx_control)) {
4725 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state))
4726 l2cap_retransmit_frames(chan);
4727 } else {
4728 l2cap_retransmit_frames(chan);
4729
4730 if (test_bit(CONN_WAIT_F, &chan->conn_state))
4731 set_bit(CONN_REJ_ACT, &chan->conn_state);
4732 }
4733}
4734static inline void l2cap_data_channel_srejframe(struct l2cap_chan *chan, u32 rx_control)
4735{
4736 u16 tx_seq = __get_reqseq(chan, rx_control);
4737
4738 BT_DBG("chan %p, req_seq %d ctrl 0x%8.8x", chan, tx_seq, rx_control);
4739
4740 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state);
4741
4742 if (__is_ctrl_poll(chan, rx_control)) {
4743 chan->expected_ack_seq = tx_seq;
4744 l2cap_drop_acked_frames(chan);
4745
4746 set_bit(CONN_SEND_FBIT, &chan->conn_state);
4747 l2cap_retransmit_one_frame(chan, tx_seq);
4748
4749 l2cap_ertm_send(chan);
4750
4751 if (test_bit(CONN_WAIT_F, &chan->conn_state)) {
4752 chan->srej_save_reqseq = tx_seq;
4753 set_bit(CONN_SREJ_ACT, &chan->conn_state);
4754 }
4755 } else if (__is_ctrl_final(chan, rx_control)) {
4756 if (test_bit(CONN_SREJ_ACT, &chan->conn_state) &&
4757 chan->srej_save_reqseq == tx_seq)
4758 clear_bit(CONN_SREJ_ACT, &chan->conn_state);
4759 else
4760 l2cap_retransmit_one_frame(chan, tx_seq);
4761 } else {
4762 l2cap_retransmit_one_frame(chan, tx_seq);
4763 if (test_bit(CONN_WAIT_F, &chan->conn_state)) {
4764 chan->srej_save_reqseq = tx_seq;
4765 set_bit(CONN_SREJ_ACT, &chan->conn_state);
4766 }
4767 }
4768}
4769
4770static inline void l2cap_data_channel_rnrframe(struct l2cap_chan *chan, u32 rx_control)
4771{
4772 u16 tx_seq = __get_reqseq(chan, rx_control);
4773
4774 BT_DBG("chan %p, req_seq %d ctrl 0x%8.8x", chan, tx_seq, rx_control);
4775
4776 set_bit(CONN_REMOTE_BUSY, &chan->conn_state);
4777 chan->expected_ack_seq = tx_seq;
4778 l2cap_drop_acked_frames(chan);
4779
4780 if (__is_ctrl_poll(chan, rx_control))
4781 set_bit(CONN_SEND_FBIT, &chan->conn_state);
4782
4783 if (!test_bit(CONN_SREJ_SENT, &chan->conn_state)) {
4784 __clear_retrans_timer(chan);
4785 if (__is_ctrl_poll(chan, rx_control))
4786 l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_FINAL);
4787 return;
4788 }
4789
4790 if (__is_ctrl_poll(chan, rx_control)) {
4791 l2cap_send_srejtail(chan);
4792 } else {
4793 rx_control = __set_ctrl_super(chan, L2CAP_SUPER_RR);
4794 }
4795}
4796
4797static inline int l2cap_data_channel_sframe(struct l2cap_chan *chan, u32 rx_control, struct sk_buff *skb)
4798{
4799 BT_DBG("chan %p rx_control 0x%8.8x len %d", chan, rx_control, skb->len);
4800
4801 if (__is_ctrl_final(chan, rx_control) &&
4802 test_bit(CONN_WAIT_F, &chan->conn_state)) {
4803 __clear_monitor_timer(chan);
4804 if (chan->unacked_frames > 0)
4805 __set_retrans_timer(chan);
4806 clear_bit(CONN_WAIT_F, &chan->conn_state);
4807 }
4808
4809 switch (__get_ctrl_super(chan, rx_control)) {
4810 case L2CAP_SUPER_RR:
4811 l2cap_data_channel_rrframe(chan, rx_control);
4812 break;
4813
4814 case L2CAP_SUPER_REJ:
4815 l2cap_data_channel_rejframe(chan, rx_control);
4816 break;
4817
4818 case L2CAP_SUPER_SREJ:
4819 l2cap_data_channel_srejframe(chan, rx_control);
4820 break;
4821
4822 case L2CAP_SUPER_RNR:
4823 l2cap_data_channel_rnrframe(chan, rx_control);
4824 break;
4825 }
4826
4827 kfree_skb(skb);
4828 return 0;
4829}
4830
4831static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq) 4339static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)
4832{ 4340{
4833 BT_DBG("chan %p, txseq %d", chan, txseq); 4341 BT_DBG("chan %p, txseq %d", chan, txseq);