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