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