Lines Matching refs:control

63 static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
904 static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control) in __unpack_enhanced_control() argument
906 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT; in __unpack_enhanced_control()
907 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT; in __unpack_enhanced_control()
911 control->sframe = 1; in __unpack_enhanced_control()
912 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT; in __unpack_enhanced_control()
913 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT; in __unpack_enhanced_control()
915 control->sar = 0; in __unpack_enhanced_control()
916 control->txseq = 0; in __unpack_enhanced_control()
919 control->sframe = 0; in __unpack_enhanced_control()
920 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT; in __unpack_enhanced_control()
921 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT; in __unpack_enhanced_control()
923 control->poll = 0; in __unpack_enhanced_control()
924 control->super = 0; in __unpack_enhanced_control()
928 static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control) in __unpack_extended_control() argument
930 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT; in __unpack_extended_control()
931 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT; in __unpack_extended_control()
935 control->sframe = 1; in __unpack_extended_control()
936 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT; in __unpack_extended_control()
937 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT; in __unpack_extended_control()
939 control->sar = 0; in __unpack_extended_control()
940 control->txseq = 0; in __unpack_extended_control()
943 control->sframe = 0; in __unpack_extended_control()
944 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT; in __unpack_extended_control()
945 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT; in __unpack_extended_control()
947 control->poll = 0; in __unpack_extended_control()
948 control->super = 0; in __unpack_extended_control()
966 static u32 __pack_extended_control(struct l2cap_ctrl *control) in __pack_extended_control() argument
970 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT; in __pack_extended_control()
971 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT; in __pack_extended_control()
973 if (control->sframe) { in __pack_extended_control()
974 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT; in __pack_extended_control()
975 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT; in __pack_extended_control()
978 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT; in __pack_extended_control()
979 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT; in __pack_extended_control()
985 static u16 __pack_enhanced_control(struct l2cap_ctrl *control) in __pack_enhanced_control() argument
989 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT; in __pack_enhanced_control()
990 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT; in __pack_enhanced_control()
992 if (control->sframe) { in __pack_enhanced_control()
993 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT; in __pack_enhanced_control()
994 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT; in __pack_enhanced_control()
997 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT; in __pack_enhanced_control()
998 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT; in __pack_enhanced_control()
1005 struct l2cap_ctrl *control, in __pack_control() argument
1009 put_unaligned_le32(__pack_extended_control(control), in __pack_control()
1012 put_unaligned_le16(__pack_enhanced_control(control), in __pack_control()
1026 u32 control) in l2cap_create_sframe_pdu() argument
1045 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE)); in l2cap_create_sframe_pdu()
1047 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE)); in l2cap_create_sframe_pdu()
1059 struct l2cap_ctrl *control) in l2cap_send_sframe() argument
1064 BT_DBG("chan %p, control %p", chan, control); in l2cap_send_sframe()
1066 if (!control->sframe) in l2cap_send_sframe()
1073 !control->poll) in l2cap_send_sframe()
1074 control->final = 1; in l2cap_send_sframe()
1076 if (control->super == L2CAP_SUPER_RR) in l2cap_send_sframe()
1078 else if (control->super == L2CAP_SUPER_RNR) in l2cap_send_sframe()
1081 if (control->super != L2CAP_SUPER_SREJ) { in l2cap_send_sframe()
1082 chan->last_acked_seq = control->reqseq; in l2cap_send_sframe()
1086 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq, in l2cap_send_sframe()
1087 control->final, control->poll, control->super); in l2cap_send_sframe()
1090 control_field = __pack_extended_control(control); in l2cap_send_sframe()
1092 control_field = __pack_enhanced_control(control); in l2cap_send_sframe()
1101 struct l2cap_ctrl control; in l2cap_send_rr_or_rnr() local
1105 memset(&control, 0, sizeof(control)); in l2cap_send_rr_or_rnr()
1106 control.sframe = 1; in l2cap_send_rr_or_rnr()
1107 control.poll = poll; in l2cap_send_rr_or_rnr()
1110 control.super = L2CAP_SUPER_RNR; in l2cap_send_rr_or_rnr()
1112 control.super = L2CAP_SUPER_RR; in l2cap_send_rr_or_rnr()
1114 control.reqseq = chan->buffer_seq; in l2cap_send_rr_or_rnr()
1115 l2cap_send_sframe(chan, &control); in l2cap_send_rr_or_rnr()
1832 struct l2cap_ctrl *control; in l2cap_streaming_send() local
1846 control = &bt_cb(skb)->l2cap; in l2cap_streaming_send()
1848 control->reqseq = 0; in l2cap_streaming_send()
1849 control->txseq = chan->next_tx_seq; in l2cap_streaming_send()
1851 __pack_control(chan, control, skb); in l2cap_streaming_send()
1860 BT_DBG("Sent txseq %u", control->txseq); in l2cap_streaming_send()
1870 struct l2cap_ctrl *control; in l2cap_ertm_send() local
1891 control = &bt_cb(skb)->l2cap; in l2cap_ertm_send()
1894 control->final = 1; in l2cap_ertm_send()
1896 control->reqseq = chan->buffer_seq; in l2cap_ertm_send()
1898 control->txseq = chan->next_tx_seq; in l2cap_ertm_send()
1900 __pack_control(chan, control, skb); in l2cap_ertm_send()
1928 BT_DBG("Sent txseq %u", control->txseq); in l2cap_ertm_send()
1939 struct l2cap_ctrl control; in l2cap_ertm_resend() local
1963 control = bt_cb(skb)->l2cap; in l2cap_ertm_resend()
1973 control.reqseq = chan->buffer_seq; in l2cap_ertm_resend()
1975 control.final = 1; in l2cap_ertm_resend()
1977 control.final = 0; in l2cap_ertm_resend()
1995 put_unaligned_le32(__pack_extended_control(&control), in l2cap_ertm_resend()
1998 put_unaligned_le16(__pack_enhanced_control(&control), in l2cap_ertm_resend()
2012 BT_DBG("Resent txseq %d", control.txseq); in l2cap_ertm_resend()
2019 struct l2cap_ctrl *control) in l2cap_retransmit() argument
2021 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit()
2023 l2cap_seq_list_append(&chan->retrans_list, control->reqseq); in l2cap_retransmit()
2028 struct l2cap_ctrl *control) in l2cap_retransmit_all() argument
2032 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit_all()
2034 if (control->poll) in l2cap_retransmit_all()
2044 if (bt_cb(skb)->l2cap.txseq == control->reqseq || in l2cap_retransmit_all()
2063 struct l2cap_ctrl control; in l2cap_send_ack() local
2071 memset(&control, 0, sizeof(control)); in l2cap_send_ack()
2072 control.sframe = 1; in l2cap_send_ack()
2077 control.super = L2CAP_SUPER_RNR; in l2cap_send_ack()
2078 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2079 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2100 control.super = L2CAP_SUPER_RR; in l2cap_send_ack()
2101 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2102 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2552 struct l2cap_ctrl control; in l2cap_send_srej() local
2557 memset(&control, 0, sizeof(control)); in l2cap_send_srej()
2558 control.sframe = 1; in l2cap_send_srej()
2559 control.super = L2CAP_SUPER_SREJ; in l2cap_send_srej()
2564 control.reqseq = seq; in l2cap_send_srej()
2565 l2cap_send_sframe(chan, &control); in l2cap_send_srej()
2575 struct l2cap_ctrl control; in l2cap_send_srej_tail() local
2582 memset(&control, 0, sizeof(control)); in l2cap_send_srej_tail()
2583 control.sframe = 1; in l2cap_send_srej_tail()
2584 control.super = L2CAP_SUPER_SREJ; in l2cap_send_srej_tail()
2585 control.reqseq = chan->srej_list.tail; in l2cap_send_srej_tail()
2586 l2cap_send_sframe(chan, &control); in l2cap_send_srej_tail()
2591 struct l2cap_ctrl control; in l2cap_send_srej_list() local
2597 memset(&control, 0, sizeof(control)); in l2cap_send_srej_list()
2598 control.sframe = 1; in l2cap_send_srej_list()
2599 control.super = L2CAP_SUPER_SREJ; in l2cap_send_srej_list()
2609 control.reqseq = seq; in l2cap_send_srej_list()
2610 l2cap_send_sframe(chan, &control); in l2cap_send_srej_list()
2658 struct l2cap_ctrl *control, in l2cap_tx_state_xmit() argument
2661 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_xmit()
2706 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_xmit()
2730 struct l2cap_ctrl *control, in l2cap_tx_state_wait_f() argument
2733 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_wait_f()
2776 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_wait_f()
2781 if (control && control->final) { in l2cap_tx_state_wait_f()
2807 static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_tx() argument
2811 chan, control, skbs, event, chan->tx_state); in l2cap_tx()
2815 l2cap_tx_state_xmit(chan, control, skbs, event); in l2cap_tx()
2818 l2cap_tx_state_wait_f(chan, control, skbs, event); in l2cap_tx()
2827 struct l2cap_ctrl *control) in l2cap_pass_to_tx() argument
2829 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx()
2830 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT); in l2cap_pass_to_tx()
2834 struct l2cap_ctrl *control) in l2cap_pass_to_tx_fbit() argument
2836 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx_fbit()
2837 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT); in l2cap_pass_to_tx_fbit()
5760 struct l2cap_ctrl control; in l2cap_send_i_or_rr_or_rnr() local
5764 memset(&control, 0, sizeof(control)); in l2cap_send_i_or_rr_or_rnr()
5765 control.sframe = 1; in l2cap_send_i_or_rr_or_rnr()
5766 control.final = 1; in l2cap_send_i_or_rr_or_rnr()
5767 control.reqseq = chan->buffer_seq; in l2cap_send_i_or_rr_or_rnr()
5771 control.super = L2CAP_SUPER_RNR; in l2cap_send_i_or_rr_or_rnr()
5772 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
5787 control.super = L2CAP_SUPER_RR; in l2cap_send_i_or_rr_or_rnr()
5788 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
5812 struct l2cap_ctrl *control) in l2cap_reassemble_sdu() argument
5816 switch (control->sar) { in l2cap_reassemble_sdu()
5945 struct l2cap_ctrl *control) in l2cap_handle_srej() argument
5949 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_srej()
5951 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_srej()
5952 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); in l2cap_handle_srej()
5957 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_srej()
5961 control->reqseq); in l2cap_handle_srej()
5973 if (control->poll) { in l2cap_handle_srej()
5974 l2cap_pass_to_tx(chan, control); in l2cap_handle_srej()
5977 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5982 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
5985 l2cap_pass_to_tx_fbit(chan, control); in l2cap_handle_srej()
5987 if (control->final) { in l2cap_handle_srej()
5988 if (chan->srej_save_reqseq != control->reqseq || in l2cap_handle_srej()
5991 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5993 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5996 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
6003 struct l2cap_ctrl *control) in l2cap_handle_rej() argument
6007 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_rej()
6009 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_rej()
6010 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); in l2cap_handle_rej()
6015 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_rej()
6026 l2cap_pass_to_tx(chan, control); in l2cap_handle_rej()
6028 if (control->final) { in l2cap_handle_rej()
6030 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
6032 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
6126 struct l2cap_ctrl *control, in l2cap_rx_state_recv() argument
6132 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_recv()
6137 switch (l2cap_classify_txseq(chan, control->txseq)) { in l2cap_rx_state_recv()
6139 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6143 control->txseq); in l2cap_rx_state_recv()
6148 control->txseq); in l2cap_rx_state_recv()
6153 err = l2cap_reassemble_sdu(chan, skb, control); in l2cap_rx_state_recv()
6157 if (control->final) { in l2cap_rx_state_recv()
6160 control->final = 0; in l2cap_rx_state_recv()
6161 l2cap_retransmit_all(chan, control); in l2cap_rx_state_recv()
6170 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6178 control->txseq); in l2cap_rx_state_recv()
6193 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_recv()
6198 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6209 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6210 if (control->final) { in l2cap_rx_state_recv()
6215 control->final = 0; in l2cap_rx_state_recv()
6216 l2cap_retransmit_all(chan, control); in l2cap_rx_state_recv()
6220 } else if (control->poll) { in l2cap_rx_state_recv()
6233 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6234 if (control && control->poll) { in l2cap_rx_state_recv()
6242 l2cap_handle_rej(chan, control); in l2cap_rx_state_recv()
6245 l2cap_handle_srej(chan, control); in l2cap_rx_state_recv()
6260 struct l2cap_ctrl *control, in l2cap_rx_state_srej_sent() argument
6264 u16 txseq = control->txseq; in l2cap_rx_state_srej_sent()
6267 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_srej_sent()
6275 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6286 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6307 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6308 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_srej_sent()
6321 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6322 l2cap_send_srej_list(chan, control->txseq); in l2cap_rx_state_srej_sent()
6326 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6342 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6343 if (control->final) { in l2cap_rx_state_srej_sent()
6348 control->final = 0; in l2cap_rx_state_srej_sent()
6349 l2cap_retransmit_all(chan, control); in l2cap_rx_state_srej_sent()
6353 } else if (control->poll) { in l2cap_rx_state_srej_sent()
6373 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6374 if (control->poll) { in l2cap_rx_state_srej_sent()
6387 l2cap_handle_rej(chan, control); in l2cap_rx_state_srej_sent()
6390 l2cap_handle_srej(chan, control); in l2cap_rx_state_srej_sent()
6417 struct l2cap_ctrl *control, in l2cap_rx_state_wait_p() argument
6422 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_wait_p()
6425 if (!control->poll) in l2cap_rx_state_wait_p()
6428 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_p()
6438 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_p()
6451 return l2cap_rx_state_recv(chan, control, NULL, event); in l2cap_rx_state_wait_p()
6455 struct l2cap_ctrl *control, in l2cap_rx_state_wait_f() argument
6460 if (!control->final) in l2cap_rx_state_wait_f()
6466 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_f()
6476 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_f()
6487 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx_state_wait_f()
6501 static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_rx() argument
6507 control, skb, event, chan->rx_state); in l2cap_rx()
6509 if (__valid_reqseq(chan, control->reqseq)) { in l2cap_rx()
6512 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx()
6515 err = l2cap_rx_state_srej_sent(chan, control, skb, in l2cap_rx()
6519 err = l2cap_rx_state_wait_p(chan, control, skb, event); in l2cap_rx()
6522 err = l2cap_rx_state_wait_f(chan, control, skb, event); in l2cap_rx()
6530 control->reqseq, chan->next_tx_seq, in l2cap_rx()
6538 static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_stream_rx() argument
6543 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb, in l2cap_stream_rx()
6546 if (l2cap_classify_txseq(chan, control->txseq) == in l2cap_stream_rx()
6548 l2cap_pass_to_tx(chan, control); in l2cap_stream_rx()
6555 l2cap_reassemble_sdu(chan, skb, control); in l2cap_stream_rx()
6570 chan->last_acked_seq = control->txseq; in l2cap_stream_rx()
6571 chan->expected_tx_seq = __next_seq(chan, control->txseq); in l2cap_stream_rx()
6578 struct l2cap_ctrl *control = &bt_cb(skb)->l2cap; in l2cap_data_rcv() local
6594 if (!control->sframe && control->sar == L2CAP_SAR_START) in l2cap_data_rcv()
6605 if (!control->sframe) { in l2cap_data_rcv()
6609 control->sar, control->reqseq, control->final, in l2cap_data_rcv()
6610 control->txseq); in l2cap_data_rcv()
6615 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F) in l2cap_data_rcv()
6620 err = l2cap_rx(chan, control, skb, event); in l2cap_data_rcv()
6622 err = l2cap_stream_rx(chan, control, skb); in l2cap_data_rcv()
6638 control->reqseq, control->final, control->poll, in l2cap_data_rcv()
6639 control->super); in l2cap_data_rcv()
6648 if (control->final && (control->poll || in l2cap_data_rcv()
6652 event = rx_func_to_event[control->super]; in l2cap_data_rcv()
6653 if (l2cap_rx(chan, control, skb, event)) in l2cap_data_rcv()