xref: /openbmc/linux/include/net/bluetooth/bluetooth.h (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds /*
2*1da177e4SLinus Torvalds    BlueZ - Bluetooth protocol stack for Linux
3*1da177e4SLinus Torvalds    Copyright (C) 2000-2001 Qualcomm Incorporated
4*1da177e4SLinus Torvalds 
5*1da177e4SLinus Torvalds    Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6*1da177e4SLinus Torvalds 
7*1da177e4SLinus Torvalds    This program is free software; you can redistribute it and/or modify
8*1da177e4SLinus Torvalds    it under the terms of the GNU General Public License version 2 as
9*1da177e4SLinus Torvalds    published by the Free Software Foundation;
10*1da177e4SLinus Torvalds 
11*1da177e4SLinus Torvalds    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12*1da177e4SLinus Torvalds    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13*1da177e4SLinus Torvalds    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14*1da177e4SLinus Torvalds    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15*1da177e4SLinus Torvalds    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16*1da177e4SLinus Torvalds    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17*1da177e4SLinus Torvalds    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18*1da177e4SLinus Torvalds    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19*1da177e4SLinus Torvalds 
20*1da177e4SLinus Torvalds    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21*1da177e4SLinus Torvalds    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22*1da177e4SLinus Torvalds    SOFTWARE IS DISCLAIMED.
23*1da177e4SLinus Torvalds */
24*1da177e4SLinus Torvalds 
25*1da177e4SLinus Torvalds #ifndef __BLUETOOTH_H
26*1da177e4SLinus Torvalds #define __BLUETOOTH_H
27*1da177e4SLinus Torvalds 
28*1da177e4SLinus Torvalds #include <asm/types.h>
29*1da177e4SLinus Torvalds #include <asm/byteorder.h>
30*1da177e4SLinus Torvalds #include <linux/list.h>
31*1da177e4SLinus Torvalds #include <linux/poll.h>
32*1da177e4SLinus Torvalds #include <net/sock.h>
33*1da177e4SLinus Torvalds 
34*1da177e4SLinus Torvalds #ifndef AF_BLUETOOTH
35*1da177e4SLinus Torvalds #define AF_BLUETOOTH	31
36*1da177e4SLinus Torvalds #define PF_BLUETOOTH	AF_BLUETOOTH
37*1da177e4SLinus Torvalds #endif
38*1da177e4SLinus Torvalds 
39*1da177e4SLinus Torvalds /* Reserv for core and drivers use */
40*1da177e4SLinus Torvalds #define BT_SKB_RESERVE	8
41*1da177e4SLinus Torvalds 
42*1da177e4SLinus Torvalds #define BTPROTO_L2CAP	0
43*1da177e4SLinus Torvalds #define BTPROTO_HCI	1
44*1da177e4SLinus Torvalds #define BTPROTO_SCO	2
45*1da177e4SLinus Torvalds #define BTPROTO_RFCOMM	3
46*1da177e4SLinus Torvalds #define BTPROTO_BNEP	4
47*1da177e4SLinus Torvalds #define BTPROTO_CMTP	5
48*1da177e4SLinus Torvalds #define BTPROTO_HIDP	6
49*1da177e4SLinus Torvalds #define BTPROTO_AVDTP	7
50*1da177e4SLinus Torvalds 
51*1da177e4SLinus Torvalds #define SOL_HCI		0
52*1da177e4SLinus Torvalds #define SOL_L2CAP	6
53*1da177e4SLinus Torvalds #define SOL_SCO		17
54*1da177e4SLinus Torvalds #define SOL_RFCOMM	18
55*1da177e4SLinus Torvalds 
56*1da177e4SLinus Torvalds #define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg)
57*1da177e4SLinus Torvalds #define BT_DBG(fmt, arg...)  printk(KERN_INFO "%s: " fmt "\n" , __FUNCTION__ , ## arg)
58*1da177e4SLinus Torvalds #define BT_ERR(fmt, arg...)  printk(KERN_ERR  "%s: " fmt "\n" , __FUNCTION__ , ## arg)
59*1da177e4SLinus Torvalds 
60*1da177e4SLinus Torvalds #ifdef HCI_DATA_DUMP
61*1da177e4SLinus Torvalds #define BT_DMP(buf, len) bt_dump(__FUNCTION__, buf, len)
62*1da177e4SLinus Torvalds #else
63*1da177e4SLinus Torvalds #define BT_DMP(D...)
64*1da177e4SLinus Torvalds #endif
65*1da177e4SLinus Torvalds 
66*1da177e4SLinus Torvalds extern struct proc_dir_entry *proc_bt;
67*1da177e4SLinus Torvalds 
68*1da177e4SLinus Torvalds /* Connection and socket states */
69*1da177e4SLinus Torvalds enum {
70*1da177e4SLinus Torvalds 	BT_CONNECTED = 1, /* Equal to TCP_ESTABLISHED to make net code happy */
71*1da177e4SLinus Torvalds 	BT_OPEN,
72*1da177e4SLinus Torvalds 	BT_BOUND,
73*1da177e4SLinus Torvalds 	BT_LISTEN,
74*1da177e4SLinus Torvalds 	BT_CONNECT,
75*1da177e4SLinus Torvalds 	BT_CONNECT2,
76*1da177e4SLinus Torvalds 	BT_CONFIG,
77*1da177e4SLinus Torvalds 	BT_DISCONN,
78*1da177e4SLinus Torvalds 	BT_CLOSED
79*1da177e4SLinus Torvalds };
80*1da177e4SLinus Torvalds 
81*1da177e4SLinus Torvalds /* Endianness conversions */
82*1da177e4SLinus Torvalds #define htobs(a)	__cpu_to_le16(a)
83*1da177e4SLinus Torvalds #define htobl(a)	__cpu_to_le32(a)
84*1da177e4SLinus Torvalds #define btohs(a)	__le16_to_cpu(a)
85*1da177e4SLinus Torvalds #define btohl(a)	__le32_to_cpu(a)
86*1da177e4SLinus Torvalds 
87*1da177e4SLinus Torvalds /* BD Address */
88*1da177e4SLinus Torvalds typedef struct {
89*1da177e4SLinus Torvalds 	__u8 b[6];
90*1da177e4SLinus Torvalds } __attribute__((packed)) bdaddr_t;
91*1da177e4SLinus Torvalds 
92*1da177e4SLinus Torvalds #define BDADDR_ANY   (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
93*1da177e4SLinus Torvalds #define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}})
94*1da177e4SLinus Torvalds 
95*1da177e4SLinus Torvalds /* Copy, swap, convert BD Address */
96*1da177e4SLinus Torvalds static inline int bacmp(bdaddr_t *ba1, bdaddr_t *ba2)
97*1da177e4SLinus Torvalds {
98*1da177e4SLinus Torvalds 	return memcmp(ba1, ba2, sizeof(bdaddr_t));
99*1da177e4SLinus Torvalds }
100*1da177e4SLinus Torvalds static inline void bacpy(bdaddr_t *dst, bdaddr_t *src)
101*1da177e4SLinus Torvalds {
102*1da177e4SLinus Torvalds 	memcpy(dst, src, sizeof(bdaddr_t));
103*1da177e4SLinus Torvalds }
104*1da177e4SLinus Torvalds 
105*1da177e4SLinus Torvalds void baswap(bdaddr_t *dst, bdaddr_t *src);
106*1da177e4SLinus Torvalds char *batostr(bdaddr_t *ba);
107*1da177e4SLinus Torvalds bdaddr_t *strtoba(char *str);
108*1da177e4SLinus Torvalds 
109*1da177e4SLinus Torvalds /* Common socket structures and functions */
110*1da177e4SLinus Torvalds 
111*1da177e4SLinus Torvalds #define bt_sk(__sk) ((struct bt_sock *) __sk)
112*1da177e4SLinus Torvalds 
113*1da177e4SLinus Torvalds struct bt_sock {
114*1da177e4SLinus Torvalds 	struct sock sk;
115*1da177e4SLinus Torvalds 	bdaddr_t    src;
116*1da177e4SLinus Torvalds 	bdaddr_t    dst;
117*1da177e4SLinus Torvalds 	struct list_head accept_q;
118*1da177e4SLinus Torvalds 	struct sock *parent;
119*1da177e4SLinus Torvalds };
120*1da177e4SLinus Torvalds 
121*1da177e4SLinus Torvalds struct bt_sock_list {
122*1da177e4SLinus Torvalds 	struct hlist_head head;
123*1da177e4SLinus Torvalds 	rwlock_t          lock;
124*1da177e4SLinus Torvalds };
125*1da177e4SLinus Torvalds 
126*1da177e4SLinus Torvalds int  bt_sock_register(int proto, struct net_proto_family *ops);
127*1da177e4SLinus Torvalds int  bt_sock_unregister(int proto);
128*1da177e4SLinus Torvalds void bt_sock_link(struct bt_sock_list *l, struct sock *s);
129*1da177e4SLinus Torvalds void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
130*1da177e4SLinus Torvalds int  bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags);
131*1da177e4SLinus Torvalds uint bt_sock_poll(struct file * file, struct socket *sock, poll_table *wait);
132*1da177e4SLinus Torvalds int  bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
133*1da177e4SLinus Torvalds 
134*1da177e4SLinus Torvalds void bt_accept_enqueue(struct sock *parent, struct sock *sk);
135*1da177e4SLinus Torvalds void bt_accept_unlink(struct sock *sk);
136*1da177e4SLinus Torvalds struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock);
137*1da177e4SLinus Torvalds 
138*1da177e4SLinus Torvalds /* Skb helpers */
139*1da177e4SLinus Torvalds struct bt_skb_cb {
140*1da177e4SLinus Torvalds 	int incoming;
141*1da177e4SLinus Torvalds };
142*1da177e4SLinus Torvalds #define bt_cb(skb) ((struct bt_skb_cb *)(skb->cb))
143*1da177e4SLinus Torvalds 
144*1da177e4SLinus Torvalds static inline struct sk_buff *bt_skb_alloc(unsigned int len, int how)
145*1da177e4SLinus Torvalds {
146*1da177e4SLinus Torvalds 	struct sk_buff *skb;
147*1da177e4SLinus Torvalds 
148*1da177e4SLinus Torvalds 	if ((skb = alloc_skb(len + BT_SKB_RESERVE, how))) {
149*1da177e4SLinus Torvalds 		skb_reserve(skb, BT_SKB_RESERVE);
150*1da177e4SLinus Torvalds 		bt_cb(skb)->incoming  = 0;
151*1da177e4SLinus Torvalds 	}
152*1da177e4SLinus Torvalds 	return skb;
153*1da177e4SLinus Torvalds }
154*1da177e4SLinus Torvalds 
155*1da177e4SLinus Torvalds static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk, unsigned long len,
156*1da177e4SLinus Torvalds 							int nb, int *err)
157*1da177e4SLinus Torvalds {
158*1da177e4SLinus Torvalds 	struct sk_buff *skb;
159*1da177e4SLinus Torvalds 
160*1da177e4SLinus Torvalds 	if ((skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err))) {
161*1da177e4SLinus Torvalds 		skb_reserve(skb, BT_SKB_RESERVE);
162*1da177e4SLinus Torvalds 		bt_cb(skb)->incoming  = 0;
163*1da177e4SLinus Torvalds 	}
164*1da177e4SLinus Torvalds 
165*1da177e4SLinus Torvalds 	return skb;
166*1da177e4SLinus Torvalds }
167*1da177e4SLinus Torvalds 
168*1da177e4SLinus Torvalds static inline int skb_frags_no(struct sk_buff *skb)
169*1da177e4SLinus Torvalds {
170*1da177e4SLinus Torvalds 	register struct sk_buff *frag = skb_shinfo(skb)->frag_list;
171*1da177e4SLinus Torvalds 	register int n = 1;
172*1da177e4SLinus Torvalds 
173*1da177e4SLinus Torvalds 	for (; frag; frag=frag->next, n++);
174*1da177e4SLinus Torvalds 	return n;
175*1da177e4SLinus Torvalds }
176*1da177e4SLinus Torvalds 
177*1da177e4SLinus Torvalds void bt_dump(char *pref, __u8 *buf, int count);
178*1da177e4SLinus Torvalds 
179*1da177e4SLinus Torvalds int bt_err(__u16 code);
180*1da177e4SLinus Torvalds 
181*1da177e4SLinus Torvalds #endif /* __BLUETOOTH_H */
182