xref: /OK3568_Linux_fs/kernel/net/bluetooth/bnep/bnep.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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