2005-04-16 15:20:36 -07:00
/*
RFCOMM implementation for Linux Bluetooth stack ( BlueZ ) .
Copyright ( C ) 2002 Maxim Krasnyansky < maxk @ qualcomm . com >
Copyright ( C ) 2002 Marcel Holtmann < marcel @ holtmann . org >
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation ;
THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS
OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS .
IN NO EVENT SHALL THE COPYRIGHT HOLDER ( S ) AND AUTHOR ( S ) BE LIABLE FOR ANY
CLAIM , OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES , OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE , DATA OR PROFITS , WHETHER IN AN
ACTION OF CONTRACT , NEGLIGENCE OR OTHER TORTIOUS ACTION , ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE .
ALL LIABILITY , INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS ,
COPYRIGHTS , TRADEMARKS OR OTHER RIGHTS , RELATING TO USE OF THIS
SOFTWARE IS DISCLAIMED .
*/
# ifndef __RFCOMM_H
# define __RFCOMM_H
# define RFCOMM_PSM 3
# define RFCOMM_CONN_TIMEOUT (HZ * 30)
# define RFCOMM_DISC_TIMEOUT (HZ * 20)
# define RFCOMM_AUTH_TIMEOUT (HZ * 25)
# define RFCOMM_DEFAULT_MTU 127
# define RFCOMM_DEFAULT_CREDITS 7
2006-02-13 11:39:57 +01:00
# define RFCOMM_MAX_L2CAP_MTU 1013
2005-04-16 15:20:36 -07:00
# define RFCOMM_MAX_CREDITS 40
# define RFCOMM_SKB_HEAD_RESERVE 8
# define RFCOMM_SKB_TAIL_RESERVE 2
# define RFCOMM_SKB_RESERVE (RFCOMM_SKB_HEAD_RESERVE + RFCOMM_SKB_TAIL_RESERVE)
# define RFCOMM_SABM 0x2f
# define RFCOMM_DISC 0x43
# define RFCOMM_UA 0x63
# define RFCOMM_DM 0x0f
# define RFCOMM_UIH 0xef
# define RFCOMM_TEST 0x08
# define RFCOMM_FCON 0x28
# define RFCOMM_FCOFF 0x18
# define RFCOMM_MSC 0x38
# define RFCOMM_RPN 0x24
# define RFCOMM_RLS 0x14
# define RFCOMM_PN 0x20
# define RFCOMM_NSC 0x04
# define RFCOMM_V24_FC 0x02
# define RFCOMM_V24_RTC 0x04
# define RFCOMM_V24_RTR 0x08
# define RFCOMM_V24_IC 0x40
# define RFCOMM_V24_DV 0x80
# define RFCOMM_RPN_BR_2400 0x0
# define RFCOMM_RPN_BR_4800 0x1
# define RFCOMM_RPN_BR_7200 0x2
# define RFCOMM_RPN_BR_9600 0x3
# define RFCOMM_RPN_BR_19200 0x4
# define RFCOMM_RPN_BR_38400 0x5
# define RFCOMM_RPN_BR_57600 0x6
# define RFCOMM_RPN_BR_115200 0x7
# define RFCOMM_RPN_BR_230400 0x8
# define RFCOMM_RPN_DATA_5 0x0
# define RFCOMM_RPN_DATA_6 0x1
# define RFCOMM_RPN_DATA_7 0x2
# define RFCOMM_RPN_DATA_8 0x3
# define RFCOMM_RPN_STOP_1 0
# define RFCOMM_RPN_STOP_15 1
# define RFCOMM_RPN_PARITY_NONE 0x0
2005-08-09 20:28:46 -07:00
# define RFCOMM_RPN_PARITY_ODD 0x1
# define RFCOMM_RPN_PARITY_EVEN 0x3
# define RFCOMM_RPN_PARITY_MARK 0x5
2005-04-16 15:20:36 -07:00
# define RFCOMM_RPN_PARITY_SPACE 0x7
# define RFCOMM_RPN_FLOW_NONE 0x00
# define RFCOMM_RPN_XON_CHAR 0x11
# define RFCOMM_RPN_XOFF_CHAR 0x13
# define RFCOMM_RPN_PM_BITRATE 0x0001
# define RFCOMM_RPN_PM_DATA 0x0002
# define RFCOMM_RPN_PM_STOP 0x0004
# define RFCOMM_RPN_PM_PARITY 0x0008
# define RFCOMM_RPN_PM_PARITY_TYPE 0x0010
# define RFCOMM_RPN_PM_XON 0x0020
# define RFCOMM_RPN_PM_XOFF 0x0040
# define RFCOMM_RPN_PM_FLOW 0x3F00
# define RFCOMM_RPN_PM_ALL 0x3F7F
struct rfcomm_hdr {
u8 addr ;
u8 ctrl ;
u8 len ; // Actual size can be 2 bytes
} __attribute__ ( ( packed ) ) ;
struct rfcomm_cmd {
u8 addr ;
u8 ctrl ;
u8 len ;
u8 fcs ;
} __attribute__ ( ( packed ) ) ;
struct rfcomm_mcc {
u8 type ;
u8 len ;
} __attribute__ ( ( packed ) ) ;
struct rfcomm_pn {
u8 dlci ;
u8 flow_ctrl ;
u8 priority ;
u8 ack_timer ;
2006-11-08 00:28:19 -08:00
__le16 mtu ;
2005-04-16 15:20:36 -07:00
u8 max_retrans ;
u8 credits ;
} __attribute__ ( ( packed ) ) ;
struct rfcomm_rpn {
u8 dlci ;
u8 bit_rate ;
u8 line_settings ;
u8 flow_ctrl ;
u8 xon_char ;
u8 xoff_char ;
2006-11-08 00:28:19 -08:00
__le16 param_mask ;
2005-04-16 15:20:36 -07:00
} __attribute__ ( ( packed ) ) ;
struct rfcomm_rls {
u8 dlci ;
u8 status ;
} __attribute__ ( ( packed ) ) ;
struct rfcomm_msc {
u8 dlci ;
u8 v24_sig ;
} __attribute__ ( ( packed ) ) ;
/* ---- Core structures, flags etc ---- */
struct rfcomm_session {
struct list_head list ;
struct socket * sock ;
unsigned long state ;
unsigned long flags ;
atomic_t refcnt ;
int initiator ;
/* Default DLC parameters */
int cfc ;
uint mtu ;
struct list_head dlcs ;
} ;
struct rfcomm_dlc {
struct list_head list ;
struct rfcomm_session * session ;
struct sk_buff_head tx_queue ;
struct timer_list timer ;
spinlock_t lock ;
unsigned long state ;
unsigned long flags ;
atomic_t refcnt ;
u8 dlci ;
u8 addr ;
u8 priority ;
u8 v24_sig ;
u8 mscex ;
u32 link_mode ;
uint mtu ;
uint cfc ;
uint rx_credits ;
uint tx_credits ;
void * owner ;
void ( * data_ready ) ( struct rfcomm_dlc * d , struct sk_buff * skb ) ;
void ( * state_change ) ( struct rfcomm_dlc * d , int err ) ;
void ( * modem_status ) ( struct rfcomm_dlc * d , u8 v24_sig ) ;
} ;
/* DLC and session flags */
# define RFCOMM_RX_THROTTLED 0
# define RFCOMM_TX_THROTTLED 1
# define RFCOMM_TIMED_OUT 2
# define RFCOMM_MSC_PENDING 3
# define RFCOMM_AUTH_PENDING 4
# define RFCOMM_AUTH_ACCEPT 5
# define RFCOMM_AUTH_REJECT 6
/* Scheduling flags and events */
# define RFCOMM_SCHED_STATE 0
# define RFCOMM_SCHED_RX 1
# define RFCOMM_SCHED_TX 2
# define RFCOMM_SCHED_TIMEO 3
# define RFCOMM_SCHED_AUTH 4
# define RFCOMM_SCHED_WAKEUP 31
/* MSC exchange flags */
# define RFCOMM_MSCEX_TX 1
# define RFCOMM_MSCEX_RX 2
# define RFCOMM_MSCEX_OK (RFCOMM_MSCEX_TX + RFCOMM_MSCEX_RX)
/* CFC states */
# define RFCOMM_CFC_UNKNOWN -1
# define RFCOMM_CFC_DISABLED 0
# define RFCOMM_CFC_ENABLED RFCOMM_MAX_CREDITS
2005-08-09 20:28:46 -07:00
/* ---- RFCOMM SEND RPN ---- */
int rfcomm_send_rpn ( struct rfcomm_session * s , int cr , u8 dlci ,
u8 bit_rate , u8 data_bits , u8 stop_bits ,
u8 parity , u8 flow_ctrl_settings ,
u8 xon_char , u8 xoff_char , u16 param_mask ) ;
2005-04-16 15:20:36 -07:00
/* ---- RFCOMM DLCs (channels) ---- */
2005-10-07 07:46:04 +01:00
struct rfcomm_dlc * rfcomm_dlc_alloc ( gfp_t prio ) ;
2005-04-16 15:20:36 -07:00
void rfcomm_dlc_free ( struct rfcomm_dlc * d ) ;
int rfcomm_dlc_open ( struct rfcomm_dlc * d , bdaddr_t * src , bdaddr_t * dst , u8 channel ) ;
int rfcomm_dlc_close ( struct rfcomm_dlc * d , int reason ) ;
int rfcomm_dlc_send ( struct rfcomm_dlc * d , struct sk_buff * skb ) ;
int rfcomm_dlc_set_modem_status ( struct rfcomm_dlc * d , u8 v24_sig ) ;
int rfcomm_dlc_get_modem_status ( struct rfcomm_dlc * d , u8 * v24_sig ) ;
# define rfcomm_dlc_lock(d) spin_lock(&d->lock)
# define rfcomm_dlc_unlock(d) spin_unlock(&d->lock)
static inline void rfcomm_dlc_hold ( struct rfcomm_dlc * d )
{
atomic_inc ( & d - > refcnt ) ;
}
static inline void rfcomm_dlc_put ( struct rfcomm_dlc * d )
{
if ( atomic_dec_and_test ( & d - > refcnt ) )
rfcomm_dlc_free ( d ) ;
}
extern void FASTCALL ( __rfcomm_dlc_throttle ( struct rfcomm_dlc * d ) ) ;
extern void FASTCALL ( __rfcomm_dlc_unthrottle ( struct rfcomm_dlc * d ) ) ;
static inline void rfcomm_dlc_throttle ( struct rfcomm_dlc * d )
{
if ( ! test_and_set_bit ( RFCOMM_RX_THROTTLED , & d - > flags ) )
__rfcomm_dlc_throttle ( d ) ;
}
static inline void rfcomm_dlc_unthrottle ( struct rfcomm_dlc * d )
{
if ( test_and_clear_bit ( RFCOMM_RX_THROTTLED , & d - > flags ) )
__rfcomm_dlc_unthrottle ( d ) ;
}
/* ---- RFCOMM sessions ---- */
void rfcomm_session_getaddr ( struct rfcomm_session * s , bdaddr_t * src , bdaddr_t * dst ) ;
static inline void rfcomm_session_hold ( struct rfcomm_session * s )
{
atomic_inc ( & s - > refcnt ) ;
}
/* ---- RFCOMM sockets ---- */
struct sockaddr_rc {
sa_family_t rc_family ;
bdaddr_t rc_bdaddr ;
u8 rc_channel ;
} ;
# define RFCOMM_CONNINFO 0x02
struct rfcomm_conninfo {
__u16 hci_handle ;
__u8 dev_class [ 3 ] ;
} ;
# define RFCOMM_LM 0x03
# define RFCOMM_LM_MASTER 0x0001
# define RFCOMM_LM_AUTH 0x0002
# define RFCOMM_LM_ENCRYPT 0x0004
# define RFCOMM_LM_TRUSTED 0x0008
# define RFCOMM_LM_RELIABLE 0x0010
# define RFCOMM_LM_SECURE 0x0020
# define rfcomm_pi(sk) ((struct rfcomm_pinfo *) sk)
struct rfcomm_pinfo {
struct bt_sock bt ;
struct rfcomm_dlc * dlc ;
u8 channel ;
u32 link_mode ;
} ;
int rfcomm_init_sockets ( void ) ;
void rfcomm_cleanup_sockets ( void ) ;
int rfcomm_connect_ind ( struct rfcomm_session * s , u8 channel , struct rfcomm_dlc * * d ) ;
/* ---- RFCOMM TTY ---- */
# define RFCOMM_MAX_DEV 256
# define RFCOMMCREATEDEV _IOW('R', 200, int)
# define RFCOMMRELEASEDEV _IOW('R', 201, int)
# define RFCOMMGETDEVLIST _IOR('R', 210, int)
# define RFCOMMGETDEVINFO _IOR('R', 211, int)
# define RFCOMMSTEALDLC _IOW('R', 220, int)
# define RFCOMM_REUSE_DLC 0
# define RFCOMM_RELEASE_ONHUP 1
# define RFCOMM_HANGUP_NOW 2
# define RFCOMM_TTY_ATTACHED 3
2007-07-11 09:23:41 +02:00
# define RFCOMM_TTY_RELEASED 4
2005-04-16 15:20:36 -07:00
struct rfcomm_dev_req {
s16 dev_id ;
u32 flags ;
bdaddr_t src ;
bdaddr_t dst ;
u8 channel ;
} ;
struct rfcomm_dev_info {
s16 id ;
u32 flags ;
u16 state ;
bdaddr_t src ;
bdaddr_t dst ;
u8 channel ;
} ;
struct rfcomm_dev_list_req {
u16 dev_num ;
struct rfcomm_dev_info dev_info [ 0 ] ;
} ;
int rfcomm_dev_ioctl ( struct sock * sk , unsigned int cmd , void __user * arg ) ;
int rfcomm_init_ttys ( void ) ;
void rfcomm_cleanup_ttys ( void ) ;
# endif /* __RFCOMM_H */