blob: badbd8e5a82f71d108421a0b96322f3215ddf3ad [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
Duy Truong790f06d2013-02-13 16:38:12 -08003 Copyright (c) 2000-2001, 2010-2012 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
66
Marcel Holtmannc4f912e2009-01-15 21:52:16 +010067#define BT_DEFER_SETUP 7
Andrei Emeltchenkoe7021122011-01-03 11:14:36 +020068#define BT_FLUSHABLE 8
69
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -070070#define BT_POWER 9
71struct bt_power {
72 __u8 force_active;
73};
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -070074
Mat Martineauf00ffac2011-10-19 15:07:32 -070075#define BT_AMP_POLICY 10
Mat Martineauc14968b2011-11-02 16:18:28 -070076
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070077/* Require BR/EDR (default policy)
78 * AMP controllers cannot be used
79 * Channel move requests from the remote device are denied
80 * If the L2CAP channel is currently using AMP, move the channel to BR/EDR
Mat Martineauc14968b2011-11-02 16:18:28 -070081 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070082#define BT_AMP_POLICY_REQUIRE_BR_EDR 0
Mat Martineauc14968b2011-11-02 16:18:28 -070083
Mat Martineauf00ffac2011-10-19 15:07:32 -070084/* Prefer BR/EDR
85 * Allow use of AMP controllers
86 * If the L2CAP channel is currently on AMP, move it to BR/EDR
87 * Channel move requests from the remote device are allowed
Mat Martineauc14968b2011-11-02 16:18:28 -070088 */
Mat Martineauf00ffac2011-10-19 15:07:32 -070089#define BT_AMP_POLICY_PREFER_BR_EDR 1
Mat Martineauc14968b2011-11-02 16:18:28 -070090
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070091/* Prefer AMP
Mat Martineauc14968b2011-11-02 16:18:28 -070092 * Allow use of AMP controllers
93 * If the L2CAP channel is currently on BR/EDR and AMP controller
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070094 * resources are available, initiate a channel move to AMP
95 * Channel move requests from the remote device are allowed
Mat Martineauc14968b2011-11-02 16:18:28 -070096 * If the L2CAP socket has not been connected yet, try to create
97 * and configure the channel directly on an AMP controller rather
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070098 * than BR/EDR
Mat Martineauc14968b2011-11-02 16:18:28 -070099 */
Mat Martineauf00ffac2011-10-19 15:07:32 -0700100#define BT_AMP_POLICY_PREFER_AMP 2
Mat Martineauc14968b2011-11-02 16:18:28 -0700101
Brian Gixa94b6122012-02-23 16:07:10 -0800102#define BT_LE_PARAMS 100
Joe Perchese1447d82011-06-30 19:15:37 -0300103
Brian Gixa94b6122012-02-23 16:07:10 -0800104#define BT_LE_SCAN_WINDOW_MIN 0x0004
105#define BT_LE_SCAN_WINDOW_MAX 0x4000
106#define BT_LE_SCAN_WINDOW_DEF 0x0004
107
108#define BT_LE_SCAN_INTERVAL_MIN 0x0004
109#define BT_LE_SCAN_INTERVAL_MAX 0x4000
110#define BT_LE_SCAN_INTERVAL_DEF 0x0008
111
112#define BT_LE_CONN_INTERVAL_MIN 0x0006
113#define BT_LE_CONN_INTERVAL_MAX 0x0C80
114#define BT_LE_CONN_INTERVAL_MIN_DEF 0x0008
115#define BT_LE_CONN_INTERVAL_MAX_DEF 0x0100
116
117#define BT_LE_LATENCY_MAX 0x01F4
118#define BT_LE_LATENCY_DEF 0x0000
119
120#define BT_LE_SUP_TO_MIN 0x000A
121#define BT_LE_SUP_TO_MAX 0x0C80
122#define BT_LE_SUP_TO_DEFAULT 0X03E8
123
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700124#define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg)
125#define BT_ERR(fmt, arg...) printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg)
126#define BT_DBG(fmt, arg...) pr_debug("%s: " fmt "\n" , __func__ , ## arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127
Linus Torvalds1da177e2005-04-16 15:20:36 -0700128/* Connection and socket states */
129enum {
130 BT_CONNECTED = 1, /* Equal to TCP_ESTABLISHED to make net code happy */
131 BT_OPEN,
132 BT_BOUND,
133 BT_LISTEN,
134 BT_CONNECT,
135 BT_CONNECT2,
136 BT_CONFIG,
137 BT_DISCONN,
138 BT_CLOSED
139};
140
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141/* BD Address */
142typedef struct {
143 __u8 b[6];
Gustavo F. Padovan66c853c2010-07-19 02:00:13 -0300144} __packed bdaddr_t;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700146#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0} })
147#define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff} })
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148
149/* Copy, swap, convert BD Address */
150static inline int bacmp(bdaddr_t *ba1, bdaddr_t *ba2)
151{
152 return memcmp(ba1, ba2, sizeof(bdaddr_t));
153}
154static inline void bacpy(bdaddr_t *dst, bdaddr_t *src)
155{
156 memcpy(dst, src, sizeof(bdaddr_t));
157}
158
159void baswap(bdaddr_t *dst, bdaddr_t *src);
160char *batostr(bdaddr_t *ba);
161bdaddr_t *strtoba(char *str);
162
163/* Common socket structures and functions */
164
165#define bt_sk(__sk) ((struct bt_sock *) __sk)
166
Brian Gixa94b6122012-02-23 16:07:10 -0800167struct bt_le_params {
168 __u8 prohibit_remote_chg;
169 __u8 filter_policy;
170 __u16 scan_interval;
171 __u16 scan_window;
172 __u16 interval_min;
173 __u16 interval_max;
174 __u16 latency;
175 __u16 supervision_timeout;
176 __u16 min_ce_len;
177 __u16 max_ce_len;
178 __u16 conn_timeout;
179};
180
Linus Torvalds1da177e2005-04-16 15:20:36 -0700181struct bt_sock {
182 struct sock sk;
183 bdaddr_t src;
184 bdaddr_t dst;
185 struct list_head accept_q;
186 struct sock *parent;
Marcel Holtmannc4f912e2009-01-15 21:52:16 +0100187 u32 defer_setup;
Brian Gixa94b6122012-02-23 16:07:10 -0800188 struct bt_le_params le_params;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700189};
190
191struct bt_sock_list {
192 struct hlist_head head;
193 rwlock_t lock;
194};
195
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +0000196int bt_sock_register(int proto, const struct net_proto_family *ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197int bt_sock_unregister(int proto);
198void bt_sock_link(struct bt_sock_list *l, struct sock *s);
199void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
Waldemar Rymarkiewicz5a9d0a32011-06-07 11:18:06 +0200200int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
201 struct msghdr *msg, size_t len, int flags);
Mat Martineau796c86e2010-09-08 10:05:27 -0700202int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
203 struct msghdr *msg, size_t len, int flags);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700204uint bt_sock_poll(struct file *file, struct socket *sock, poll_table *wait);
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200205int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
207
208void bt_accept_enqueue(struct sock *parent, struct sock *sk);
209void bt_accept_unlink(struct sock *sk);
210struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock);
211
212/* Skb helpers */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700213struct bt_l2cap_control {
214 __u8 frame_type;
215 __u8 final;
216 __u8 sar;
217 __u8 super;
218 __u16 reqseq;
219 __u16 txseq;
220 __u8 poll;
221 __u8 fcs;
222};
223
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224struct bt_skb_cb {
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700225 __u8 pkt_type;
226 __u8 incoming;
Suraj Sumangala33e882a2010-07-14 13:02:17 +0530227 __u16 expect;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -0300228 __u8 retries;
Jaikumar Ganesh14b12d02011-05-23 18:06:04 -0700229 __u8 force_active;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700230 unsigned short channel;
231 struct bt_l2cap_control control;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232};
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300233#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700234
Al Virodd0fc662005-10-07 07:46:04 +0100235static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236{
237 struct sk_buff *skb;
238
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700239 skb = alloc_skb(len + BT_SKB_RESERVE, how);
240 if (skb) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241 skb_reserve(skb, BT_SKB_RESERVE);
242 bt_cb(skb)->incoming = 0;
243 }
244 return skb;
245}
246
Waldemar Rymarkiewicz5a9d0a32011-06-07 11:18:06 +0200247static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk,
248 unsigned long len, int nb, int *err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700249{
250 struct sk_buff *skb;
251
Gustavo F. Padovane454c842010-09-21 16:31:11 -0300252 release_sock(sk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700253 skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err);
254 if (skb) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700255 skb_reserve(skb, BT_SKB_RESERVE);
256 bt_cb(skb)->incoming = 0;
257 }
Gustavo F. Padovane454c842010-09-21 16:31:11 -0300258 lock_sock(sk);
259
260 if (!skb && *err)
261 return NULL;
262
263 *err = sock_error(sk);
264 if (*err)
265 goto out;
266
267 if (sk->sk_shutdown) {
268 *err = -ECONNRESET;
269 goto out;
270 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271
272 return skb;
Gustavo F. Padovane454c842010-09-21 16:31:11 -0300273
274out:
275 kfree_skb(skb);
276 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700277}
278
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700279int bt_err(__u16 code);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280
Marcel Holtmann65164552005-10-28 19:20:48 +0200281extern int hci_sock_init(void);
Tobias Klauser04005dd2008-03-05 18:47:03 -0800282extern void hci_sock_cleanup(void);
Marcel Holtmann65164552005-10-28 19:20:48 +0200283
284extern int bt_sysfs_init(void);
285extern void bt_sysfs_cleanup(void);
286
Marcel Holtmannaef7d972010-03-21 05:27:45 +0100287extern struct dentry *bt_debugfs;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -0800288
Gustavo F. Padovan64274512011-02-07 20:08:52 -0200289int l2cap_init(void);
290void l2cap_exit(void);
Gustavo F. Padovan64274512011-02-07 20:08:52 -0200291
Gustavo F. Padovan64274512011-02-07 20:08:52 -0200292int sco_init(void);
293void sco_exit(void);
Gustavo F. Padovan64274512011-02-07 20:08:52 -0200294
Linus Torvalds1da177e2005-04-16 15:20:36 -0700295#endif /* __BLUETOOTH_H */