linux/include/net/bluetooth/rfcomm.h
<<
>>
Prefs
   1/*
   2   RFCOMM implementation for Linux Bluetooth stack (BlueZ)
   3   Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
   4   Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
   5
   6   This program is free software; you can redistribute it and/or modify
   7   it under the terms of the GNU General Public License version 2 as
   8   published by the Free Software Foundation;
   9
  10   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  11   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  12   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
  13   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
  14   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
  15   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  16   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  17   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  18
  19   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
  20   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
  21   SOFTWARE IS DISCLAIMED.
  22*/
  23
  24#ifndef __RFCOMM_H
  25#define __RFCOMM_H
  26
  27#define RFCOMM_CONN_TIMEOUT (HZ * 30)
  28#define RFCOMM_DISC_TIMEOUT (HZ * 20)
  29#define RFCOMM_AUTH_TIMEOUT (HZ * 25)
  30#define RFCOMM_IDLE_TIMEOUT (HZ * 2)
  31
  32#define RFCOMM_DEFAULT_MTU      127
  33#define RFCOMM_DEFAULT_CREDITS  7
  34
  35#define RFCOMM_MAX_L2CAP_MTU    1013
  36#define RFCOMM_MAX_CREDITS      40
  37
  38#define RFCOMM_SKB_HEAD_RESERVE 8
  39#define RFCOMM_SKB_TAIL_RESERVE 2
  40#define RFCOMM_SKB_RESERVE  (RFCOMM_SKB_HEAD_RESERVE + RFCOMM_SKB_TAIL_RESERVE)
  41
  42#define RFCOMM_SABM     0x2f
  43#define RFCOMM_DISC     0x43
  44#define RFCOMM_UA       0x63
  45#define RFCOMM_DM       0x0f
  46#define RFCOMM_UIH      0xef
  47
  48#define RFCOMM_TEST     0x08
  49#define RFCOMM_FCON     0x28
  50#define RFCOMM_FCOFF    0x18
  51#define RFCOMM_MSC      0x38
  52#define RFCOMM_RPN      0x24
  53#define RFCOMM_RLS      0x14
  54#define RFCOMM_PN       0x20
  55#define RFCOMM_NSC      0x04
  56
  57#define RFCOMM_V24_FC   0x02
  58#define RFCOMM_V24_RTC  0x04
  59#define RFCOMM_V24_RTR  0x08
  60#define RFCOMM_V24_IC   0x40
  61#define RFCOMM_V24_DV   0x80
  62
  63#define RFCOMM_RPN_BR_2400      0x0
  64#define RFCOMM_RPN_BR_4800      0x1
  65#define RFCOMM_RPN_BR_7200      0x2
  66#define RFCOMM_RPN_BR_9600      0x3
  67#define RFCOMM_RPN_BR_19200     0x4
  68#define RFCOMM_RPN_BR_38400     0x5
  69#define RFCOMM_RPN_BR_57600     0x6
  70#define RFCOMM_RPN_BR_115200    0x7
  71#define RFCOMM_RPN_BR_230400    0x8
  72
  73#define RFCOMM_RPN_DATA_5       0x0
  74#define RFCOMM_RPN_DATA_6       0x1
  75#define RFCOMM_RPN_DATA_7       0x2
  76#define RFCOMM_RPN_DATA_8       0x3
  77
  78#define RFCOMM_RPN_STOP_1       0
  79#define RFCOMM_RPN_STOP_15      1
  80
  81#define RFCOMM_RPN_PARITY_NONE  0x0
  82#define RFCOMM_RPN_PARITY_ODD   0x1
  83#define RFCOMM_RPN_PARITY_EVEN  0x3
  84#define RFCOMM_RPN_PARITY_MARK  0x5
  85#define RFCOMM_RPN_PARITY_SPACE 0x7
  86
  87#define RFCOMM_RPN_FLOW_NONE    0x00
  88
  89#define RFCOMM_RPN_XON_CHAR     0x11
  90#define RFCOMM_RPN_XOFF_CHAR    0x13
  91
  92#define RFCOMM_RPN_PM_BITRATE           0x0001
  93#define RFCOMM_RPN_PM_DATA              0x0002
  94#define RFCOMM_RPN_PM_STOP              0x0004
  95#define RFCOMM_RPN_PM_PARITY            0x0008
  96#define RFCOMM_RPN_PM_PARITY_TYPE       0x0010
  97#define RFCOMM_RPN_PM_XON               0x0020
  98#define RFCOMM_RPN_PM_XOFF              0x0040
  99#define RFCOMM_RPN_PM_FLOW              0x3F00
 100
 101#define RFCOMM_RPN_PM_ALL               0x3F7F
 102
 103struct rfcomm_hdr {
 104        u8 addr;
 105        u8 ctrl;
 106        u8 len;    /* Actual size can be 2 bytes */
 107} __packed;
 108
 109struct rfcomm_cmd {
 110        u8 addr;
 111        u8 ctrl;
 112        u8 len;
 113        u8 fcs;
 114} __packed;
 115
 116struct rfcomm_mcc {
 117        u8 type;
 118        u8 len;
 119} __packed;
 120
 121struct rfcomm_pn {
 122        u8  dlci;
 123        u8  flow_ctrl;
 124        u8  priority;
 125        u8  ack_timer;
 126        __le16 mtu;
 127        u8  max_retrans;
 128        u8  credits;
 129} __packed;
 130
 131struct rfcomm_rpn {
 132        u8  dlci;
 133        u8  bit_rate;
 134        u8  line_settings;
 135        u8  flow_ctrl;
 136        u8  xon_char;
 137        u8  xoff_char;
 138        __le16 param_mask;
 139} __packed;
 140
 141struct rfcomm_rls {
 142        u8  dlci;
 143        u8  status;
 144} __packed;
 145
 146struct rfcomm_msc {
 147        u8  dlci;
 148        u8  v24_sig;
 149} __packed;
 150
 151/* ---- Core structures, flags etc ---- */
 152
 153struct rfcomm_session {
 154        struct list_head list;
 155        struct socket   *sock;
 156        struct timer_list timer;
 157        unsigned long    state;
 158        unsigned long    flags;
 159        int              initiator;
 160
 161        /* Default DLC parameters */
 162        int    cfc;
 163        uint   mtu;
 164
 165        struct list_head dlcs;
 166};
 167
 168struct rfcomm_dlc {
 169        struct list_head      list;
 170        struct rfcomm_session *session;
 171        struct sk_buff_head   tx_queue;
 172        struct timer_list     timer;
 173
 174        struct mutex  lock;
 175        unsigned long state;
 176        unsigned long flags;
 177        atomic_t      refcnt;
 178        u8            dlci;
 179        u8            addr;
 180        u8            priority;
 181        u8            v24_sig;
 182        u8            remote_v24_sig;
 183        u8            mscex;
 184        u8            out;
 185        u8            sec_level;
 186        u8            role_switch;
 187        u32           defer_setup;
 188
 189        uint          mtu;
 190        uint          cfc;
 191        uint          rx_credits;
 192        uint          tx_credits;
 193
 194        void          *owner;
 195
 196        void (*data_ready)(struct rfcomm_dlc *d, struct sk_buff *skb);
 197        void (*state_change)(struct rfcomm_dlc *d, int err);
 198        void (*modem_status)(struct rfcomm_dlc *d, u8 v24_sig);
 199};
 200
 201/* DLC and session flags */
 202#define RFCOMM_RX_THROTTLED 0
 203#define RFCOMM_TX_THROTTLED 1
 204#define RFCOMM_TIMED_OUT    2
 205#define RFCOMM_MSC_PENDING  3
 206#define RFCOMM_SEC_PENDING  4
 207#define RFCOMM_AUTH_PENDING 5
 208#define RFCOMM_AUTH_ACCEPT  6
 209#define RFCOMM_AUTH_REJECT  7
 210#define RFCOMM_DEFER_SETUP  8
 211#define RFCOMM_ENC_DROP     9
 212
 213/* Scheduling flags and events */
 214#define RFCOMM_SCHED_WAKEUP 31
 215
 216/* MSC exchange flags */
 217#define RFCOMM_MSCEX_TX     1
 218#define RFCOMM_MSCEX_RX     2
 219#define RFCOMM_MSCEX_OK     (RFCOMM_MSCEX_TX + RFCOMM_MSCEX_RX)
 220
 221/* CFC states */
 222#define RFCOMM_CFC_UNKNOWN  -1
 223#define RFCOMM_CFC_DISABLED 0
 224#define RFCOMM_CFC_ENABLED  RFCOMM_MAX_CREDITS
 225
 226/* ---- RFCOMM SEND RPN ---- */
 227int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci,
 228                        u8 bit_rate, u8 data_bits, u8 stop_bits,
 229                        u8 parity, u8 flow_ctrl_settings,
 230                        u8 xon_char, u8 xoff_char, u16 param_mask);
 231
 232/* ---- RFCOMM DLCs (channels) ---- */
 233struct rfcomm_dlc *rfcomm_dlc_alloc(gfp_t prio);
 234void rfcomm_dlc_free(struct rfcomm_dlc *d);
 235int  rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst,
 236                                                                u8 channel);
 237int  rfcomm_dlc_close(struct rfcomm_dlc *d, int reason);
 238int  rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb);
 239void rfcomm_dlc_send_noerror(struct rfcomm_dlc *d, struct sk_buff *skb);
 240int  rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig);
 241int  rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig);
 242void rfcomm_dlc_accept(struct rfcomm_dlc *d);
 243struct rfcomm_dlc *rfcomm_dlc_exists(bdaddr_t *src, bdaddr_t *dst, u8 channel);
 244
 245#define rfcomm_dlc_lock(d)     mutex_lock(&d->lock)
 246#define rfcomm_dlc_unlock(d)   mutex_unlock(&d->lock)
 247
 248static inline void rfcomm_dlc_hold(struct rfcomm_dlc *d)
 249{
 250        atomic_inc(&d->refcnt);
 251}
 252
 253static inline void rfcomm_dlc_put(struct rfcomm_dlc *d)
 254{
 255        if (atomic_dec_and_test(&d->refcnt))
 256                rfcomm_dlc_free(d);
 257}
 258
 259void __rfcomm_dlc_throttle(struct rfcomm_dlc *d);
 260void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d);
 261
 262static inline void rfcomm_dlc_throttle(struct rfcomm_dlc *d)
 263{
 264        if (!test_and_set_bit(RFCOMM_RX_THROTTLED, &d->flags))
 265                __rfcomm_dlc_throttle(d);
 266}
 267
 268static inline void rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
 269{
 270        if (test_and_clear_bit(RFCOMM_RX_THROTTLED, &d->flags))
 271                __rfcomm_dlc_unthrottle(d);
 272}
 273
 274/* ---- RFCOMM sessions ---- */
 275void   rfcomm_session_getaddr(struct rfcomm_session *s, bdaddr_t *src,
 276                                                                bdaddr_t *dst);
 277
 278/* ---- RFCOMM sockets ---- */
 279struct sockaddr_rc {
 280        sa_family_t     rc_family;
 281        bdaddr_t        rc_bdaddr;
 282        u8              rc_channel;
 283};
 284
 285#define RFCOMM_CONNINFO 0x02
 286struct rfcomm_conninfo {
 287        __u16 hci_handle;
 288        __u8  dev_class[3];
 289};
 290
 291#define RFCOMM_LM       0x03
 292#define RFCOMM_LM_MASTER        0x0001
 293#define RFCOMM_LM_AUTH          0x0002
 294#define RFCOMM_LM_ENCRYPT       0x0004
 295#define RFCOMM_LM_TRUSTED       0x0008
 296#define RFCOMM_LM_RELIABLE      0x0010
 297#define RFCOMM_LM_SECURE        0x0020
 298#define RFCOMM_LM_FIPS          0x0040
 299
 300#define rfcomm_pi(sk) ((struct rfcomm_pinfo *) sk)
 301
 302struct rfcomm_pinfo {
 303        struct bt_sock bt;
 304        bdaddr_t src;
 305        bdaddr_t dst;
 306        struct rfcomm_dlc   *dlc;
 307        u8     channel;
 308        u8     sec_level;
 309        u8     role_switch;
 310};
 311
 312int  rfcomm_init_sockets(void);
 313void rfcomm_cleanup_sockets(void);
 314
 315int  rfcomm_connect_ind(struct rfcomm_session *s, u8 channel,
 316                                                        struct rfcomm_dlc **d);
 317
 318/* ---- RFCOMM TTY ---- */
 319#define RFCOMM_MAX_DEV  256
 320
 321#define RFCOMMCREATEDEV         _IOW('R', 200, int)
 322#define RFCOMMRELEASEDEV        _IOW('R', 201, int)
 323#define RFCOMMGETDEVLIST        _IOR('R', 210, int)
 324#define RFCOMMGETDEVINFO        _IOR('R', 211, int)
 325#define RFCOMMSTEALDLC          _IOW('R', 220, int)
 326
 327/* rfcomm_dev.flags bit definitions */
 328#define RFCOMM_REUSE_DLC      0
 329#define RFCOMM_RELEASE_ONHUP  1
 330#define RFCOMM_HANGUP_NOW     2
 331#define RFCOMM_TTY_ATTACHED   3
 332#define RFCOMM_DEFUNCT_BIT4   4   /* don't reuse this bit - userspace visible */
 333
 334/* rfcomm_dev.status bit definitions */
 335#define RFCOMM_DEV_RELEASED   0
 336#define RFCOMM_TTY_OWNED      1
 337
 338struct rfcomm_dev_req {
 339        s16      dev_id;
 340        u32      flags;
 341        bdaddr_t src;
 342        bdaddr_t dst;
 343        u8       channel;
 344};
 345
 346struct rfcomm_dev_info {
 347        s16      id;
 348        u32      flags;
 349        u16      state;
 350        bdaddr_t src;
 351        bdaddr_t dst;
 352        u8       channel;
 353};
 354
 355struct rfcomm_dev_list_req {
 356        u16      dev_num;
 357        struct   rfcomm_dev_info dev_info[0];
 358};
 359
 360int  rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
 361
 362#ifdef CONFIG_BT_RFCOMM_TTY
 363int  rfcomm_init_ttys(void);
 364void rfcomm_cleanup_ttys(void);
 365#else
 366static inline int rfcomm_init_ttys(void)
 367{
 368        return 0;
 369}
 370static inline void rfcomm_cleanup_ttys(void)
 371{
 372}
 373#endif
 374#endif /* __RFCOMM_H */
 375