11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds    BlueZ - Bluetooth protocol stack for Linux
31da177e4SLinus Torvalds    Copyright (C) 2000-2001 Qualcomm Incorporated
4*0fe8c8d0SIulia Tanasescu    Copyright 2023 NXP
51da177e4SLinus Torvalds 
61da177e4SLinus Torvalds    Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds    This program is free software; you can redistribute it and/or modify
91da177e4SLinus Torvalds    it under the terms of the GNU General Public License version 2 as
101da177e4SLinus Torvalds    published by the Free Software Foundation;
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
131da177e4SLinus Torvalds    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
141da177e4SLinus Torvalds    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
151da177e4SLinus Torvalds    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
161da177e4SLinus Torvalds    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
171da177e4SLinus Torvalds    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
181da177e4SLinus Torvalds    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
191da177e4SLinus Torvalds    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
201da177e4SLinus Torvalds 
211da177e4SLinus Torvalds    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
221da177e4SLinus Torvalds    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
231da177e4SLinus Torvalds    SOFTWARE IS DISCLAIMED.
241da177e4SLinus Torvalds */
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds #ifndef __BLUETOOTH_H
271da177e4SLinus Torvalds #define __BLUETOOTH_H
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds #include <linux/poll.h>
301da177e4SLinus Torvalds #include <net/sock.h>
31256a06c8SMasatake YAMATO #include <linux/seq_file.h>
321da177e4SLinus Torvalds 
339e8305b3SMarcel Holtmann #define BT_SUBSYS_VERSION	2
344037a774SMarcel Holtmann #define BT_SUBSYS_REVISION	22
35dd31506dSMarcel Holtmann 
361da177e4SLinus Torvalds #ifndef AF_BLUETOOTH
371da177e4SLinus Torvalds #define AF_BLUETOOTH	31
381da177e4SLinus Torvalds #define PF_BLUETOOTH	AF_BLUETOOTH
391da177e4SLinus Torvalds #endif
401da177e4SLinus Torvalds 
41d095c1ebSAndrei Emeltchenko /* Bluetooth versions */
42d095c1ebSAndrei Emeltchenko #define BLUETOOTH_VER_1_1	1
43d095c1ebSAndrei Emeltchenko #define BLUETOOTH_VER_1_2	2
44d095c1ebSAndrei Emeltchenko #define BLUETOOTH_VER_2_0	3
45cde1a8a9SIsmael Ferreras Morezuelas #define BLUETOOTH_VER_2_1	4
46cde1a8a9SIsmael Ferreras Morezuelas #define BLUETOOTH_VER_4_0	6
47d095c1ebSAndrei Emeltchenko 
481da177e4SLinus Torvalds /* Reserv for core and drivers use */
491da177e4SLinus Torvalds #define BT_SKB_RESERVE	8
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds #define BTPROTO_L2CAP	0
521da177e4SLinus Torvalds #define BTPROTO_HCI	1
531da177e4SLinus Torvalds #define BTPROTO_SCO	2
541da177e4SLinus Torvalds #define BTPROTO_RFCOMM	3
551da177e4SLinus Torvalds #define BTPROTO_BNEP	4
561da177e4SLinus Torvalds #define BTPROTO_CMTP	5
571da177e4SLinus Torvalds #define BTPROTO_HIDP	6
581da177e4SLinus Torvalds #define BTPROTO_AVDTP	7
5926afbd82SLuiz Augusto von Dentz #define BTPROTO_ISO	8
6026afbd82SLuiz Augusto von Dentz #define BTPROTO_LAST	BTPROTO_ISO
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds #define SOL_HCI		0
631da177e4SLinus Torvalds #define SOL_L2CAP	6
641da177e4SLinus Torvalds #define SOL_SCO		17
651da177e4SLinus Torvalds #define SOL_RFCOMM	18
661da177e4SLinus Torvalds 
678c1b2355SMarcel Holtmann #define BT_SECURITY	4
688c1b2355SMarcel Holtmann struct bt_security {
698c1b2355SMarcel Holtmann 	__u8 level;
708f360119SVinicius Costa Gomes 	__u8 key_size;
718c1b2355SMarcel Holtmann };
728c1b2355SMarcel Holtmann #define BT_SECURITY_SDP		0
738c1b2355SMarcel Holtmann #define BT_SECURITY_LOW		1
748c1b2355SMarcel Holtmann #define BT_SECURITY_MEDIUM	2
758c1b2355SMarcel Holtmann #define BT_SECURITY_HIGH	3
767b5a9241SMarcel Holtmann #define BT_SECURITY_FIPS	4
778c1b2355SMarcel Holtmann 
78c4f912e1SMarcel Holtmann #define BT_DEFER_SETUP	7
79c4f912e1SMarcel Holtmann 
80e702112fSAndrei Emeltchenko #define BT_FLUSHABLE	8
81e702112fSAndrei Emeltchenko 
82e702112fSAndrei Emeltchenko #define BT_FLUSHABLE_OFF	0
83e702112fSAndrei Emeltchenko #define BT_FLUSHABLE_ON		1
84e702112fSAndrei Emeltchenko 
8514b12d0bSJaikumar Ganesh #define BT_POWER	9
8614b12d0bSJaikumar Ganesh struct bt_power {
8714b12d0bSJaikumar Ganesh 	__u8 force_active;
8814b12d0bSJaikumar Ganesh };
8914b12d0bSJaikumar Ganesh #define BT_POWER_FORCE_ACTIVE_OFF 0
9014b12d0bSJaikumar Ganesh #define BT_POWER_FORCE_ACTIVE_ON  1
9114b12d0bSJaikumar Ganesh 
92c14968b0SMat Martineau #define BT_CHANNEL_POLICY	10
93c14968b0SMat Martineau 
94c14968b0SMat Martineau /* BR/EDR only (default policy)
95c14968b0SMat Martineau  *   AMP controllers cannot be used.
96c14968b0SMat Martineau  *   Channel move requests from the remote device are denied.
97c14968b0SMat Martineau  *   If the L2CAP channel is currently using AMP, move the channel to BR/EDR.
98c14968b0SMat Martineau  */
99c14968b0SMat Martineau #define BT_CHANNEL_POLICY_BREDR_ONLY		0
100c14968b0SMat Martineau 
101c14968b0SMat Martineau /* BR/EDR Preferred
102c14968b0SMat Martineau  *   Allow use of AMP controllers.
103c14968b0SMat Martineau  *   If the L2CAP channel is currently on AMP, move it to BR/EDR.
104c14968b0SMat Martineau  *   Channel move requests from the remote device are allowed.
105c14968b0SMat Martineau  */
106c14968b0SMat Martineau #define BT_CHANNEL_POLICY_BREDR_PREFERRED	1
107c14968b0SMat Martineau 
108c14968b0SMat Martineau /* AMP Preferred
109c14968b0SMat Martineau  *   Allow use of AMP controllers
110c14968b0SMat Martineau  *   If the L2CAP channel is currently on BR/EDR and AMP controller
111c14968b0SMat Martineau  *     resources are available, initiate a channel move to AMP.
112c14968b0SMat Martineau  *   Channel move requests from the remote device are allowed.
113c14968b0SMat Martineau  *   If the L2CAP socket has not been connected yet, try to create
114c14968b0SMat Martineau  *     and configure the channel directly on an AMP controller rather
115c14968b0SMat Martineau  *     than BR/EDR.
116c14968b0SMat Martineau  */
117c14968b0SMat Martineau #define BT_CHANNEL_POLICY_AMP_PREFERRED		2
118c14968b0SMat Martineau 
119ad10b1a4SFrédéric Dalleau #define BT_VOICE		11
120ad10b1a4SFrédéric Dalleau struct bt_voice {
121ad10b1a4SFrédéric Dalleau 	__u16 setting;
122ad10b1a4SFrédéric Dalleau };
123ad10b1a4SFrédéric Dalleau 
124ad10b1a4SFrédéric Dalleau #define BT_VOICE_TRANSPARENT			0x0003
125ad10b1a4SFrédéric Dalleau #define BT_VOICE_CVSD_16BIT			0x0060
126ad10b1a4SFrédéric Dalleau 
1271f435424SJohan Hedberg #define BT_SNDMTU		12
1281f435424SJohan Hedberg #define BT_RCVMTU		13
129eab2404bSLuiz Augusto von Dentz #define BT_PHY			14
130eab2404bSLuiz Augusto von Dentz 
131eab2404bSLuiz Augusto von Dentz #define BT_PHY_BR_1M_1SLOT	0x00000001
132eab2404bSLuiz Augusto von Dentz #define BT_PHY_BR_1M_3SLOT	0x00000002
133eab2404bSLuiz Augusto von Dentz #define BT_PHY_BR_1M_5SLOT	0x00000004
134eab2404bSLuiz Augusto von Dentz #define BT_PHY_EDR_2M_1SLOT	0x00000008
135eab2404bSLuiz Augusto von Dentz #define BT_PHY_EDR_2M_3SLOT	0x00000010
136eab2404bSLuiz Augusto von Dentz #define BT_PHY_EDR_2M_5SLOT	0x00000020
137eab2404bSLuiz Augusto von Dentz #define BT_PHY_EDR_3M_1SLOT	0x00000040
138eab2404bSLuiz Augusto von Dentz #define BT_PHY_EDR_3M_3SLOT	0x00000080
139eab2404bSLuiz Augusto von Dentz #define BT_PHY_EDR_3M_5SLOT	0x00000100
140eab2404bSLuiz Augusto von Dentz #define BT_PHY_LE_1M_TX		0x00000200
141eab2404bSLuiz Augusto von Dentz #define BT_PHY_LE_1M_RX		0x00000400
142eab2404bSLuiz Augusto von Dentz #define BT_PHY_LE_2M_TX		0x00000800
143eab2404bSLuiz Augusto von Dentz #define BT_PHY_LE_2M_RX		0x00001000
144eab2404bSLuiz Augusto von Dentz #define BT_PHY_LE_CODED_TX	0x00002000
145eab2404bSLuiz Augusto von Dentz #define BT_PHY_LE_CODED_RX	0x00004000
1461f435424SJohan Hedberg 
1473ee7b7cdSLuiz Augusto von Dentz #define BT_MODE			15
1483ee7b7cdSLuiz Augusto von Dentz 
1493ee7b7cdSLuiz Augusto von Dentz #define BT_MODE_BASIC		0x00
1503ee7b7cdSLuiz Augusto von Dentz #define BT_MODE_ERTM		0x01
1513ee7b7cdSLuiz Augusto von Dentz #define BT_MODE_STREAMING	0x02
1523ee7b7cdSLuiz Augusto von Dentz #define BT_MODE_LE_FLOWCTL	0x03
1533ee7b7cdSLuiz Augusto von Dentz #define BT_MODE_EXT_FLOWCTL	0x04
1543ee7b7cdSLuiz Augusto von Dentz 
15500398e1dSAlain Michaud #define BT_PKT_STATUS           16
15600398e1dSAlain Michaud 
15700398e1dSAlain Michaud #define BT_SCM_PKT_STATUS	0x03
15800398e1dSAlain Michaud 
15926afbd82SLuiz Augusto von Dentz #define BT_ISO_QOS		17
16026afbd82SLuiz Augusto von Dentz 
16126afbd82SLuiz Augusto von Dentz #define BT_ISO_QOS_CIG_UNSET	0xff
16226afbd82SLuiz Augusto von Dentz #define BT_ISO_QOS_CIS_UNSET	0xff
16326afbd82SLuiz Augusto von Dentz 
164eca0ae4aSLuiz Augusto von Dentz #define BT_ISO_QOS_BIG_UNSET	0xff
165eca0ae4aSLuiz Augusto von Dentz #define BT_ISO_QOS_BIS_UNSET	0xff
166eca0ae4aSLuiz Augusto von Dentz 
16726afbd82SLuiz Augusto von Dentz struct bt_iso_io_qos {
16826afbd82SLuiz Augusto von Dentz 	__u32 interval;
16926afbd82SLuiz Augusto von Dentz 	__u16 latency;
17026afbd82SLuiz Augusto von Dentz 	__u16 sdu;
17126afbd82SLuiz Augusto von Dentz 	__u8  phy;
17226afbd82SLuiz Augusto von Dentz 	__u8  rtn;
17326afbd82SLuiz Augusto von Dentz };
17426afbd82SLuiz Augusto von Dentz 
175*0fe8c8d0SIulia Tanasescu struct bt_iso_ucast_qos {
17626afbd82SLuiz Augusto von Dentz 	__u8  cig;
17726afbd82SLuiz Augusto von Dentz 	__u8  cis;
17826afbd82SLuiz Augusto von Dentz 	__u8  sca;
17926afbd82SLuiz Augusto von Dentz 	__u8  packing;
18026afbd82SLuiz Augusto von Dentz 	__u8  framing;
18126afbd82SLuiz Augusto von Dentz 	struct bt_iso_io_qos in;
18226afbd82SLuiz Augusto von Dentz 	struct bt_iso_io_qos out;
18326afbd82SLuiz Augusto von Dentz };
18426afbd82SLuiz Augusto von Dentz 
185*0fe8c8d0SIulia Tanasescu struct bt_iso_bcast_qos {
186*0fe8c8d0SIulia Tanasescu 	__u8  big;
187*0fe8c8d0SIulia Tanasescu 	__u8  bis;
188*0fe8c8d0SIulia Tanasescu 	__u8  sync_interval;
189*0fe8c8d0SIulia Tanasescu 	__u8  packing;
190*0fe8c8d0SIulia Tanasescu 	__u8  framing;
191*0fe8c8d0SIulia Tanasescu 	struct bt_iso_io_qos in;
192*0fe8c8d0SIulia Tanasescu 	struct bt_iso_io_qos out;
193*0fe8c8d0SIulia Tanasescu 	__u8  encryption;
194*0fe8c8d0SIulia Tanasescu 	__u8  bcode[16];
195*0fe8c8d0SIulia Tanasescu 	__u8  options;
196*0fe8c8d0SIulia Tanasescu 	__u16 skip;
197*0fe8c8d0SIulia Tanasescu 	__u16 sync_timeout;
198*0fe8c8d0SIulia Tanasescu 	__u8  sync_cte_type;
199*0fe8c8d0SIulia Tanasescu 	__u8  mse;
200*0fe8c8d0SIulia Tanasescu 	__u16 timeout;
201*0fe8c8d0SIulia Tanasescu };
202*0fe8c8d0SIulia Tanasescu 
203*0fe8c8d0SIulia Tanasescu struct bt_iso_qos {
204*0fe8c8d0SIulia Tanasescu 	union {
205*0fe8c8d0SIulia Tanasescu 		struct bt_iso_ucast_qos ucast;
206*0fe8c8d0SIulia Tanasescu 		struct bt_iso_bcast_qos bcast;
207*0fe8c8d0SIulia Tanasescu 	};
208*0fe8c8d0SIulia Tanasescu };
209*0fe8c8d0SIulia Tanasescu 
21026afbd82SLuiz Augusto von Dentz #define BT_ISO_PHY_1M		0x01
21126afbd82SLuiz Augusto von Dentz #define BT_ISO_PHY_2M		0x02
21226afbd82SLuiz Augusto von Dentz #define BT_ISO_PHY_CODED	0x04
21326afbd82SLuiz Augusto von Dentz #define BT_ISO_PHY_ANY		(BT_ISO_PHY_1M | BT_ISO_PHY_2M | \
21426afbd82SLuiz Augusto von Dentz 				 BT_ISO_PHY_CODED)
21526afbd82SLuiz Augusto von Dentz 
216248733e8SKiran K #define BT_CODEC	19
217248733e8SKiran K 
218248733e8SKiran K struct	bt_codec_caps {
219248733e8SKiran K 	__u8	len;
220248733e8SKiran K 	__u8	data[];
221248733e8SKiran K } __packed;
222248733e8SKiran K 
223248733e8SKiran K struct bt_codec {
224248733e8SKiran K 	__u8	id;
225248733e8SKiran K 	__u16	cid;
226248733e8SKiran K 	__u16	vid;
227248733e8SKiran K 	__u8	data_path;
228248733e8SKiran K 	__u8	num_caps;
229248733e8SKiran K } __packed;
230248733e8SKiran K 
231248733e8SKiran K struct bt_codecs {
232248733e8SKiran K 	__u8		num_codecs;
233248733e8SKiran K 	struct bt_codec	codecs[];
234248733e8SKiran K } __packed;
235248733e8SKiran K 
236f6873401SKiran K #define BT_CODEC_CVSD		0x02
237b2af264aSKiran K #define BT_CODEC_TRANSPARENT	0x03
238904c139aSKiran K #define BT_CODEC_MSBC		0x05
239f6873401SKiran K 
240f764a6c2SLuiz Augusto von Dentz #define BT_ISO_BASE		20
241f764a6c2SLuiz Augusto von Dentz 
2423ed7003eSJoe Perches __printf(1, 2)
2432b0bf6c8SJoe Perches void bt_info(const char *fmt, ...);
2443ed7003eSJoe Perches __printf(1, 2)
245594b31eaSFrederic Danis void bt_warn(const char *fmt, ...);
246594b31eaSFrederic Danis __printf(1, 2)
2472b0bf6c8SJoe Perches void bt_err(const char *fmt, ...);
248e625e50cSMarcel Holtmann #if IS_ENABLED(CONFIG_BT_FEATURE_DEBUG)
249e625e50cSMarcel Holtmann void bt_dbg_set(bool enable);
250e625e50cSMarcel Holtmann bool bt_dbg_get(void);
251e625e50cSMarcel Holtmann __printf(1, 2)
252e625e50cSMarcel Holtmann void bt_dbg(const char *fmt, ...);
253e625e50cSMarcel Holtmann #endif
254e781b7f7SSzymon Janc __printf(1, 2)
25536278a5dSAlain Michaud void bt_warn_ratelimited(const char *fmt, ...);
25636278a5dSAlain Michaud __printf(1, 2)
257e781b7f7SSzymon Janc void bt_err_ratelimited(const char *fmt, ...);
258e1447d8dSJoe Perches 
2593ed7003eSJoe Perches #define BT_INFO(fmt, ...)	bt_info(fmt "\n", ##__VA_ARGS__)
260594b31eaSFrederic Danis #define BT_WARN(fmt, ...)	bt_warn(fmt "\n", ##__VA_ARGS__)
2613ed7003eSJoe Perches #define BT_ERR(fmt, ...)	bt_err(fmt "\n", ##__VA_ARGS__)
262e625e50cSMarcel Holtmann 
263e625e50cSMarcel Holtmann #if IS_ENABLED(CONFIG_BT_FEATURE_DEBUG)
264e625e50cSMarcel Holtmann #define BT_DBG(fmt, ...)	bt_dbg(fmt "\n", ##__VA_ARGS__)
265e625e50cSMarcel Holtmann #else
2663ed7003eSJoe Perches #define BT_DBG(fmt, ...)	pr_debug(fmt "\n", ##__VA_ARGS__)
267e625e50cSMarcel Holtmann #endif
2681da177e4SLinus Torvalds 
2699b392e0eSLuiz Augusto von Dentz #define bt_dev_name(hdev) ((hdev) ? (hdev)->name : "null")
2709b392e0eSLuiz Augusto von Dentz 
2716f558b70SLoic Poulain #define bt_dev_info(hdev, fmt, ...)				\
2729b392e0eSLuiz Augusto von Dentz 	BT_INFO("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__)
273594b31eaSFrederic Danis #define bt_dev_warn(hdev, fmt, ...)				\
2749b392e0eSLuiz Augusto von Dentz 	BT_WARN("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__)
2756f558b70SLoic Poulain #define bt_dev_err(hdev, fmt, ...)				\
2769b392e0eSLuiz Augusto von Dentz 	BT_ERR("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__)
2776f558b70SLoic Poulain #define bt_dev_dbg(hdev, fmt, ...)				\
2789b392e0eSLuiz Augusto von Dentz 	BT_DBG("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__)
2796f558b70SLoic Poulain 
28036278a5dSAlain Michaud #define bt_dev_warn_ratelimited(hdev, fmt, ...)			\
2819b392e0eSLuiz Augusto von Dentz 	bt_warn_ratelimited("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__)
2822064ee33SMarcel Holtmann #define bt_dev_err_ratelimited(hdev, fmt, ...)			\
2839b392e0eSLuiz Augusto von Dentz 	bt_err_ratelimited("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__)
2842064ee33SMarcel Holtmann 
2851da177e4SLinus Torvalds /* Connection and socket states */
2861da177e4SLinus Torvalds enum {
2871da177e4SLinus Torvalds 	BT_CONNECTED = 1, /* Equal to TCP_ESTABLISHED to make net code happy */
2881da177e4SLinus Torvalds 	BT_OPEN,
2891da177e4SLinus Torvalds 	BT_BOUND,
2901da177e4SLinus Torvalds 	BT_LISTEN,
2911da177e4SLinus Torvalds 	BT_CONNECT,
2921da177e4SLinus Torvalds 	BT_CONNECT2,
2931da177e4SLinus Torvalds 	BT_CONFIG,
2941da177e4SLinus Torvalds 	BT_DISCONN,
2951da177e4SLinus Torvalds 	BT_CLOSED
2961da177e4SLinus Torvalds };
2971da177e4SLinus Torvalds 
29820d1803aSAndrei Emeltchenko /* If unused will be removed by compiler */
29920d1803aSAndrei Emeltchenko static inline const char *state_to_string(int state)
30020d1803aSAndrei Emeltchenko {
30120d1803aSAndrei Emeltchenko 	switch (state) {
30220d1803aSAndrei Emeltchenko 	case BT_CONNECTED:
30320d1803aSAndrei Emeltchenko 		return "BT_CONNECTED";
30420d1803aSAndrei Emeltchenko 	case BT_OPEN:
30520d1803aSAndrei Emeltchenko 		return "BT_OPEN";
30620d1803aSAndrei Emeltchenko 	case BT_BOUND:
30720d1803aSAndrei Emeltchenko 		return "BT_BOUND";
30820d1803aSAndrei Emeltchenko 	case BT_LISTEN:
30920d1803aSAndrei Emeltchenko 		return "BT_LISTEN";
31020d1803aSAndrei Emeltchenko 	case BT_CONNECT:
31120d1803aSAndrei Emeltchenko 		return "BT_CONNECT";
31220d1803aSAndrei Emeltchenko 	case BT_CONNECT2:
31320d1803aSAndrei Emeltchenko 		return "BT_CONNECT2";
31420d1803aSAndrei Emeltchenko 	case BT_CONFIG:
31520d1803aSAndrei Emeltchenko 		return "BT_CONFIG";
31620d1803aSAndrei Emeltchenko 	case BT_DISCONN:
31720d1803aSAndrei Emeltchenko 		return "BT_DISCONN";
31820d1803aSAndrei Emeltchenko 	case BT_CLOSED:
31920d1803aSAndrei Emeltchenko 		return "BT_CLOSED";
32020d1803aSAndrei Emeltchenko 	}
32120d1803aSAndrei Emeltchenko 
32220d1803aSAndrei Emeltchenko 	return "invalid state";
32320d1803aSAndrei Emeltchenko }
32420d1803aSAndrei Emeltchenko 
3251da177e4SLinus Torvalds /* BD Address */
3261da177e4SLinus Torvalds typedef struct {
3271da177e4SLinus Torvalds 	__u8 b[6];
32866c853ccSGustavo F. Padovan } __packed bdaddr_t;
3291da177e4SLinus Torvalds 
330591f47f3SAndre Guedes /* BD Address type */
331591f47f3SAndre Guedes #define BDADDR_BREDR		0x00
332591f47f3SAndre Guedes #define BDADDR_LE_PUBLIC	0x01
333591f47f3SAndre Guedes #define BDADDR_LE_RANDOM	0x02
334591f47f3SAndre Guedes 
33521fcf572SPavel Machek static inline bool bdaddr_type_is_valid(u8 type)
336679efe2bSJohan Hedberg {
337679efe2bSJohan Hedberg 	switch (type) {
338679efe2bSJohan Hedberg 	case BDADDR_BREDR:
339679efe2bSJohan Hedberg 	case BDADDR_LE_PUBLIC:
340679efe2bSJohan Hedberg 	case BDADDR_LE_RANDOM:
341679efe2bSJohan Hedberg 		return true;
342679efe2bSJohan Hedberg 	}
343679efe2bSJohan Hedberg 
344679efe2bSJohan Hedberg 	return false;
345679efe2bSJohan Hedberg }
346679efe2bSJohan Hedberg 
34721fcf572SPavel Machek static inline bool bdaddr_type_is_le(u8 type)
348679efe2bSJohan Hedberg {
349679efe2bSJohan Hedberg 	switch (type) {
350679efe2bSJohan Hedberg 	case BDADDR_LE_PUBLIC:
351679efe2bSJohan Hedberg 	case BDADDR_LE_RANDOM:
352679efe2bSJohan Hedberg 		return true;
353679efe2bSJohan Hedberg 	}
354679efe2bSJohan Hedberg 
355679efe2bSJohan Hedberg 	return false;
356679efe2bSJohan Hedberg }
357679efe2bSJohan Hedberg 
3581da177e4SLinus Torvalds #define BDADDR_ANY  (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}})
359a59ac2f7SMarcel Holtmann #define BDADDR_NONE (&(bdaddr_t) {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}})
3601da177e4SLinus Torvalds 
3611da177e4SLinus Torvalds /* Copy, swap, convert BD Address */
362f53c20e9SDavid Herrmann static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2)
3631da177e4SLinus Torvalds {
3641da177e4SLinus Torvalds 	return memcmp(ba1, ba2, sizeof(bdaddr_t));
3651da177e4SLinus Torvalds }
366f53c20e9SDavid Herrmann static inline void bacpy(bdaddr_t *dst, const bdaddr_t *src)
3671da177e4SLinus Torvalds {
3681da177e4SLinus Torvalds 	memcpy(dst, src, sizeof(bdaddr_t));
3691da177e4SLinus Torvalds }
3701da177e4SLinus Torvalds 
37165bce462SLoic Poulain void baswap(bdaddr_t *dst, const bdaddr_t *src);
3721da177e4SLinus Torvalds 
3731da177e4SLinus Torvalds /* Common socket structures and functions */
3741da177e4SLinus Torvalds 
3751da177e4SLinus Torvalds #define bt_sk(__sk) ((struct bt_sock *) __sk)
3761da177e4SLinus Torvalds 
3771da177e4SLinus Torvalds struct bt_sock {
3781da177e4SLinus Torvalds 	struct sock sk;
3791da177e4SLinus Torvalds 	struct list_head accept_q;
3801da177e4SLinus Torvalds 	struct sock *parent;
381c5daa683SGustavo Padovan 	unsigned long flags;
382d9763698SMarcel Holtmann 	void (*skb_msg_name)(struct sk_buff *, void *, int *);
38300398e1dSAlain Michaud 	void (*skb_put_cmsg)(struct sk_buff *, struct msghdr *, struct sock *);
384c5daa683SGustavo Padovan };
385c5daa683SGustavo Padovan 
386c5daa683SGustavo Padovan enum {
387c5daa683SGustavo Padovan 	BT_SK_DEFER_SETUP,
388c5daa683SGustavo Padovan 	BT_SK_SUSPEND,
3891da177e4SLinus Torvalds };
3901da177e4SLinus Torvalds 
3911da177e4SLinus Torvalds struct bt_sock_list {
3921da177e4SLinus Torvalds 	struct hlist_head head;
3931da177e4SLinus Torvalds 	rwlock_t          lock;
394256a06c8SMasatake YAMATO #ifdef CONFIG_PROC_FS
395256a06c8SMasatake YAMATO         int (* custom_seq_show)(struct seq_file *, void *);
396256a06c8SMasatake YAMATO #endif
3971da177e4SLinus Torvalds };
3981da177e4SLinus Torvalds 
399ec1b4cf7SStephen Hemminger int  bt_sock_register(int proto, const struct net_proto_family *ops);
400be9f97f0SDavid Herrmann void bt_sock_unregister(int proto);
4011da177e4SLinus Torvalds void bt_sock_link(struct bt_sock_list *l, struct sock *s);
4021da177e4SLinus Torvalds void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
4031b784140SYing Xue int  bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
4041b784140SYing Xue 		     int flags);
4051b784140SYing Xue int  bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
4061b784140SYing Xue 			    size_t len, int flags);
407a11e1d43SLinus Torvalds __poll_t bt_sock_poll(struct file *file, struct socket *sock, poll_table *wait);
4083241ad82SMarcel Holtmann int  bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
4091da177e4SLinus Torvalds int  bt_sock_wait_state(struct sock *sk, int state, unsigned long timeo);
410da891217SGavin Li int  bt_sock_wait_ready(struct sock *sk, unsigned int msg_flags);
4111da177e4SLinus Torvalds 
412c4f5627fSMatthias Kaehlcke void bt_accept_enqueue(struct sock *parent, struct sock *sk, bool bh);
4131da177e4SLinus Torvalds void bt_accept_unlink(struct sock *sk);
4141da177e4SLinus Torvalds struct sock *bt_accept_dequeue(struct sock *parent, struct socket *newsock);
4151da177e4SLinus Torvalds 
4161da177e4SLinus Torvalds /* Skb helpers */
41700e3112cSMat Martineau struct l2cap_ctrl {
41821fcf572SPavel Machek 	u8	sframe:1,
41900e3112cSMat Martineau 		poll:1,
42000e3112cSMat Martineau 		final:1,
42100e3112cSMat Martineau 		fcs:1,
42200e3112cSMat Martineau 		sar:2,
42300e3112cSMat Martineau 		super:2;
42421fcf572SPavel Machek 
42521fcf572SPavel Machek 	u16	reqseq;
42621fcf572SPavel Machek 	u16	txseq;
42721fcf572SPavel Machek 	u8	retries;
428a4368ff3SJohan Hedberg 	__le16  psm;
429a4368ff3SJohan Hedberg 	bdaddr_t bdaddr;
430a4368ff3SJohan Hedberg 	struct l2cap_chan *chan;
43100e3112cSMat Martineau };
43200e3112cSMat Martineau 
43300398e1dSAlain Michaud struct sco_ctrl {
43400398e1dSAlain Michaud 	u8	pkt_status;
43500398e1dSAlain Michaud };
43600398e1dSAlain Michaud 
4373119ae95SJohan Hedberg struct hci_dev;
4383119ae95SJohan Hedberg 
4391904a853SMarcel Holtmann typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status, u16 opcode);
440e6214487SJohan Hedberg typedef void (*hci_req_complete_skb_t)(struct hci_dev *hdev, u8 status,
441e6214487SJohan Hedberg 				       u16 opcode, struct sk_buff *skb);
4423119ae95SJohan Hedberg 
44344d27137SJohan Hedberg #define HCI_REQ_START	BIT(0)
44444d27137SJohan Hedberg #define HCI_REQ_SKB	BIT(1)
44544d27137SJohan Hedberg 
446242c0ebdSMarcel Holtmann struct hci_ctrl {
447cba6b758SLuiz Augusto von Dentz 	struct sock *sk;
44821fcf572SPavel Machek 	u16 opcode;
44944d27137SJohan Hedberg 	u8 req_flags;
450242c0ebdSMarcel Holtmann 	u8 req_event;
45144d27137SJohan Hedberg 	union {
452242c0ebdSMarcel Holtmann 		hci_req_complete_t req_complete;
453242c0ebdSMarcel Holtmann 		hci_req_complete_skb_t req_complete_skb;
454db6e3e8dSJohan Hedberg 	};
45544d27137SJohan Hedberg };
456db6e3e8dSJohan Hedberg 
4578aca46f9SLuiz Augusto von Dentz struct mgmt_ctrl {
4588aca46f9SLuiz Augusto von Dentz 	struct hci_dev *hdev;
4598aca46f9SLuiz Augusto von Dentz 	u16 opcode;
4608aca46f9SLuiz Augusto von Dentz };
4618aca46f9SLuiz Augusto von Dentz 
4621da177e4SLinus Torvalds struct bt_skb_cb {
46321fcf572SPavel Machek 	u8 pkt_type;
46421fcf572SPavel Machek 	u8 force_active;
46521fcf572SPavel Machek 	u16 expect;
46621fcf572SPavel Machek 	u8 incoming:1;
467db6e3e8dSJohan Hedberg 	union {
468a4368ff3SJohan Hedberg 		struct l2cap_ctrl l2cap;
46900398e1dSAlain Michaud 		struct sco_ctrl sco;
470242c0ebdSMarcel Holtmann 		struct hci_ctrl hci;
4718aca46f9SLuiz Augusto von Dentz 		struct mgmt_ctrl mgmt;
472db6e3e8dSJohan Hedberg 	};
4731da177e4SLinus Torvalds };
4741c2acffbSGustavo F. Padovan #define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
4751da177e4SLinus Torvalds 
476f5c4a42aSMarcel Holtmann #define hci_skb_pkt_type(skb) bt_cb((skb))->pkt_type
477f5c4a42aSMarcel Holtmann #define hci_skb_expect(skb) bt_cb((skb))->expect
478f5c4a42aSMarcel Holtmann #define hci_skb_opcode(skb) bt_cb((skb))->hci.opcode
47985b56857SLuiz Augusto von Dentz #define hci_skb_event(skb) bt_cb((skb))->hci.req_event
480cba6b758SLuiz Augusto von Dentz #define hci_skb_sk(skb) bt_cb((skb))->hci.sk
481f5c4a42aSMarcel Holtmann 
482dd0fc66fSAl Viro static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
4831da177e4SLinus Torvalds {
4841da177e4SLinus Torvalds 	struct sk_buff *skb;
4851da177e4SLinus Torvalds 
486c3c7ea65SGustavo Padovan 	skb = alloc_skb(len + BT_SKB_RESERVE, how);
4875fcc86bdSJohan Hedberg 	if (skb)
4881da177e4SLinus Torvalds 		skb_reserve(skb, BT_SKB_RESERVE);
4891da177e4SLinus Torvalds 	return skb;
4901da177e4SLinus Torvalds }
4911da177e4SLinus Torvalds 
4925a9d0a3fSWaldemar Rymarkiewicz static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk,
4935a9d0a3fSWaldemar Rymarkiewicz 					unsigned long len, int nb, int *err)
4941da177e4SLinus Torvalds {
4951da177e4SLinus Torvalds 	struct sk_buff *skb;
4961da177e4SLinus Torvalds 
497c3c7ea65SGustavo Padovan 	skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err);
4985fcc86bdSJohan Hedberg 	if (skb)
4991da177e4SLinus Torvalds 		skb_reserve(skb, BT_SKB_RESERVE);
500e454c844SGustavo F. Padovan 
501e454c844SGustavo F. Padovan 	if (!skb && *err)
502e454c844SGustavo F. Padovan 		return NULL;
503e454c844SGustavo F. Padovan 
504e454c844SGustavo F. Padovan 	*err = sock_error(sk);
505e454c844SGustavo F. Padovan 	if (*err)
506e454c844SGustavo F. Padovan 		goto out;
507e454c844SGustavo F. Padovan 
508e454c844SGustavo F. Padovan 	if (sk->sk_shutdown) {
509e454c844SGustavo F. Padovan 		*err = -ECONNRESET;
510e454c844SGustavo F. Padovan 		goto out;
511e454c844SGustavo F. Padovan 	}
5121da177e4SLinus Torvalds 
5131da177e4SLinus Torvalds 	return skb;
514e454c844SGustavo F. Padovan 
515e454c844SGustavo F. Padovan out:
516e454c844SGustavo F. Padovan 	kfree_skb(skb);
517e454c844SGustavo F. Padovan 	return NULL;
5181da177e4SLinus Torvalds }
5191da177e4SLinus Torvalds 
52038f64f65SLuiz Augusto von Dentz /* Shall not be called with lock_sock held */
52138f64f65SLuiz Augusto von Dentz static inline struct sk_buff *bt_skb_sendmsg(struct sock *sk,
52238f64f65SLuiz Augusto von Dentz 					     struct msghdr *msg,
52338f64f65SLuiz Augusto von Dentz 					     size_t len, size_t mtu,
52438f64f65SLuiz Augusto von Dentz 					     size_t headroom, size_t tailroom)
52538f64f65SLuiz Augusto von Dentz {
52638f64f65SLuiz Augusto von Dentz 	struct sk_buff *skb;
52738f64f65SLuiz Augusto von Dentz 	size_t size = min_t(size_t, len, mtu);
52838f64f65SLuiz Augusto von Dentz 	int err;
52938f64f65SLuiz Augusto von Dentz 
53038f64f65SLuiz Augusto von Dentz 	skb = bt_skb_send_alloc(sk, size + headroom + tailroom,
53138f64f65SLuiz Augusto von Dentz 				msg->msg_flags & MSG_DONTWAIT, &err);
53238f64f65SLuiz Augusto von Dentz 	if (!skb)
53338f64f65SLuiz Augusto von Dentz 		return ERR_PTR(err);
53438f64f65SLuiz Augusto von Dentz 
53538f64f65SLuiz Augusto von Dentz 	skb_reserve(skb, headroom);
53638f64f65SLuiz Augusto von Dentz 	skb_tailroom_reserve(skb, mtu, tailroom);
53738f64f65SLuiz Augusto von Dentz 
53838f64f65SLuiz Augusto von Dentz 	if (!copy_from_iter_full(skb_put(skb, size), size, &msg->msg_iter)) {
53938f64f65SLuiz Augusto von Dentz 		kfree_skb(skb);
54038f64f65SLuiz Augusto von Dentz 		return ERR_PTR(-EFAULT);
54138f64f65SLuiz Augusto von Dentz 	}
54238f64f65SLuiz Augusto von Dentz 
54338f64f65SLuiz Augusto von Dentz 	skb->priority = sk->sk_priority;
54438f64f65SLuiz Augusto von Dentz 
54538f64f65SLuiz Augusto von Dentz 	return skb;
54638f64f65SLuiz Augusto von Dentz }
54738f64f65SLuiz Augusto von Dentz 
54897e4e802SLuiz Augusto von Dentz /* Similar to bt_skb_sendmsg but can split the msg into multiple fragments
54997e4e802SLuiz Augusto von Dentz  * accourding to the MTU.
55097e4e802SLuiz Augusto von Dentz  */
55197e4e802SLuiz Augusto von Dentz static inline struct sk_buff *bt_skb_sendmmsg(struct sock *sk,
55297e4e802SLuiz Augusto von Dentz 					      struct msghdr *msg,
55397e4e802SLuiz Augusto von Dentz 					      size_t len, size_t mtu,
55497e4e802SLuiz Augusto von Dentz 					      size_t headroom, size_t tailroom)
55597e4e802SLuiz Augusto von Dentz {
55697e4e802SLuiz Augusto von Dentz 	struct sk_buff *skb, **frag;
55797e4e802SLuiz Augusto von Dentz 
55897e4e802SLuiz Augusto von Dentz 	skb = bt_skb_sendmsg(sk, msg, len, mtu, headroom, tailroom);
5596f43f616SDan Carpenter 	if (IS_ERR(skb))
56097e4e802SLuiz Augusto von Dentz 		return skb;
56197e4e802SLuiz Augusto von Dentz 
56297e4e802SLuiz Augusto von Dentz 	len -= skb->len;
56397e4e802SLuiz Augusto von Dentz 	if (!len)
56497e4e802SLuiz Augusto von Dentz 		return skb;
56597e4e802SLuiz Augusto von Dentz 
56697e4e802SLuiz Augusto von Dentz 	/* Add remaining data over MTU as continuation fragments */
56797e4e802SLuiz Augusto von Dentz 	frag = &skb_shinfo(skb)->frag_list;
56897e4e802SLuiz Augusto von Dentz 	while (len) {
56997e4e802SLuiz Augusto von Dentz 		struct sk_buff *tmp;
57097e4e802SLuiz Augusto von Dentz 
57197e4e802SLuiz Augusto von Dentz 		tmp = bt_skb_sendmsg(sk, msg, len, mtu, headroom, tailroom);
572266191aaSLuiz Augusto von Dentz 		if (IS_ERR(tmp)) {
57329fb6083SLuiz Augusto von Dentz 			return skb;
57497e4e802SLuiz Augusto von Dentz 		}
57597e4e802SLuiz Augusto von Dentz 
57697e4e802SLuiz Augusto von Dentz 		len -= tmp->len;
57797e4e802SLuiz Augusto von Dentz 
57897e4e802SLuiz Augusto von Dentz 		*frag = tmp;
57997e4e802SLuiz Augusto von Dentz 		frag = &(*frag)->next;
58097e4e802SLuiz Augusto von Dentz 	}
58197e4e802SLuiz Augusto von Dentz 
58297e4e802SLuiz Augusto von Dentz 	return skb;
58397e4e802SLuiz Augusto von Dentz }
58497e4e802SLuiz Augusto von Dentz 
58521fcf572SPavel Machek int bt_to_errno(u16 code);
586ca2045e0SLuiz Augusto von Dentz __u8 bt_status(int err);
5871da177e4SLinus Torvalds 
5886befc644SMarcel Holtmann void hci_sock_set_flag(struct sock *sk, int nr);
5896befc644SMarcel Holtmann void hci_sock_clear_flag(struct sock *sk, int nr);
590c85be545SMarcel Holtmann int hci_sock_test_flag(struct sock *sk, int nr);
591d0f172b1SJohan Hedberg unsigned short hci_sock_get_channel(struct sock *sk);
59270ecce91SMarcel Holtmann u32 hci_sock_get_cookie(struct sock *sk);
5936befc644SMarcel Holtmann 
594e74e58f8SJoe Perches int hci_sock_init(void);
595e74e58f8SJoe Perches void hci_sock_cleanup(void);
5966516455dSMarcel Holtmann 
597e74e58f8SJoe Perches int bt_sysfs_init(void);
598e74e58f8SJoe Perches void bt_sysfs_cleanup(void);
5996516455dSMarcel Holtmann 
600e74e58f8SJoe Perches int bt_procfs_init(struct net *net, const char *name,
601256a06c8SMasatake YAMATO 		   struct bt_sock_list *sk_list,
602256a06c8SMasatake YAMATO 		   int (*seq_show)(struct seq_file *, void *));
603e74e58f8SJoe Perches void bt_procfs_cleanup(struct net *net, const char *name);
604256a06c8SMasatake YAMATO 
605aef7d97cSMarcel Holtmann extern struct dentry *bt_debugfs;
606be9d1227SMarcel Holtmann 
60764274518SGustavo F. Padovan int l2cap_init(void);
60864274518SGustavo F. Padovan void l2cap_exit(void);
60964274518SGustavo F. Padovan 
610ff50e8afSArron Wang #if IS_ENABLED(CONFIG_BT_BREDR)
61164274518SGustavo F. Padovan int sco_init(void);
61264274518SGustavo F. Padovan void sco_exit(void);
613ff50e8afSArron Wang #else
614ff50e8afSArron Wang static inline int sco_init(void)
615ff50e8afSArron Wang {
616ff50e8afSArron Wang 	return 0;
617ff50e8afSArron Wang }
618ff50e8afSArron Wang 
619ff50e8afSArron Wang static inline void sco_exit(void)
620ff50e8afSArron Wang {
621ff50e8afSArron Wang }
622ff50e8afSArron Wang #endif
62364274518SGustavo F. Padovan 
624ccf74f23SLuiz Augusto von Dentz #if IS_ENABLED(CONFIG_BT_LE)
625ccf74f23SLuiz Augusto von Dentz int iso_init(void);
626ccf74f23SLuiz Augusto von Dentz int iso_exit(void);
627ccf74f23SLuiz Augusto von Dentz bool iso_enabled(void);
628ccf74f23SLuiz Augusto von Dentz #else
629ccf74f23SLuiz Augusto von Dentz static inline int iso_init(void)
630ccf74f23SLuiz Augusto von Dentz {
631ccf74f23SLuiz Augusto von Dentz 	return 0;
632ccf74f23SLuiz Augusto von Dentz }
633ccf74f23SLuiz Augusto von Dentz 
634ccf74f23SLuiz Augusto von Dentz static inline int iso_exit(void)
635ccf74f23SLuiz Augusto von Dentz {
636ccf74f23SLuiz Augusto von Dentz 	return 0;
637ccf74f23SLuiz Augusto von Dentz }
638ccf74f23SLuiz Augusto von Dentz 
639ccf74f23SLuiz Augusto von Dentz static inline bool iso_enabled(void)
640ccf74f23SLuiz Augusto von Dentz {
641ccf74f23SLuiz Augusto von Dentz 	return false;
642ccf74f23SLuiz Augusto von Dentz }
643ccf74f23SLuiz Augusto von Dentz #endif
644ccf74f23SLuiz Augusto von Dentz 
6456d785aa3SJohan Hedberg int mgmt_init(void);
6466d785aa3SJohan Hedberg void mgmt_exit(void);
647b338d917SBrian Gix void mgmt_cleanup(struct sock *sk);
6486d785aa3SJohan Hedberg 
649d22015aaSOctavian Purdila void bt_sock_reclassify_lock(struct sock *sk, int proto);
650d22015aaSOctavian Purdila 
6511da177e4SLinus Torvalds #endif /* __BLUETOOTH_H */
652