Commit 8c3a4f004e706fd7e681c68c6de4946c8c76b976
Committed by
Johan Hedberg
1 parent
682877c31f
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
Bluetooth: Rename L2CAP_LE_DEFAULT_MTU
This patch renames L2CAP_LE_DEFAULT_MTU macro to L2CAP_LE_MIN_MTU since it represents the minimum MTU value, not the default MTU value for LE. Signed-off-by: Andre Guedes <andre.guedes@openbossa.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Showing 2 changed files with 2 additions and 2 deletions Inline Diff
include/net/bluetooth/l2cap.h
1 | /* | 1 | /* |
2 | BlueZ - Bluetooth protocol stack for Linux | 2 | BlueZ - Bluetooth protocol stack for Linux |
3 | Copyright (C) 2000-2001 Qualcomm Incorporated | 3 | Copyright (C) 2000-2001 Qualcomm Incorporated |
4 | Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org> | 4 | Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org> |
5 | Copyright (C) 2010 Google Inc. | 5 | Copyright (C) 2010 Google Inc. |
6 | 6 | ||
7 | Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> | 7 | Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> |
8 | 8 | ||
9 | This program is free software; you can redistribute it and/or modify | 9 | This program is free software; you can redistribute it and/or modify |
10 | it under the terms of the GNU General Public License version 2 as | 10 | it under the terms of the GNU General Public License version 2 as |
11 | published by the Free Software Foundation; | 11 | published by the Free Software Foundation; |
12 | 12 | ||
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
14 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 14 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. | 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. |
16 | IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY | 16 | IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY |
17 | CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES | 17 | CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES |
18 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | 18 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
19 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | 19 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
20 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 20 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
21 | 21 | ||
22 | ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, | 22 | ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, |
23 | COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS | 23 | COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS |
24 | SOFTWARE IS DISCLAIMED. | 24 | SOFTWARE IS DISCLAIMED. |
25 | */ | 25 | */ |
26 | 26 | ||
27 | #ifndef __L2CAP_H | 27 | #ifndef __L2CAP_H |
28 | #define __L2CAP_H | 28 | #define __L2CAP_H |
29 | 29 | ||
30 | #include <asm/unaligned.h> | 30 | #include <asm/unaligned.h> |
31 | 31 | ||
32 | /* L2CAP defaults */ | 32 | /* L2CAP defaults */ |
33 | #define L2CAP_DEFAULT_MTU 672 | 33 | #define L2CAP_DEFAULT_MTU 672 |
34 | #define L2CAP_DEFAULT_MIN_MTU 48 | 34 | #define L2CAP_DEFAULT_MIN_MTU 48 |
35 | #define L2CAP_DEFAULT_FLUSH_TO 0xffff | 35 | #define L2CAP_DEFAULT_FLUSH_TO 0xffff |
36 | #define L2CAP_DEFAULT_TX_WINDOW 63 | 36 | #define L2CAP_DEFAULT_TX_WINDOW 63 |
37 | #define L2CAP_DEFAULT_EXT_WINDOW 0x3FFF | 37 | #define L2CAP_DEFAULT_EXT_WINDOW 0x3FFF |
38 | #define L2CAP_DEFAULT_MAX_TX 3 | 38 | #define L2CAP_DEFAULT_MAX_TX 3 |
39 | #define L2CAP_DEFAULT_RETRANS_TO 2000 /* 2 seconds */ | 39 | #define L2CAP_DEFAULT_RETRANS_TO 2000 /* 2 seconds */ |
40 | #define L2CAP_DEFAULT_MONITOR_TO 12000 /* 12 seconds */ | 40 | #define L2CAP_DEFAULT_MONITOR_TO 12000 /* 12 seconds */ |
41 | #define L2CAP_DEFAULT_MAX_PDU_SIZE 1009 /* Sized for 3-DH5 packet */ | 41 | #define L2CAP_DEFAULT_MAX_PDU_SIZE 1009 /* Sized for 3-DH5 packet */ |
42 | #define L2CAP_DEFAULT_ACK_TO 200 | 42 | #define L2CAP_DEFAULT_ACK_TO 200 |
43 | #define L2CAP_LE_DEFAULT_MTU 23 | ||
44 | #define L2CAP_DEFAULT_MAX_SDU_SIZE 0xFFFF | 43 | #define L2CAP_DEFAULT_MAX_SDU_SIZE 0xFFFF |
45 | #define L2CAP_DEFAULT_SDU_ITIME 0xFFFFFFFF | 44 | #define L2CAP_DEFAULT_SDU_ITIME 0xFFFFFFFF |
46 | #define L2CAP_DEFAULT_ACC_LAT 0xFFFFFFFF | 45 | #define L2CAP_DEFAULT_ACC_LAT 0xFFFFFFFF |
47 | #define L2CAP_BREDR_MAX_PAYLOAD 1019 /* 3-DH5 packet */ | 46 | #define L2CAP_BREDR_MAX_PAYLOAD 1019 /* 3-DH5 packet */ |
47 | #define L2CAP_LE_MIN_MTU 23 | ||
48 | 48 | ||
49 | #define L2CAP_DISC_TIMEOUT msecs_to_jiffies(100) | 49 | #define L2CAP_DISC_TIMEOUT msecs_to_jiffies(100) |
50 | #define L2CAP_DISC_REJ_TIMEOUT msecs_to_jiffies(5000) | 50 | #define L2CAP_DISC_REJ_TIMEOUT msecs_to_jiffies(5000) |
51 | #define L2CAP_ENC_TIMEOUT msecs_to_jiffies(5000) | 51 | #define L2CAP_ENC_TIMEOUT msecs_to_jiffies(5000) |
52 | #define L2CAP_CONN_TIMEOUT msecs_to_jiffies(40000) | 52 | #define L2CAP_CONN_TIMEOUT msecs_to_jiffies(40000) |
53 | #define L2CAP_INFO_TIMEOUT msecs_to_jiffies(4000) | 53 | #define L2CAP_INFO_TIMEOUT msecs_to_jiffies(4000) |
54 | 54 | ||
55 | #define L2CAP_A2MP_DEFAULT_MTU 670 | 55 | #define L2CAP_A2MP_DEFAULT_MTU 670 |
56 | 56 | ||
57 | /* L2CAP socket address */ | 57 | /* L2CAP socket address */ |
58 | struct sockaddr_l2 { | 58 | struct sockaddr_l2 { |
59 | sa_family_t l2_family; | 59 | sa_family_t l2_family; |
60 | __le16 l2_psm; | 60 | __le16 l2_psm; |
61 | bdaddr_t l2_bdaddr; | 61 | bdaddr_t l2_bdaddr; |
62 | __le16 l2_cid; | 62 | __le16 l2_cid; |
63 | __u8 l2_bdaddr_type; | 63 | __u8 l2_bdaddr_type; |
64 | }; | 64 | }; |
65 | 65 | ||
66 | /* L2CAP socket options */ | 66 | /* L2CAP socket options */ |
67 | #define L2CAP_OPTIONS 0x01 | 67 | #define L2CAP_OPTIONS 0x01 |
68 | struct l2cap_options { | 68 | struct l2cap_options { |
69 | __u16 omtu; | 69 | __u16 omtu; |
70 | __u16 imtu; | 70 | __u16 imtu; |
71 | __u16 flush_to; | 71 | __u16 flush_to; |
72 | __u8 mode; | 72 | __u8 mode; |
73 | __u8 fcs; | 73 | __u8 fcs; |
74 | __u8 max_tx; | 74 | __u8 max_tx; |
75 | __u16 txwin_size; | 75 | __u16 txwin_size; |
76 | }; | 76 | }; |
77 | 77 | ||
78 | #define L2CAP_CONNINFO 0x02 | 78 | #define L2CAP_CONNINFO 0x02 |
79 | struct l2cap_conninfo { | 79 | struct l2cap_conninfo { |
80 | __u16 hci_handle; | 80 | __u16 hci_handle; |
81 | __u8 dev_class[3]; | 81 | __u8 dev_class[3]; |
82 | }; | 82 | }; |
83 | 83 | ||
84 | #define L2CAP_LM 0x03 | 84 | #define L2CAP_LM 0x03 |
85 | #define L2CAP_LM_MASTER 0x0001 | 85 | #define L2CAP_LM_MASTER 0x0001 |
86 | #define L2CAP_LM_AUTH 0x0002 | 86 | #define L2CAP_LM_AUTH 0x0002 |
87 | #define L2CAP_LM_ENCRYPT 0x0004 | 87 | #define L2CAP_LM_ENCRYPT 0x0004 |
88 | #define L2CAP_LM_TRUSTED 0x0008 | 88 | #define L2CAP_LM_TRUSTED 0x0008 |
89 | #define L2CAP_LM_RELIABLE 0x0010 | 89 | #define L2CAP_LM_RELIABLE 0x0010 |
90 | #define L2CAP_LM_SECURE 0x0020 | 90 | #define L2CAP_LM_SECURE 0x0020 |
91 | 91 | ||
92 | /* L2CAP command codes */ | 92 | /* L2CAP command codes */ |
93 | #define L2CAP_COMMAND_REJ 0x01 | 93 | #define L2CAP_COMMAND_REJ 0x01 |
94 | #define L2CAP_CONN_REQ 0x02 | 94 | #define L2CAP_CONN_REQ 0x02 |
95 | #define L2CAP_CONN_RSP 0x03 | 95 | #define L2CAP_CONN_RSP 0x03 |
96 | #define L2CAP_CONF_REQ 0x04 | 96 | #define L2CAP_CONF_REQ 0x04 |
97 | #define L2CAP_CONF_RSP 0x05 | 97 | #define L2CAP_CONF_RSP 0x05 |
98 | #define L2CAP_DISCONN_REQ 0x06 | 98 | #define L2CAP_DISCONN_REQ 0x06 |
99 | #define L2CAP_DISCONN_RSP 0x07 | 99 | #define L2CAP_DISCONN_RSP 0x07 |
100 | #define L2CAP_ECHO_REQ 0x08 | 100 | #define L2CAP_ECHO_REQ 0x08 |
101 | #define L2CAP_ECHO_RSP 0x09 | 101 | #define L2CAP_ECHO_RSP 0x09 |
102 | #define L2CAP_INFO_REQ 0x0a | 102 | #define L2CAP_INFO_REQ 0x0a |
103 | #define L2CAP_INFO_RSP 0x0b | 103 | #define L2CAP_INFO_RSP 0x0b |
104 | #define L2CAP_CREATE_CHAN_REQ 0x0c | 104 | #define L2CAP_CREATE_CHAN_REQ 0x0c |
105 | #define L2CAP_CREATE_CHAN_RSP 0x0d | 105 | #define L2CAP_CREATE_CHAN_RSP 0x0d |
106 | #define L2CAP_MOVE_CHAN_REQ 0x0e | 106 | #define L2CAP_MOVE_CHAN_REQ 0x0e |
107 | #define L2CAP_MOVE_CHAN_RSP 0x0f | 107 | #define L2CAP_MOVE_CHAN_RSP 0x0f |
108 | #define L2CAP_MOVE_CHAN_CFM 0x10 | 108 | #define L2CAP_MOVE_CHAN_CFM 0x10 |
109 | #define L2CAP_MOVE_CHAN_CFM_RSP 0x11 | 109 | #define L2CAP_MOVE_CHAN_CFM_RSP 0x11 |
110 | #define L2CAP_CONN_PARAM_UPDATE_REQ 0x12 | 110 | #define L2CAP_CONN_PARAM_UPDATE_REQ 0x12 |
111 | #define L2CAP_CONN_PARAM_UPDATE_RSP 0x13 | 111 | #define L2CAP_CONN_PARAM_UPDATE_RSP 0x13 |
112 | 112 | ||
113 | /* L2CAP extended feature mask */ | 113 | /* L2CAP extended feature mask */ |
114 | #define L2CAP_FEAT_FLOWCTL 0x00000001 | 114 | #define L2CAP_FEAT_FLOWCTL 0x00000001 |
115 | #define L2CAP_FEAT_RETRANS 0x00000002 | 115 | #define L2CAP_FEAT_RETRANS 0x00000002 |
116 | #define L2CAP_FEAT_BIDIR_QOS 0x00000004 | 116 | #define L2CAP_FEAT_BIDIR_QOS 0x00000004 |
117 | #define L2CAP_FEAT_ERTM 0x00000008 | 117 | #define L2CAP_FEAT_ERTM 0x00000008 |
118 | #define L2CAP_FEAT_STREAMING 0x00000010 | 118 | #define L2CAP_FEAT_STREAMING 0x00000010 |
119 | #define L2CAP_FEAT_FCS 0x00000020 | 119 | #define L2CAP_FEAT_FCS 0x00000020 |
120 | #define L2CAP_FEAT_EXT_FLOW 0x00000040 | 120 | #define L2CAP_FEAT_EXT_FLOW 0x00000040 |
121 | #define L2CAP_FEAT_FIXED_CHAN 0x00000080 | 121 | #define L2CAP_FEAT_FIXED_CHAN 0x00000080 |
122 | #define L2CAP_FEAT_EXT_WINDOW 0x00000100 | 122 | #define L2CAP_FEAT_EXT_WINDOW 0x00000100 |
123 | #define L2CAP_FEAT_UCD 0x00000200 | 123 | #define L2CAP_FEAT_UCD 0x00000200 |
124 | 124 | ||
125 | /* L2CAP checksum option */ | 125 | /* L2CAP checksum option */ |
126 | #define L2CAP_FCS_NONE 0x00 | 126 | #define L2CAP_FCS_NONE 0x00 |
127 | #define L2CAP_FCS_CRC16 0x01 | 127 | #define L2CAP_FCS_CRC16 0x01 |
128 | 128 | ||
129 | /* L2CAP fixed channels */ | 129 | /* L2CAP fixed channels */ |
130 | #define L2CAP_FC_L2CAP 0x02 | 130 | #define L2CAP_FC_L2CAP 0x02 |
131 | #define L2CAP_FC_A2MP 0x08 | 131 | #define L2CAP_FC_A2MP 0x08 |
132 | 132 | ||
133 | /* L2CAP Control Field bit masks */ | 133 | /* L2CAP Control Field bit masks */ |
134 | #define L2CAP_CTRL_SAR 0xC000 | 134 | #define L2CAP_CTRL_SAR 0xC000 |
135 | #define L2CAP_CTRL_REQSEQ 0x3F00 | 135 | #define L2CAP_CTRL_REQSEQ 0x3F00 |
136 | #define L2CAP_CTRL_TXSEQ 0x007E | 136 | #define L2CAP_CTRL_TXSEQ 0x007E |
137 | #define L2CAP_CTRL_SUPERVISE 0x000C | 137 | #define L2CAP_CTRL_SUPERVISE 0x000C |
138 | 138 | ||
139 | #define L2CAP_CTRL_RETRANS 0x0080 | 139 | #define L2CAP_CTRL_RETRANS 0x0080 |
140 | #define L2CAP_CTRL_FINAL 0x0080 | 140 | #define L2CAP_CTRL_FINAL 0x0080 |
141 | #define L2CAP_CTRL_POLL 0x0010 | 141 | #define L2CAP_CTRL_POLL 0x0010 |
142 | #define L2CAP_CTRL_FRAME_TYPE 0x0001 /* I- or S-Frame */ | 142 | #define L2CAP_CTRL_FRAME_TYPE 0x0001 /* I- or S-Frame */ |
143 | 143 | ||
144 | #define L2CAP_CTRL_TXSEQ_SHIFT 1 | 144 | #define L2CAP_CTRL_TXSEQ_SHIFT 1 |
145 | #define L2CAP_CTRL_SUPER_SHIFT 2 | 145 | #define L2CAP_CTRL_SUPER_SHIFT 2 |
146 | #define L2CAP_CTRL_POLL_SHIFT 4 | 146 | #define L2CAP_CTRL_POLL_SHIFT 4 |
147 | #define L2CAP_CTRL_FINAL_SHIFT 7 | 147 | #define L2CAP_CTRL_FINAL_SHIFT 7 |
148 | #define L2CAP_CTRL_REQSEQ_SHIFT 8 | 148 | #define L2CAP_CTRL_REQSEQ_SHIFT 8 |
149 | #define L2CAP_CTRL_SAR_SHIFT 14 | 149 | #define L2CAP_CTRL_SAR_SHIFT 14 |
150 | 150 | ||
151 | /* L2CAP Extended Control Field bit mask */ | 151 | /* L2CAP Extended Control Field bit mask */ |
152 | #define L2CAP_EXT_CTRL_TXSEQ 0xFFFC0000 | 152 | #define L2CAP_EXT_CTRL_TXSEQ 0xFFFC0000 |
153 | #define L2CAP_EXT_CTRL_SAR 0x00030000 | 153 | #define L2CAP_EXT_CTRL_SAR 0x00030000 |
154 | #define L2CAP_EXT_CTRL_SUPERVISE 0x00030000 | 154 | #define L2CAP_EXT_CTRL_SUPERVISE 0x00030000 |
155 | #define L2CAP_EXT_CTRL_REQSEQ 0x0000FFFC | 155 | #define L2CAP_EXT_CTRL_REQSEQ 0x0000FFFC |
156 | 156 | ||
157 | #define L2CAP_EXT_CTRL_POLL 0x00040000 | 157 | #define L2CAP_EXT_CTRL_POLL 0x00040000 |
158 | #define L2CAP_EXT_CTRL_FINAL 0x00000002 | 158 | #define L2CAP_EXT_CTRL_FINAL 0x00000002 |
159 | #define L2CAP_EXT_CTRL_FRAME_TYPE 0x00000001 /* I- or S-Frame */ | 159 | #define L2CAP_EXT_CTRL_FRAME_TYPE 0x00000001 /* I- or S-Frame */ |
160 | 160 | ||
161 | #define L2CAP_EXT_CTRL_FINAL_SHIFT 1 | 161 | #define L2CAP_EXT_CTRL_FINAL_SHIFT 1 |
162 | #define L2CAP_EXT_CTRL_REQSEQ_SHIFT 2 | 162 | #define L2CAP_EXT_CTRL_REQSEQ_SHIFT 2 |
163 | #define L2CAP_EXT_CTRL_SAR_SHIFT 16 | 163 | #define L2CAP_EXT_CTRL_SAR_SHIFT 16 |
164 | #define L2CAP_EXT_CTRL_SUPER_SHIFT 16 | 164 | #define L2CAP_EXT_CTRL_SUPER_SHIFT 16 |
165 | #define L2CAP_EXT_CTRL_POLL_SHIFT 18 | 165 | #define L2CAP_EXT_CTRL_POLL_SHIFT 18 |
166 | #define L2CAP_EXT_CTRL_TXSEQ_SHIFT 18 | 166 | #define L2CAP_EXT_CTRL_TXSEQ_SHIFT 18 |
167 | 167 | ||
168 | /* L2CAP Supervisory Function */ | 168 | /* L2CAP Supervisory Function */ |
169 | #define L2CAP_SUPER_RR 0x00 | 169 | #define L2CAP_SUPER_RR 0x00 |
170 | #define L2CAP_SUPER_REJ 0x01 | 170 | #define L2CAP_SUPER_REJ 0x01 |
171 | #define L2CAP_SUPER_RNR 0x02 | 171 | #define L2CAP_SUPER_RNR 0x02 |
172 | #define L2CAP_SUPER_SREJ 0x03 | 172 | #define L2CAP_SUPER_SREJ 0x03 |
173 | 173 | ||
174 | /* L2CAP Segmentation and Reassembly */ | 174 | /* L2CAP Segmentation and Reassembly */ |
175 | #define L2CAP_SAR_UNSEGMENTED 0x00 | 175 | #define L2CAP_SAR_UNSEGMENTED 0x00 |
176 | #define L2CAP_SAR_START 0x01 | 176 | #define L2CAP_SAR_START 0x01 |
177 | #define L2CAP_SAR_END 0x02 | 177 | #define L2CAP_SAR_END 0x02 |
178 | #define L2CAP_SAR_CONTINUE 0x03 | 178 | #define L2CAP_SAR_CONTINUE 0x03 |
179 | 179 | ||
180 | /* L2CAP Command rej. reasons */ | 180 | /* L2CAP Command rej. reasons */ |
181 | #define L2CAP_REJ_NOT_UNDERSTOOD 0x0000 | 181 | #define L2CAP_REJ_NOT_UNDERSTOOD 0x0000 |
182 | #define L2CAP_REJ_MTU_EXCEEDED 0x0001 | 182 | #define L2CAP_REJ_MTU_EXCEEDED 0x0001 |
183 | #define L2CAP_REJ_INVALID_CID 0x0002 | 183 | #define L2CAP_REJ_INVALID_CID 0x0002 |
184 | 184 | ||
185 | /* L2CAP structures */ | 185 | /* L2CAP structures */ |
186 | struct l2cap_hdr { | 186 | struct l2cap_hdr { |
187 | __le16 len; | 187 | __le16 len; |
188 | __le16 cid; | 188 | __le16 cid; |
189 | } __packed; | 189 | } __packed; |
190 | #define L2CAP_HDR_SIZE 4 | 190 | #define L2CAP_HDR_SIZE 4 |
191 | #define L2CAP_ENH_HDR_SIZE 6 | 191 | #define L2CAP_ENH_HDR_SIZE 6 |
192 | #define L2CAP_EXT_HDR_SIZE 8 | 192 | #define L2CAP_EXT_HDR_SIZE 8 |
193 | 193 | ||
194 | #define L2CAP_FCS_SIZE 2 | 194 | #define L2CAP_FCS_SIZE 2 |
195 | #define L2CAP_SDULEN_SIZE 2 | 195 | #define L2CAP_SDULEN_SIZE 2 |
196 | #define L2CAP_PSMLEN_SIZE 2 | 196 | #define L2CAP_PSMLEN_SIZE 2 |
197 | #define L2CAP_ENH_CTRL_SIZE 2 | 197 | #define L2CAP_ENH_CTRL_SIZE 2 |
198 | #define L2CAP_EXT_CTRL_SIZE 4 | 198 | #define L2CAP_EXT_CTRL_SIZE 4 |
199 | 199 | ||
200 | struct l2cap_cmd_hdr { | 200 | struct l2cap_cmd_hdr { |
201 | __u8 code; | 201 | __u8 code; |
202 | __u8 ident; | 202 | __u8 ident; |
203 | __le16 len; | 203 | __le16 len; |
204 | } __packed; | 204 | } __packed; |
205 | #define L2CAP_CMD_HDR_SIZE 4 | 205 | #define L2CAP_CMD_HDR_SIZE 4 |
206 | 206 | ||
207 | struct l2cap_cmd_rej_unk { | 207 | struct l2cap_cmd_rej_unk { |
208 | __le16 reason; | 208 | __le16 reason; |
209 | } __packed; | 209 | } __packed; |
210 | 210 | ||
211 | struct l2cap_cmd_rej_mtu { | 211 | struct l2cap_cmd_rej_mtu { |
212 | __le16 reason; | 212 | __le16 reason; |
213 | __le16 max_mtu; | 213 | __le16 max_mtu; |
214 | } __packed; | 214 | } __packed; |
215 | 215 | ||
216 | struct l2cap_cmd_rej_cid { | 216 | struct l2cap_cmd_rej_cid { |
217 | __le16 reason; | 217 | __le16 reason; |
218 | __le16 scid; | 218 | __le16 scid; |
219 | __le16 dcid; | 219 | __le16 dcid; |
220 | } __packed; | 220 | } __packed; |
221 | 221 | ||
222 | struct l2cap_conn_req { | 222 | struct l2cap_conn_req { |
223 | __le16 psm; | 223 | __le16 psm; |
224 | __le16 scid; | 224 | __le16 scid; |
225 | } __packed; | 225 | } __packed; |
226 | 226 | ||
227 | struct l2cap_conn_rsp { | 227 | struct l2cap_conn_rsp { |
228 | __le16 dcid; | 228 | __le16 dcid; |
229 | __le16 scid; | 229 | __le16 scid; |
230 | __le16 result; | 230 | __le16 result; |
231 | __le16 status; | 231 | __le16 status; |
232 | } __packed; | 232 | } __packed; |
233 | 233 | ||
234 | /* protocol/service multiplexer (PSM) */ | 234 | /* protocol/service multiplexer (PSM) */ |
235 | #define L2CAP_PSM_SDP 0x0001 | 235 | #define L2CAP_PSM_SDP 0x0001 |
236 | #define L2CAP_PSM_RFCOMM 0x0003 | 236 | #define L2CAP_PSM_RFCOMM 0x0003 |
237 | 237 | ||
238 | /* channel indentifier */ | 238 | /* channel indentifier */ |
239 | #define L2CAP_CID_SIGNALING 0x0001 | 239 | #define L2CAP_CID_SIGNALING 0x0001 |
240 | #define L2CAP_CID_CONN_LESS 0x0002 | 240 | #define L2CAP_CID_CONN_LESS 0x0002 |
241 | #define L2CAP_CID_A2MP 0x0003 | 241 | #define L2CAP_CID_A2MP 0x0003 |
242 | #define L2CAP_CID_LE_DATA 0x0004 | 242 | #define L2CAP_CID_LE_DATA 0x0004 |
243 | #define L2CAP_CID_LE_SIGNALING 0x0005 | 243 | #define L2CAP_CID_LE_SIGNALING 0x0005 |
244 | #define L2CAP_CID_SMP 0x0006 | 244 | #define L2CAP_CID_SMP 0x0006 |
245 | #define L2CAP_CID_DYN_START 0x0040 | 245 | #define L2CAP_CID_DYN_START 0x0040 |
246 | #define L2CAP_CID_DYN_END 0xffff | 246 | #define L2CAP_CID_DYN_END 0xffff |
247 | 247 | ||
248 | /* connect/create channel results */ | 248 | /* connect/create channel results */ |
249 | #define L2CAP_CR_SUCCESS 0x0000 | 249 | #define L2CAP_CR_SUCCESS 0x0000 |
250 | #define L2CAP_CR_PEND 0x0001 | 250 | #define L2CAP_CR_PEND 0x0001 |
251 | #define L2CAP_CR_BAD_PSM 0x0002 | 251 | #define L2CAP_CR_BAD_PSM 0x0002 |
252 | #define L2CAP_CR_SEC_BLOCK 0x0003 | 252 | #define L2CAP_CR_SEC_BLOCK 0x0003 |
253 | #define L2CAP_CR_NO_MEM 0x0004 | 253 | #define L2CAP_CR_NO_MEM 0x0004 |
254 | #define L2CAP_CR_BAD_AMP 0x0005 | 254 | #define L2CAP_CR_BAD_AMP 0x0005 |
255 | 255 | ||
256 | /* connect/create channel status */ | 256 | /* connect/create channel status */ |
257 | #define L2CAP_CS_NO_INFO 0x0000 | 257 | #define L2CAP_CS_NO_INFO 0x0000 |
258 | #define L2CAP_CS_AUTHEN_PEND 0x0001 | 258 | #define L2CAP_CS_AUTHEN_PEND 0x0001 |
259 | #define L2CAP_CS_AUTHOR_PEND 0x0002 | 259 | #define L2CAP_CS_AUTHOR_PEND 0x0002 |
260 | 260 | ||
261 | struct l2cap_conf_req { | 261 | struct l2cap_conf_req { |
262 | __le16 dcid; | 262 | __le16 dcid; |
263 | __le16 flags; | 263 | __le16 flags; |
264 | __u8 data[0]; | 264 | __u8 data[0]; |
265 | } __packed; | 265 | } __packed; |
266 | 266 | ||
267 | struct l2cap_conf_rsp { | 267 | struct l2cap_conf_rsp { |
268 | __le16 scid; | 268 | __le16 scid; |
269 | __le16 flags; | 269 | __le16 flags; |
270 | __le16 result; | 270 | __le16 result; |
271 | __u8 data[0]; | 271 | __u8 data[0]; |
272 | } __packed; | 272 | } __packed; |
273 | 273 | ||
274 | #define L2CAP_CONF_SUCCESS 0x0000 | 274 | #define L2CAP_CONF_SUCCESS 0x0000 |
275 | #define L2CAP_CONF_UNACCEPT 0x0001 | 275 | #define L2CAP_CONF_UNACCEPT 0x0001 |
276 | #define L2CAP_CONF_REJECT 0x0002 | 276 | #define L2CAP_CONF_REJECT 0x0002 |
277 | #define L2CAP_CONF_UNKNOWN 0x0003 | 277 | #define L2CAP_CONF_UNKNOWN 0x0003 |
278 | #define L2CAP_CONF_PENDING 0x0004 | 278 | #define L2CAP_CONF_PENDING 0x0004 |
279 | #define L2CAP_CONF_EFS_REJECT 0x0005 | 279 | #define L2CAP_CONF_EFS_REJECT 0x0005 |
280 | 280 | ||
281 | /* configuration req/rsp continuation flag */ | 281 | /* configuration req/rsp continuation flag */ |
282 | #define L2CAP_CONF_FLAG_CONTINUATION 0x0001 | 282 | #define L2CAP_CONF_FLAG_CONTINUATION 0x0001 |
283 | 283 | ||
284 | struct l2cap_conf_opt { | 284 | struct l2cap_conf_opt { |
285 | __u8 type; | 285 | __u8 type; |
286 | __u8 len; | 286 | __u8 len; |
287 | __u8 val[0]; | 287 | __u8 val[0]; |
288 | } __packed; | 288 | } __packed; |
289 | #define L2CAP_CONF_OPT_SIZE 2 | 289 | #define L2CAP_CONF_OPT_SIZE 2 |
290 | 290 | ||
291 | #define L2CAP_CONF_HINT 0x80 | 291 | #define L2CAP_CONF_HINT 0x80 |
292 | #define L2CAP_CONF_MASK 0x7f | 292 | #define L2CAP_CONF_MASK 0x7f |
293 | 293 | ||
294 | #define L2CAP_CONF_MTU 0x01 | 294 | #define L2CAP_CONF_MTU 0x01 |
295 | #define L2CAP_CONF_FLUSH_TO 0x02 | 295 | #define L2CAP_CONF_FLUSH_TO 0x02 |
296 | #define L2CAP_CONF_QOS 0x03 | 296 | #define L2CAP_CONF_QOS 0x03 |
297 | #define L2CAP_CONF_RFC 0x04 | 297 | #define L2CAP_CONF_RFC 0x04 |
298 | #define L2CAP_CONF_FCS 0x05 | 298 | #define L2CAP_CONF_FCS 0x05 |
299 | #define L2CAP_CONF_EFS 0x06 | 299 | #define L2CAP_CONF_EFS 0x06 |
300 | #define L2CAP_CONF_EWS 0x07 | 300 | #define L2CAP_CONF_EWS 0x07 |
301 | 301 | ||
302 | #define L2CAP_CONF_MAX_SIZE 22 | 302 | #define L2CAP_CONF_MAX_SIZE 22 |
303 | 303 | ||
304 | struct l2cap_conf_rfc { | 304 | struct l2cap_conf_rfc { |
305 | __u8 mode; | 305 | __u8 mode; |
306 | __u8 txwin_size; | 306 | __u8 txwin_size; |
307 | __u8 max_transmit; | 307 | __u8 max_transmit; |
308 | __le16 retrans_timeout; | 308 | __le16 retrans_timeout; |
309 | __le16 monitor_timeout; | 309 | __le16 monitor_timeout; |
310 | __le16 max_pdu_size; | 310 | __le16 max_pdu_size; |
311 | } __packed; | 311 | } __packed; |
312 | 312 | ||
313 | #define L2CAP_MODE_BASIC 0x00 | 313 | #define L2CAP_MODE_BASIC 0x00 |
314 | #define L2CAP_MODE_RETRANS 0x01 | 314 | #define L2CAP_MODE_RETRANS 0x01 |
315 | #define L2CAP_MODE_FLOWCTL 0x02 | 315 | #define L2CAP_MODE_FLOWCTL 0x02 |
316 | #define L2CAP_MODE_ERTM 0x03 | 316 | #define L2CAP_MODE_ERTM 0x03 |
317 | #define L2CAP_MODE_STREAMING 0x04 | 317 | #define L2CAP_MODE_STREAMING 0x04 |
318 | 318 | ||
319 | struct l2cap_conf_efs { | 319 | struct l2cap_conf_efs { |
320 | __u8 id; | 320 | __u8 id; |
321 | __u8 stype; | 321 | __u8 stype; |
322 | __le16 msdu; | 322 | __le16 msdu; |
323 | __le32 sdu_itime; | 323 | __le32 sdu_itime; |
324 | __le32 acc_lat; | 324 | __le32 acc_lat; |
325 | __le32 flush_to; | 325 | __le32 flush_to; |
326 | } __packed; | 326 | } __packed; |
327 | 327 | ||
328 | #define L2CAP_SERV_NOTRAFIC 0x00 | 328 | #define L2CAP_SERV_NOTRAFIC 0x00 |
329 | #define L2CAP_SERV_BESTEFFORT 0x01 | 329 | #define L2CAP_SERV_BESTEFFORT 0x01 |
330 | #define L2CAP_SERV_GUARANTEED 0x02 | 330 | #define L2CAP_SERV_GUARANTEED 0x02 |
331 | 331 | ||
332 | #define L2CAP_BESTEFFORT_ID 0x01 | 332 | #define L2CAP_BESTEFFORT_ID 0x01 |
333 | 333 | ||
334 | struct l2cap_disconn_req { | 334 | struct l2cap_disconn_req { |
335 | __le16 dcid; | 335 | __le16 dcid; |
336 | __le16 scid; | 336 | __le16 scid; |
337 | } __packed; | 337 | } __packed; |
338 | 338 | ||
339 | struct l2cap_disconn_rsp { | 339 | struct l2cap_disconn_rsp { |
340 | __le16 dcid; | 340 | __le16 dcid; |
341 | __le16 scid; | 341 | __le16 scid; |
342 | } __packed; | 342 | } __packed; |
343 | 343 | ||
344 | struct l2cap_info_req { | 344 | struct l2cap_info_req { |
345 | __le16 type; | 345 | __le16 type; |
346 | } __packed; | 346 | } __packed; |
347 | 347 | ||
348 | struct l2cap_info_rsp { | 348 | struct l2cap_info_rsp { |
349 | __le16 type; | 349 | __le16 type; |
350 | __le16 result; | 350 | __le16 result; |
351 | __u8 data[0]; | 351 | __u8 data[0]; |
352 | } __packed; | 352 | } __packed; |
353 | 353 | ||
354 | struct l2cap_create_chan_req { | 354 | struct l2cap_create_chan_req { |
355 | __le16 psm; | 355 | __le16 psm; |
356 | __le16 scid; | 356 | __le16 scid; |
357 | __u8 amp_id; | 357 | __u8 amp_id; |
358 | } __packed; | 358 | } __packed; |
359 | 359 | ||
360 | struct l2cap_create_chan_rsp { | 360 | struct l2cap_create_chan_rsp { |
361 | __le16 dcid; | 361 | __le16 dcid; |
362 | __le16 scid; | 362 | __le16 scid; |
363 | __le16 result; | 363 | __le16 result; |
364 | __le16 status; | 364 | __le16 status; |
365 | } __packed; | 365 | } __packed; |
366 | 366 | ||
367 | struct l2cap_move_chan_req { | 367 | struct l2cap_move_chan_req { |
368 | __le16 icid; | 368 | __le16 icid; |
369 | __u8 dest_amp_id; | 369 | __u8 dest_amp_id; |
370 | } __packed; | 370 | } __packed; |
371 | 371 | ||
372 | struct l2cap_move_chan_rsp { | 372 | struct l2cap_move_chan_rsp { |
373 | __le16 icid; | 373 | __le16 icid; |
374 | __le16 result; | 374 | __le16 result; |
375 | } __packed; | 375 | } __packed; |
376 | 376 | ||
377 | #define L2CAP_MR_SUCCESS 0x0000 | 377 | #define L2CAP_MR_SUCCESS 0x0000 |
378 | #define L2CAP_MR_PEND 0x0001 | 378 | #define L2CAP_MR_PEND 0x0001 |
379 | #define L2CAP_MR_BAD_ID 0x0002 | 379 | #define L2CAP_MR_BAD_ID 0x0002 |
380 | #define L2CAP_MR_SAME_ID 0x0003 | 380 | #define L2CAP_MR_SAME_ID 0x0003 |
381 | #define L2CAP_MR_NOT_SUPP 0x0004 | 381 | #define L2CAP_MR_NOT_SUPP 0x0004 |
382 | #define L2CAP_MR_COLLISION 0x0005 | 382 | #define L2CAP_MR_COLLISION 0x0005 |
383 | #define L2CAP_MR_NOT_ALLOWED 0x0006 | 383 | #define L2CAP_MR_NOT_ALLOWED 0x0006 |
384 | 384 | ||
385 | struct l2cap_move_chan_cfm { | 385 | struct l2cap_move_chan_cfm { |
386 | __le16 icid; | 386 | __le16 icid; |
387 | __le16 result; | 387 | __le16 result; |
388 | } __packed; | 388 | } __packed; |
389 | 389 | ||
390 | #define L2CAP_MC_CONFIRMED 0x0000 | 390 | #define L2CAP_MC_CONFIRMED 0x0000 |
391 | #define L2CAP_MC_UNCONFIRMED 0x0001 | 391 | #define L2CAP_MC_UNCONFIRMED 0x0001 |
392 | 392 | ||
393 | struct l2cap_move_chan_cfm_rsp { | 393 | struct l2cap_move_chan_cfm_rsp { |
394 | __le16 icid; | 394 | __le16 icid; |
395 | } __packed; | 395 | } __packed; |
396 | 396 | ||
397 | /* info type */ | 397 | /* info type */ |
398 | #define L2CAP_IT_CL_MTU 0x0001 | 398 | #define L2CAP_IT_CL_MTU 0x0001 |
399 | #define L2CAP_IT_FEAT_MASK 0x0002 | 399 | #define L2CAP_IT_FEAT_MASK 0x0002 |
400 | #define L2CAP_IT_FIXED_CHAN 0x0003 | 400 | #define L2CAP_IT_FIXED_CHAN 0x0003 |
401 | 401 | ||
402 | /* info result */ | 402 | /* info result */ |
403 | #define L2CAP_IR_SUCCESS 0x0000 | 403 | #define L2CAP_IR_SUCCESS 0x0000 |
404 | #define L2CAP_IR_NOTSUPP 0x0001 | 404 | #define L2CAP_IR_NOTSUPP 0x0001 |
405 | 405 | ||
406 | struct l2cap_conn_param_update_req { | 406 | struct l2cap_conn_param_update_req { |
407 | __le16 min; | 407 | __le16 min; |
408 | __le16 max; | 408 | __le16 max; |
409 | __le16 latency; | 409 | __le16 latency; |
410 | __le16 to_multiplier; | 410 | __le16 to_multiplier; |
411 | } __packed; | 411 | } __packed; |
412 | 412 | ||
413 | struct l2cap_conn_param_update_rsp { | 413 | struct l2cap_conn_param_update_rsp { |
414 | __le16 result; | 414 | __le16 result; |
415 | } __packed; | 415 | } __packed; |
416 | 416 | ||
417 | /* Connection Parameters result */ | 417 | /* Connection Parameters result */ |
418 | #define L2CAP_CONN_PARAM_ACCEPTED 0x0000 | 418 | #define L2CAP_CONN_PARAM_ACCEPTED 0x0000 |
419 | #define L2CAP_CONN_PARAM_REJECTED 0x0001 | 419 | #define L2CAP_CONN_PARAM_REJECTED 0x0001 |
420 | 420 | ||
421 | /* ----- L2CAP channels and connections ----- */ | 421 | /* ----- L2CAP channels and connections ----- */ |
422 | struct l2cap_seq_list { | 422 | struct l2cap_seq_list { |
423 | __u16 head; | 423 | __u16 head; |
424 | __u16 tail; | 424 | __u16 tail; |
425 | __u16 mask; | 425 | __u16 mask; |
426 | __u16 *list; | 426 | __u16 *list; |
427 | }; | 427 | }; |
428 | 428 | ||
429 | #define L2CAP_SEQ_LIST_CLEAR 0xFFFF | 429 | #define L2CAP_SEQ_LIST_CLEAR 0xFFFF |
430 | #define L2CAP_SEQ_LIST_TAIL 0x8000 | 430 | #define L2CAP_SEQ_LIST_TAIL 0x8000 |
431 | 431 | ||
432 | struct l2cap_chan { | 432 | struct l2cap_chan { |
433 | struct sock *sk; | 433 | struct sock *sk; |
434 | 434 | ||
435 | struct l2cap_conn *conn; | 435 | struct l2cap_conn *conn; |
436 | 436 | ||
437 | __u8 state; | 437 | __u8 state; |
438 | 438 | ||
439 | atomic_t refcnt; | 439 | atomic_t refcnt; |
440 | 440 | ||
441 | __le16 psm; | 441 | __le16 psm; |
442 | __u16 dcid; | 442 | __u16 dcid; |
443 | __u16 scid; | 443 | __u16 scid; |
444 | 444 | ||
445 | __u16 imtu; | 445 | __u16 imtu; |
446 | __u16 omtu; | 446 | __u16 omtu; |
447 | __u16 flush_to; | 447 | __u16 flush_to; |
448 | __u8 mode; | 448 | __u8 mode; |
449 | __u8 chan_type; | 449 | __u8 chan_type; |
450 | __u8 chan_policy; | 450 | __u8 chan_policy; |
451 | 451 | ||
452 | __le16 sport; | 452 | __le16 sport; |
453 | 453 | ||
454 | __u8 sec_level; | 454 | __u8 sec_level; |
455 | 455 | ||
456 | __u8 ident; | 456 | __u8 ident; |
457 | 457 | ||
458 | __u8 conf_req[64]; | 458 | __u8 conf_req[64]; |
459 | __u8 conf_len; | 459 | __u8 conf_len; |
460 | __u8 num_conf_req; | 460 | __u8 num_conf_req; |
461 | __u8 num_conf_rsp; | 461 | __u8 num_conf_rsp; |
462 | 462 | ||
463 | __u8 fcs; | 463 | __u8 fcs; |
464 | 464 | ||
465 | __u16 tx_win; | 465 | __u16 tx_win; |
466 | __u16 tx_win_max; | 466 | __u16 tx_win_max; |
467 | __u8 max_tx; | 467 | __u8 max_tx; |
468 | __u16 retrans_timeout; | 468 | __u16 retrans_timeout; |
469 | __u16 monitor_timeout; | 469 | __u16 monitor_timeout; |
470 | __u16 mps; | 470 | __u16 mps; |
471 | 471 | ||
472 | __u8 tx_state; | 472 | __u8 tx_state; |
473 | __u8 rx_state; | 473 | __u8 rx_state; |
474 | 474 | ||
475 | unsigned long conf_state; | 475 | unsigned long conf_state; |
476 | unsigned long conn_state; | 476 | unsigned long conn_state; |
477 | unsigned long flags; | 477 | unsigned long flags; |
478 | 478 | ||
479 | __u16 next_tx_seq; | 479 | __u16 next_tx_seq; |
480 | __u16 expected_ack_seq; | 480 | __u16 expected_ack_seq; |
481 | __u16 expected_tx_seq; | 481 | __u16 expected_tx_seq; |
482 | __u16 buffer_seq; | 482 | __u16 buffer_seq; |
483 | __u16 srej_save_reqseq; | 483 | __u16 srej_save_reqseq; |
484 | __u16 last_acked_seq; | 484 | __u16 last_acked_seq; |
485 | __u16 frames_sent; | 485 | __u16 frames_sent; |
486 | __u16 unacked_frames; | 486 | __u16 unacked_frames; |
487 | __u8 retry_count; | 487 | __u8 retry_count; |
488 | __u16 srej_queue_next; | 488 | __u16 srej_queue_next; |
489 | __u16 sdu_len; | 489 | __u16 sdu_len; |
490 | struct sk_buff *sdu; | 490 | struct sk_buff *sdu; |
491 | struct sk_buff *sdu_last_frag; | 491 | struct sk_buff *sdu_last_frag; |
492 | 492 | ||
493 | __u16 remote_tx_win; | 493 | __u16 remote_tx_win; |
494 | __u8 remote_max_tx; | 494 | __u8 remote_max_tx; |
495 | __u16 remote_mps; | 495 | __u16 remote_mps; |
496 | 496 | ||
497 | __u8 local_id; | 497 | __u8 local_id; |
498 | __u8 local_stype; | 498 | __u8 local_stype; |
499 | __u16 local_msdu; | 499 | __u16 local_msdu; |
500 | __u32 local_sdu_itime; | 500 | __u32 local_sdu_itime; |
501 | __u32 local_acc_lat; | 501 | __u32 local_acc_lat; |
502 | __u32 local_flush_to; | 502 | __u32 local_flush_to; |
503 | 503 | ||
504 | __u8 remote_id; | 504 | __u8 remote_id; |
505 | __u8 remote_stype; | 505 | __u8 remote_stype; |
506 | __u16 remote_msdu; | 506 | __u16 remote_msdu; |
507 | __u32 remote_sdu_itime; | 507 | __u32 remote_sdu_itime; |
508 | __u32 remote_acc_lat; | 508 | __u32 remote_acc_lat; |
509 | __u32 remote_flush_to; | 509 | __u32 remote_flush_to; |
510 | 510 | ||
511 | struct delayed_work chan_timer; | 511 | struct delayed_work chan_timer; |
512 | struct delayed_work retrans_timer; | 512 | struct delayed_work retrans_timer; |
513 | struct delayed_work monitor_timer; | 513 | struct delayed_work monitor_timer; |
514 | struct delayed_work ack_timer; | 514 | struct delayed_work ack_timer; |
515 | 515 | ||
516 | struct sk_buff *tx_send_head; | 516 | struct sk_buff *tx_send_head; |
517 | struct sk_buff_head tx_q; | 517 | struct sk_buff_head tx_q; |
518 | struct sk_buff_head srej_q; | 518 | struct sk_buff_head srej_q; |
519 | struct l2cap_seq_list srej_list; | 519 | struct l2cap_seq_list srej_list; |
520 | struct l2cap_seq_list retrans_list; | 520 | struct l2cap_seq_list retrans_list; |
521 | 521 | ||
522 | struct list_head list; | 522 | struct list_head list; |
523 | struct list_head global_l; | 523 | struct list_head global_l; |
524 | 524 | ||
525 | void *data; | 525 | void *data; |
526 | struct l2cap_ops *ops; | 526 | struct l2cap_ops *ops; |
527 | struct mutex lock; | 527 | struct mutex lock; |
528 | }; | 528 | }; |
529 | 529 | ||
530 | struct l2cap_ops { | 530 | struct l2cap_ops { |
531 | char *name; | 531 | char *name; |
532 | 532 | ||
533 | struct l2cap_chan *(*new_connection) (struct l2cap_chan *chan); | 533 | struct l2cap_chan *(*new_connection) (struct l2cap_chan *chan); |
534 | int (*recv) (struct l2cap_chan * chan, | 534 | int (*recv) (struct l2cap_chan * chan, |
535 | struct sk_buff *skb); | 535 | struct sk_buff *skb); |
536 | void (*teardown) (struct l2cap_chan *chan, int err); | 536 | void (*teardown) (struct l2cap_chan *chan, int err); |
537 | void (*close) (struct l2cap_chan *chan); | 537 | void (*close) (struct l2cap_chan *chan); |
538 | void (*state_change) (struct l2cap_chan *chan, | 538 | void (*state_change) (struct l2cap_chan *chan, |
539 | int state); | 539 | int state); |
540 | void (*ready) (struct l2cap_chan *chan); | 540 | void (*ready) (struct l2cap_chan *chan); |
541 | struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan, | 541 | struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan, |
542 | unsigned long len, int nb); | 542 | unsigned long len, int nb); |
543 | }; | 543 | }; |
544 | 544 | ||
545 | struct l2cap_conn { | 545 | struct l2cap_conn { |
546 | struct hci_conn *hcon; | 546 | struct hci_conn *hcon; |
547 | struct hci_chan *hchan; | 547 | struct hci_chan *hchan; |
548 | 548 | ||
549 | bdaddr_t *dst; | 549 | bdaddr_t *dst; |
550 | bdaddr_t *src; | 550 | bdaddr_t *src; |
551 | 551 | ||
552 | unsigned int mtu; | 552 | unsigned int mtu; |
553 | 553 | ||
554 | __u32 feat_mask; | 554 | __u32 feat_mask; |
555 | __u8 fixed_chan_mask; | 555 | __u8 fixed_chan_mask; |
556 | 556 | ||
557 | __u8 info_state; | 557 | __u8 info_state; |
558 | __u8 info_ident; | 558 | __u8 info_ident; |
559 | 559 | ||
560 | struct delayed_work info_timer; | 560 | struct delayed_work info_timer; |
561 | 561 | ||
562 | spinlock_t lock; | 562 | spinlock_t lock; |
563 | 563 | ||
564 | struct sk_buff *rx_skb; | 564 | struct sk_buff *rx_skb; |
565 | __u32 rx_len; | 565 | __u32 rx_len; |
566 | __u8 tx_ident; | 566 | __u8 tx_ident; |
567 | 567 | ||
568 | __u8 disc_reason; | 568 | __u8 disc_reason; |
569 | 569 | ||
570 | struct delayed_work security_timer; | 570 | struct delayed_work security_timer; |
571 | struct smp_chan *smp_chan; | 571 | struct smp_chan *smp_chan; |
572 | 572 | ||
573 | struct list_head chan_l; | 573 | struct list_head chan_l; |
574 | struct mutex chan_lock; | 574 | struct mutex chan_lock; |
575 | }; | 575 | }; |
576 | 576 | ||
577 | #define L2CAP_INFO_CL_MTU_REQ_SENT 0x01 | 577 | #define L2CAP_INFO_CL_MTU_REQ_SENT 0x01 |
578 | #define L2CAP_INFO_FEAT_MASK_REQ_SENT 0x04 | 578 | #define L2CAP_INFO_FEAT_MASK_REQ_SENT 0x04 |
579 | #define L2CAP_INFO_FEAT_MASK_REQ_DONE 0x08 | 579 | #define L2CAP_INFO_FEAT_MASK_REQ_DONE 0x08 |
580 | 580 | ||
581 | #define L2CAP_CHAN_RAW 1 | 581 | #define L2CAP_CHAN_RAW 1 |
582 | #define L2CAP_CHAN_CONN_LESS 2 | 582 | #define L2CAP_CHAN_CONN_LESS 2 |
583 | #define L2CAP_CHAN_CONN_ORIENTED 3 | 583 | #define L2CAP_CHAN_CONN_ORIENTED 3 |
584 | #define L2CAP_CHAN_CONN_FIX_A2MP 4 | 584 | #define L2CAP_CHAN_CONN_FIX_A2MP 4 |
585 | 585 | ||
586 | /* ----- L2CAP socket info ----- */ | 586 | /* ----- L2CAP socket info ----- */ |
587 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) | 587 | #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) |
588 | 588 | ||
589 | struct l2cap_pinfo { | 589 | struct l2cap_pinfo { |
590 | struct bt_sock bt; | 590 | struct bt_sock bt; |
591 | struct l2cap_chan *chan; | 591 | struct l2cap_chan *chan; |
592 | struct sk_buff *rx_busy_skb; | 592 | struct sk_buff *rx_busy_skb; |
593 | }; | 593 | }; |
594 | 594 | ||
595 | enum { | 595 | enum { |
596 | CONF_REQ_SENT, | 596 | CONF_REQ_SENT, |
597 | CONF_INPUT_DONE, | 597 | CONF_INPUT_DONE, |
598 | CONF_OUTPUT_DONE, | 598 | CONF_OUTPUT_DONE, |
599 | CONF_MTU_DONE, | 599 | CONF_MTU_DONE, |
600 | CONF_MODE_DONE, | 600 | CONF_MODE_DONE, |
601 | CONF_CONNECT_PEND, | 601 | CONF_CONNECT_PEND, |
602 | CONF_NO_FCS_RECV, | 602 | CONF_NO_FCS_RECV, |
603 | CONF_STATE2_DEVICE, | 603 | CONF_STATE2_DEVICE, |
604 | CONF_EWS_RECV, | 604 | CONF_EWS_RECV, |
605 | CONF_LOC_CONF_PEND, | 605 | CONF_LOC_CONF_PEND, |
606 | CONF_REM_CONF_PEND, | 606 | CONF_REM_CONF_PEND, |
607 | CONF_NOT_COMPLETE, | 607 | CONF_NOT_COMPLETE, |
608 | }; | 608 | }; |
609 | 609 | ||
610 | #define L2CAP_CONF_MAX_CONF_REQ 2 | 610 | #define L2CAP_CONF_MAX_CONF_REQ 2 |
611 | #define L2CAP_CONF_MAX_CONF_RSP 2 | 611 | #define L2CAP_CONF_MAX_CONF_RSP 2 |
612 | 612 | ||
613 | enum { | 613 | enum { |
614 | CONN_SREJ_SENT, | 614 | CONN_SREJ_SENT, |
615 | CONN_WAIT_F, | 615 | CONN_WAIT_F, |
616 | CONN_SREJ_ACT, | 616 | CONN_SREJ_ACT, |
617 | CONN_SEND_PBIT, | 617 | CONN_SEND_PBIT, |
618 | CONN_REMOTE_BUSY, | 618 | CONN_REMOTE_BUSY, |
619 | CONN_LOCAL_BUSY, | 619 | CONN_LOCAL_BUSY, |
620 | CONN_REJ_ACT, | 620 | CONN_REJ_ACT, |
621 | CONN_SEND_FBIT, | 621 | CONN_SEND_FBIT, |
622 | CONN_RNR_SENT, | 622 | CONN_RNR_SENT, |
623 | }; | 623 | }; |
624 | 624 | ||
625 | /* Definitions for flags in l2cap_chan */ | 625 | /* Definitions for flags in l2cap_chan */ |
626 | enum { | 626 | enum { |
627 | FLAG_ROLE_SWITCH, | 627 | FLAG_ROLE_SWITCH, |
628 | FLAG_FORCE_ACTIVE, | 628 | FLAG_FORCE_ACTIVE, |
629 | FLAG_FORCE_RELIABLE, | 629 | FLAG_FORCE_RELIABLE, |
630 | FLAG_FLUSHABLE, | 630 | FLAG_FLUSHABLE, |
631 | FLAG_EXT_CTRL, | 631 | FLAG_EXT_CTRL, |
632 | FLAG_EFS_ENABLE, | 632 | FLAG_EFS_ENABLE, |
633 | }; | 633 | }; |
634 | 634 | ||
635 | enum { | 635 | enum { |
636 | L2CAP_TX_STATE_XMIT, | 636 | L2CAP_TX_STATE_XMIT, |
637 | L2CAP_TX_STATE_WAIT_F, | 637 | L2CAP_TX_STATE_WAIT_F, |
638 | }; | 638 | }; |
639 | 639 | ||
640 | enum { | 640 | enum { |
641 | L2CAP_RX_STATE_RECV, | 641 | L2CAP_RX_STATE_RECV, |
642 | L2CAP_RX_STATE_SREJ_SENT, | 642 | L2CAP_RX_STATE_SREJ_SENT, |
643 | }; | 643 | }; |
644 | 644 | ||
645 | enum { | 645 | enum { |
646 | L2CAP_TXSEQ_EXPECTED, | 646 | L2CAP_TXSEQ_EXPECTED, |
647 | L2CAP_TXSEQ_EXPECTED_SREJ, | 647 | L2CAP_TXSEQ_EXPECTED_SREJ, |
648 | L2CAP_TXSEQ_UNEXPECTED, | 648 | L2CAP_TXSEQ_UNEXPECTED, |
649 | L2CAP_TXSEQ_UNEXPECTED_SREJ, | 649 | L2CAP_TXSEQ_UNEXPECTED_SREJ, |
650 | L2CAP_TXSEQ_DUPLICATE, | 650 | L2CAP_TXSEQ_DUPLICATE, |
651 | L2CAP_TXSEQ_DUPLICATE_SREJ, | 651 | L2CAP_TXSEQ_DUPLICATE_SREJ, |
652 | L2CAP_TXSEQ_INVALID, | 652 | L2CAP_TXSEQ_INVALID, |
653 | L2CAP_TXSEQ_INVALID_IGNORE, | 653 | L2CAP_TXSEQ_INVALID_IGNORE, |
654 | }; | 654 | }; |
655 | 655 | ||
656 | enum { | 656 | enum { |
657 | L2CAP_EV_DATA_REQUEST, | 657 | L2CAP_EV_DATA_REQUEST, |
658 | L2CAP_EV_LOCAL_BUSY_DETECTED, | 658 | L2CAP_EV_LOCAL_BUSY_DETECTED, |
659 | L2CAP_EV_LOCAL_BUSY_CLEAR, | 659 | L2CAP_EV_LOCAL_BUSY_CLEAR, |
660 | L2CAP_EV_RECV_REQSEQ_AND_FBIT, | 660 | L2CAP_EV_RECV_REQSEQ_AND_FBIT, |
661 | L2CAP_EV_RECV_FBIT, | 661 | L2CAP_EV_RECV_FBIT, |
662 | L2CAP_EV_RETRANS_TO, | 662 | L2CAP_EV_RETRANS_TO, |
663 | L2CAP_EV_MONITOR_TO, | 663 | L2CAP_EV_MONITOR_TO, |
664 | L2CAP_EV_EXPLICIT_POLL, | 664 | L2CAP_EV_EXPLICIT_POLL, |
665 | L2CAP_EV_RECV_IFRAME, | 665 | L2CAP_EV_RECV_IFRAME, |
666 | L2CAP_EV_RECV_RR, | 666 | L2CAP_EV_RECV_RR, |
667 | L2CAP_EV_RECV_REJ, | 667 | L2CAP_EV_RECV_REJ, |
668 | L2CAP_EV_RECV_RNR, | 668 | L2CAP_EV_RECV_RNR, |
669 | L2CAP_EV_RECV_SREJ, | 669 | L2CAP_EV_RECV_SREJ, |
670 | L2CAP_EV_RECV_FRAME, | 670 | L2CAP_EV_RECV_FRAME, |
671 | }; | 671 | }; |
672 | 672 | ||
673 | static inline void l2cap_chan_hold(struct l2cap_chan *c) | 673 | static inline void l2cap_chan_hold(struct l2cap_chan *c) |
674 | { | 674 | { |
675 | atomic_inc(&c->refcnt); | 675 | atomic_inc(&c->refcnt); |
676 | } | 676 | } |
677 | 677 | ||
678 | static inline void l2cap_chan_put(struct l2cap_chan *c) | 678 | static inline void l2cap_chan_put(struct l2cap_chan *c) |
679 | { | 679 | { |
680 | if (atomic_dec_and_test(&c->refcnt)) | 680 | if (atomic_dec_and_test(&c->refcnt)) |
681 | kfree(c); | 681 | kfree(c); |
682 | } | 682 | } |
683 | 683 | ||
684 | static inline void l2cap_chan_lock(struct l2cap_chan *chan) | 684 | static inline void l2cap_chan_lock(struct l2cap_chan *chan) |
685 | { | 685 | { |
686 | mutex_lock(&chan->lock); | 686 | mutex_lock(&chan->lock); |
687 | } | 687 | } |
688 | 688 | ||
689 | static inline void l2cap_chan_unlock(struct l2cap_chan *chan) | 689 | static inline void l2cap_chan_unlock(struct l2cap_chan *chan) |
690 | { | 690 | { |
691 | mutex_unlock(&chan->lock); | 691 | mutex_unlock(&chan->lock); |
692 | } | 692 | } |
693 | 693 | ||
694 | static inline void l2cap_set_timer(struct l2cap_chan *chan, | 694 | static inline void l2cap_set_timer(struct l2cap_chan *chan, |
695 | struct delayed_work *work, long timeout) | 695 | struct delayed_work *work, long timeout) |
696 | { | 696 | { |
697 | BT_DBG("chan %p state %s timeout %ld", chan, | 697 | BT_DBG("chan %p state %s timeout %ld", chan, |
698 | state_to_string(chan->state), timeout); | 698 | state_to_string(chan->state), timeout); |
699 | 699 | ||
700 | /* If delayed work cancelled do not hold(chan) | 700 | /* If delayed work cancelled do not hold(chan) |
701 | since it is already done with previous set_timer */ | 701 | since it is already done with previous set_timer */ |
702 | if (!cancel_delayed_work(work)) | 702 | if (!cancel_delayed_work(work)) |
703 | l2cap_chan_hold(chan); | 703 | l2cap_chan_hold(chan); |
704 | 704 | ||
705 | schedule_delayed_work(work, timeout); | 705 | schedule_delayed_work(work, timeout); |
706 | } | 706 | } |
707 | 707 | ||
708 | static inline bool l2cap_clear_timer(struct l2cap_chan *chan, | 708 | static inline bool l2cap_clear_timer(struct l2cap_chan *chan, |
709 | struct delayed_work *work) | 709 | struct delayed_work *work) |
710 | { | 710 | { |
711 | bool ret; | 711 | bool ret; |
712 | 712 | ||
713 | /* put(chan) if delayed work cancelled otherwise it | 713 | /* put(chan) if delayed work cancelled otherwise it |
714 | is done in delayed work function */ | 714 | is done in delayed work function */ |
715 | ret = cancel_delayed_work(work); | 715 | ret = cancel_delayed_work(work); |
716 | if (ret) | 716 | if (ret) |
717 | l2cap_chan_put(chan); | 717 | l2cap_chan_put(chan); |
718 | 718 | ||
719 | return ret; | 719 | return ret; |
720 | } | 720 | } |
721 | 721 | ||
722 | #define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t)) | 722 | #define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t)) |
723 | #define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer) | 723 | #define __clear_chan_timer(c) l2cap_clear_timer(c, &c->chan_timer) |
724 | #define __clear_retrans_timer(c) l2cap_clear_timer(c, &c->retrans_timer) | 724 | #define __clear_retrans_timer(c) l2cap_clear_timer(c, &c->retrans_timer) |
725 | #define __clear_monitor_timer(c) l2cap_clear_timer(c, &c->monitor_timer) | 725 | #define __clear_monitor_timer(c) l2cap_clear_timer(c, &c->monitor_timer) |
726 | #define __set_ack_timer(c) l2cap_set_timer(c, &chan->ack_timer, \ | 726 | #define __set_ack_timer(c) l2cap_set_timer(c, &chan->ack_timer, \ |
727 | msecs_to_jiffies(L2CAP_DEFAULT_ACK_TO)); | 727 | msecs_to_jiffies(L2CAP_DEFAULT_ACK_TO)); |
728 | #define __clear_ack_timer(c) l2cap_clear_timer(c, &c->ack_timer) | 728 | #define __clear_ack_timer(c) l2cap_clear_timer(c, &c->ack_timer) |
729 | 729 | ||
730 | static inline int __seq_offset(struct l2cap_chan *chan, __u16 seq1, __u16 seq2) | 730 | static inline int __seq_offset(struct l2cap_chan *chan, __u16 seq1, __u16 seq2) |
731 | { | 731 | { |
732 | if (seq1 >= seq2) | 732 | if (seq1 >= seq2) |
733 | return seq1 - seq2; | 733 | return seq1 - seq2; |
734 | else | 734 | else |
735 | return chan->tx_win_max + 1 - seq2 + seq1; | 735 | return chan->tx_win_max + 1 - seq2 + seq1; |
736 | } | 736 | } |
737 | 737 | ||
738 | static inline __u16 __next_seq(struct l2cap_chan *chan, __u16 seq) | 738 | static inline __u16 __next_seq(struct l2cap_chan *chan, __u16 seq) |
739 | { | 739 | { |
740 | return (seq + 1) % (chan->tx_win_max + 1); | 740 | return (seq + 1) % (chan->tx_win_max + 1); |
741 | } | 741 | } |
742 | 742 | ||
743 | 743 | ||
744 | extern bool disable_ertm; | 744 | extern bool disable_ertm; |
745 | 745 | ||
746 | int l2cap_init_sockets(void); | 746 | int l2cap_init_sockets(void); |
747 | void l2cap_cleanup_sockets(void); | 747 | void l2cap_cleanup_sockets(void); |
748 | 748 | ||
749 | void __l2cap_connect_rsp_defer(struct l2cap_chan *chan); | 749 | void __l2cap_connect_rsp_defer(struct l2cap_chan *chan); |
750 | int __l2cap_wait_ack(struct sock *sk); | 750 | int __l2cap_wait_ack(struct sock *sk); |
751 | 751 | ||
752 | int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm); | 752 | int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm); |
753 | int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid); | 753 | int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid); |
754 | 754 | ||
755 | struct l2cap_chan *l2cap_chan_create(void); | 755 | struct l2cap_chan *l2cap_chan_create(void); |
756 | void l2cap_chan_close(struct l2cap_chan *chan, int reason); | 756 | void l2cap_chan_close(struct l2cap_chan *chan, int reason); |
757 | void l2cap_chan_destroy(struct l2cap_chan *chan); | 757 | void l2cap_chan_destroy(struct l2cap_chan *chan); |
758 | int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, | 758 | int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, |
759 | bdaddr_t *dst, u8 dst_type); | 759 | bdaddr_t *dst, u8 dst_type); |
760 | int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len, | 760 | int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len, |
761 | u32 priority); | 761 | u32 priority); |
762 | void l2cap_chan_busy(struct l2cap_chan *chan, int busy); | 762 | void l2cap_chan_busy(struct l2cap_chan *chan, int busy); |
763 | int l2cap_chan_check_security(struct l2cap_chan *chan); | 763 | int l2cap_chan_check_security(struct l2cap_chan *chan); |
764 | void l2cap_chan_set_defaults(struct l2cap_chan *chan); | 764 | void l2cap_chan_set_defaults(struct l2cap_chan *chan); |
765 | int l2cap_ertm_init(struct l2cap_chan *chan); | 765 | int l2cap_ertm_init(struct l2cap_chan *chan); |
766 | void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); | 766 | void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan); |
767 | void l2cap_chan_del(struct l2cap_chan *chan, int err); | 767 | void l2cap_chan_del(struct l2cap_chan *chan, int err); |
768 | 768 | ||
769 | #endif /* __L2CAP_H */ | 769 | #endif /* __L2CAP_H */ |
net/bluetooth/l2cap_sock.c
1 | /* | 1 | /* |
2 | BlueZ - Bluetooth protocol stack for Linux | 2 | BlueZ - Bluetooth protocol stack for Linux |
3 | Copyright (C) 2000-2001 Qualcomm Incorporated | 3 | Copyright (C) 2000-2001 Qualcomm Incorporated |
4 | Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org> | 4 | Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org> |
5 | Copyright (C) 2010 Google Inc. | 5 | Copyright (C) 2010 Google Inc. |
6 | Copyright (C) 2011 ProFUSION Embedded Systems | 6 | Copyright (C) 2011 ProFUSION Embedded Systems |
7 | 7 | ||
8 | Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> | 8 | Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> |
9 | 9 | ||
10 | This program is free software; you can redistribute it and/or modify | 10 | This program is free software; you can redistribute it and/or modify |
11 | it under the terms of the GNU General Public License version 2 as | 11 | it under the terms of the GNU General Public License version 2 as |
12 | published by the Free Software Foundation; | 12 | published by the Free Software Foundation; |
13 | 13 | ||
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. | 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. |
17 | IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY | 17 | IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY |
18 | CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES | 18 | CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES |
19 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | 19 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
20 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | 20 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
21 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 21 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
22 | 22 | ||
23 | ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, | 23 | ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, |
24 | COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS | 24 | COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS |
25 | SOFTWARE IS DISCLAIMED. | 25 | SOFTWARE IS DISCLAIMED. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | /* Bluetooth L2CAP sockets. */ | 28 | /* Bluetooth L2CAP sockets. */ |
29 | 29 | ||
30 | #include <linux/export.h> | 30 | #include <linux/export.h> |
31 | 31 | ||
32 | #include <net/bluetooth/bluetooth.h> | 32 | #include <net/bluetooth/bluetooth.h> |
33 | #include <net/bluetooth/hci_core.h> | 33 | #include <net/bluetooth/hci_core.h> |
34 | #include <net/bluetooth/l2cap.h> | 34 | #include <net/bluetooth/l2cap.h> |
35 | #include <net/bluetooth/smp.h> | 35 | #include <net/bluetooth/smp.h> |
36 | 36 | ||
37 | static const struct proto_ops l2cap_sock_ops; | 37 | static const struct proto_ops l2cap_sock_ops; |
38 | static void l2cap_sock_init(struct sock *sk, struct sock *parent); | 38 | static void l2cap_sock_init(struct sock *sk, struct sock *parent); |
39 | static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio); | 39 | static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio); |
40 | 40 | ||
41 | static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) | 41 | static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) |
42 | { | 42 | { |
43 | struct sock *sk = sock->sk; | 43 | struct sock *sk = sock->sk; |
44 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | 44 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
45 | struct sockaddr_l2 la; | 45 | struct sockaddr_l2 la; |
46 | int len, err = 0; | 46 | int len, err = 0; |
47 | 47 | ||
48 | BT_DBG("sk %p", sk); | 48 | BT_DBG("sk %p", sk); |
49 | 49 | ||
50 | if (!addr || addr->sa_family != AF_BLUETOOTH) | 50 | if (!addr || addr->sa_family != AF_BLUETOOTH) |
51 | return -EINVAL; | 51 | return -EINVAL; |
52 | 52 | ||
53 | memset(&la, 0, sizeof(la)); | 53 | memset(&la, 0, sizeof(la)); |
54 | len = min_t(unsigned int, sizeof(la), alen); | 54 | len = min_t(unsigned int, sizeof(la), alen); |
55 | memcpy(&la, addr, len); | 55 | memcpy(&la, addr, len); |
56 | 56 | ||
57 | if (la.l2_cid && la.l2_psm) | 57 | if (la.l2_cid && la.l2_psm) |
58 | return -EINVAL; | 58 | return -EINVAL; |
59 | 59 | ||
60 | lock_sock(sk); | 60 | lock_sock(sk); |
61 | 61 | ||
62 | if (sk->sk_state != BT_OPEN) { | 62 | if (sk->sk_state != BT_OPEN) { |
63 | err = -EBADFD; | 63 | err = -EBADFD; |
64 | goto done; | 64 | goto done; |
65 | } | 65 | } |
66 | 66 | ||
67 | if (la.l2_psm) { | 67 | if (la.l2_psm) { |
68 | __u16 psm = __le16_to_cpu(la.l2_psm); | 68 | __u16 psm = __le16_to_cpu(la.l2_psm); |
69 | 69 | ||
70 | /* PSM must be odd and lsb of upper byte must be 0 */ | 70 | /* PSM must be odd and lsb of upper byte must be 0 */ |
71 | if ((psm & 0x0101) != 0x0001) { | 71 | if ((psm & 0x0101) != 0x0001) { |
72 | err = -EINVAL; | 72 | err = -EINVAL; |
73 | goto done; | 73 | goto done; |
74 | } | 74 | } |
75 | 75 | ||
76 | /* Restrict usage of well-known PSMs */ | 76 | /* Restrict usage of well-known PSMs */ |
77 | if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) { | 77 | if (psm < 0x1001 && !capable(CAP_NET_BIND_SERVICE)) { |
78 | err = -EACCES; | 78 | err = -EACCES; |
79 | goto done; | 79 | goto done; |
80 | } | 80 | } |
81 | } | 81 | } |
82 | 82 | ||
83 | if (la.l2_cid) | 83 | if (la.l2_cid) |
84 | err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid)); | 84 | err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid)); |
85 | else | 85 | else |
86 | err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm); | 86 | err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm); |
87 | 87 | ||
88 | if (err < 0) | 88 | if (err < 0) |
89 | goto done; | 89 | goto done; |
90 | 90 | ||
91 | if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP || | 91 | if (__le16_to_cpu(la.l2_psm) == L2CAP_PSM_SDP || |
92 | __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM) | 92 | __le16_to_cpu(la.l2_psm) == L2CAP_PSM_RFCOMM) |
93 | chan->sec_level = BT_SECURITY_SDP; | 93 | chan->sec_level = BT_SECURITY_SDP; |
94 | 94 | ||
95 | bacpy(&bt_sk(sk)->src, &la.l2_bdaddr); | 95 | bacpy(&bt_sk(sk)->src, &la.l2_bdaddr); |
96 | 96 | ||
97 | chan->state = BT_BOUND; | 97 | chan->state = BT_BOUND; |
98 | sk->sk_state = BT_BOUND; | 98 | sk->sk_state = BT_BOUND; |
99 | 99 | ||
100 | done: | 100 | done: |
101 | release_sock(sk); | 101 | release_sock(sk); |
102 | return err; | 102 | return err; |
103 | } | 103 | } |
104 | 104 | ||
105 | static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags) | 105 | static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int flags) |
106 | { | 106 | { |
107 | struct sock *sk = sock->sk; | 107 | struct sock *sk = sock->sk; |
108 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | 108 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
109 | struct sockaddr_l2 la; | 109 | struct sockaddr_l2 la; |
110 | int len, err = 0; | 110 | int len, err = 0; |
111 | 111 | ||
112 | BT_DBG("sk %p", sk); | 112 | BT_DBG("sk %p", sk); |
113 | 113 | ||
114 | if (!addr || alen < sizeof(addr->sa_family) || | 114 | if (!addr || alen < sizeof(addr->sa_family) || |
115 | addr->sa_family != AF_BLUETOOTH) | 115 | addr->sa_family != AF_BLUETOOTH) |
116 | return -EINVAL; | 116 | return -EINVAL; |
117 | 117 | ||
118 | memset(&la, 0, sizeof(la)); | 118 | memset(&la, 0, sizeof(la)); |
119 | len = min_t(unsigned int, sizeof(la), alen); | 119 | len = min_t(unsigned int, sizeof(la), alen); |
120 | memcpy(&la, addr, len); | 120 | memcpy(&la, addr, len); |
121 | 121 | ||
122 | if (la.l2_cid && la.l2_psm) | 122 | if (la.l2_cid && la.l2_psm) |
123 | return -EINVAL; | 123 | return -EINVAL; |
124 | 124 | ||
125 | err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid), | 125 | err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid), |
126 | &la.l2_bdaddr, la.l2_bdaddr_type); | 126 | &la.l2_bdaddr, la.l2_bdaddr_type); |
127 | if (err) | 127 | if (err) |
128 | return err; | 128 | return err; |
129 | 129 | ||
130 | lock_sock(sk); | 130 | lock_sock(sk); |
131 | 131 | ||
132 | err = bt_sock_wait_state(sk, BT_CONNECTED, | 132 | err = bt_sock_wait_state(sk, BT_CONNECTED, |
133 | sock_sndtimeo(sk, flags & O_NONBLOCK)); | 133 | sock_sndtimeo(sk, flags & O_NONBLOCK)); |
134 | 134 | ||
135 | release_sock(sk); | 135 | release_sock(sk); |
136 | 136 | ||
137 | return err; | 137 | return err; |
138 | } | 138 | } |
139 | 139 | ||
140 | static int l2cap_sock_listen(struct socket *sock, int backlog) | 140 | static int l2cap_sock_listen(struct socket *sock, int backlog) |
141 | { | 141 | { |
142 | struct sock *sk = sock->sk; | 142 | struct sock *sk = sock->sk; |
143 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | 143 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
144 | int err = 0; | 144 | int err = 0; |
145 | 145 | ||
146 | BT_DBG("sk %p backlog %d", sk, backlog); | 146 | BT_DBG("sk %p backlog %d", sk, backlog); |
147 | 147 | ||
148 | lock_sock(sk); | 148 | lock_sock(sk); |
149 | 149 | ||
150 | if (sk->sk_state != BT_BOUND) { | 150 | if (sk->sk_state != BT_BOUND) { |
151 | err = -EBADFD; | 151 | err = -EBADFD; |
152 | goto done; | 152 | goto done; |
153 | } | 153 | } |
154 | 154 | ||
155 | if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) { | 155 | if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) { |
156 | err = -EINVAL; | 156 | err = -EINVAL; |
157 | goto done; | 157 | goto done; |
158 | } | 158 | } |
159 | 159 | ||
160 | switch (chan->mode) { | 160 | switch (chan->mode) { |
161 | case L2CAP_MODE_BASIC: | 161 | case L2CAP_MODE_BASIC: |
162 | break; | 162 | break; |
163 | case L2CAP_MODE_ERTM: | 163 | case L2CAP_MODE_ERTM: |
164 | case L2CAP_MODE_STREAMING: | 164 | case L2CAP_MODE_STREAMING: |
165 | if (!disable_ertm) | 165 | if (!disable_ertm) |
166 | break; | 166 | break; |
167 | /* fall through */ | 167 | /* fall through */ |
168 | default: | 168 | default: |
169 | err = -ENOTSUPP; | 169 | err = -ENOTSUPP; |
170 | goto done; | 170 | goto done; |
171 | } | 171 | } |
172 | 172 | ||
173 | sk->sk_max_ack_backlog = backlog; | 173 | sk->sk_max_ack_backlog = backlog; |
174 | sk->sk_ack_backlog = 0; | 174 | sk->sk_ack_backlog = 0; |
175 | 175 | ||
176 | chan->state = BT_LISTEN; | 176 | chan->state = BT_LISTEN; |
177 | sk->sk_state = BT_LISTEN; | 177 | sk->sk_state = BT_LISTEN; |
178 | 178 | ||
179 | done: | 179 | done: |
180 | release_sock(sk); | 180 | release_sock(sk); |
181 | return err; | 181 | return err; |
182 | } | 182 | } |
183 | 183 | ||
184 | static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags) | 184 | static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int flags) |
185 | { | 185 | { |
186 | DECLARE_WAITQUEUE(wait, current); | 186 | DECLARE_WAITQUEUE(wait, current); |
187 | struct sock *sk = sock->sk, *nsk; | 187 | struct sock *sk = sock->sk, *nsk; |
188 | long timeo; | 188 | long timeo; |
189 | int err = 0; | 189 | int err = 0; |
190 | 190 | ||
191 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); | 191 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
192 | 192 | ||
193 | timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); | 193 | timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); |
194 | 194 | ||
195 | BT_DBG("sk %p timeo %ld", sk, timeo); | 195 | BT_DBG("sk %p timeo %ld", sk, timeo); |
196 | 196 | ||
197 | /* Wait for an incoming connection. (wake-one). */ | 197 | /* Wait for an incoming connection. (wake-one). */ |
198 | add_wait_queue_exclusive(sk_sleep(sk), &wait); | 198 | add_wait_queue_exclusive(sk_sleep(sk), &wait); |
199 | while (1) { | 199 | while (1) { |
200 | set_current_state(TASK_INTERRUPTIBLE); | 200 | set_current_state(TASK_INTERRUPTIBLE); |
201 | 201 | ||
202 | if (sk->sk_state != BT_LISTEN) { | 202 | if (sk->sk_state != BT_LISTEN) { |
203 | err = -EBADFD; | 203 | err = -EBADFD; |
204 | break; | 204 | break; |
205 | } | 205 | } |
206 | 206 | ||
207 | nsk = bt_accept_dequeue(sk, newsock); | 207 | nsk = bt_accept_dequeue(sk, newsock); |
208 | if (nsk) | 208 | if (nsk) |
209 | break; | 209 | break; |
210 | 210 | ||
211 | if (!timeo) { | 211 | if (!timeo) { |
212 | err = -EAGAIN; | 212 | err = -EAGAIN; |
213 | break; | 213 | break; |
214 | } | 214 | } |
215 | 215 | ||
216 | if (signal_pending(current)) { | 216 | if (signal_pending(current)) { |
217 | err = sock_intr_errno(timeo); | 217 | err = sock_intr_errno(timeo); |
218 | break; | 218 | break; |
219 | } | 219 | } |
220 | 220 | ||
221 | release_sock(sk); | 221 | release_sock(sk); |
222 | timeo = schedule_timeout(timeo); | 222 | timeo = schedule_timeout(timeo); |
223 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); | 223 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
224 | } | 224 | } |
225 | __set_current_state(TASK_RUNNING); | 225 | __set_current_state(TASK_RUNNING); |
226 | remove_wait_queue(sk_sleep(sk), &wait); | 226 | remove_wait_queue(sk_sleep(sk), &wait); |
227 | 227 | ||
228 | if (err) | 228 | if (err) |
229 | goto done; | 229 | goto done; |
230 | 230 | ||
231 | newsock->state = SS_CONNECTED; | 231 | newsock->state = SS_CONNECTED; |
232 | 232 | ||
233 | BT_DBG("new socket %p", nsk); | 233 | BT_DBG("new socket %p", nsk); |
234 | 234 | ||
235 | done: | 235 | done: |
236 | release_sock(sk); | 236 | release_sock(sk); |
237 | return err; | 237 | return err; |
238 | } | 238 | } |
239 | 239 | ||
240 | static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer) | 240 | static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *len, int peer) |
241 | { | 241 | { |
242 | struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr; | 242 | struct sockaddr_l2 *la = (struct sockaddr_l2 *) addr; |
243 | struct sock *sk = sock->sk; | 243 | struct sock *sk = sock->sk; |
244 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | 244 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
245 | 245 | ||
246 | BT_DBG("sock %p, sk %p", sock, sk); | 246 | BT_DBG("sock %p, sk %p", sock, sk); |
247 | 247 | ||
248 | addr->sa_family = AF_BLUETOOTH; | 248 | addr->sa_family = AF_BLUETOOTH; |
249 | *len = sizeof(struct sockaddr_l2); | 249 | *len = sizeof(struct sockaddr_l2); |
250 | 250 | ||
251 | if (peer) { | 251 | if (peer) { |
252 | la->l2_psm = chan->psm; | 252 | la->l2_psm = chan->psm; |
253 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst); | 253 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->dst); |
254 | la->l2_cid = cpu_to_le16(chan->dcid); | 254 | la->l2_cid = cpu_to_le16(chan->dcid); |
255 | } else { | 255 | } else { |
256 | la->l2_psm = chan->sport; | 256 | la->l2_psm = chan->sport; |
257 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->src); | 257 | bacpy(&la->l2_bdaddr, &bt_sk(sk)->src); |
258 | la->l2_cid = cpu_to_le16(chan->scid); | 258 | la->l2_cid = cpu_to_le16(chan->scid); |
259 | } | 259 | } |
260 | 260 | ||
261 | return 0; | 261 | return 0; |
262 | } | 262 | } |
263 | 263 | ||
264 | static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen) | 264 | static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen) |
265 | { | 265 | { |
266 | struct sock *sk = sock->sk; | 266 | struct sock *sk = sock->sk; |
267 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | 267 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
268 | struct l2cap_options opts; | 268 | struct l2cap_options opts; |
269 | struct l2cap_conninfo cinfo; | 269 | struct l2cap_conninfo cinfo; |
270 | int len, err = 0; | 270 | int len, err = 0; |
271 | u32 opt; | 271 | u32 opt; |
272 | 272 | ||
273 | BT_DBG("sk %p", sk); | 273 | BT_DBG("sk %p", sk); |
274 | 274 | ||
275 | if (get_user(len, optlen)) | 275 | if (get_user(len, optlen)) |
276 | return -EFAULT; | 276 | return -EFAULT; |
277 | 277 | ||
278 | lock_sock(sk); | 278 | lock_sock(sk); |
279 | 279 | ||
280 | switch (optname) { | 280 | switch (optname) { |
281 | case L2CAP_OPTIONS: | 281 | case L2CAP_OPTIONS: |
282 | memset(&opts, 0, sizeof(opts)); | 282 | memset(&opts, 0, sizeof(opts)); |
283 | opts.imtu = chan->imtu; | 283 | opts.imtu = chan->imtu; |
284 | opts.omtu = chan->omtu; | 284 | opts.omtu = chan->omtu; |
285 | opts.flush_to = chan->flush_to; | 285 | opts.flush_to = chan->flush_to; |
286 | opts.mode = chan->mode; | 286 | opts.mode = chan->mode; |
287 | opts.fcs = chan->fcs; | 287 | opts.fcs = chan->fcs; |
288 | opts.max_tx = chan->max_tx; | 288 | opts.max_tx = chan->max_tx; |
289 | opts.txwin_size = chan->tx_win; | 289 | opts.txwin_size = chan->tx_win; |
290 | 290 | ||
291 | len = min_t(unsigned int, len, sizeof(opts)); | 291 | len = min_t(unsigned int, len, sizeof(opts)); |
292 | if (copy_to_user(optval, (char *) &opts, len)) | 292 | if (copy_to_user(optval, (char *) &opts, len)) |
293 | err = -EFAULT; | 293 | err = -EFAULT; |
294 | 294 | ||
295 | break; | 295 | break; |
296 | 296 | ||
297 | case L2CAP_LM: | 297 | case L2CAP_LM: |
298 | switch (chan->sec_level) { | 298 | switch (chan->sec_level) { |
299 | case BT_SECURITY_LOW: | 299 | case BT_SECURITY_LOW: |
300 | opt = L2CAP_LM_AUTH; | 300 | opt = L2CAP_LM_AUTH; |
301 | break; | 301 | break; |
302 | case BT_SECURITY_MEDIUM: | 302 | case BT_SECURITY_MEDIUM: |
303 | opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT; | 303 | opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT; |
304 | break; | 304 | break; |
305 | case BT_SECURITY_HIGH: | 305 | case BT_SECURITY_HIGH: |
306 | opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT | | 306 | opt = L2CAP_LM_AUTH | L2CAP_LM_ENCRYPT | |
307 | L2CAP_LM_SECURE; | 307 | L2CAP_LM_SECURE; |
308 | break; | 308 | break; |
309 | default: | 309 | default: |
310 | opt = 0; | 310 | opt = 0; |
311 | break; | 311 | break; |
312 | } | 312 | } |
313 | 313 | ||
314 | if (test_bit(FLAG_ROLE_SWITCH, &chan->flags)) | 314 | if (test_bit(FLAG_ROLE_SWITCH, &chan->flags)) |
315 | opt |= L2CAP_LM_MASTER; | 315 | opt |= L2CAP_LM_MASTER; |
316 | 316 | ||
317 | if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags)) | 317 | if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags)) |
318 | opt |= L2CAP_LM_RELIABLE; | 318 | opt |= L2CAP_LM_RELIABLE; |
319 | 319 | ||
320 | if (put_user(opt, (u32 __user *) optval)) | 320 | if (put_user(opt, (u32 __user *) optval)) |
321 | err = -EFAULT; | 321 | err = -EFAULT; |
322 | break; | 322 | break; |
323 | 323 | ||
324 | case L2CAP_CONNINFO: | 324 | case L2CAP_CONNINFO: |
325 | if (sk->sk_state != BT_CONNECTED && | 325 | if (sk->sk_state != BT_CONNECTED && |
326 | !(sk->sk_state == BT_CONNECT2 && | 326 | !(sk->sk_state == BT_CONNECT2 && |
327 | test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { | 327 | test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { |
328 | err = -ENOTCONN; | 328 | err = -ENOTCONN; |
329 | break; | 329 | break; |
330 | } | 330 | } |
331 | 331 | ||
332 | memset(&cinfo, 0, sizeof(cinfo)); | 332 | memset(&cinfo, 0, sizeof(cinfo)); |
333 | cinfo.hci_handle = chan->conn->hcon->handle; | 333 | cinfo.hci_handle = chan->conn->hcon->handle; |
334 | memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3); | 334 | memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3); |
335 | 335 | ||
336 | len = min_t(unsigned int, len, sizeof(cinfo)); | 336 | len = min_t(unsigned int, len, sizeof(cinfo)); |
337 | if (copy_to_user(optval, (char *) &cinfo, len)) | 337 | if (copy_to_user(optval, (char *) &cinfo, len)) |
338 | err = -EFAULT; | 338 | err = -EFAULT; |
339 | 339 | ||
340 | break; | 340 | break; |
341 | 341 | ||
342 | default: | 342 | default: |
343 | err = -ENOPROTOOPT; | 343 | err = -ENOPROTOOPT; |
344 | break; | 344 | break; |
345 | } | 345 | } |
346 | 346 | ||
347 | release_sock(sk); | 347 | release_sock(sk); |
348 | return err; | 348 | return err; |
349 | } | 349 | } |
350 | 350 | ||
351 | static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen) | 351 | static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen) |
352 | { | 352 | { |
353 | struct sock *sk = sock->sk; | 353 | struct sock *sk = sock->sk; |
354 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | 354 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
355 | struct bt_security sec; | 355 | struct bt_security sec; |
356 | struct bt_power pwr; | 356 | struct bt_power pwr; |
357 | int len, err = 0; | 357 | int len, err = 0; |
358 | 358 | ||
359 | BT_DBG("sk %p", sk); | 359 | BT_DBG("sk %p", sk); |
360 | 360 | ||
361 | if (level == SOL_L2CAP) | 361 | if (level == SOL_L2CAP) |
362 | return l2cap_sock_getsockopt_old(sock, optname, optval, optlen); | 362 | return l2cap_sock_getsockopt_old(sock, optname, optval, optlen); |
363 | 363 | ||
364 | if (level != SOL_BLUETOOTH) | 364 | if (level != SOL_BLUETOOTH) |
365 | return -ENOPROTOOPT; | 365 | return -ENOPROTOOPT; |
366 | 366 | ||
367 | if (get_user(len, optlen)) | 367 | if (get_user(len, optlen)) |
368 | return -EFAULT; | 368 | return -EFAULT; |
369 | 369 | ||
370 | lock_sock(sk); | 370 | lock_sock(sk); |
371 | 371 | ||
372 | switch (optname) { | 372 | switch (optname) { |
373 | case BT_SECURITY: | 373 | case BT_SECURITY: |
374 | if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED && | 374 | if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED && |
375 | chan->chan_type != L2CAP_CHAN_RAW) { | 375 | chan->chan_type != L2CAP_CHAN_RAW) { |
376 | err = -EINVAL; | 376 | err = -EINVAL; |
377 | break; | 377 | break; |
378 | } | 378 | } |
379 | 379 | ||
380 | memset(&sec, 0, sizeof(sec)); | 380 | memset(&sec, 0, sizeof(sec)); |
381 | if (chan->conn) | 381 | if (chan->conn) |
382 | sec.level = chan->conn->hcon->sec_level; | 382 | sec.level = chan->conn->hcon->sec_level; |
383 | else | 383 | else |
384 | sec.level = chan->sec_level; | 384 | sec.level = chan->sec_level; |
385 | 385 | ||
386 | if (sk->sk_state == BT_CONNECTED) | 386 | if (sk->sk_state == BT_CONNECTED) |
387 | sec.key_size = chan->conn->hcon->enc_key_size; | 387 | sec.key_size = chan->conn->hcon->enc_key_size; |
388 | 388 | ||
389 | len = min_t(unsigned int, len, sizeof(sec)); | 389 | len = min_t(unsigned int, len, sizeof(sec)); |
390 | if (copy_to_user(optval, (char *) &sec, len)) | 390 | if (copy_to_user(optval, (char *) &sec, len)) |
391 | err = -EFAULT; | 391 | err = -EFAULT; |
392 | 392 | ||
393 | break; | 393 | break; |
394 | 394 | ||
395 | case BT_DEFER_SETUP: | 395 | case BT_DEFER_SETUP: |
396 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { | 396 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { |
397 | err = -EINVAL; | 397 | err = -EINVAL; |
398 | break; | 398 | break; |
399 | } | 399 | } |
400 | 400 | ||
401 | if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), | 401 | if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), |
402 | (u32 __user *) optval)) | 402 | (u32 __user *) optval)) |
403 | err = -EFAULT; | 403 | err = -EFAULT; |
404 | 404 | ||
405 | break; | 405 | break; |
406 | 406 | ||
407 | case BT_FLUSHABLE: | 407 | case BT_FLUSHABLE: |
408 | if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags), | 408 | if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags), |
409 | (u32 __user *) optval)) | 409 | (u32 __user *) optval)) |
410 | err = -EFAULT; | 410 | err = -EFAULT; |
411 | 411 | ||
412 | break; | 412 | break; |
413 | 413 | ||
414 | case BT_POWER: | 414 | case BT_POWER: |
415 | if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM | 415 | if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM |
416 | && sk->sk_type != SOCK_RAW) { | 416 | && sk->sk_type != SOCK_RAW) { |
417 | err = -EINVAL; | 417 | err = -EINVAL; |
418 | break; | 418 | break; |
419 | } | 419 | } |
420 | 420 | ||
421 | pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags); | 421 | pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags); |
422 | 422 | ||
423 | len = min_t(unsigned int, len, sizeof(pwr)); | 423 | len = min_t(unsigned int, len, sizeof(pwr)); |
424 | if (copy_to_user(optval, (char *) &pwr, len)) | 424 | if (copy_to_user(optval, (char *) &pwr, len)) |
425 | err = -EFAULT; | 425 | err = -EFAULT; |
426 | 426 | ||
427 | break; | 427 | break; |
428 | 428 | ||
429 | case BT_CHANNEL_POLICY: | 429 | case BT_CHANNEL_POLICY: |
430 | if (!enable_hs) { | 430 | if (!enable_hs) { |
431 | err = -ENOPROTOOPT; | 431 | err = -ENOPROTOOPT; |
432 | break; | 432 | break; |
433 | } | 433 | } |
434 | 434 | ||
435 | if (put_user(chan->chan_policy, (u32 __user *) optval)) | 435 | if (put_user(chan->chan_policy, (u32 __user *) optval)) |
436 | err = -EFAULT; | 436 | err = -EFAULT; |
437 | break; | 437 | break; |
438 | 438 | ||
439 | default: | 439 | default: |
440 | err = -ENOPROTOOPT; | 440 | err = -ENOPROTOOPT; |
441 | break; | 441 | break; |
442 | } | 442 | } |
443 | 443 | ||
444 | release_sock(sk); | 444 | release_sock(sk); |
445 | return err; | 445 | return err; |
446 | } | 446 | } |
447 | 447 | ||
448 | static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu) | 448 | static bool l2cap_valid_mtu(struct l2cap_chan *chan, u16 mtu) |
449 | { | 449 | { |
450 | switch (chan->scid) { | 450 | switch (chan->scid) { |
451 | case L2CAP_CID_LE_DATA: | 451 | case L2CAP_CID_LE_DATA: |
452 | if (mtu < L2CAP_LE_DEFAULT_MTU) | 452 | if (mtu < L2CAP_LE_MIN_MTU) |
453 | return false; | 453 | return false; |
454 | break; | 454 | break; |
455 | 455 | ||
456 | default: | 456 | default: |
457 | if (mtu < L2CAP_DEFAULT_MIN_MTU) | 457 | if (mtu < L2CAP_DEFAULT_MIN_MTU) |
458 | return false; | 458 | return false; |
459 | } | 459 | } |
460 | 460 | ||
461 | return true; | 461 | return true; |
462 | } | 462 | } |
463 | 463 | ||
464 | static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen) | 464 | static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen) |
465 | { | 465 | { |
466 | struct sock *sk = sock->sk; | 466 | struct sock *sk = sock->sk; |
467 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | 467 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
468 | struct l2cap_options opts; | 468 | struct l2cap_options opts; |
469 | int len, err = 0; | 469 | int len, err = 0; |
470 | u32 opt; | 470 | u32 opt; |
471 | 471 | ||
472 | BT_DBG("sk %p", sk); | 472 | BT_DBG("sk %p", sk); |
473 | 473 | ||
474 | lock_sock(sk); | 474 | lock_sock(sk); |
475 | 475 | ||
476 | switch (optname) { | 476 | switch (optname) { |
477 | case L2CAP_OPTIONS: | 477 | case L2CAP_OPTIONS: |
478 | if (sk->sk_state == BT_CONNECTED) { | 478 | if (sk->sk_state == BT_CONNECTED) { |
479 | err = -EINVAL; | 479 | err = -EINVAL; |
480 | break; | 480 | break; |
481 | } | 481 | } |
482 | 482 | ||
483 | opts.imtu = chan->imtu; | 483 | opts.imtu = chan->imtu; |
484 | opts.omtu = chan->omtu; | 484 | opts.omtu = chan->omtu; |
485 | opts.flush_to = chan->flush_to; | 485 | opts.flush_to = chan->flush_to; |
486 | opts.mode = chan->mode; | 486 | opts.mode = chan->mode; |
487 | opts.fcs = chan->fcs; | 487 | opts.fcs = chan->fcs; |
488 | opts.max_tx = chan->max_tx; | 488 | opts.max_tx = chan->max_tx; |
489 | opts.txwin_size = chan->tx_win; | 489 | opts.txwin_size = chan->tx_win; |
490 | 490 | ||
491 | len = min_t(unsigned int, sizeof(opts), optlen); | 491 | len = min_t(unsigned int, sizeof(opts), optlen); |
492 | if (copy_from_user((char *) &opts, optval, len)) { | 492 | if (copy_from_user((char *) &opts, optval, len)) { |
493 | err = -EFAULT; | 493 | err = -EFAULT; |
494 | break; | 494 | break; |
495 | } | 495 | } |
496 | 496 | ||
497 | if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) { | 497 | if (opts.txwin_size > L2CAP_DEFAULT_EXT_WINDOW) { |
498 | err = -EINVAL; | 498 | err = -EINVAL; |
499 | break; | 499 | break; |
500 | } | 500 | } |
501 | 501 | ||
502 | if (!l2cap_valid_mtu(chan, opts.imtu)) { | 502 | if (!l2cap_valid_mtu(chan, opts.imtu)) { |
503 | err = -EINVAL; | 503 | err = -EINVAL; |
504 | break; | 504 | break; |
505 | } | 505 | } |
506 | 506 | ||
507 | chan->mode = opts.mode; | 507 | chan->mode = opts.mode; |
508 | switch (chan->mode) { | 508 | switch (chan->mode) { |
509 | case L2CAP_MODE_BASIC: | 509 | case L2CAP_MODE_BASIC: |
510 | clear_bit(CONF_STATE2_DEVICE, &chan->conf_state); | 510 | clear_bit(CONF_STATE2_DEVICE, &chan->conf_state); |
511 | break; | 511 | break; |
512 | case L2CAP_MODE_ERTM: | 512 | case L2CAP_MODE_ERTM: |
513 | case L2CAP_MODE_STREAMING: | 513 | case L2CAP_MODE_STREAMING: |
514 | if (!disable_ertm) | 514 | if (!disable_ertm) |
515 | break; | 515 | break; |
516 | /* fall through */ | 516 | /* fall through */ |
517 | default: | 517 | default: |
518 | err = -EINVAL; | 518 | err = -EINVAL; |
519 | break; | 519 | break; |
520 | } | 520 | } |
521 | 521 | ||
522 | chan->imtu = opts.imtu; | 522 | chan->imtu = opts.imtu; |
523 | chan->omtu = opts.omtu; | 523 | chan->omtu = opts.omtu; |
524 | chan->fcs = opts.fcs; | 524 | chan->fcs = opts.fcs; |
525 | chan->max_tx = opts.max_tx; | 525 | chan->max_tx = opts.max_tx; |
526 | chan->tx_win = opts.txwin_size; | 526 | chan->tx_win = opts.txwin_size; |
527 | break; | 527 | break; |
528 | 528 | ||
529 | case L2CAP_LM: | 529 | case L2CAP_LM: |
530 | if (get_user(opt, (u32 __user *) optval)) { | 530 | if (get_user(opt, (u32 __user *) optval)) { |
531 | err = -EFAULT; | 531 | err = -EFAULT; |
532 | break; | 532 | break; |
533 | } | 533 | } |
534 | 534 | ||
535 | if (opt & L2CAP_LM_AUTH) | 535 | if (opt & L2CAP_LM_AUTH) |
536 | chan->sec_level = BT_SECURITY_LOW; | 536 | chan->sec_level = BT_SECURITY_LOW; |
537 | if (opt & L2CAP_LM_ENCRYPT) | 537 | if (opt & L2CAP_LM_ENCRYPT) |
538 | chan->sec_level = BT_SECURITY_MEDIUM; | 538 | chan->sec_level = BT_SECURITY_MEDIUM; |
539 | if (opt & L2CAP_LM_SECURE) | 539 | if (opt & L2CAP_LM_SECURE) |
540 | chan->sec_level = BT_SECURITY_HIGH; | 540 | chan->sec_level = BT_SECURITY_HIGH; |
541 | 541 | ||
542 | if (opt & L2CAP_LM_MASTER) | 542 | if (opt & L2CAP_LM_MASTER) |
543 | set_bit(FLAG_ROLE_SWITCH, &chan->flags); | 543 | set_bit(FLAG_ROLE_SWITCH, &chan->flags); |
544 | else | 544 | else |
545 | clear_bit(FLAG_ROLE_SWITCH, &chan->flags); | 545 | clear_bit(FLAG_ROLE_SWITCH, &chan->flags); |
546 | 546 | ||
547 | if (opt & L2CAP_LM_RELIABLE) | 547 | if (opt & L2CAP_LM_RELIABLE) |
548 | set_bit(FLAG_FORCE_RELIABLE, &chan->flags); | 548 | set_bit(FLAG_FORCE_RELIABLE, &chan->flags); |
549 | else | 549 | else |
550 | clear_bit(FLAG_FORCE_RELIABLE, &chan->flags); | 550 | clear_bit(FLAG_FORCE_RELIABLE, &chan->flags); |
551 | break; | 551 | break; |
552 | 552 | ||
553 | default: | 553 | default: |
554 | err = -ENOPROTOOPT; | 554 | err = -ENOPROTOOPT; |
555 | break; | 555 | break; |
556 | } | 556 | } |
557 | 557 | ||
558 | release_sock(sk); | 558 | release_sock(sk); |
559 | return err; | 559 | return err; |
560 | } | 560 | } |
561 | 561 | ||
562 | static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen) | 562 | static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen) |
563 | { | 563 | { |
564 | struct sock *sk = sock->sk; | 564 | struct sock *sk = sock->sk; |
565 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | 565 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
566 | struct bt_security sec; | 566 | struct bt_security sec; |
567 | struct bt_power pwr; | 567 | struct bt_power pwr; |
568 | struct l2cap_conn *conn; | 568 | struct l2cap_conn *conn; |
569 | int len, err = 0; | 569 | int len, err = 0; |
570 | u32 opt; | 570 | u32 opt; |
571 | 571 | ||
572 | BT_DBG("sk %p", sk); | 572 | BT_DBG("sk %p", sk); |
573 | 573 | ||
574 | if (level == SOL_L2CAP) | 574 | if (level == SOL_L2CAP) |
575 | return l2cap_sock_setsockopt_old(sock, optname, optval, optlen); | 575 | return l2cap_sock_setsockopt_old(sock, optname, optval, optlen); |
576 | 576 | ||
577 | if (level != SOL_BLUETOOTH) | 577 | if (level != SOL_BLUETOOTH) |
578 | return -ENOPROTOOPT; | 578 | return -ENOPROTOOPT; |
579 | 579 | ||
580 | lock_sock(sk); | 580 | lock_sock(sk); |
581 | 581 | ||
582 | switch (optname) { | 582 | switch (optname) { |
583 | case BT_SECURITY: | 583 | case BT_SECURITY: |
584 | if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED && | 584 | if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED && |
585 | chan->chan_type != L2CAP_CHAN_RAW) { | 585 | chan->chan_type != L2CAP_CHAN_RAW) { |
586 | err = -EINVAL; | 586 | err = -EINVAL; |
587 | break; | 587 | break; |
588 | } | 588 | } |
589 | 589 | ||
590 | sec.level = BT_SECURITY_LOW; | 590 | sec.level = BT_SECURITY_LOW; |
591 | 591 | ||
592 | len = min_t(unsigned int, sizeof(sec), optlen); | 592 | len = min_t(unsigned int, sizeof(sec), optlen); |
593 | if (copy_from_user((char *) &sec, optval, len)) { | 593 | if (copy_from_user((char *) &sec, optval, len)) { |
594 | err = -EFAULT; | 594 | err = -EFAULT; |
595 | break; | 595 | break; |
596 | } | 596 | } |
597 | 597 | ||
598 | if (sec.level < BT_SECURITY_LOW || | 598 | if (sec.level < BT_SECURITY_LOW || |
599 | sec.level > BT_SECURITY_HIGH) { | 599 | sec.level > BT_SECURITY_HIGH) { |
600 | err = -EINVAL; | 600 | err = -EINVAL; |
601 | break; | 601 | break; |
602 | } | 602 | } |
603 | 603 | ||
604 | chan->sec_level = sec.level; | 604 | chan->sec_level = sec.level; |
605 | 605 | ||
606 | if (!chan->conn) | 606 | if (!chan->conn) |
607 | break; | 607 | break; |
608 | 608 | ||
609 | conn = chan->conn; | 609 | conn = chan->conn; |
610 | 610 | ||
611 | /*change security for LE channels */ | 611 | /*change security for LE channels */ |
612 | if (chan->scid == L2CAP_CID_LE_DATA) { | 612 | if (chan->scid == L2CAP_CID_LE_DATA) { |
613 | if (!conn->hcon->out) { | 613 | if (!conn->hcon->out) { |
614 | err = -EINVAL; | 614 | err = -EINVAL; |
615 | break; | 615 | break; |
616 | } | 616 | } |
617 | 617 | ||
618 | if (smp_conn_security(conn, sec.level)) | 618 | if (smp_conn_security(conn, sec.level)) |
619 | break; | 619 | break; |
620 | sk->sk_state = BT_CONFIG; | 620 | sk->sk_state = BT_CONFIG; |
621 | chan->state = BT_CONFIG; | 621 | chan->state = BT_CONFIG; |
622 | 622 | ||
623 | /* or for ACL link */ | 623 | /* or for ACL link */ |
624 | } else if ((sk->sk_state == BT_CONNECT2 && | 624 | } else if ((sk->sk_state == BT_CONNECT2 && |
625 | test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) || | 625 | test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) || |
626 | sk->sk_state == BT_CONNECTED) { | 626 | sk->sk_state == BT_CONNECTED) { |
627 | if (!l2cap_chan_check_security(chan)) | 627 | if (!l2cap_chan_check_security(chan)) |
628 | set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags); | 628 | set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags); |
629 | else | 629 | else |
630 | sk->sk_state_change(sk); | 630 | sk->sk_state_change(sk); |
631 | } else { | 631 | } else { |
632 | err = -EINVAL; | 632 | err = -EINVAL; |
633 | } | 633 | } |
634 | break; | 634 | break; |
635 | 635 | ||
636 | case BT_DEFER_SETUP: | 636 | case BT_DEFER_SETUP: |
637 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { | 637 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { |
638 | err = -EINVAL; | 638 | err = -EINVAL; |
639 | break; | 639 | break; |
640 | } | 640 | } |
641 | 641 | ||
642 | if (get_user(opt, (u32 __user *) optval)) { | 642 | if (get_user(opt, (u32 __user *) optval)) { |
643 | err = -EFAULT; | 643 | err = -EFAULT; |
644 | break; | 644 | break; |
645 | } | 645 | } |
646 | 646 | ||
647 | if (opt) | 647 | if (opt) |
648 | set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); | 648 | set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); |
649 | else | 649 | else |
650 | clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); | 650 | clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); |
651 | break; | 651 | break; |
652 | 652 | ||
653 | case BT_FLUSHABLE: | 653 | case BT_FLUSHABLE: |
654 | if (get_user(opt, (u32 __user *) optval)) { | 654 | if (get_user(opt, (u32 __user *) optval)) { |
655 | err = -EFAULT; | 655 | err = -EFAULT; |
656 | break; | 656 | break; |
657 | } | 657 | } |
658 | 658 | ||
659 | if (opt > BT_FLUSHABLE_ON) { | 659 | if (opt > BT_FLUSHABLE_ON) { |
660 | err = -EINVAL; | 660 | err = -EINVAL; |
661 | break; | 661 | break; |
662 | } | 662 | } |
663 | 663 | ||
664 | if (opt == BT_FLUSHABLE_OFF) { | 664 | if (opt == BT_FLUSHABLE_OFF) { |
665 | struct l2cap_conn *conn = chan->conn; | 665 | struct l2cap_conn *conn = chan->conn; |
666 | /* proceed further only when we have l2cap_conn and | 666 | /* proceed further only when we have l2cap_conn and |
667 | No Flush support in the LM */ | 667 | No Flush support in the LM */ |
668 | if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) { | 668 | if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) { |
669 | err = -EINVAL; | 669 | err = -EINVAL; |
670 | break; | 670 | break; |
671 | } | 671 | } |
672 | } | 672 | } |
673 | 673 | ||
674 | if (opt) | 674 | if (opt) |
675 | set_bit(FLAG_FLUSHABLE, &chan->flags); | 675 | set_bit(FLAG_FLUSHABLE, &chan->flags); |
676 | else | 676 | else |
677 | clear_bit(FLAG_FLUSHABLE, &chan->flags); | 677 | clear_bit(FLAG_FLUSHABLE, &chan->flags); |
678 | break; | 678 | break; |
679 | 679 | ||
680 | case BT_POWER: | 680 | case BT_POWER: |
681 | if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED && | 681 | if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED && |
682 | chan->chan_type != L2CAP_CHAN_RAW) { | 682 | chan->chan_type != L2CAP_CHAN_RAW) { |
683 | err = -EINVAL; | 683 | err = -EINVAL; |
684 | break; | 684 | break; |
685 | } | 685 | } |
686 | 686 | ||
687 | pwr.force_active = BT_POWER_FORCE_ACTIVE_ON; | 687 | pwr.force_active = BT_POWER_FORCE_ACTIVE_ON; |
688 | 688 | ||
689 | len = min_t(unsigned int, sizeof(pwr), optlen); | 689 | len = min_t(unsigned int, sizeof(pwr), optlen); |
690 | if (copy_from_user((char *) &pwr, optval, len)) { | 690 | if (copy_from_user((char *) &pwr, optval, len)) { |
691 | err = -EFAULT; | 691 | err = -EFAULT; |
692 | break; | 692 | break; |
693 | } | 693 | } |
694 | 694 | ||
695 | if (pwr.force_active) | 695 | if (pwr.force_active) |
696 | set_bit(FLAG_FORCE_ACTIVE, &chan->flags); | 696 | set_bit(FLAG_FORCE_ACTIVE, &chan->flags); |
697 | else | 697 | else |
698 | clear_bit(FLAG_FORCE_ACTIVE, &chan->flags); | 698 | clear_bit(FLAG_FORCE_ACTIVE, &chan->flags); |
699 | break; | 699 | break; |
700 | 700 | ||
701 | case BT_CHANNEL_POLICY: | 701 | case BT_CHANNEL_POLICY: |
702 | if (!enable_hs) { | 702 | if (!enable_hs) { |
703 | err = -ENOPROTOOPT; | 703 | err = -ENOPROTOOPT; |
704 | break; | 704 | break; |
705 | } | 705 | } |
706 | 706 | ||
707 | if (get_user(opt, (u32 __user *) optval)) { | 707 | if (get_user(opt, (u32 __user *) optval)) { |
708 | err = -EFAULT; | 708 | err = -EFAULT; |
709 | break; | 709 | break; |
710 | } | 710 | } |
711 | 711 | ||
712 | if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) { | 712 | if (opt > BT_CHANNEL_POLICY_AMP_PREFERRED) { |
713 | err = -EINVAL; | 713 | err = -EINVAL; |
714 | break; | 714 | break; |
715 | } | 715 | } |
716 | 716 | ||
717 | if (chan->mode != L2CAP_MODE_ERTM && | 717 | if (chan->mode != L2CAP_MODE_ERTM && |
718 | chan->mode != L2CAP_MODE_STREAMING) { | 718 | chan->mode != L2CAP_MODE_STREAMING) { |
719 | err = -EOPNOTSUPP; | 719 | err = -EOPNOTSUPP; |
720 | break; | 720 | break; |
721 | } | 721 | } |
722 | 722 | ||
723 | chan->chan_policy = (u8) opt; | 723 | chan->chan_policy = (u8) opt; |
724 | break; | 724 | break; |
725 | 725 | ||
726 | default: | 726 | default: |
727 | err = -ENOPROTOOPT; | 727 | err = -ENOPROTOOPT; |
728 | break; | 728 | break; |
729 | } | 729 | } |
730 | 730 | ||
731 | release_sock(sk); | 731 | release_sock(sk); |
732 | return err; | 732 | return err; |
733 | } | 733 | } |
734 | 734 | ||
735 | static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len) | 735 | static int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len) |
736 | { | 736 | { |
737 | struct sock *sk = sock->sk; | 737 | struct sock *sk = sock->sk; |
738 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | 738 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
739 | int err; | 739 | int err; |
740 | 740 | ||
741 | BT_DBG("sock %p, sk %p", sock, sk); | 741 | BT_DBG("sock %p, sk %p", sock, sk); |
742 | 742 | ||
743 | err = sock_error(sk); | 743 | err = sock_error(sk); |
744 | if (err) | 744 | if (err) |
745 | return err; | 745 | return err; |
746 | 746 | ||
747 | if (msg->msg_flags & MSG_OOB) | 747 | if (msg->msg_flags & MSG_OOB) |
748 | return -EOPNOTSUPP; | 748 | return -EOPNOTSUPP; |
749 | 749 | ||
750 | if (sk->sk_state != BT_CONNECTED) | 750 | if (sk->sk_state != BT_CONNECTED) |
751 | return -ENOTCONN; | 751 | return -ENOTCONN; |
752 | 752 | ||
753 | l2cap_chan_lock(chan); | 753 | l2cap_chan_lock(chan); |
754 | err = l2cap_chan_send(chan, msg, len, sk->sk_priority); | 754 | err = l2cap_chan_send(chan, msg, len, sk->sk_priority); |
755 | l2cap_chan_unlock(chan); | 755 | l2cap_chan_unlock(chan); |
756 | 756 | ||
757 | return err; | 757 | return err; |
758 | } | 758 | } |
759 | 759 | ||
760 | static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags) | 760 | static int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags) |
761 | { | 761 | { |
762 | struct sock *sk = sock->sk; | 762 | struct sock *sk = sock->sk; |
763 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 763 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
764 | int err; | 764 | int err; |
765 | 765 | ||
766 | lock_sock(sk); | 766 | lock_sock(sk); |
767 | 767 | ||
768 | if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP, | 768 | if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP, |
769 | &bt_sk(sk)->flags)) { | 769 | &bt_sk(sk)->flags)) { |
770 | sk->sk_state = BT_CONFIG; | 770 | sk->sk_state = BT_CONFIG; |
771 | pi->chan->state = BT_CONFIG; | 771 | pi->chan->state = BT_CONFIG; |
772 | 772 | ||
773 | __l2cap_connect_rsp_defer(pi->chan); | 773 | __l2cap_connect_rsp_defer(pi->chan); |
774 | release_sock(sk); | 774 | release_sock(sk); |
775 | return 0; | 775 | return 0; |
776 | } | 776 | } |
777 | 777 | ||
778 | release_sock(sk); | 778 | release_sock(sk); |
779 | 779 | ||
780 | if (sock->type == SOCK_STREAM) | 780 | if (sock->type == SOCK_STREAM) |
781 | err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags); | 781 | err = bt_sock_stream_recvmsg(iocb, sock, msg, len, flags); |
782 | else | 782 | else |
783 | err = bt_sock_recvmsg(iocb, sock, msg, len, flags); | 783 | err = bt_sock_recvmsg(iocb, sock, msg, len, flags); |
784 | 784 | ||
785 | if (pi->chan->mode != L2CAP_MODE_ERTM) | 785 | if (pi->chan->mode != L2CAP_MODE_ERTM) |
786 | return err; | 786 | return err; |
787 | 787 | ||
788 | /* Attempt to put pending rx data in the socket buffer */ | 788 | /* Attempt to put pending rx data in the socket buffer */ |
789 | 789 | ||
790 | lock_sock(sk); | 790 | lock_sock(sk); |
791 | 791 | ||
792 | if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state)) | 792 | if (!test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state)) |
793 | goto done; | 793 | goto done; |
794 | 794 | ||
795 | if (pi->rx_busy_skb) { | 795 | if (pi->rx_busy_skb) { |
796 | if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb)) | 796 | if (!sock_queue_rcv_skb(sk, pi->rx_busy_skb)) |
797 | pi->rx_busy_skb = NULL; | 797 | pi->rx_busy_skb = NULL; |
798 | else | 798 | else |
799 | goto done; | 799 | goto done; |
800 | } | 800 | } |
801 | 801 | ||
802 | /* Restore data flow when half of the receive buffer is | 802 | /* Restore data flow when half of the receive buffer is |
803 | * available. This avoids resending large numbers of | 803 | * available. This avoids resending large numbers of |
804 | * frames. | 804 | * frames. |
805 | */ | 805 | */ |
806 | if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1) | 806 | if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1) |
807 | l2cap_chan_busy(pi->chan, 0); | 807 | l2cap_chan_busy(pi->chan, 0); |
808 | 808 | ||
809 | done: | 809 | done: |
810 | release_sock(sk); | 810 | release_sock(sk); |
811 | return err; | 811 | return err; |
812 | } | 812 | } |
813 | 813 | ||
814 | /* Kill socket (only if zapped and orphan) | 814 | /* Kill socket (only if zapped and orphan) |
815 | * Must be called on unlocked socket. | 815 | * Must be called on unlocked socket. |
816 | */ | 816 | */ |
817 | static void l2cap_sock_kill(struct sock *sk) | 817 | static void l2cap_sock_kill(struct sock *sk) |
818 | { | 818 | { |
819 | if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket) | 819 | if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket) |
820 | return; | 820 | return; |
821 | 821 | ||
822 | BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state)); | 822 | BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state)); |
823 | 823 | ||
824 | /* Kill poor orphan */ | 824 | /* Kill poor orphan */ |
825 | 825 | ||
826 | l2cap_chan_destroy(l2cap_pi(sk)->chan); | 826 | l2cap_chan_destroy(l2cap_pi(sk)->chan); |
827 | sock_set_flag(sk, SOCK_DEAD); | 827 | sock_set_flag(sk, SOCK_DEAD); |
828 | sock_put(sk); | 828 | sock_put(sk); |
829 | } | 829 | } |
830 | 830 | ||
831 | static int l2cap_sock_shutdown(struct socket *sock, int how) | 831 | static int l2cap_sock_shutdown(struct socket *sock, int how) |
832 | { | 832 | { |
833 | struct sock *sk = sock->sk; | 833 | struct sock *sk = sock->sk; |
834 | struct l2cap_chan *chan; | 834 | struct l2cap_chan *chan; |
835 | struct l2cap_conn *conn; | 835 | struct l2cap_conn *conn; |
836 | int err = 0; | 836 | int err = 0; |
837 | 837 | ||
838 | BT_DBG("sock %p, sk %p", sock, sk); | 838 | BT_DBG("sock %p, sk %p", sock, sk); |
839 | 839 | ||
840 | if (!sk) | 840 | if (!sk) |
841 | return 0; | 841 | return 0; |
842 | 842 | ||
843 | chan = l2cap_pi(sk)->chan; | 843 | chan = l2cap_pi(sk)->chan; |
844 | conn = chan->conn; | 844 | conn = chan->conn; |
845 | 845 | ||
846 | if (conn) | 846 | if (conn) |
847 | mutex_lock(&conn->chan_lock); | 847 | mutex_lock(&conn->chan_lock); |
848 | 848 | ||
849 | l2cap_chan_lock(chan); | 849 | l2cap_chan_lock(chan); |
850 | lock_sock(sk); | 850 | lock_sock(sk); |
851 | 851 | ||
852 | if (!sk->sk_shutdown) { | 852 | if (!sk->sk_shutdown) { |
853 | if (chan->mode == L2CAP_MODE_ERTM) | 853 | if (chan->mode == L2CAP_MODE_ERTM) |
854 | err = __l2cap_wait_ack(sk); | 854 | err = __l2cap_wait_ack(sk); |
855 | 855 | ||
856 | sk->sk_shutdown = SHUTDOWN_MASK; | 856 | sk->sk_shutdown = SHUTDOWN_MASK; |
857 | 857 | ||
858 | release_sock(sk); | 858 | release_sock(sk); |
859 | l2cap_chan_close(chan, 0); | 859 | l2cap_chan_close(chan, 0); |
860 | lock_sock(sk); | 860 | lock_sock(sk); |
861 | 861 | ||
862 | if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) | 862 | if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) |
863 | err = bt_sock_wait_state(sk, BT_CLOSED, | 863 | err = bt_sock_wait_state(sk, BT_CLOSED, |
864 | sk->sk_lingertime); | 864 | sk->sk_lingertime); |
865 | } | 865 | } |
866 | 866 | ||
867 | if (!err && sk->sk_err) | 867 | if (!err && sk->sk_err) |
868 | err = -sk->sk_err; | 868 | err = -sk->sk_err; |
869 | 869 | ||
870 | release_sock(sk); | 870 | release_sock(sk); |
871 | l2cap_chan_unlock(chan); | 871 | l2cap_chan_unlock(chan); |
872 | 872 | ||
873 | if (conn) | 873 | if (conn) |
874 | mutex_unlock(&conn->chan_lock); | 874 | mutex_unlock(&conn->chan_lock); |
875 | 875 | ||
876 | return err; | 876 | return err; |
877 | } | 877 | } |
878 | 878 | ||
879 | static int l2cap_sock_release(struct socket *sock) | 879 | static int l2cap_sock_release(struct socket *sock) |
880 | { | 880 | { |
881 | struct sock *sk = sock->sk; | 881 | struct sock *sk = sock->sk; |
882 | int err; | 882 | int err; |
883 | 883 | ||
884 | BT_DBG("sock %p, sk %p", sock, sk); | 884 | BT_DBG("sock %p, sk %p", sock, sk); |
885 | 885 | ||
886 | if (!sk) | 886 | if (!sk) |
887 | return 0; | 887 | return 0; |
888 | 888 | ||
889 | err = l2cap_sock_shutdown(sock, 2); | 889 | err = l2cap_sock_shutdown(sock, 2); |
890 | 890 | ||
891 | sock_orphan(sk); | 891 | sock_orphan(sk); |
892 | l2cap_sock_kill(sk); | 892 | l2cap_sock_kill(sk); |
893 | return err; | 893 | return err; |
894 | } | 894 | } |
895 | 895 | ||
896 | static void l2cap_sock_cleanup_listen(struct sock *parent) | 896 | static void l2cap_sock_cleanup_listen(struct sock *parent) |
897 | { | 897 | { |
898 | struct sock *sk; | 898 | struct sock *sk; |
899 | 899 | ||
900 | BT_DBG("parent %p", parent); | 900 | BT_DBG("parent %p", parent); |
901 | 901 | ||
902 | /* Close not yet accepted channels */ | 902 | /* Close not yet accepted channels */ |
903 | while ((sk = bt_accept_dequeue(parent, NULL))) { | 903 | while ((sk = bt_accept_dequeue(parent, NULL))) { |
904 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; | 904 | struct l2cap_chan *chan = l2cap_pi(sk)->chan; |
905 | 905 | ||
906 | l2cap_chan_lock(chan); | 906 | l2cap_chan_lock(chan); |
907 | __clear_chan_timer(chan); | 907 | __clear_chan_timer(chan); |
908 | l2cap_chan_close(chan, ECONNRESET); | 908 | l2cap_chan_close(chan, ECONNRESET); |
909 | l2cap_chan_unlock(chan); | 909 | l2cap_chan_unlock(chan); |
910 | 910 | ||
911 | l2cap_sock_kill(sk); | 911 | l2cap_sock_kill(sk); |
912 | } | 912 | } |
913 | } | 913 | } |
914 | 914 | ||
915 | static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan) | 915 | static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan) |
916 | { | 916 | { |
917 | struct sock *sk, *parent = chan->data; | 917 | struct sock *sk, *parent = chan->data; |
918 | 918 | ||
919 | /* Check for backlog size */ | 919 | /* Check for backlog size */ |
920 | if (sk_acceptq_is_full(parent)) { | 920 | if (sk_acceptq_is_full(parent)) { |
921 | BT_DBG("backlog full %d", parent->sk_ack_backlog); | 921 | BT_DBG("backlog full %d", parent->sk_ack_backlog); |
922 | return NULL; | 922 | return NULL; |
923 | } | 923 | } |
924 | 924 | ||
925 | sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP, | 925 | sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP, |
926 | GFP_ATOMIC); | 926 | GFP_ATOMIC); |
927 | if (!sk) | 927 | if (!sk) |
928 | return NULL; | 928 | return NULL; |
929 | 929 | ||
930 | bt_sock_reclassify_lock(sk, BTPROTO_L2CAP); | 930 | bt_sock_reclassify_lock(sk, BTPROTO_L2CAP); |
931 | 931 | ||
932 | l2cap_sock_init(sk, parent); | 932 | l2cap_sock_init(sk, parent); |
933 | 933 | ||
934 | return l2cap_pi(sk)->chan; | 934 | return l2cap_pi(sk)->chan; |
935 | } | 935 | } |
936 | 936 | ||
937 | static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb) | 937 | static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb) |
938 | { | 938 | { |
939 | int err; | 939 | int err; |
940 | struct sock *sk = chan->data; | 940 | struct sock *sk = chan->data; |
941 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 941 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
942 | 942 | ||
943 | lock_sock(sk); | 943 | lock_sock(sk); |
944 | 944 | ||
945 | if (pi->rx_busy_skb) { | 945 | if (pi->rx_busy_skb) { |
946 | err = -ENOMEM; | 946 | err = -ENOMEM; |
947 | goto done; | 947 | goto done; |
948 | } | 948 | } |
949 | 949 | ||
950 | err = sock_queue_rcv_skb(sk, skb); | 950 | err = sock_queue_rcv_skb(sk, skb); |
951 | 951 | ||
952 | /* For ERTM, handle one skb that doesn't fit into the recv | 952 | /* For ERTM, handle one skb that doesn't fit into the recv |
953 | * buffer. This is important to do because the data frames | 953 | * buffer. This is important to do because the data frames |
954 | * have already been acked, so the skb cannot be discarded. | 954 | * have already been acked, so the skb cannot be discarded. |
955 | * | 955 | * |
956 | * Notify the l2cap core that the buffer is full, so the | 956 | * Notify the l2cap core that the buffer is full, so the |
957 | * LOCAL_BUSY state is entered and no more frames are | 957 | * LOCAL_BUSY state is entered and no more frames are |
958 | * acked and reassembled until there is buffer space | 958 | * acked and reassembled until there is buffer space |
959 | * available. | 959 | * available. |
960 | */ | 960 | */ |
961 | if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) { | 961 | if (err < 0 && pi->chan->mode == L2CAP_MODE_ERTM) { |
962 | pi->rx_busy_skb = skb; | 962 | pi->rx_busy_skb = skb; |
963 | l2cap_chan_busy(pi->chan, 1); | 963 | l2cap_chan_busy(pi->chan, 1); |
964 | err = 0; | 964 | err = 0; |
965 | } | 965 | } |
966 | 966 | ||
967 | done: | 967 | done: |
968 | release_sock(sk); | 968 | release_sock(sk); |
969 | 969 | ||
970 | return err; | 970 | return err; |
971 | } | 971 | } |
972 | 972 | ||
973 | static void l2cap_sock_close_cb(struct l2cap_chan *chan) | 973 | static void l2cap_sock_close_cb(struct l2cap_chan *chan) |
974 | { | 974 | { |
975 | struct sock *sk = chan->data; | 975 | struct sock *sk = chan->data; |
976 | 976 | ||
977 | l2cap_sock_kill(sk); | 977 | l2cap_sock_kill(sk); |
978 | } | 978 | } |
979 | 979 | ||
980 | static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err) | 980 | static void l2cap_sock_teardown_cb(struct l2cap_chan *chan, int err) |
981 | { | 981 | { |
982 | struct sock *sk = chan->data; | 982 | struct sock *sk = chan->data; |
983 | struct sock *parent; | 983 | struct sock *parent; |
984 | 984 | ||
985 | lock_sock(sk); | 985 | lock_sock(sk); |
986 | 986 | ||
987 | parent = bt_sk(sk)->parent; | 987 | parent = bt_sk(sk)->parent; |
988 | 988 | ||
989 | sock_set_flag(sk, SOCK_ZAPPED); | 989 | sock_set_flag(sk, SOCK_ZAPPED); |
990 | 990 | ||
991 | switch (chan->state) { | 991 | switch (chan->state) { |
992 | case BT_OPEN: | 992 | case BT_OPEN: |
993 | case BT_BOUND: | 993 | case BT_BOUND: |
994 | case BT_CLOSED: | 994 | case BT_CLOSED: |
995 | break; | 995 | break; |
996 | case BT_LISTEN: | 996 | case BT_LISTEN: |
997 | l2cap_sock_cleanup_listen(sk); | 997 | l2cap_sock_cleanup_listen(sk); |
998 | sk->sk_state = BT_CLOSED; | 998 | sk->sk_state = BT_CLOSED; |
999 | chan->state = BT_CLOSED; | 999 | chan->state = BT_CLOSED; |
1000 | 1000 | ||
1001 | break; | 1001 | break; |
1002 | default: | 1002 | default: |
1003 | sk->sk_state = BT_CLOSED; | 1003 | sk->sk_state = BT_CLOSED; |
1004 | chan->state = BT_CLOSED; | 1004 | chan->state = BT_CLOSED; |
1005 | 1005 | ||
1006 | sk->sk_err = err; | 1006 | sk->sk_err = err; |
1007 | 1007 | ||
1008 | if (parent) { | 1008 | if (parent) { |
1009 | bt_accept_unlink(sk); | 1009 | bt_accept_unlink(sk); |
1010 | parent->sk_data_ready(parent, 0); | 1010 | parent->sk_data_ready(parent, 0); |
1011 | } else { | 1011 | } else { |
1012 | sk->sk_state_change(sk); | 1012 | sk->sk_state_change(sk); |
1013 | } | 1013 | } |
1014 | 1014 | ||
1015 | break; | 1015 | break; |
1016 | } | 1016 | } |
1017 | 1017 | ||
1018 | release_sock(sk); | 1018 | release_sock(sk); |
1019 | } | 1019 | } |
1020 | 1020 | ||
1021 | static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state) | 1021 | static void l2cap_sock_state_change_cb(struct l2cap_chan *chan, int state) |
1022 | { | 1022 | { |
1023 | struct sock *sk = chan->data; | 1023 | struct sock *sk = chan->data; |
1024 | 1024 | ||
1025 | sk->sk_state = state; | 1025 | sk->sk_state = state; |
1026 | } | 1026 | } |
1027 | 1027 | ||
1028 | static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan, | 1028 | static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan, |
1029 | unsigned long len, int nb) | 1029 | unsigned long len, int nb) |
1030 | { | 1030 | { |
1031 | struct sk_buff *skb; | 1031 | struct sk_buff *skb; |
1032 | int err; | 1032 | int err; |
1033 | 1033 | ||
1034 | l2cap_chan_unlock(chan); | 1034 | l2cap_chan_unlock(chan); |
1035 | skb = bt_skb_send_alloc(chan->sk, len, nb, &err); | 1035 | skb = bt_skb_send_alloc(chan->sk, len, nb, &err); |
1036 | l2cap_chan_lock(chan); | 1036 | l2cap_chan_lock(chan); |
1037 | 1037 | ||
1038 | if (!skb) | 1038 | if (!skb) |
1039 | return ERR_PTR(err); | 1039 | return ERR_PTR(err); |
1040 | 1040 | ||
1041 | return skb; | 1041 | return skb; |
1042 | } | 1042 | } |
1043 | 1043 | ||
1044 | static void l2cap_sock_ready_cb(struct l2cap_chan *chan) | 1044 | static void l2cap_sock_ready_cb(struct l2cap_chan *chan) |
1045 | { | 1045 | { |
1046 | struct sock *sk = chan->data; | 1046 | struct sock *sk = chan->data; |
1047 | struct sock *parent; | 1047 | struct sock *parent; |
1048 | 1048 | ||
1049 | lock_sock(sk); | 1049 | lock_sock(sk); |
1050 | 1050 | ||
1051 | parent = bt_sk(sk)->parent; | 1051 | parent = bt_sk(sk)->parent; |
1052 | 1052 | ||
1053 | BT_DBG("sk %p, parent %p", sk, parent); | 1053 | BT_DBG("sk %p, parent %p", sk, parent); |
1054 | 1054 | ||
1055 | sk->sk_state = BT_CONNECTED; | 1055 | sk->sk_state = BT_CONNECTED; |
1056 | sk->sk_state_change(sk); | 1056 | sk->sk_state_change(sk); |
1057 | 1057 | ||
1058 | if (parent) | 1058 | if (parent) |
1059 | parent->sk_data_ready(parent, 0); | 1059 | parent->sk_data_ready(parent, 0); |
1060 | 1060 | ||
1061 | release_sock(sk); | 1061 | release_sock(sk); |
1062 | } | 1062 | } |
1063 | 1063 | ||
1064 | static struct l2cap_ops l2cap_chan_ops = { | 1064 | static struct l2cap_ops l2cap_chan_ops = { |
1065 | .name = "L2CAP Socket Interface", | 1065 | .name = "L2CAP Socket Interface", |
1066 | .new_connection = l2cap_sock_new_connection_cb, | 1066 | .new_connection = l2cap_sock_new_connection_cb, |
1067 | .recv = l2cap_sock_recv_cb, | 1067 | .recv = l2cap_sock_recv_cb, |
1068 | .close = l2cap_sock_close_cb, | 1068 | .close = l2cap_sock_close_cb, |
1069 | .teardown = l2cap_sock_teardown_cb, | 1069 | .teardown = l2cap_sock_teardown_cb, |
1070 | .state_change = l2cap_sock_state_change_cb, | 1070 | .state_change = l2cap_sock_state_change_cb, |
1071 | .ready = l2cap_sock_ready_cb, | 1071 | .ready = l2cap_sock_ready_cb, |
1072 | .alloc_skb = l2cap_sock_alloc_skb_cb, | 1072 | .alloc_skb = l2cap_sock_alloc_skb_cb, |
1073 | }; | 1073 | }; |
1074 | 1074 | ||
1075 | static void l2cap_sock_destruct(struct sock *sk) | 1075 | static void l2cap_sock_destruct(struct sock *sk) |
1076 | { | 1076 | { |
1077 | BT_DBG("sk %p", sk); | 1077 | BT_DBG("sk %p", sk); |
1078 | 1078 | ||
1079 | l2cap_chan_put(l2cap_pi(sk)->chan); | 1079 | l2cap_chan_put(l2cap_pi(sk)->chan); |
1080 | if (l2cap_pi(sk)->rx_busy_skb) { | 1080 | if (l2cap_pi(sk)->rx_busy_skb) { |
1081 | kfree_skb(l2cap_pi(sk)->rx_busy_skb); | 1081 | kfree_skb(l2cap_pi(sk)->rx_busy_skb); |
1082 | l2cap_pi(sk)->rx_busy_skb = NULL; | 1082 | l2cap_pi(sk)->rx_busy_skb = NULL; |
1083 | } | 1083 | } |
1084 | 1084 | ||
1085 | skb_queue_purge(&sk->sk_receive_queue); | 1085 | skb_queue_purge(&sk->sk_receive_queue); |
1086 | skb_queue_purge(&sk->sk_write_queue); | 1086 | skb_queue_purge(&sk->sk_write_queue); |
1087 | } | 1087 | } |
1088 | 1088 | ||
1089 | static void l2cap_sock_init(struct sock *sk, struct sock *parent) | 1089 | static void l2cap_sock_init(struct sock *sk, struct sock *parent) |
1090 | { | 1090 | { |
1091 | struct l2cap_pinfo *pi = l2cap_pi(sk); | 1091 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
1092 | struct l2cap_chan *chan = pi->chan; | 1092 | struct l2cap_chan *chan = pi->chan; |
1093 | 1093 | ||
1094 | BT_DBG("sk %p", sk); | 1094 | BT_DBG("sk %p", sk); |
1095 | 1095 | ||
1096 | if (parent) { | 1096 | if (parent) { |
1097 | struct l2cap_chan *pchan = l2cap_pi(parent)->chan; | 1097 | struct l2cap_chan *pchan = l2cap_pi(parent)->chan; |
1098 | 1098 | ||
1099 | sk->sk_type = parent->sk_type; | 1099 | sk->sk_type = parent->sk_type; |
1100 | bt_sk(sk)->flags = bt_sk(parent)->flags; | 1100 | bt_sk(sk)->flags = bt_sk(parent)->flags; |
1101 | 1101 | ||
1102 | chan->chan_type = pchan->chan_type; | 1102 | chan->chan_type = pchan->chan_type; |
1103 | chan->imtu = pchan->imtu; | 1103 | chan->imtu = pchan->imtu; |
1104 | chan->omtu = pchan->omtu; | 1104 | chan->omtu = pchan->omtu; |
1105 | chan->conf_state = pchan->conf_state; | 1105 | chan->conf_state = pchan->conf_state; |
1106 | chan->mode = pchan->mode; | 1106 | chan->mode = pchan->mode; |
1107 | chan->fcs = pchan->fcs; | 1107 | chan->fcs = pchan->fcs; |
1108 | chan->max_tx = pchan->max_tx; | 1108 | chan->max_tx = pchan->max_tx; |
1109 | chan->tx_win = pchan->tx_win; | 1109 | chan->tx_win = pchan->tx_win; |
1110 | chan->tx_win_max = pchan->tx_win_max; | 1110 | chan->tx_win_max = pchan->tx_win_max; |
1111 | chan->sec_level = pchan->sec_level; | 1111 | chan->sec_level = pchan->sec_level; |
1112 | chan->flags = pchan->flags; | 1112 | chan->flags = pchan->flags; |
1113 | 1113 | ||
1114 | security_sk_clone(parent, sk); | 1114 | security_sk_clone(parent, sk); |
1115 | } else { | 1115 | } else { |
1116 | 1116 | ||
1117 | switch (sk->sk_type) { | 1117 | switch (sk->sk_type) { |
1118 | case SOCK_RAW: | 1118 | case SOCK_RAW: |
1119 | chan->chan_type = L2CAP_CHAN_RAW; | 1119 | chan->chan_type = L2CAP_CHAN_RAW; |
1120 | break; | 1120 | break; |
1121 | case SOCK_DGRAM: | 1121 | case SOCK_DGRAM: |
1122 | chan->chan_type = L2CAP_CHAN_CONN_LESS; | 1122 | chan->chan_type = L2CAP_CHAN_CONN_LESS; |
1123 | break; | 1123 | break; |
1124 | case SOCK_SEQPACKET: | 1124 | case SOCK_SEQPACKET: |
1125 | case SOCK_STREAM: | 1125 | case SOCK_STREAM: |
1126 | chan->chan_type = L2CAP_CHAN_CONN_ORIENTED; | 1126 | chan->chan_type = L2CAP_CHAN_CONN_ORIENTED; |
1127 | break; | 1127 | break; |
1128 | } | 1128 | } |
1129 | 1129 | ||
1130 | chan->imtu = L2CAP_DEFAULT_MTU; | 1130 | chan->imtu = L2CAP_DEFAULT_MTU; |
1131 | chan->omtu = 0; | 1131 | chan->omtu = 0; |
1132 | if (!disable_ertm && sk->sk_type == SOCK_STREAM) { | 1132 | if (!disable_ertm && sk->sk_type == SOCK_STREAM) { |
1133 | chan->mode = L2CAP_MODE_ERTM; | 1133 | chan->mode = L2CAP_MODE_ERTM; |
1134 | set_bit(CONF_STATE2_DEVICE, &chan->conf_state); | 1134 | set_bit(CONF_STATE2_DEVICE, &chan->conf_state); |
1135 | } else { | 1135 | } else { |
1136 | chan->mode = L2CAP_MODE_BASIC; | 1136 | chan->mode = L2CAP_MODE_BASIC; |
1137 | } | 1137 | } |
1138 | 1138 | ||
1139 | l2cap_chan_set_defaults(chan); | 1139 | l2cap_chan_set_defaults(chan); |
1140 | } | 1140 | } |
1141 | 1141 | ||
1142 | /* Default config options */ | 1142 | /* Default config options */ |
1143 | chan->flush_to = L2CAP_DEFAULT_FLUSH_TO; | 1143 | chan->flush_to = L2CAP_DEFAULT_FLUSH_TO; |
1144 | 1144 | ||
1145 | chan->data = sk; | 1145 | chan->data = sk; |
1146 | chan->ops = &l2cap_chan_ops; | 1146 | chan->ops = &l2cap_chan_ops; |
1147 | } | 1147 | } |
1148 | 1148 | ||
1149 | static struct proto l2cap_proto = { | 1149 | static struct proto l2cap_proto = { |
1150 | .name = "L2CAP", | 1150 | .name = "L2CAP", |
1151 | .owner = THIS_MODULE, | 1151 | .owner = THIS_MODULE, |
1152 | .obj_size = sizeof(struct l2cap_pinfo) | 1152 | .obj_size = sizeof(struct l2cap_pinfo) |
1153 | }; | 1153 | }; |
1154 | 1154 | ||
1155 | static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio) | 1155 | static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio) |
1156 | { | 1156 | { |
1157 | struct sock *sk; | 1157 | struct sock *sk; |
1158 | struct l2cap_chan *chan; | 1158 | struct l2cap_chan *chan; |
1159 | 1159 | ||
1160 | sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto); | 1160 | sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto); |
1161 | if (!sk) | 1161 | if (!sk) |
1162 | return NULL; | 1162 | return NULL; |
1163 | 1163 | ||
1164 | sock_init_data(sock, sk); | 1164 | sock_init_data(sock, sk); |
1165 | INIT_LIST_HEAD(&bt_sk(sk)->accept_q); | 1165 | INIT_LIST_HEAD(&bt_sk(sk)->accept_q); |
1166 | 1166 | ||
1167 | sk->sk_destruct = l2cap_sock_destruct; | 1167 | sk->sk_destruct = l2cap_sock_destruct; |
1168 | sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT; | 1168 | sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT; |
1169 | 1169 | ||
1170 | sock_reset_flag(sk, SOCK_ZAPPED); | 1170 | sock_reset_flag(sk, SOCK_ZAPPED); |
1171 | 1171 | ||
1172 | sk->sk_protocol = proto; | 1172 | sk->sk_protocol = proto; |
1173 | sk->sk_state = BT_OPEN; | 1173 | sk->sk_state = BT_OPEN; |
1174 | 1174 | ||
1175 | chan = l2cap_chan_create(); | 1175 | chan = l2cap_chan_create(); |
1176 | if (!chan) { | 1176 | if (!chan) { |
1177 | l2cap_sock_kill(sk); | 1177 | l2cap_sock_kill(sk); |
1178 | return NULL; | 1178 | return NULL; |
1179 | } | 1179 | } |
1180 | 1180 | ||
1181 | l2cap_chan_hold(chan); | 1181 | l2cap_chan_hold(chan); |
1182 | 1182 | ||
1183 | chan->sk = sk; | 1183 | chan->sk = sk; |
1184 | 1184 | ||
1185 | l2cap_pi(sk)->chan = chan; | 1185 | l2cap_pi(sk)->chan = chan; |
1186 | 1186 | ||
1187 | return sk; | 1187 | return sk; |
1188 | } | 1188 | } |
1189 | 1189 | ||
1190 | static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol, | 1190 | static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol, |
1191 | int kern) | 1191 | int kern) |
1192 | { | 1192 | { |
1193 | struct sock *sk; | 1193 | struct sock *sk; |
1194 | 1194 | ||
1195 | BT_DBG("sock %p", sock); | 1195 | BT_DBG("sock %p", sock); |
1196 | 1196 | ||
1197 | sock->state = SS_UNCONNECTED; | 1197 | sock->state = SS_UNCONNECTED; |
1198 | 1198 | ||
1199 | if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM && | 1199 | if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM && |
1200 | sock->type != SOCK_DGRAM && sock->type != SOCK_RAW) | 1200 | sock->type != SOCK_DGRAM && sock->type != SOCK_RAW) |
1201 | return -ESOCKTNOSUPPORT; | 1201 | return -ESOCKTNOSUPPORT; |
1202 | 1202 | ||
1203 | if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW)) | 1203 | if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW)) |
1204 | return -EPERM; | 1204 | return -EPERM; |
1205 | 1205 | ||
1206 | sock->ops = &l2cap_sock_ops; | 1206 | sock->ops = &l2cap_sock_ops; |
1207 | 1207 | ||
1208 | sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC); | 1208 | sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC); |
1209 | if (!sk) | 1209 | if (!sk) |
1210 | return -ENOMEM; | 1210 | return -ENOMEM; |
1211 | 1211 | ||
1212 | l2cap_sock_init(sk, NULL); | 1212 | l2cap_sock_init(sk, NULL); |
1213 | return 0; | 1213 | return 0; |
1214 | } | 1214 | } |
1215 | 1215 | ||
1216 | static const struct proto_ops l2cap_sock_ops = { | 1216 | static const struct proto_ops l2cap_sock_ops = { |
1217 | .family = PF_BLUETOOTH, | 1217 | .family = PF_BLUETOOTH, |
1218 | .owner = THIS_MODULE, | 1218 | .owner = THIS_MODULE, |
1219 | .release = l2cap_sock_release, | 1219 | .release = l2cap_sock_release, |
1220 | .bind = l2cap_sock_bind, | 1220 | .bind = l2cap_sock_bind, |
1221 | .connect = l2cap_sock_connect, | 1221 | .connect = l2cap_sock_connect, |
1222 | .listen = l2cap_sock_listen, | 1222 | .listen = l2cap_sock_listen, |
1223 | .accept = l2cap_sock_accept, | 1223 | .accept = l2cap_sock_accept, |
1224 | .getname = l2cap_sock_getname, | 1224 | .getname = l2cap_sock_getname, |
1225 | .sendmsg = l2cap_sock_sendmsg, | 1225 | .sendmsg = l2cap_sock_sendmsg, |
1226 | .recvmsg = l2cap_sock_recvmsg, | 1226 | .recvmsg = l2cap_sock_recvmsg, |
1227 | .poll = bt_sock_poll, | 1227 | .poll = bt_sock_poll, |
1228 | .ioctl = bt_sock_ioctl, | 1228 | .ioctl = bt_sock_ioctl, |
1229 | .mmap = sock_no_mmap, | 1229 | .mmap = sock_no_mmap, |
1230 | .socketpair = sock_no_socketpair, | 1230 | .socketpair = sock_no_socketpair, |
1231 | .shutdown = l2cap_sock_shutdown, | 1231 | .shutdown = l2cap_sock_shutdown, |
1232 | .setsockopt = l2cap_sock_setsockopt, | 1232 | .setsockopt = l2cap_sock_setsockopt, |
1233 | .getsockopt = l2cap_sock_getsockopt | 1233 | .getsockopt = l2cap_sock_getsockopt |
1234 | }; | 1234 | }; |
1235 | 1235 | ||
1236 | static const struct net_proto_family l2cap_sock_family_ops = { | 1236 | static const struct net_proto_family l2cap_sock_family_ops = { |
1237 | .family = PF_BLUETOOTH, | 1237 | .family = PF_BLUETOOTH, |
1238 | .owner = THIS_MODULE, | 1238 | .owner = THIS_MODULE, |
1239 | .create = l2cap_sock_create, | 1239 | .create = l2cap_sock_create, |
1240 | }; | 1240 | }; |
1241 | 1241 | ||
1242 | int __init l2cap_init_sockets(void) | 1242 | int __init l2cap_init_sockets(void) |
1243 | { | 1243 | { |
1244 | int err; | 1244 | int err; |
1245 | 1245 | ||
1246 | err = proto_register(&l2cap_proto, 0); | 1246 | err = proto_register(&l2cap_proto, 0); |
1247 | if (err < 0) | 1247 | if (err < 0) |
1248 | return err; | 1248 | return err; |
1249 | 1249 | ||
1250 | err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops); | 1250 | err = bt_sock_register(BTPROTO_L2CAP, &l2cap_sock_family_ops); |
1251 | if (err < 0) | 1251 | if (err < 0) |
1252 | goto error; | 1252 | goto error; |
1253 | 1253 | ||
1254 | BT_INFO("L2CAP socket layer initialized"); | 1254 | BT_INFO("L2CAP socket layer initialized"); |
1255 | 1255 | ||
1256 | return 0; | 1256 | return 0; |
1257 | 1257 | ||
1258 | error: | 1258 | error: |
1259 | BT_ERR("L2CAP socket registration failed"); | 1259 | BT_ERR("L2CAP socket registration failed"); |
1260 | proto_unregister(&l2cap_proto); | 1260 | proto_unregister(&l2cap_proto); |
1261 | return err; | 1261 | return err; |
1262 | } | 1262 | } |
1263 | 1263 | ||
1264 | void l2cap_cleanup_sockets(void) | 1264 | void l2cap_cleanup_sockets(void) |
1265 | { | 1265 | { |
1266 | if (bt_sock_unregister(BTPROTO_L2CAP) < 0) | 1266 | if (bt_sock_unregister(BTPROTO_L2CAP) < 0) |
1267 | BT_ERR("L2CAP socket unregistration failed"); | 1267 | BT_ERR("L2CAP socket unregistration failed"); |
1268 | 1268 | ||
1269 | proto_unregister(&l2cap_proto); | 1269 | proto_unregister(&l2cap_proto); |
1270 | } | 1270 | } |
1271 | 1271 |