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