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