162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci   RFCOMM implementation for Linux Bluetooth stack (BlueZ)
362306a36Sopenharmony_ci   Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
462306a36Sopenharmony_ci   Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci   This program is free software; you can redistribute it and/or modify
762306a36Sopenharmony_ci   it under the terms of the GNU General Public License version 2 as
862306a36Sopenharmony_ci   published by the Free Software Foundation;
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1162306a36Sopenharmony_ci   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1262306a36Sopenharmony_ci   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
1362306a36Sopenharmony_ci   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
1462306a36Sopenharmony_ci   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
1562306a36Sopenharmony_ci   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1662306a36Sopenharmony_ci   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1762306a36Sopenharmony_ci   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
2062306a36Sopenharmony_ci   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
2162306a36Sopenharmony_ci   SOFTWARE IS DISCLAIMED.
2262306a36Sopenharmony_ci*/
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include <linux/refcount.h>
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#ifndef __RFCOMM_H
2762306a36Sopenharmony_ci#define __RFCOMM_H
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define RFCOMM_CONN_TIMEOUT (HZ * 30)
3062306a36Sopenharmony_ci#define RFCOMM_DISC_TIMEOUT (HZ * 20)
3162306a36Sopenharmony_ci#define RFCOMM_AUTH_TIMEOUT (HZ * 25)
3262306a36Sopenharmony_ci#define RFCOMM_IDLE_TIMEOUT (HZ * 2)
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define RFCOMM_DEFAULT_MTU	127
3562306a36Sopenharmony_ci#define RFCOMM_DEFAULT_CREDITS	7
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define RFCOMM_MAX_CREDITS	40
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define RFCOMM_SKB_HEAD_RESERVE	8
4062306a36Sopenharmony_ci#define RFCOMM_SKB_TAIL_RESERVE	2
4162306a36Sopenharmony_ci#define RFCOMM_SKB_RESERVE  (RFCOMM_SKB_HEAD_RESERVE + RFCOMM_SKB_TAIL_RESERVE)
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define RFCOMM_SABM	0x2f
4462306a36Sopenharmony_ci#define RFCOMM_DISC	0x43
4562306a36Sopenharmony_ci#define RFCOMM_UA	0x63
4662306a36Sopenharmony_ci#define RFCOMM_DM	0x0f
4762306a36Sopenharmony_ci#define RFCOMM_UIH	0xef
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci#define RFCOMM_TEST	0x08
5062306a36Sopenharmony_ci#define RFCOMM_FCON	0x28
5162306a36Sopenharmony_ci#define RFCOMM_FCOFF	0x18
5262306a36Sopenharmony_ci#define RFCOMM_MSC	0x38
5362306a36Sopenharmony_ci#define RFCOMM_RPN	0x24
5462306a36Sopenharmony_ci#define RFCOMM_RLS	0x14
5562306a36Sopenharmony_ci#define RFCOMM_PN	0x20
5662306a36Sopenharmony_ci#define RFCOMM_NSC	0x04
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define RFCOMM_V24_FC	0x02
5962306a36Sopenharmony_ci#define RFCOMM_V24_RTC	0x04
6062306a36Sopenharmony_ci#define RFCOMM_V24_RTR	0x08
6162306a36Sopenharmony_ci#define RFCOMM_V24_IC	0x40
6262306a36Sopenharmony_ci#define RFCOMM_V24_DV	0x80
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#define RFCOMM_RPN_BR_2400	0x0
6562306a36Sopenharmony_ci#define RFCOMM_RPN_BR_4800	0x1
6662306a36Sopenharmony_ci#define RFCOMM_RPN_BR_7200	0x2
6762306a36Sopenharmony_ci#define RFCOMM_RPN_BR_9600	0x3
6862306a36Sopenharmony_ci#define RFCOMM_RPN_BR_19200	0x4
6962306a36Sopenharmony_ci#define RFCOMM_RPN_BR_38400	0x5
7062306a36Sopenharmony_ci#define RFCOMM_RPN_BR_57600	0x6
7162306a36Sopenharmony_ci#define RFCOMM_RPN_BR_115200	0x7
7262306a36Sopenharmony_ci#define RFCOMM_RPN_BR_230400	0x8
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#define RFCOMM_RPN_DATA_5	0x0
7562306a36Sopenharmony_ci#define RFCOMM_RPN_DATA_6	0x1
7662306a36Sopenharmony_ci#define RFCOMM_RPN_DATA_7	0x2
7762306a36Sopenharmony_ci#define RFCOMM_RPN_DATA_8	0x3
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#define RFCOMM_RPN_STOP_1	0
8062306a36Sopenharmony_ci#define RFCOMM_RPN_STOP_15	1
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci#define RFCOMM_RPN_PARITY_NONE	0x0
8362306a36Sopenharmony_ci#define RFCOMM_RPN_PARITY_ODD	0x1
8462306a36Sopenharmony_ci#define RFCOMM_RPN_PARITY_EVEN	0x3
8562306a36Sopenharmony_ci#define RFCOMM_RPN_PARITY_MARK	0x5
8662306a36Sopenharmony_ci#define RFCOMM_RPN_PARITY_SPACE	0x7
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci#define RFCOMM_RPN_FLOW_NONE	0x00
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci#define RFCOMM_RPN_XON_CHAR	0x11
9162306a36Sopenharmony_ci#define RFCOMM_RPN_XOFF_CHAR	0x13
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci#define RFCOMM_RPN_PM_BITRATE		0x0001
9462306a36Sopenharmony_ci#define RFCOMM_RPN_PM_DATA		0x0002
9562306a36Sopenharmony_ci#define RFCOMM_RPN_PM_STOP		0x0004
9662306a36Sopenharmony_ci#define RFCOMM_RPN_PM_PARITY		0x0008
9762306a36Sopenharmony_ci#define RFCOMM_RPN_PM_PARITY_TYPE	0x0010
9862306a36Sopenharmony_ci#define RFCOMM_RPN_PM_XON		0x0020
9962306a36Sopenharmony_ci#define RFCOMM_RPN_PM_XOFF		0x0040
10062306a36Sopenharmony_ci#define RFCOMM_RPN_PM_FLOW		0x3F00
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci#define RFCOMM_RPN_PM_ALL		0x3F7F
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cistruct rfcomm_hdr {
10562306a36Sopenharmony_ci	u8 addr;
10662306a36Sopenharmony_ci	u8 ctrl;
10762306a36Sopenharmony_ci	u8 len;    /* Actual size can be 2 bytes */
10862306a36Sopenharmony_ci} __packed;
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistruct rfcomm_cmd {
11162306a36Sopenharmony_ci	u8 addr;
11262306a36Sopenharmony_ci	u8 ctrl;
11362306a36Sopenharmony_ci	u8 len;
11462306a36Sopenharmony_ci	u8 fcs;
11562306a36Sopenharmony_ci} __packed;
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistruct rfcomm_mcc {
11862306a36Sopenharmony_ci	u8 type;
11962306a36Sopenharmony_ci	u8 len;
12062306a36Sopenharmony_ci} __packed;
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cistruct rfcomm_pn {
12362306a36Sopenharmony_ci	u8  dlci;
12462306a36Sopenharmony_ci	u8  flow_ctrl;
12562306a36Sopenharmony_ci	u8  priority;
12662306a36Sopenharmony_ci	u8  ack_timer;
12762306a36Sopenharmony_ci	__le16 mtu;
12862306a36Sopenharmony_ci	u8  max_retrans;
12962306a36Sopenharmony_ci	u8  credits;
13062306a36Sopenharmony_ci} __packed;
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_cistruct rfcomm_rpn {
13362306a36Sopenharmony_ci	u8  dlci;
13462306a36Sopenharmony_ci	u8  bit_rate;
13562306a36Sopenharmony_ci	u8  line_settings;
13662306a36Sopenharmony_ci	u8  flow_ctrl;
13762306a36Sopenharmony_ci	u8  xon_char;
13862306a36Sopenharmony_ci	u8  xoff_char;
13962306a36Sopenharmony_ci	__le16 param_mask;
14062306a36Sopenharmony_ci} __packed;
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_cistruct rfcomm_rls {
14362306a36Sopenharmony_ci	u8  dlci;
14462306a36Sopenharmony_ci	u8  status;
14562306a36Sopenharmony_ci} __packed;
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_cistruct rfcomm_msc {
14862306a36Sopenharmony_ci	u8  dlci;
14962306a36Sopenharmony_ci	u8  v24_sig;
15062306a36Sopenharmony_ci} __packed;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci/* ---- Core structures, flags etc ---- */
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cistruct rfcomm_session {
15562306a36Sopenharmony_ci	struct list_head list;
15662306a36Sopenharmony_ci	struct socket   *sock;
15762306a36Sopenharmony_ci	struct timer_list timer;
15862306a36Sopenharmony_ci	unsigned long    state;
15962306a36Sopenharmony_ci	unsigned long    flags;
16062306a36Sopenharmony_ci	int              initiator;
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	/* Default DLC parameters */
16362306a36Sopenharmony_ci	int    cfc;
16462306a36Sopenharmony_ci	uint   mtu;
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci	struct list_head dlcs;
16762306a36Sopenharmony_ci};
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cistruct rfcomm_dlc {
17062306a36Sopenharmony_ci	struct list_head      list;
17162306a36Sopenharmony_ci	struct rfcomm_session *session;
17262306a36Sopenharmony_ci	struct sk_buff_head   tx_queue;
17362306a36Sopenharmony_ci	struct timer_list     timer;
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci	struct mutex  lock;
17662306a36Sopenharmony_ci	unsigned long state;
17762306a36Sopenharmony_ci	unsigned long flags;
17862306a36Sopenharmony_ci	refcount_t    refcnt;
17962306a36Sopenharmony_ci	u8            dlci;
18062306a36Sopenharmony_ci	u8            addr;
18162306a36Sopenharmony_ci	u8            priority;
18262306a36Sopenharmony_ci	u8            v24_sig;
18362306a36Sopenharmony_ci	u8            remote_v24_sig;
18462306a36Sopenharmony_ci	u8            mscex;
18562306a36Sopenharmony_ci	u8            out;
18662306a36Sopenharmony_ci	u8            sec_level;
18762306a36Sopenharmony_ci	u8            role_switch;
18862306a36Sopenharmony_ci	u32           defer_setup;
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	uint          mtu;
19162306a36Sopenharmony_ci	uint          cfc;
19262306a36Sopenharmony_ci	uint          rx_credits;
19362306a36Sopenharmony_ci	uint          tx_credits;
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	void          *owner;
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	void (*data_ready)(struct rfcomm_dlc *d, struct sk_buff *skb);
19862306a36Sopenharmony_ci	void (*state_change)(struct rfcomm_dlc *d, int err);
19962306a36Sopenharmony_ci	void (*modem_status)(struct rfcomm_dlc *d, u8 v24_sig);
20062306a36Sopenharmony_ci};
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci/* DLC and session flags */
20362306a36Sopenharmony_ci#define RFCOMM_RX_THROTTLED 0
20462306a36Sopenharmony_ci#define RFCOMM_TX_THROTTLED 1
20562306a36Sopenharmony_ci#define RFCOMM_TIMED_OUT    2
20662306a36Sopenharmony_ci#define RFCOMM_MSC_PENDING  3
20762306a36Sopenharmony_ci#define RFCOMM_SEC_PENDING  4
20862306a36Sopenharmony_ci#define RFCOMM_AUTH_PENDING 5
20962306a36Sopenharmony_ci#define RFCOMM_AUTH_ACCEPT  6
21062306a36Sopenharmony_ci#define RFCOMM_AUTH_REJECT  7
21162306a36Sopenharmony_ci#define RFCOMM_DEFER_SETUP  8
21262306a36Sopenharmony_ci#define RFCOMM_ENC_DROP     9
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci/* Scheduling flags and events */
21562306a36Sopenharmony_ci#define RFCOMM_SCHED_WAKEUP 31
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci/* MSC exchange flags */
21862306a36Sopenharmony_ci#define RFCOMM_MSCEX_TX     1
21962306a36Sopenharmony_ci#define RFCOMM_MSCEX_RX     2
22062306a36Sopenharmony_ci#define RFCOMM_MSCEX_OK     (RFCOMM_MSCEX_TX + RFCOMM_MSCEX_RX)
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci/* CFC states */
22362306a36Sopenharmony_ci#define RFCOMM_CFC_UNKNOWN  -1
22462306a36Sopenharmony_ci#define RFCOMM_CFC_DISABLED 0
22562306a36Sopenharmony_ci#define RFCOMM_CFC_ENABLED  RFCOMM_MAX_CREDITS
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci/* ---- RFCOMM SEND RPN ---- */
22862306a36Sopenharmony_ciint rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci,
22962306a36Sopenharmony_ci			u8 bit_rate, u8 data_bits, u8 stop_bits,
23062306a36Sopenharmony_ci			u8 parity, u8 flow_ctrl_settings,
23162306a36Sopenharmony_ci			u8 xon_char, u8 xoff_char, u16 param_mask);
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci/* ---- RFCOMM DLCs (channels) ---- */
23462306a36Sopenharmony_cistruct rfcomm_dlc *rfcomm_dlc_alloc(gfp_t prio);
23562306a36Sopenharmony_civoid rfcomm_dlc_free(struct rfcomm_dlc *d);
23662306a36Sopenharmony_ciint  rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst,
23762306a36Sopenharmony_ci								u8 channel);
23862306a36Sopenharmony_ciint  rfcomm_dlc_close(struct rfcomm_dlc *d, int reason);
23962306a36Sopenharmony_ciint  rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb);
24062306a36Sopenharmony_civoid rfcomm_dlc_send_noerror(struct rfcomm_dlc *d, struct sk_buff *skb);
24162306a36Sopenharmony_ciint  rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig);
24262306a36Sopenharmony_ciint  rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig);
24362306a36Sopenharmony_civoid rfcomm_dlc_accept(struct rfcomm_dlc *d);
24462306a36Sopenharmony_cistruct rfcomm_dlc *rfcomm_dlc_exists(bdaddr_t *src, bdaddr_t *dst, u8 channel);
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci#define rfcomm_dlc_lock(d)     mutex_lock(&d->lock)
24762306a36Sopenharmony_ci#define rfcomm_dlc_unlock(d)   mutex_unlock(&d->lock)
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_cistatic inline void rfcomm_dlc_hold(struct rfcomm_dlc *d)
25062306a36Sopenharmony_ci{
25162306a36Sopenharmony_ci	refcount_inc(&d->refcnt);
25262306a36Sopenharmony_ci}
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_cistatic inline void rfcomm_dlc_put(struct rfcomm_dlc *d)
25562306a36Sopenharmony_ci{
25662306a36Sopenharmony_ci	if (refcount_dec_and_test(&d->refcnt))
25762306a36Sopenharmony_ci		rfcomm_dlc_free(d);
25862306a36Sopenharmony_ci}
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_civoid __rfcomm_dlc_throttle(struct rfcomm_dlc *d);
26162306a36Sopenharmony_civoid __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d);
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_cistatic inline void rfcomm_dlc_throttle(struct rfcomm_dlc *d)
26462306a36Sopenharmony_ci{
26562306a36Sopenharmony_ci	if (!test_and_set_bit(RFCOMM_RX_THROTTLED, &d->flags))
26662306a36Sopenharmony_ci		__rfcomm_dlc_throttle(d);
26762306a36Sopenharmony_ci}
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_cistatic inline void rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
27062306a36Sopenharmony_ci{
27162306a36Sopenharmony_ci	if (test_and_clear_bit(RFCOMM_RX_THROTTLED, &d->flags))
27262306a36Sopenharmony_ci		__rfcomm_dlc_unthrottle(d);
27362306a36Sopenharmony_ci}
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci/* ---- RFCOMM sessions ---- */
27662306a36Sopenharmony_civoid   rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src,
27762306a36Sopenharmony_ci								bdaddr_t *dst);
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci/* ---- RFCOMM sockets ---- */
28062306a36Sopenharmony_cistruct sockaddr_rc {
28162306a36Sopenharmony_ci	sa_family_t	rc_family;
28262306a36Sopenharmony_ci	bdaddr_t	rc_bdaddr;
28362306a36Sopenharmony_ci	u8		rc_channel;
28462306a36Sopenharmony_ci};
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci#define RFCOMM_CONNINFO	0x02
28762306a36Sopenharmony_cistruct rfcomm_conninfo {
28862306a36Sopenharmony_ci	__u16 hci_handle;
28962306a36Sopenharmony_ci	__u8  dev_class[3];
29062306a36Sopenharmony_ci};
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci#define RFCOMM_LM	0x03
29362306a36Sopenharmony_ci#define RFCOMM_LM_MASTER	0x0001
29462306a36Sopenharmony_ci#define RFCOMM_LM_AUTH		0x0002
29562306a36Sopenharmony_ci#define RFCOMM_LM_ENCRYPT	0x0004
29662306a36Sopenharmony_ci#define RFCOMM_LM_TRUSTED	0x0008
29762306a36Sopenharmony_ci#define RFCOMM_LM_RELIABLE	0x0010
29862306a36Sopenharmony_ci#define RFCOMM_LM_SECURE	0x0020
29962306a36Sopenharmony_ci#define RFCOMM_LM_FIPS		0x0040
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci#define rfcomm_pi(sk) ((struct rfcomm_pinfo *) sk)
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_cistruct rfcomm_pinfo {
30462306a36Sopenharmony_ci	struct bt_sock bt;
30562306a36Sopenharmony_ci	bdaddr_t src;
30662306a36Sopenharmony_ci	bdaddr_t dst;
30762306a36Sopenharmony_ci	struct rfcomm_dlc   *dlc;
30862306a36Sopenharmony_ci	u8     channel;
30962306a36Sopenharmony_ci	u8     sec_level;
31062306a36Sopenharmony_ci	u8     role_switch;
31162306a36Sopenharmony_ci};
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ciint  rfcomm_init_sockets(void);
31462306a36Sopenharmony_civoid rfcomm_cleanup_sockets(void);
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ciint  rfcomm_connect_ind(struct rfcomm_session *s, u8 channel,
31762306a36Sopenharmony_ci							struct rfcomm_dlc **d);
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci/* ---- RFCOMM TTY ---- */
32062306a36Sopenharmony_ci#define RFCOMM_MAX_DEV  256
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci#define RFCOMMCREATEDEV		_IOW('R', 200, int)
32362306a36Sopenharmony_ci#define RFCOMMRELEASEDEV	_IOW('R', 201, int)
32462306a36Sopenharmony_ci#define RFCOMMGETDEVLIST	_IOR('R', 210, int)
32562306a36Sopenharmony_ci#define RFCOMMGETDEVINFO	_IOR('R', 211, int)
32662306a36Sopenharmony_ci#define RFCOMMSTEALDLC		_IOW('R', 220, int)
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci/* rfcomm_dev.flags bit definitions */
32962306a36Sopenharmony_ci#define RFCOMM_REUSE_DLC      0
33062306a36Sopenharmony_ci#define RFCOMM_RELEASE_ONHUP  1
33162306a36Sopenharmony_ci#define RFCOMM_HANGUP_NOW     2
33262306a36Sopenharmony_ci#define RFCOMM_TTY_ATTACHED   3
33362306a36Sopenharmony_ci#define RFCOMM_DEFUNCT_BIT4   4	  /* don't reuse this bit - userspace visible */
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci/* rfcomm_dev.status bit definitions */
33662306a36Sopenharmony_ci#define RFCOMM_DEV_RELEASED   0
33762306a36Sopenharmony_ci#define RFCOMM_TTY_OWNED      1
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_cistruct rfcomm_dev_req {
34062306a36Sopenharmony_ci	s16      dev_id;
34162306a36Sopenharmony_ci	u32      flags;
34262306a36Sopenharmony_ci	bdaddr_t src;
34362306a36Sopenharmony_ci	bdaddr_t dst;
34462306a36Sopenharmony_ci	u8       channel;
34562306a36Sopenharmony_ci};
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_cistruct rfcomm_dev_info {
34862306a36Sopenharmony_ci	s16      id;
34962306a36Sopenharmony_ci	u32      flags;
35062306a36Sopenharmony_ci	u16      state;
35162306a36Sopenharmony_ci	bdaddr_t src;
35262306a36Sopenharmony_ci	bdaddr_t dst;
35362306a36Sopenharmony_ci	u8       channel;
35462306a36Sopenharmony_ci};
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_cistruct rfcomm_dev_list_req {
35762306a36Sopenharmony_ci	u16      dev_num;
35862306a36Sopenharmony_ci	struct   rfcomm_dev_info dev_info[];
35962306a36Sopenharmony_ci};
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ciint  rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci#ifdef CONFIG_BT_RFCOMM_TTY
36462306a36Sopenharmony_ciint  rfcomm_init_ttys(void);
36562306a36Sopenharmony_civoid rfcomm_cleanup_ttys(void);
36662306a36Sopenharmony_ci#else
36762306a36Sopenharmony_cistatic inline int rfcomm_init_ttys(void)
36862306a36Sopenharmony_ci{
36962306a36Sopenharmony_ci	return 0;
37062306a36Sopenharmony_ci}
37162306a36Sopenharmony_cistatic inline void rfcomm_cleanup_ttys(void)
37262306a36Sopenharmony_ci{
37362306a36Sopenharmony_ci}
37462306a36Sopenharmony_ci#endif
37562306a36Sopenharmony_ci#endif /* __RFCOMM_H */
376