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()
1836 struct l2cap_ctrl *control; in l2cap_streaming_send() local
1850 control = &bt_cb(skb)->l2cap; in l2cap_streaming_send()
1852 control->reqseq = 0; in l2cap_streaming_send()
1853 control->txseq = chan->next_tx_seq; in l2cap_streaming_send()
1855 __pack_control(chan, control, skb); in l2cap_streaming_send()
1864 BT_DBG("Sent txseq %u", control->txseq); in l2cap_streaming_send()
1874 struct l2cap_ctrl *control; in l2cap_ertm_send() local
1895 control = &bt_cb(skb)->l2cap; in l2cap_ertm_send()
1898 control->final = 1; in l2cap_ertm_send()
1900 control->reqseq = chan->buffer_seq; in l2cap_ertm_send()
1902 control->txseq = chan->next_tx_seq; in l2cap_ertm_send()
1904 __pack_control(chan, control, skb); in l2cap_ertm_send()
1932 BT_DBG("Sent txseq %u", control->txseq); in l2cap_ertm_send()
1943 struct l2cap_ctrl control; in l2cap_ertm_resend() local
1967 control = bt_cb(skb)->l2cap; in l2cap_ertm_resend()
1977 control.reqseq = chan->buffer_seq; in l2cap_ertm_resend()
1979 control.final = 1; in l2cap_ertm_resend()
1981 control.final = 0; in l2cap_ertm_resend()
1999 put_unaligned_le32(__pack_extended_control(&control), in l2cap_ertm_resend()
2002 put_unaligned_le16(__pack_enhanced_control(&control), in l2cap_ertm_resend()
2016 BT_DBG("Resent txseq %d", control.txseq); in l2cap_ertm_resend()
2023 struct l2cap_ctrl *control) in l2cap_retransmit() argument
2025 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit()
2027 l2cap_seq_list_append(&chan->retrans_list, control->reqseq); in l2cap_retransmit()
2032 struct l2cap_ctrl *control) in l2cap_retransmit_all() argument
2036 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit_all()
2038 if (control->poll) in l2cap_retransmit_all()
2048 if (bt_cb(skb)->l2cap.txseq == control->reqseq || in l2cap_retransmit_all()
2067 struct l2cap_ctrl control; in l2cap_send_ack() local
2075 memset(&control, 0, sizeof(control)); in l2cap_send_ack()
2076 control.sframe = 1; in l2cap_send_ack()
2081 control.super = L2CAP_SUPER_RNR; in l2cap_send_ack()
2082 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2083 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2104 control.super = L2CAP_SUPER_RR; in l2cap_send_ack()
2105 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2106 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2556 struct l2cap_ctrl control; in l2cap_send_srej() local
2561 memset(&control, 0, sizeof(control)); in l2cap_send_srej()
2562 control.sframe = 1; in l2cap_send_srej()
2563 control.super = L2CAP_SUPER_SREJ; in l2cap_send_srej()
2568 control.reqseq = seq; in l2cap_send_srej()
2569 l2cap_send_sframe(chan, &control); in l2cap_send_srej()
2579 struct l2cap_ctrl control; in l2cap_send_srej_tail() local
2586 memset(&control, 0, sizeof(control)); in l2cap_send_srej_tail()
2587 control.sframe = 1; in l2cap_send_srej_tail()
2588 control.super = L2CAP_SUPER_SREJ; in l2cap_send_srej_tail()
2589 control.reqseq = chan->srej_list.tail; in l2cap_send_srej_tail()
2590 l2cap_send_sframe(chan, &control); in l2cap_send_srej_tail()
2595 struct l2cap_ctrl control; in l2cap_send_srej_list() local
2601 memset(&control, 0, sizeof(control)); in l2cap_send_srej_list()
2602 control.sframe = 1; in l2cap_send_srej_list()
2603 control.super = L2CAP_SUPER_SREJ; in l2cap_send_srej_list()
2613 control.reqseq = seq; in l2cap_send_srej_list()
2614 l2cap_send_sframe(chan, &control); in l2cap_send_srej_list()
2662 struct l2cap_ctrl *control, in l2cap_tx_state_xmit() argument
2665 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_xmit()
2710 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_xmit()
2734 struct l2cap_ctrl *control, in l2cap_tx_state_wait_f() argument
2737 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_wait_f()
2780 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_wait_f()
2785 if (control && control->final) { in l2cap_tx_state_wait_f()
2811 static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_tx() argument
2815 chan, control, skbs, event, chan->tx_state); in l2cap_tx()
2819 l2cap_tx_state_xmit(chan, control, skbs, event); in l2cap_tx()
2822 l2cap_tx_state_wait_f(chan, control, skbs, event); in l2cap_tx()
2831 struct l2cap_ctrl *control) in l2cap_pass_to_tx() argument
2833 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx()
2834 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT); in l2cap_pass_to_tx()
2838 struct l2cap_ctrl *control) in l2cap_pass_to_tx_fbit() argument
2840 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx_fbit()
2841 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT); in l2cap_pass_to_tx_fbit()
5750 struct l2cap_ctrl control; in l2cap_send_i_or_rr_or_rnr() local
5754 memset(&control, 0, sizeof(control)); in l2cap_send_i_or_rr_or_rnr()
5755 control.sframe = 1; in l2cap_send_i_or_rr_or_rnr()
5756 control.final = 1; in l2cap_send_i_or_rr_or_rnr()
5757 control.reqseq = chan->buffer_seq; in l2cap_send_i_or_rr_or_rnr()
5761 control.super = L2CAP_SUPER_RNR; in l2cap_send_i_or_rr_or_rnr()
5762 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
5777 control.super = L2CAP_SUPER_RR; in l2cap_send_i_or_rr_or_rnr()
5778 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
5802 struct l2cap_ctrl *control) in l2cap_reassemble_sdu() argument
5806 switch (control->sar) { in l2cap_reassemble_sdu()
5935 struct l2cap_ctrl *control) in l2cap_handle_srej() argument
5939 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_srej()
5941 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_srej()
5942 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); in l2cap_handle_srej()
5947 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_srej()
5951 control->reqseq); in l2cap_handle_srej()
5963 if (control->poll) { in l2cap_handle_srej()
5964 l2cap_pass_to_tx(chan, control); in l2cap_handle_srej()
5967 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5972 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
5975 l2cap_pass_to_tx_fbit(chan, control); in l2cap_handle_srej()
5977 if (control->final) { in l2cap_handle_srej()
5978 if (chan->srej_save_reqseq != control->reqseq || in l2cap_handle_srej()
5981 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5983 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5986 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
5993 struct l2cap_ctrl *control) in l2cap_handle_rej() argument
5997 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_rej()
5999 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_rej()
6000 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); in l2cap_handle_rej()
6005 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_rej()
6016 l2cap_pass_to_tx(chan, control); in l2cap_handle_rej()
6018 if (control->final) { in l2cap_handle_rej()
6020 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
6022 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
6116 struct l2cap_ctrl *control, in l2cap_rx_state_recv() argument
6122 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_recv()
6127 switch (l2cap_classify_txseq(chan, control->txseq)) { in l2cap_rx_state_recv()
6129 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6133 control->txseq); in l2cap_rx_state_recv()
6138 control->txseq); in l2cap_rx_state_recv()
6143 err = l2cap_reassemble_sdu(chan, skb, control); in l2cap_rx_state_recv()
6147 if (control->final) { in l2cap_rx_state_recv()
6150 control->final = 0; in l2cap_rx_state_recv()
6151 l2cap_retransmit_all(chan, control); in l2cap_rx_state_recv()
6160 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6168 control->txseq); in l2cap_rx_state_recv()
6183 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_recv()
6188 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6199 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6200 if (control->final) { in l2cap_rx_state_recv()
6205 control->final = 0; in l2cap_rx_state_recv()
6206 l2cap_retransmit_all(chan, control); in l2cap_rx_state_recv()
6210 } else if (control->poll) { in l2cap_rx_state_recv()
6223 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6224 if (control && control->poll) { in l2cap_rx_state_recv()
6232 l2cap_handle_rej(chan, control); in l2cap_rx_state_recv()
6235 l2cap_handle_srej(chan, control); in l2cap_rx_state_recv()
6250 struct l2cap_ctrl *control, in l2cap_rx_state_srej_sent() argument
6254 u16 txseq = control->txseq; in l2cap_rx_state_srej_sent()
6257 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_srej_sent()
6265 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6276 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6297 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6298 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_srej_sent()
6311 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6312 l2cap_send_srej_list(chan, control->txseq); in l2cap_rx_state_srej_sent()
6316 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6332 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6333 if (control->final) { in l2cap_rx_state_srej_sent()
6338 control->final = 0; in l2cap_rx_state_srej_sent()
6339 l2cap_retransmit_all(chan, control); in l2cap_rx_state_srej_sent()
6343 } else if (control->poll) { in l2cap_rx_state_srej_sent()
6363 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6364 if (control->poll) { in l2cap_rx_state_srej_sent()
6377 l2cap_handle_rej(chan, control); in l2cap_rx_state_srej_sent()
6380 l2cap_handle_srej(chan, control); in l2cap_rx_state_srej_sent()
6407 struct l2cap_ctrl *control, in l2cap_rx_state_wait_p() argument
6412 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_wait_p()
6415 if (!control->poll) in l2cap_rx_state_wait_p()
6418 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_p()
6428 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_p()
6441 return l2cap_rx_state_recv(chan, control, NULL, event); in l2cap_rx_state_wait_p()
6445 struct l2cap_ctrl *control, in l2cap_rx_state_wait_f() argument
6450 if (!control->final) in l2cap_rx_state_wait_f()
6456 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_f()
6466 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_f()
6477 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx_state_wait_f()
6491 static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_rx() argument
6497 control, skb, event, chan->rx_state); in l2cap_rx()
6499 if (__valid_reqseq(chan, control->reqseq)) { in l2cap_rx()
6502 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx()
6505 err = l2cap_rx_state_srej_sent(chan, control, skb, in l2cap_rx()
6509 err = l2cap_rx_state_wait_p(chan, control, skb, event); in l2cap_rx()
6512 err = l2cap_rx_state_wait_f(chan, control, skb, event); in l2cap_rx()
6520 control->reqseq, chan->next_tx_seq, in l2cap_rx()
6528 static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_stream_rx() argument
6533 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb, in l2cap_stream_rx()
6536 if (l2cap_classify_txseq(chan, control->txseq) == in l2cap_stream_rx()
6538 l2cap_pass_to_tx(chan, control); in l2cap_stream_rx()
6545 l2cap_reassemble_sdu(chan, skb, control); in l2cap_stream_rx()
6560 chan->last_acked_seq = control->txseq; in l2cap_stream_rx()
6561 chan->expected_tx_seq = __next_seq(chan, control->txseq); in l2cap_stream_rx()
6568 struct l2cap_ctrl *control = &bt_cb(skb)->l2cap; in l2cap_data_rcv() local
6584 if (!control->sframe && control->sar == L2CAP_SAR_START) in l2cap_data_rcv()
6595 if (!control->sframe) { in l2cap_data_rcv()
6599 control->sar, control->reqseq, control->final, in l2cap_data_rcv()
6600 control->txseq); in l2cap_data_rcv()
6605 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F) in l2cap_data_rcv()
6610 err = l2cap_rx(chan, control, skb, event); in l2cap_data_rcv()
6612 err = l2cap_stream_rx(chan, control, skb); in l2cap_data_rcv()
6628 control->reqseq, control->final, control->poll, in l2cap_data_rcv()
6629 control->super); in l2cap_data_rcv()
6638 if (control->final && (control->poll || in l2cap_data_rcv()
6642 event = rx_func_to_event[control->super]; in l2cap_data_rcv()
6643 if (l2cap_rx(chan, control, skb, event)) in l2cap_data_rcv()