blob: 155c6fd091e6bb8d5372367bb95ce0a85e0fc55d [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
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003 Copyright (c) 2000-2001, 2010-2011 Code Aurora Forum. 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 Gomes89daa342011-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
68
Mat Martineauf00ffac2011-10-19 15:07:32 -070069#define BT_POWER 9
Jaikumar Ganesh514abe62011-05-23 18:06:04 -070070struct bt_power {
71 __u8 force_active;
72};
Jaikumar Ganesh514abe62011-05-23 18:06:04 -070073
Mat Martineauf00ffac2011-10-19 15:07:32 -070074#define BT_AMP_POLICY 10
Joe Perches19f7f222011-06-30 19:15:37 -030075
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070076/* Require BR/EDR (default policy)
77 * AMP controllers cannot be used
78 * Channel move requests from the remote device are denied
79 * If the L2CAP channel is currently using AMP, move the channel to BR/EDR
80 */
81#define BT_AMP_POLICY_REQUIRE_BR_EDR 0
82
Mat Martineauf00ffac2011-10-19 15:07:32 -070083/* Prefer BR/EDR
84 * Allow use of AMP controllers
85 * If the L2CAP channel is currently on AMP, move it to BR/EDR
86 * Channel move requests from the remote device are allowed
87 */
88#define BT_AMP_POLICY_PREFER_BR_EDR 1
89
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070090/* Prefer AMP
91 * Allow use of AMP controllers
92 * If the L2CAP channel is currently on BR/EDR and AMP controller
93 * resources are available, initiate a channel move to AMP
94 * Channel move requests from the remote device are allowed
95 * If the L2CAP socket has not been connected yet, try to create
96 * and configure the channel directly on an AMP controller rather
97 * than BR/EDR
98 */
Mat Martineauf00ffac2011-10-19 15:07:32 -070099#define BT_AMP_POLICY_PREFER_AMP 2
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700100
101#define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg)
102#define BT_ERR(fmt, arg...) printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg)
103#define BT_DBG(fmt, arg...) pr_debug("%s: " fmt "\n" , __func__ , ## arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105/* Connection and socket states */
106enum {
107 BT_CONNECTED = 1, /* Equal to TCP_ESTABLISHED to make net code happy */
108 BT_OPEN,
109 BT_BOUND,
110 BT_LISTEN,
111 BT_CONNECT,
112 BT_CONNECT2,
113 BT_CONFIG,
114 BT_DISCONN,
115 BT_CLOSED
116};
117
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118/* BD Address */
119typedef struct {
120 __u8 b[6];
Gustavo F. Padovan66c853c2010-07-19 02:00:13 -0300121} __packed bdaddr_t;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700122
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700123#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0} })
124#define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff} })
Linus Torvalds1da177e2005-04-16 15:20:36 -0700125
126/* Copy, swap, convert BD Address */
127static inline int bacmp(bdaddr_t *ba1, bdaddr_t *ba2)
128{
129 return memcmp(ba1, ba2, sizeof(bdaddr_t));
130}
131static inline void bacpy(bdaddr_t *dst, bdaddr_t *src)
132{
133 memcpy(dst, src, sizeof(bdaddr_t));
134}
135
136void baswap(bdaddr_t *dst, bdaddr_t *src);
137char *batostr(bdaddr_t *ba);
138bdaddr_t *strtoba(char *str);
139
140/* Common socket structures and functions */
141
142#define bt_sk(__sk) ((struct bt_sock *) __sk)
143
144struct bt_sock {
145 struct sock sk;
146 bdaddr_t src;
147 bdaddr_t dst;
148 struct list_head accept_q;
149 struct sock *parent;
Marcel Holtmannc4f912e2009-01-15 21:52:16 +0100150 u32 defer_setup;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151};
152
153struct bt_sock_list {
154 struct hlist_head head;
155 rwlock_t lock;
156};
157
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +0000158int bt_sock_register(int proto, const struct net_proto_family *ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700159int bt_sock_unregister(int proto);
160void bt_sock_link(struct bt_sock_list *l, struct sock *s);
161void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
Waldemar Rymarkiewicz3f8e1e32011-06-07 11:18:06 +0200162int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
163 struct msghdr *msg, size_t len, int flags);
Mat Martineau796c86e2010-09-08 10:05:27 -0700164int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
165 struct msghdr *msg, size_t len, int flags);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700166uint bt_sock_poll(struct file *file, struct socket *sock, poll_table *wait);
Marcel Holtmann3241ad82008-07-14 20:13:50 +0200167int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168int bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
169
170void bt_accept_enqueue(struct sock *parent, struct sock *sk);
171void bt_accept_unlink(struct sock *sk);
172struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock);
173
174/* Skb helpers */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700175struct bt_l2cap_control {
176 __u8 frame_type;
177 __u8 final;
178 __u8 sar;
179 __u8 super;
180 __u16 reqseq;
181 __u16 txseq;
182 __u8 poll;
183 __u8 fcs;
184};
185
Linus Torvalds1da177e2005-04-16 15:20:36 -0700186struct bt_skb_cb {
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700187 __u8 pkt_type;
188 __u8 incoming;
Suraj Sumangala33e882a2010-07-14 13:02:17 +0530189 __u16 expect;
Gustavo F. Padovane90bac02009-08-20 22:26:00 -0300190 __u8 retries;
Jaikumar Ganesh514abe62011-05-23 18:06:04 -0700191 __u8 force_active;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700192 unsigned short channel;
193 struct bt_l2cap_control control;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700194};
Gustavo F. Padovan1c2acff2009-08-20 22:25:57 -0300195#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700196
Al Virodd0fc662005-10-07 07:46:04 +0100197static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198{
199 struct sk_buff *skb;
200
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700201 skb = alloc_skb(len + BT_SKB_RESERVE, how);
202 if (skb) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203 skb_reserve(skb, BT_SKB_RESERVE);
204 bt_cb(skb)->incoming = 0;
205 }
206 return skb;
207}
208
Waldemar Rymarkiewicz3f8e1e32011-06-07 11:18:06 +0200209static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk,
210 unsigned long len, int nb, int *err)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211{
212 struct sk_buff *skb;
213
Gustavo F. Padovane454c842010-09-21 16:31:11 -0300214 release_sock(sk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700215 skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err);
216 if (skb) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700217 skb_reserve(skb, BT_SKB_RESERVE);
218 bt_cb(skb)->incoming = 0;
219 }
Gustavo F. Padovane454c842010-09-21 16:31:11 -0300220 lock_sock(sk);
221
222 if (!skb && *err)
223 return NULL;
224
225 *err = sock_error(sk);
226 if (*err)
227 goto out;
228
229 if (sk->sk_shutdown) {
230 *err = -ECONNRESET;
231 goto out;
232 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700233
234 return skb;
Gustavo F. Padovane454c842010-09-21 16:31:11 -0300235
236out:
237 kfree_skb(skb);
238 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239}
240
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700241int bt_err(__u16 code);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242
Marcel Holtmann65164552005-10-28 19:20:48 +0200243extern int hci_sock_init(void);
Tobias Klauser04005dd2008-03-05 18:47:03 -0800244extern void hci_sock_cleanup(void);
Marcel Holtmann65164552005-10-28 19:20:48 +0200245
246extern int bt_sysfs_init(void);
247extern void bt_sysfs_cleanup(void);
248
Marcel Holtmannaef7d972010-03-21 05:27:45 +0100249extern struct dentry *bt_debugfs;
Marcel Holtmannbe9d1222005-11-08 09:57:38 -0800250
Gustavo F. Padovan64274512011-02-07 20:08:52 -0200251#ifdef CONFIG_BT_L2CAP
252int l2cap_init(void);
253void l2cap_exit(void);
254#else
255static inline int l2cap_init(void)
256{
257 return 0;
258}
259
260static inline void l2cap_exit(void)
261{
262}
263#endif
264
265#ifdef CONFIG_BT_SCO
266int sco_init(void);
267void sco_exit(void);
268#else
269static inline int sco_init(void)
270{
271 return 0;
272}
273
274static inline void sco_exit(void)
275{
276}
277#endif
278
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279#endif /* __BLUETOOTH_H */