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