162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci  BNEP protocol definition for Linux Bluetooth stack (BlueZ).
462306a36Sopenharmony_ci  Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci*/
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _BNEP_H
962306a36Sopenharmony_ci#define _BNEP_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/types.h>
1262306a36Sopenharmony_ci#include <linux/crc32.h>
1362306a36Sopenharmony_ci#include <net/bluetooth/bluetooth.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* Limits */
1662306a36Sopenharmony_ci#define BNEP_MAX_PROTO_FILTERS		5
1762306a36Sopenharmony_ci#define BNEP_MAX_MULTICAST_FILTERS	20
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/* UUIDs */
2062306a36Sopenharmony_ci#define BNEP_BASE_UUID	0x0000000000001000800000805F9B34FB
2162306a36Sopenharmony_ci#define BNEP_UUID16	0x02
2262306a36Sopenharmony_ci#define BNEP_UUID32	0x04
2362306a36Sopenharmony_ci#define BNEP_UUID128	0x16
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#define BNEP_SVC_PANU	0x1115
2662306a36Sopenharmony_ci#define BNEP_SVC_NAP	0x1116
2762306a36Sopenharmony_ci#define BNEP_SVC_GN	0x1117
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* Packet types */
3062306a36Sopenharmony_ci#define BNEP_GENERAL			0x00
3162306a36Sopenharmony_ci#define BNEP_CONTROL			0x01
3262306a36Sopenharmony_ci#define BNEP_COMPRESSED			0x02
3362306a36Sopenharmony_ci#define BNEP_COMPRESSED_SRC_ONLY	0x03
3462306a36Sopenharmony_ci#define BNEP_COMPRESSED_DST_ONLY	0x04
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/* Control types */
3762306a36Sopenharmony_ci#define BNEP_CMD_NOT_UNDERSTOOD		0x00
3862306a36Sopenharmony_ci#define BNEP_SETUP_CONN_REQ		0x01
3962306a36Sopenharmony_ci#define BNEP_SETUP_CONN_RSP		0x02
4062306a36Sopenharmony_ci#define BNEP_FILTER_NET_TYPE_SET	0x03
4162306a36Sopenharmony_ci#define BNEP_FILTER_NET_TYPE_RSP	0x04
4262306a36Sopenharmony_ci#define BNEP_FILTER_MULTI_ADDR_SET	0x05
4362306a36Sopenharmony_ci#define BNEP_FILTER_MULTI_ADDR_RSP	0x06
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci/* Extension types */
4662306a36Sopenharmony_ci#define BNEP_EXT_CONTROL 0x00
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/* Response messages */
4962306a36Sopenharmony_ci#define BNEP_SUCCESS 0x00
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#define BNEP_CONN_INVALID_DST 0x01
5262306a36Sopenharmony_ci#define BNEP_CONN_INVALID_SRC 0x02
5362306a36Sopenharmony_ci#define BNEP_CONN_INVALID_SVC 0x03
5462306a36Sopenharmony_ci#define BNEP_CONN_NOT_ALLOWED 0x04
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define BNEP_FILTER_UNSUPPORTED_REQ	0x01
5762306a36Sopenharmony_ci#define BNEP_FILTER_INVALID_RANGE	0x02
5862306a36Sopenharmony_ci#define BNEP_FILTER_INVALID_MCADDR	0x02
5962306a36Sopenharmony_ci#define BNEP_FILTER_LIMIT_REACHED	0x03
6062306a36Sopenharmony_ci#define BNEP_FILTER_DENIED_SECURITY	0x04
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/* L2CAP settings */
6362306a36Sopenharmony_ci#define BNEP_MTU	1691
6462306a36Sopenharmony_ci#define BNEP_PSM	0x0f
6562306a36Sopenharmony_ci#define BNEP_FLUSH_TO	0xffff
6662306a36Sopenharmony_ci#define BNEP_CONNECT_TO	15
6762306a36Sopenharmony_ci#define BNEP_FILTER_TO	15
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/* Headers */
7062306a36Sopenharmony_ci#define BNEP_TYPE_MASK	0x7f
7162306a36Sopenharmony_ci#define BNEP_EXT_HEADER	0x80
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistruct bnep_setup_conn_req {
7462306a36Sopenharmony_ci	__u8 type;
7562306a36Sopenharmony_ci	__u8 ctrl;
7662306a36Sopenharmony_ci	__u8 uuid_size;
7762306a36Sopenharmony_ci	__u8 service[];
7862306a36Sopenharmony_ci} __packed;
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistruct bnep_set_filter_req {
8162306a36Sopenharmony_ci	__u8 type;
8262306a36Sopenharmony_ci	__u8 ctrl;
8362306a36Sopenharmony_ci	__be16 len;
8462306a36Sopenharmony_ci	__u8 list[];
8562306a36Sopenharmony_ci} __packed;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_cistruct bnep_control_rsp {
8862306a36Sopenharmony_ci	__u8 type;
8962306a36Sopenharmony_ci	__u8 ctrl;
9062306a36Sopenharmony_ci	__be16 resp;
9162306a36Sopenharmony_ci} __packed;
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistruct bnep_ext_hdr {
9462306a36Sopenharmony_ci	__u8 type;
9562306a36Sopenharmony_ci	__u8 len;
9662306a36Sopenharmony_ci	__u8 data[];
9762306a36Sopenharmony_ci} __packed;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci/* BNEP ioctl defines */
10062306a36Sopenharmony_ci#define BNEPCONNADD	_IOW('B', 200, int)
10162306a36Sopenharmony_ci#define BNEPCONNDEL	_IOW('B', 201, int)
10262306a36Sopenharmony_ci#define BNEPGETCONNLIST	_IOR('B', 210, int)
10362306a36Sopenharmony_ci#define BNEPGETCONNINFO	_IOR('B', 211, int)
10462306a36Sopenharmony_ci#define BNEPGETSUPPFEAT	_IOR('B', 212, int)
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci#define BNEP_SETUP_RESPONSE	0
10762306a36Sopenharmony_ci#define BNEP_SETUP_RSP_SENT	10
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cistruct bnep_connadd_req {
11062306a36Sopenharmony_ci	int   sock;		/* Connected socket */
11162306a36Sopenharmony_ci	__u32 flags;
11262306a36Sopenharmony_ci	__u16 role;
11362306a36Sopenharmony_ci	char  device[16];	/* Name of the Ethernet device */
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cistruct bnep_conndel_req {
11762306a36Sopenharmony_ci	__u32 flags;
11862306a36Sopenharmony_ci	__u8  dst[ETH_ALEN];
11962306a36Sopenharmony_ci};
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_cistruct bnep_conninfo {
12262306a36Sopenharmony_ci	__u32 flags;
12362306a36Sopenharmony_ci	__u16 role;
12462306a36Sopenharmony_ci	__u16 state;
12562306a36Sopenharmony_ci	__u8  dst[ETH_ALEN];
12662306a36Sopenharmony_ci	char  device[16];
12762306a36Sopenharmony_ci};
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_cistruct bnep_connlist_req {
13062306a36Sopenharmony_ci	__u32  cnum;
13162306a36Sopenharmony_ci	struct bnep_conninfo __user *ci;
13262306a36Sopenharmony_ci};
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_cistruct bnep_proto_filter {
13562306a36Sopenharmony_ci	__u16 start;
13662306a36Sopenharmony_ci	__u16 end;
13762306a36Sopenharmony_ci};
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ciint bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock);
14062306a36Sopenharmony_ciint bnep_del_connection(struct bnep_conndel_req *req);
14162306a36Sopenharmony_ciint bnep_get_connlist(struct bnep_connlist_req *req);
14262306a36Sopenharmony_ciint bnep_get_conninfo(struct bnep_conninfo *ci);
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci/* BNEP sessions */
14562306a36Sopenharmony_cistruct bnep_session {
14662306a36Sopenharmony_ci	struct list_head list;
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	unsigned int  role;
14962306a36Sopenharmony_ci	unsigned long state;
15062306a36Sopenharmony_ci	unsigned long flags;
15162306a36Sopenharmony_ci	atomic_t      terminate;
15262306a36Sopenharmony_ci	struct task_struct *task;
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	struct ethhdr eh;
15562306a36Sopenharmony_ci	struct msghdr msg;
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	struct bnep_proto_filter proto_filter[BNEP_MAX_PROTO_FILTERS];
15862306a36Sopenharmony_ci	unsigned long long mc_filter;
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	struct socket    *sock;
16162306a36Sopenharmony_ci	struct net_device *dev;
16262306a36Sopenharmony_ci};
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_civoid bnep_net_setup(struct net_device *dev);
16562306a36Sopenharmony_ciint bnep_sock_init(void);
16662306a36Sopenharmony_civoid bnep_sock_cleanup(void);
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_cistatic inline int bnep_mc_hash(__u8 *addr)
16962306a36Sopenharmony_ci{
17062306a36Sopenharmony_ci	return crc32_be(~0, addr, ETH_ALEN) >> 26;
17162306a36Sopenharmony_ci}
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci#endif
174