blob: e909195ede7338e9caf319d34f43f74e2e63918a [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
Bhakthavatsala Raghavendrab03b5702013-02-12 19:44:47 +05303 Copyright (c) 2000-2001, 2010-2013 The Linux Foundation. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070015 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25#ifndef __BLUETOOTH_H
26#define __BLUETOOTH_H
27
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070028#include <linux/types.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#include <asm/byteorder.h>
30#include <linux/list.h>
31#include <linux/poll.h>
32#include <net/sock.h>
33
34#ifndef AF_BLUETOOTH
35#define AF_BLUETOOTH 31
36#define PF_BLUETOOTH AF_BLUETOOTH
37#endif
38
39/* Reserv for core and drivers use */
40#define BT_SKB_RESERVE 8
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070041#define BT_SKB_RESERVE_80211 32
Linus Torvalds1da177e2005-04-16 15:20:36 -070042
43#define BTPROTO_L2CAP 0
44#define BTPROTO_HCI 1
45#define BTPROTO_SCO 2
46#define BTPROTO_RFCOMM 3
47#define BTPROTO_BNEP 4
48#define BTPROTO_CMTP 5
49#define BTPROTO_HIDP 6
50#define BTPROTO_AVDTP 7
51
52#define SOL_HCI 0
53#define SOL_L2CAP 6
54#define SOL_SCO 17
55#define SOL_RFCOMM 18
56
Marcel Holtmann8c1b2352009-01-15 21:58:04 +010057#define BT_SECURITY 4
58struct bt_security {
59 __u8 level;
Vinicius Costa Gomes8f360112011-07-08 18:31:46 -030060 __u8 key_size;
Marcel Holtmann8c1b2352009-01-15 21:58:04 +010061};
62#define BT_SECURITY_SDP 0
63#define BT_SECURITY_LOW 1
64#define BT_SECURITY_MEDIUM 2
65#define BT_SECURITY_HIGH 3
Bhakthavatsala Raghavendrab03b5702013-02-12 19:44:47 +053066#define BT_SECURITY_VERY_HIGH 4
Marcel Holtmann8c1b2352009-01-15 21:58:04 +010067
Marcel Holtmannc4f912e2009-01-15 21:52:16 +010068#define BT_DEFER_SETUP 7
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +020069#define BT_FLUSHABLE 8
70
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -070071#define BT_POWER 9
72struct bt_power {
73 __u8 force_active;
74};
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -070075
Mat Martineauf00ffac2011-10-19 15:07:32 -070076#define BT_AMP_POLICY 10
Mat Martineauc14968b2011-11-02 16:18:28 -070077
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070078/* Require BR/EDR (default policy)
79 * AMP controllers cannot be used
80 * Channel move requests from the remote device are denied
81 * If the L2CAP channel is currently using AMP, move the channel to BR/EDR
Mat Martineauc14968b2011-11-02 16:18:28 -070082 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070083#define BT_AMP_POLICY_REQUIRE_BR_EDR 0
Mat Martineauc14968b2011-11-02 16:18:28 -070084
Mat Martineauf00ffac2011-10-19 15:07:32 -070085/* Prefer BR/EDR
86 * Allow use of AMP controllers
87 * If the L2CAP channel is currently on AMP, move it to BR/EDR
88 * Channel move requests from the remote device are allowed
Mat Martineauc14968b2011-11-02 16:18:28 -070089 */
Mat Martineauf00ffac2011-10-19 15:07:32 -070090#define BT_AMP_POLICY_PREFER_BR_EDR 1
Mat Martineauc14968b2011-11-02 16:18:28 -070091
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070092/* Prefer AMP
Mat Martineauc14968b2011-11-02 16:18:28 -070093 * Allow use of AMP controllers
94 * If the L2CAP channel is currently on BR/EDR and AMP controller
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070095 * resources are available, initiate a channel move to AMP
96 * Channel move requests from the remote device are allowed
Mat Martineauc14968b2011-11-02 16:18:28 -070097 * If the L2CAP socket has not been connected yet, try to create
98 * and configure the channel directly on an AMP controller rather
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070099 * than BR/EDR
Mat Martineauc14968b2011-11-02 16:18:28 -0700100 */
Mat Martineauf00ffac2011-10-19 15:07:32 -0700101#define BT_AMP_POLICY_PREFER_AMP 2
Mat Martineauc14968b2011-11-02 16:18:28 -0700102
Brian Gixa94b6122012-02-23 16:07:10 -0800103#define BT_LE_PARAMS 100
Joe Perchese1447d82011-06-30 19:15:37 -0300104
Brian Gixa94b6122012-02-23 16:07:10 -0800105#define BT_LE_SCAN_WINDOW_MIN 0x0004
106#define BT_LE_SCAN_WINDOW_MAX 0x4000
107#define BT_LE_SCAN_WINDOW_DEF 0x0004
108
109#define BT_LE_SCAN_INTERVAL_MIN 0x0004
110#define BT_LE_SCAN_INTERVAL_MAX 0x4000
111#define BT_LE_SCAN_INTERVAL_DEF 0x0008
112
113#define BT_LE_CONN_INTERVAL_MIN 0x0006
114#define BT_LE_CONN_INTERVAL_MAX 0x0C80
115#define BT_LE_CONN_INTERVAL_MIN_DEF 0x0008
116#define BT_LE_CONN_INTERVAL_MAX_DEF 0x0100
117
118#define BT_LE_LATENCY_MAX 0x01F4
119#define BT_LE_LATENCY_DEF 0x0000
120
121#define BT_LE_SUP_TO_MIN 0x000A
122#define BT_LE_SUP_TO_MAX 0x0C80
123#define BT_LE_SUP_TO_DEFAULT 0X03E8
124
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700125#define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg)
126#define BT_ERR(fmt, arg...) printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg)
127#define BT_DBG(fmt, arg...) pr_debug("%s: " fmt "\n" , __func__ , ## arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700128
Linus Torvalds1da177e2005-04-16 15:20:36 -0700129/* Connection and socket states */
130enum {
131 BT_CONNECTED = 1, /* Equal to TCP_ESTABLISHED to make net code happy */
132 BT_OPEN,
133 BT_BOUND,
134 BT_LISTEN,
135 BT_CONNECT,
136 BT_CONNECT2,
137 BT_CONFIG,
138 BT_DISCONN,
139 BT_CLOSED
140};
141
Linus Torvalds1da177e2005-04-16 15:20:36 -0700142/* BD Address */
143typedef struct {
144 __u8 b[6];
Gustavo F. Padovan66c853c2010-07-19 02:00:13 -0300145} __packed bdaddr_t;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700147#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0} })
148#define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff} })
Linus Torvalds1da177e2005-04-16 15:20:36 -0700149
150/* Copy, swap, convert BD Address */
151static inline int bacmp(bdaddr_t *ba1, bdaddr_t *ba2)
152{
153 return memcmp(ba1, ba2, sizeof(bdaddr_t));
154}
155static inline void bacpy(bdaddr_t *dst, bdaddr_t *src)
156{
157 memcpy(dst, src, sizeof(bdaddr_t));
158}
159
160void baswap(bdaddr_t *dst, bdaddr_t *src);
161char *batostr(bdaddr_t *ba);
162bdaddr_t *strtoba(char *str);
163
164/* Common socket structures and functions */
165
166#define bt_sk(__sk) ((struct bt_sock *) __sk)
167
Brian Gixa94b6122012-02-23 16:07:10 -0800168struct bt_le_params {
169 __u8 prohibit_remote_chg;
170 __u8 filter_policy;
171 __u16 scan_interval;
172 __u16 scan_window;
173 __u16 interval_min;
174 __u16 interval_max;
175 __u16 latency;
176 __u16 supervision_timeout;
177 __u16 min_ce_len;
178 __u16 max_ce_len;
179 __u16 conn_timeout;
180};
181
Linus Torvalds1da177e2005-04-16 15:20:36 -0700182struct bt_sock {
183 struct sock sk;
184 bdaddr_t src;
185 bdaddr_t dst;
186 struct list_head accept_q;
187 struct sock *parent;
Marcel Holtmannc4f912e2009-01-15 21:52:16 +0100188 u32 defer_setup;
Brian Gixa94b6122012-02-23 16:07:10 -0800189 struct bt_le_params le_params;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190};
191
192struct bt_sock_list {
193 struct hlist_head head;
194 rwlock_t lock;
195};
196
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +0000197int bt_sock_register(int proto, const struct net_proto_family *ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198int bt_sock_unregister(int proto);
199void bt_sock_link(struct bt_sock_list *l, struct sock *s);
200void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
Waldemar Rymarkiewicz5a9d0a32011-06-07 11:18:06 +0200201int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
202 struct msghdr *msg, size_t len, int flags);
Mat Martineau796c86e2010-09-08 10:05:27 -0700203int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
204 struct msghdr *msg, size_t len, int flags);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700205uint bt_sock_poll(struct file *file, struct socket *sock, poll_table *wait);
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200206int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
208
209void bt_accept_enqueue(struct sock *parent, struct sock *sk);
210void bt_accept_unlink(struct sock *sk);
211struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock);
212
213/* Skb helpers */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700214struct bt_l2cap_control {
215 __u8 frame_type;
216 __u8 final;
217 __u8 sar;
218 __u8 super;
219 __u16 reqseq;
220 __u16 txseq;
221 __u8 poll;
222 __u8 fcs;
223};
224
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225struct bt_skb_cb {
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700226 __u8 pkt_type;
227 __u8 incoming;
Suraj Sumangala33e882a2010-07-14 13:02:17 +0530228 __u16 expect;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -0300229 __u8 retries;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700230 __u8 force_active;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700231 unsigned short channel;
232 struct bt_l2cap_control control;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700233};
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300234#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235
Al Virodd0fc662005-10-07 07:46:04 +0100236static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700237{
238 struct sk_buff *skb;
239
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700240 skb = alloc_skb(len + BT_SKB_RESERVE, how);
241 if (skb) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242 skb_reserve(skb, BT_SKB_RESERVE);
243 bt_cb(skb)->incoming = 0;
244 }
245 return skb;
246}
247
Waldemar Rymarkiewicz5a9d0a32011-06-07 11:18:06 +0200248static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk,
249 unsigned long len, int nb, int *err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700250{
251 struct sk_buff *skb;
252
Gustavo F. Padovane454c842010-09-21 16:31:11 -0300253 release_sock(sk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700254 skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err);
255 if (skb) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256 skb_reserve(skb, BT_SKB_RESERVE);
257 bt_cb(skb)->incoming = 0;
258 }
Gustavo F. Padovane454c842010-09-21 16:31:11 -0300259 lock_sock(sk);
260
261 if (!skb && *err)
262 return NULL;
263
264 *err = sock_error(sk);
265 if (*err)
266 goto out;
267
268 if (sk->sk_shutdown) {
269 *err = -ECONNRESET;
270 goto out;
271 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700272
273 return skb;
Gustavo F. Padovane454c842010-09-21 16:31:11 -0300274
275out:
276 kfree_skb(skb);
277 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278}
279
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700280int bt_err(__u16 code);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700281
Marcel Holtmann65164552005-10-28 19:20:48 +0200282extern int hci_sock_init(void);
Tobias Klauser04005dd2008-03-05 18:47:03 -0800283extern void hci_sock_cleanup(void);
Marcel Holtmann65164552005-10-28 19:20:48 +0200284
285extern int bt_sysfs_init(void);
286extern void bt_sysfs_cleanup(void);
287
Marcel Holtmannaef7d972010-03-21 05:27:45 +0100288extern struct dentry *bt_debugfs;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -0800289
Gustavo F. Padovan64274512011-02-07 20:08:52 -0200290int l2cap_init(void);
291void l2cap_exit(void);
Gustavo F. Padovan64274512011-02-07 20:08:52 -0200292
Gustavo F. Padovan64274512011-02-07 20:08:52 -0200293int sco_init(void);
294void sco_exit(void);
Gustavo F. Padovan64274512011-02-07 20:08:52 -0200295
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296#endif /* __BLUETOOTH_H */