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