Lines Matching refs:control
60 static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
1006 static void __unpack_enhanced_control(u16 enh, struct l2cap_ctrl *control) in __unpack_enhanced_control() argument
1008 control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT; in __unpack_enhanced_control()
1009 control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT; in __unpack_enhanced_control()
1013 control->sframe = 1; in __unpack_enhanced_control()
1014 control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT; in __unpack_enhanced_control()
1015 control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT; in __unpack_enhanced_control()
1017 control->sar = 0; in __unpack_enhanced_control()
1018 control->txseq = 0; in __unpack_enhanced_control()
1021 control->sframe = 0; in __unpack_enhanced_control()
1022 control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT; in __unpack_enhanced_control()
1023 control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT; in __unpack_enhanced_control()
1025 control->poll = 0; in __unpack_enhanced_control()
1026 control->super = 0; in __unpack_enhanced_control()
1030 static void __unpack_extended_control(u32 ext, struct l2cap_ctrl *control) in __unpack_extended_control() argument
1032 control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT; in __unpack_extended_control()
1033 control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT; in __unpack_extended_control()
1037 control->sframe = 1; in __unpack_extended_control()
1038 control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT; in __unpack_extended_control()
1039 control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT; in __unpack_extended_control()
1041 control->sar = 0; in __unpack_extended_control()
1042 control->txseq = 0; in __unpack_extended_control()
1045 control->sframe = 0; in __unpack_extended_control()
1046 control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT; in __unpack_extended_control()
1047 control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT; in __unpack_extended_control()
1049 control->poll = 0; in __unpack_extended_control()
1050 control->super = 0; in __unpack_extended_control()
1068 static u32 __pack_extended_control(struct l2cap_ctrl *control) in __pack_extended_control() argument
1072 packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT; in __pack_extended_control()
1073 packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT; in __pack_extended_control()
1075 if (control->sframe) { in __pack_extended_control()
1076 packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT; in __pack_extended_control()
1077 packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT; in __pack_extended_control()
1080 packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT; in __pack_extended_control()
1081 packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT; in __pack_extended_control()
1087 static u16 __pack_enhanced_control(struct l2cap_ctrl *control) in __pack_enhanced_control() argument
1091 packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT; in __pack_enhanced_control()
1092 packed |= control->final << L2CAP_CTRL_FINAL_SHIFT; in __pack_enhanced_control()
1094 if (control->sframe) { in __pack_enhanced_control()
1095 packed |= control->poll << L2CAP_CTRL_POLL_SHIFT; in __pack_enhanced_control()
1096 packed |= control->super << L2CAP_CTRL_SUPER_SHIFT; in __pack_enhanced_control()
1099 packed |= control->sar << L2CAP_CTRL_SAR_SHIFT; in __pack_enhanced_control()
1100 packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT; in __pack_enhanced_control()
1107 struct l2cap_ctrl *control, in __pack_control() argument
1111 put_unaligned_le32(__pack_extended_control(control), in __pack_control()
1114 put_unaligned_le16(__pack_enhanced_control(control), in __pack_control()
1128 u32 control) in l2cap_create_sframe_pdu() argument
1147 put_unaligned_le32(control, skb_put(skb, L2CAP_EXT_CTRL_SIZE)); in l2cap_create_sframe_pdu()
1149 put_unaligned_le16(control, skb_put(skb, L2CAP_ENH_CTRL_SIZE)); in l2cap_create_sframe_pdu()
1161 struct l2cap_ctrl *control) in l2cap_send_sframe() argument
1166 BT_DBG("chan %p, control %p", chan, control); in l2cap_send_sframe()
1168 if (!control->sframe) in l2cap_send_sframe()
1172 !control->poll) in l2cap_send_sframe()
1173 control->final = 1; in l2cap_send_sframe()
1175 if (control->super == L2CAP_SUPER_RR) in l2cap_send_sframe()
1177 else if (control->super == L2CAP_SUPER_RNR) in l2cap_send_sframe()
1180 if (control->super != L2CAP_SUPER_SREJ) { in l2cap_send_sframe()
1181 chan->last_acked_seq = control->reqseq; in l2cap_send_sframe()
1185 BT_DBG("reqseq %d, final %d, poll %d, super %d", control->reqseq, in l2cap_send_sframe()
1186 control->final, control->poll, control->super); in l2cap_send_sframe()
1189 control_field = __pack_extended_control(control); in l2cap_send_sframe()
1191 control_field = __pack_enhanced_control(control); in l2cap_send_sframe()
1200 struct l2cap_ctrl control; in l2cap_send_rr_or_rnr() local
1204 memset(&control, 0, sizeof(control)); in l2cap_send_rr_or_rnr()
1205 control.sframe = 1; in l2cap_send_rr_or_rnr()
1206 control.poll = poll; in l2cap_send_rr_or_rnr()
1209 control.super = L2CAP_SUPER_RNR; in l2cap_send_rr_or_rnr()
1211 control.super = L2CAP_SUPER_RR; in l2cap_send_rr_or_rnr()
1213 control.reqseq = chan->buffer_seq; in l2cap_send_rr_or_rnr()
1214 l2cap_send_sframe(chan, &control); in l2cap_send_rr_or_rnr()
1928 struct l2cap_ctrl *control; in l2cap_streaming_send() local
1939 control = &bt_cb(skb)->l2cap; in l2cap_streaming_send()
1941 control->reqseq = 0; in l2cap_streaming_send()
1942 control->txseq = chan->next_tx_seq; in l2cap_streaming_send()
1944 __pack_control(chan, control, skb); in l2cap_streaming_send()
1953 BT_DBG("Sent txseq %u", control->txseq); in l2cap_streaming_send()
1963 struct l2cap_ctrl *control; in l2cap_ertm_send() local
1981 control = &bt_cb(skb)->l2cap; in l2cap_ertm_send()
1984 control->final = 1; in l2cap_ertm_send()
1986 control->reqseq = chan->buffer_seq; in l2cap_ertm_send()
1988 control->txseq = chan->next_tx_seq; in l2cap_ertm_send()
1990 __pack_control(chan, control, skb); in l2cap_ertm_send()
2018 BT_DBG("Sent txseq %u", control->txseq); in l2cap_ertm_send()
2029 struct l2cap_ctrl control; in l2cap_ertm_resend() local
2050 control = bt_cb(skb)->l2cap; in l2cap_ertm_resend()
2060 control.reqseq = chan->buffer_seq; in l2cap_ertm_resend()
2062 control.final = 1; in l2cap_ertm_resend()
2064 control.final = 0; in l2cap_ertm_resend()
2082 put_unaligned_le32(__pack_extended_control(&control), in l2cap_ertm_resend()
2085 put_unaligned_le16(__pack_enhanced_control(&control), in l2cap_ertm_resend()
2099 BT_DBG("Resent txseq %d", control.txseq); in l2cap_ertm_resend()
2106 struct l2cap_ctrl *control) in l2cap_retransmit() argument
2108 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit()
2110 l2cap_seq_list_append(&chan->retrans_list, control->reqseq); in l2cap_retransmit()
2115 struct l2cap_ctrl *control) in l2cap_retransmit_all() argument
2119 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit_all()
2121 if (control->poll) in l2cap_retransmit_all()
2131 if (bt_cb(skb)->l2cap.txseq == control->reqseq || in l2cap_retransmit_all()
2150 struct l2cap_ctrl control; in l2cap_send_ack() local
2158 memset(&control, 0, sizeof(control)); in l2cap_send_ack()
2159 control.sframe = 1; in l2cap_send_ack()
2164 control.super = L2CAP_SUPER_RNR; in l2cap_send_ack()
2165 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2166 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2187 control.super = L2CAP_SUPER_RR; in l2cap_send_ack()
2188 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2189 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2660 struct l2cap_ctrl control; in l2cap_send_srej() local
2665 memset(&control, 0, sizeof(control)); in l2cap_send_srej()
2666 control.sframe = 1; in l2cap_send_srej()
2667 control.super = L2CAP_SUPER_SREJ; in l2cap_send_srej()
2672 control.reqseq = seq; in l2cap_send_srej()
2673 l2cap_send_sframe(chan, &control); in l2cap_send_srej()
2683 struct l2cap_ctrl control; in l2cap_send_srej_tail() local
2690 memset(&control, 0, sizeof(control)); in l2cap_send_srej_tail()
2691 control.sframe = 1; in l2cap_send_srej_tail()
2692 control.super = L2CAP_SUPER_SREJ; in l2cap_send_srej_tail()
2693 control.reqseq = chan->srej_list.tail; in l2cap_send_srej_tail()
2694 l2cap_send_sframe(chan, &control); in l2cap_send_srej_tail()
2699 struct l2cap_ctrl control; in l2cap_send_srej_list() local
2705 memset(&control, 0, sizeof(control)); in l2cap_send_srej_list()
2706 control.sframe = 1; in l2cap_send_srej_list()
2707 control.super = L2CAP_SUPER_SREJ; in l2cap_send_srej_list()
2717 control.reqseq = seq; in l2cap_send_srej_list()
2718 l2cap_send_sframe(chan, &control); in l2cap_send_srej_list()
2766 struct l2cap_ctrl *control, in l2cap_tx_state_xmit() argument
2769 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_xmit()
2814 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_xmit()
2838 struct l2cap_ctrl *control, in l2cap_tx_state_wait_f() argument
2841 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_wait_f()
2884 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_wait_f()
2888 if (control && control->final) { in l2cap_tx_state_wait_f()
2914 static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_tx() argument
2918 chan, control, skbs, event, chan->tx_state); in l2cap_tx()
2922 l2cap_tx_state_xmit(chan, control, skbs, event); in l2cap_tx()
2925 l2cap_tx_state_wait_f(chan, control, skbs, event); in l2cap_tx()
2934 struct l2cap_ctrl *control) in l2cap_pass_to_tx() argument
2936 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx()
2937 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT); in l2cap_pass_to_tx()
2941 struct l2cap_ctrl *control) in l2cap_pass_to_tx_fbit() argument
2943 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx_fbit()
2944 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT); in l2cap_pass_to_tx_fbit()
5598 struct l2cap_ctrl control; in l2cap_send_i_or_rr_or_rnr() local
5602 memset(&control, 0, sizeof(control)); in l2cap_send_i_or_rr_or_rnr()
5603 control.sframe = 1; in l2cap_send_i_or_rr_or_rnr()
5604 control.final = 1; in l2cap_send_i_or_rr_or_rnr()
5605 control.reqseq = chan->buffer_seq; in l2cap_send_i_or_rr_or_rnr()
5609 control.super = L2CAP_SUPER_RNR; in l2cap_send_i_or_rr_or_rnr()
5610 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
5625 control.super = L2CAP_SUPER_RR; in l2cap_send_i_or_rr_or_rnr()
5626 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
5650 struct l2cap_ctrl *control) in l2cap_reassemble_sdu() argument
5654 switch (control->sar) { in l2cap_reassemble_sdu()
5786 struct l2cap_ctrl *control) in l2cap_handle_srej() argument
5790 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_srej()
5792 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_srej()
5793 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); in l2cap_handle_srej()
5798 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_srej()
5802 control->reqseq); in l2cap_handle_srej()
5814 if (control->poll) { in l2cap_handle_srej()
5815 l2cap_pass_to_tx(chan, control); in l2cap_handle_srej()
5818 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5823 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
5826 l2cap_pass_to_tx_fbit(chan, control); in l2cap_handle_srej()
5828 if (control->final) { in l2cap_handle_srej()
5829 if (chan->srej_save_reqseq != control->reqseq || in l2cap_handle_srej()
5832 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5834 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5837 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
5844 struct l2cap_ctrl *control) in l2cap_handle_rej() argument
5848 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_rej()
5850 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_rej()
5851 BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); in l2cap_handle_rej()
5856 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_rej()
5867 l2cap_pass_to_tx(chan, control); in l2cap_handle_rej()
5869 if (control->final) { in l2cap_handle_rej()
5871 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
5873 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
5967 struct l2cap_ctrl *control, in l2cap_rx_state_recv() argument
5974 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_recv()
5979 switch (l2cap_classify_txseq(chan, control->txseq)) { in l2cap_rx_state_recv()
5981 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
5985 control->txseq); in l2cap_rx_state_recv()
5990 control->txseq); in l2cap_rx_state_recv()
6011 local_control = *control; in l2cap_rx_state_recv()
6012 err = l2cap_reassemble_sdu(chan, skb, control); in l2cap_rx_state_recv()
6029 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6037 control->txseq); in l2cap_rx_state_recv()
6052 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_recv()
6057 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6068 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6069 if (control->final) { in l2cap_rx_state_recv()
6074 control->final = 0; in l2cap_rx_state_recv()
6075 l2cap_retransmit_all(chan, control); in l2cap_rx_state_recv()
6079 } else if (control->poll) { in l2cap_rx_state_recv()
6092 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6093 if (control && control->poll) { in l2cap_rx_state_recv()
6101 l2cap_handle_rej(chan, control); in l2cap_rx_state_recv()
6104 l2cap_handle_srej(chan, control); in l2cap_rx_state_recv()
6119 struct l2cap_ctrl *control, in l2cap_rx_state_srej_sent() argument
6123 u16 txseq = control->txseq; in l2cap_rx_state_srej_sent()
6126 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_srej_sent()
6134 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6145 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6166 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6167 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_srej_sent()
6180 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6181 l2cap_send_srej_list(chan, control->txseq); in l2cap_rx_state_srej_sent()
6185 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6201 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6202 if (control->final) { in l2cap_rx_state_srej_sent()
6207 control->final = 0; in l2cap_rx_state_srej_sent()
6208 l2cap_retransmit_all(chan, control); in l2cap_rx_state_srej_sent()
6212 } else if (control->poll) { in l2cap_rx_state_srej_sent()
6232 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6233 if (control->poll) { in l2cap_rx_state_srej_sent()
6246 l2cap_handle_rej(chan, control); in l2cap_rx_state_srej_sent()
6249 l2cap_handle_srej(chan, control); in l2cap_rx_state_srej_sent()
6272 struct l2cap_ctrl *control, in l2cap_rx_state_wait_p() argument
6277 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_wait_p()
6280 if (!control->poll) in l2cap_rx_state_wait_p()
6283 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_p()
6293 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_p()
6306 return l2cap_rx_state_recv(chan, control, NULL, event); in l2cap_rx_state_wait_p()
6310 struct l2cap_ctrl *control, in l2cap_rx_state_wait_f() argument
6315 if (!control->final) in l2cap_rx_state_wait_f()
6321 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_f()
6331 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_f()
6338 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx_state_wait_f()
6352 static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_rx() argument
6358 control, skb, event, chan->rx_state); in l2cap_rx()
6360 if (__valid_reqseq(chan, control->reqseq)) { in l2cap_rx()
6363 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx()
6366 err = l2cap_rx_state_srej_sent(chan, control, skb, in l2cap_rx()
6370 err = l2cap_rx_state_wait_p(chan, control, skb, event); in l2cap_rx()
6373 err = l2cap_rx_state_wait_f(chan, control, skb, event); in l2cap_rx()
6381 control->reqseq, chan->next_tx_seq, in l2cap_rx()
6389 static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_stream_rx() argument
6407 u16 txseq = control->txseq; in l2cap_stream_rx()
6409 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb, in l2cap_stream_rx()
6413 l2cap_pass_to_tx(chan, control); in l2cap_stream_rx()
6420 l2cap_reassemble_sdu(chan, skb, control); in l2cap_stream_rx()
6443 struct l2cap_ctrl *control = &bt_cb(skb)->l2cap; in l2cap_data_rcv() local
6459 if (!control->sframe && control->sar == L2CAP_SAR_START) in l2cap_data_rcv()
6475 if (!control->sframe) { in l2cap_data_rcv()
6479 control->sar, control->reqseq, control->final, in l2cap_data_rcv()
6480 control->txseq); in l2cap_data_rcv()
6485 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F) in l2cap_data_rcv()
6490 err = l2cap_rx(chan, control, skb, event); in l2cap_data_rcv()
6492 err = l2cap_stream_rx(chan, control, skb); in l2cap_data_rcv()
6508 control->reqseq, control->final, control->poll, in l2cap_data_rcv()
6509 control->super); in l2cap_data_rcv()
6518 if (control->final && (control->poll || in l2cap_data_rcv()
6522 event = rx_func_to_event[control->super]; in l2cap_data_rcv()
6523 if (l2cap_rx(chan, control, skb, event)) in l2cap_data_rcv()