1/*
2  BNEP protocol definition for Linux Bluetooth stack (BlueZ).
3  Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
4
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License, version 2, as
7  published by the Free Software Foundation.
8
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  GNU General Public License for more details.
13
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, see <http://www.gnu.org/licenses/>.
16*/
17
18#ifndef _BNEP_H
19#define _BNEP_H
20
21#include <linux/types.h>
22#include <linux/crc32.h>
23#include <net/bluetooth/bluetooth.h>
24
25/* Limits */
26#define BNEP_MAX_PROTO_FILTERS		5
27#define BNEP_MAX_MULTICAST_FILTERS	20
28
29/* UUIDs */
30#define BNEP_BASE_UUID	0x0000000000001000800000805F9B34FB
31#define BNEP_UUID16	0x02
32#define BNEP_UUID32	0x04
33#define BNEP_UUID128	0x16
34
35#define BNEP_SVC_PANU	0x1115
36#define BNEP_SVC_NAP	0x1116
37#define BNEP_SVC_GN	0x1117
38
39/* Packet types */
40#define BNEP_GENERAL			0x00
41#define BNEP_CONTROL			0x01
42#define BNEP_COMPRESSED			0x02
43#define BNEP_COMPRESSED_SRC_ONLY	0x03
44#define BNEP_COMPRESSED_DST_ONLY	0x04
45
46/* Control types */
47#define BNEP_CMD_NOT_UNDERSTOOD		0x00
48#define BNEP_SETUP_CONN_REQ		0x01
49#define BNEP_SETUP_CONN_RSP		0x02
50#define BNEP_FILTER_NET_TYPE_SET	0x03
51#define BNEP_FILTER_NET_TYPE_RSP	0x04
52#define BNEP_FILTER_MULTI_ADDR_SET	0x05
53#define BNEP_FILTER_MULTI_ADDR_RSP	0x06
54
55/* Extension types */
56#define BNEP_EXT_CONTROL 0x00
57
58/* Response messages */
59#define BNEP_SUCCESS 0x00
60
61#define BNEP_CONN_INVALID_DST 0x01
62#define BNEP_CONN_INVALID_SRC 0x02
63#define BNEP_CONN_INVALID_SVC 0x03
64#define BNEP_CONN_NOT_ALLOWED 0x04
65
66#define BNEP_FILTER_UNSUPPORTED_REQ	0x01
67#define BNEP_FILTER_INVALID_RANGE	0x02
68#define BNEP_FILTER_INVALID_MCADDR	0x02
69#define BNEP_FILTER_LIMIT_REACHED	0x03
70#define BNEP_FILTER_DENIED_SECURITY	0x04
71
72/* L2CAP settings */
73#define BNEP_MTU	1691
74#define BNEP_PSM	0x0f
75#define BNEP_FLUSH_TO	0xffff
76#define BNEP_CONNECT_TO	15
77#define BNEP_FILTER_TO	15
78
79/* Headers */
80#define BNEP_TYPE_MASK	0x7f
81#define BNEP_EXT_HEADER	0x80
82
83struct bnep_setup_conn_req {
84	__u8 type;
85	__u8 ctrl;
86	__u8 uuid_size;
87	__u8 service[0];
88} __packed;
89
90struct bnep_set_filter_req {
91	__u8 type;
92	__u8 ctrl;
93	__be16 len;
94	__u8 list[0];
95} __packed;
96
97struct bnep_control_rsp {
98	__u8 type;
99	__u8 ctrl;
100	__be16 resp;
101} __packed;
102
103struct bnep_ext_hdr {
104	__u8 type;
105	__u8 len;
106	__u8 data[0];
107} __packed;
108
109/* BNEP ioctl defines */
110#define BNEPCONNADD	_IOW('B', 200, int)
111#define BNEPCONNDEL	_IOW('B', 201, int)
112#define BNEPGETCONNLIST	_IOR('B', 210, int)
113#define BNEPGETCONNINFO	_IOR('B', 211, int)
114
115struct bnep_connadd_req {
116	int   sock;		/* Connected socket */
117	__u32 flags;
118	__u16 role;
119	char  device[16];	/* Name of the Ethernet device */
120};
121
122struct bnep_conndel_req {
123	__u32 flags;
124	__u8  dst[ETH_ALEN];
125};
126
127struct bnep_conninfo {
128	__u32 flags;
129	__u16 role;
130	__u16 state;
131	__u8  dst[ETH_ALEN];
132	char  device[16];
133};
134
135struct bnep_connlist_req {
136	__u32  cnum;
137	struct bnep_conninfo __user *ci;
138};
139
140struct bnep_proto_filter {
141	__u16 start;
142	__u16 end;
143};
144
145int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock);
146int bnep_del_connection(struct bnep_conndel_req *req);
147int bnep_get_connlist(struct bnep_connlist_req *req);
148int bnep_get_conninfo(struct bnep_conninfo *ci);
149
150/* BNEP sessions */
151struct bnep_session {
152	struct list_head list;
153
154	unsigned int  role;
155	unsigned long state;
156	unsigned long flags;
157	atomic_t      terminate;
158	struct task_struct *task;
159
160	struct ethhdr eh;
161	struct msghdr msg;
162
163	struct bnep_proto_filter proto_filter[BNEP_MAX_PROTO_FILTERS];
164	unsigned long long mc_filter;
165
166	struct socket    *sock;
167	struct net_device *dev;
168};
169
170void bnep_net_setup(struct net_device *dev);
171int bnep_sock_init(void);
172void bnep_sock_cleanup(void);
173
174static inline int bnep_mc_hash(__u8 *addr)
175{
176	return crc32_be(~0, addr, ETH_ALEN) >> 26;
177}
178
179#endif
180