1 /* 2 * 3 * BlueZ - Bluetooth protocol stack for Linux 4 * 5 * Copyright (C) 2001-2002 Wayne Lee <waynelee@qualcomm.com> 6 * Copyright (C) 2003-2007 Marcel Holtmann <marcel@holtmann.org> 7 * 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 22 * 23 */ 24 25 #ifndef __RFCOMM_H 26 #define __RFCOMM_H 27 28 #include <endian.h> 29 30 #define RFCOMM_PSM 3 31 32 #define TRUE 1 33 #define FALSE 0 34 35 #define RFCOMM_MAX_CONN 10 36 #define BT_NBR_DATAPORTS RFCOMM_MAX_CONN 37 38 #define GET_BIT(pos,bitfield) ((bitfield[(pos)/32]) & (1 << ((pos) % 32))) 39 #define SET_BIT(pos,bitfield) ((bitfield[(pos)/32]) |= (1 << ((pos) % 32))) 40 #define CLR_BIT(pos,bitfield) ((bitfield[(pos)/32]) &= ((1 << ((pos) % 32)) ^ (~0))) 41 42 /* Sets the P/F-bit in the control field */ 43 #define SET_PF(ctr) ((ctr) | (1 << 4)) 44 /* Clears the P/F-bit in the control field */ 45 #define CLR_PF(ctr) ((ctr) & 0xef) 46 /* Returns the P/F-bit */ 47 #define GET_PF(ctr) (((ctr) >> 4) & 0x1) 48 49 #define MIN(a, b) (((a) < (b)) ? (a) : (b)) 50 51 /* Endian-swapping macros for structs */ 52 #define swap_long_frame(x) ((x)->h.length.val = le16_to_cpu((x)->h.length.val)) 53 #define swap_mcc_long_frame(x) (swap_long_frame(x)) 54 55 /* Used for UIH packets */ 56 #define SHORT_CRC_CHECK 2 57 /* Used for all packet exepts for the UIH packets */ 58 #define LONG_CRC_CHECK 3 59 /* Short header for short UIH packets */ 60 #define SHORT_HDR 2 61 /* Long header for long UIH packets */ 62 #define LONG_HDR 3 63 64 /* FIXME: Should this one be defined here? */ 65 #define SHORT_PAYLOAD_SIZE 127 66 /* Used for setting the EA field in different packets, really neccessary? */ 67 #define EA 1 68 /* Yes the FCS size is only one byte */ 69 #define FCS_SIZE 1 70 71 #define RFCOMM_MAX_HDR_SIZE 5 72 73 #define MAX_CREDITS 30 74 #define START_CREDITS 7 75 #define MIN_CREDITS 6 76 77 #define DEF_RFCOMM_MTU 127 78 79 /* The values in the control field when sending ordinary rfcomm packets */ 80 #define SABM 0x2f /* set asynchronous balanced mode */ 81 #define UA 0x63 /* unnumbered acknolodgement */ 82 #define DM 0x0f /* disconnected mode */ 83 #define DISC 0x43 /* disconnect */ 84 #define UIH 0xef /* unnumbered information with header check (only) */ 85 #define UI 0x03 /* unnumbered information (with all data check) */ 86 87 #define SABM_SIZE 4 88 #define UA_SIZE 4 89 90 /* The values in the type field in a multiplexer command packet */ 91 #define PN (0x80 >> 2) /* parameter negotiation */ 92 #define PSC (0x40 >> 2) /* power saving control */ 93 #define CLD (0xc0 >> 2) /* close down */ 94 #define TEST (0x20 >> 2) /* test */ 95 #define FCON (0xa0 >> 2) /* flow control on */ 96 #define FCOFF (0x60 >> 2) /* flow control off */ 97 #define MSC (0xe0 >> 2) /* modem status command */ 98 #define NSC (0x10 >> 2) /* not supported command response */ 99 #define RPN (0x90 >> 2) /* remote port negotiation */ 100 #define RLS (0x50 >> 2) /* remote line status */ 101 #define SNC (0xd0 >> 2) /* service negotiation command */ 102 103 /* Define of some V.24 signals modem control signals in RFCOMM */ 104 #define DV 0x80 /* data valid */ 105 #define IC 0x40 /* incoming call */ 106 #define RTR 0x08 /* ready to receive */ 107 #define RTC 0x04 /* ready to communicate */ 108 #define FC 0x02 /* flow control (unable to accept frames) */ 109 110 #define CTRL_CHAN 0 /* The control channel is defined as DLCI 0 in rfcomm */ 111 #define MCC_CMD 1 /* Multiplexer command */ 112 #define MCC_RSP 0 /* Multiplexer response */ 113 114 #if __BYTE_ORDER == __LITTLE_ENDIAN 115 116 typedef struct parameter_mask { 117 uint8_t bit_rate:1; 118 uint8_t data_bits:1; 119 uint8_t stop_bit:1; 120 uint8_t parity:1; 121 uint8_t parity_type:1; 122 uint8_t xon:1; 123 uint8_t xoff:1; 124 uint8_t res1:1; 125 uint8_t xon_input:1; 126 uint8_t xon_output:1; 127 uint8_t rtr_input:1; 128 uint8_t rtr_output:1; 129 uint8_t rtc_input:1; 130 uint8_t rtc_output:1; 131 uint8_t res2:2; 132 } __attribute__ ((packed)) parameter_mask; 133 134 typedef struct rpn_values { 135 uint8_t bit_rate; 136 uint8_t data_bits:2; 137 uint8_t stop_bit:1; 138 uint8_t parity:1; 139 uint8_t parity_type:2; 140 uint8_t res1:2; 141 uint8_t xon_input:1; 142 uint8_t xon_output:1; 143 uint8_t rtr_input:1; 144 uint8_t rtr_output:1; 145 uint8_t rtc_input:1; 146 uint8_t rtc_output:1; 147 uint8_t res2:2; 148 uint8_t xon; 149 uint8_t xoff; 150 uint16_t pm; 151 //parameter_mask pm; 152 } __attribute__ ((packed)) rpn_values; 153 154 #elif __BYTE_ORDER == __BIG_ENDIAN 155 156 typedef struct parameter_mask { 157 uint8_t res1:1; 158 uint8_t xoff:1; 159 uint8_t xon:1; 160 uint8_t parity_type:1; 161 uint8_t parity:1; 162 uint8_t stop_bit:1; 163 uint8_t data_bits:1; 164 uint8_t bit_rate:1; 165 uint8_t res2:2; 166 uint8_t rtc_output:1; 167 uint8_t rtc_input:1; 168 uint8_t rtr_output:1; 169 uint8_t rtr_input:1; 170 uint8_t xon_output:1; 171 uint8_t xon_input:1; 172 173 } __attribute__ ((packed)) parameter_mask; 174 175 typedef struct rpn_values { 176 uint8_t bit_rate; 177 uint8_t res1:2; 178 uint8_t parity_type:2; 179 uint8_t parity:1; 180 uint8_t stop_bit:1; 181 uint8_t data_bits:2; 182 uint8_t res2:2; 183 uint8_t rtc_output:1; 184 uint8_t rtc_input:1; 185 uint8_t rtr_output:1; 186 uint8_t rtr_input:1; 187 uint8_t xon_output:1; 188 uint8_t xon_input:1; 189 uint8_t xon; 190 uint8_t xoff; 191 uint16_t pm; 192 //parameter_mask pm; 193 } __attribute__ ((packed)) rpn_values; 194 195 #else 196 #error "Unknown byte order" 197 #endif 198 199 /* Typedefinitions of stuctures used for creating and parsing packets, for a 200 * further description of the structures please se the bluetooth core 201 * specification part F:1 and the ETSI TS 07.10 specification */ 202 203 #if __BYTE_ORDER == __LITTLE_ENDIAN 204 205 typedef struct address_field { 206 uint8_t ea:1; 207 uint8_t cr:1; 208 uint8_t d:1; 209 uint8_t server_chn:5; 210 } __attribute__ ((packed)) address_field; 211 212 typedef struct short_length { 213 uint8_t ea:1; 214 uint8_t len:7; 215 } __attribute__ ((packed)) short_length; 216 217 typedef union long_length { 218 struct bits { 219 uint8_t ea:1; 220 unsigned short len:15; 221 } __attribute__ ((packed)) bits ; 222 uint16_t val ; 223 } __attribute__ ((packed)) long_length; 224 225 typedef struct short_frame_head { 226 address_field addr; 227 uint8_t control; 228 short_length length; 229 } __attribute__ ((packed)) short_frame_head; 230 231 typedef struct short_frame { 232 short_frame_head h; 233 uint8_t data[0]; 234 } __attribute__ ((packed)) short_frame; 235 236 typedef struct long_frame_head { 237 address_field addr; 238 uint8_t control; 239 long_length length; 240 uint8_t data[0]; 241 } __attribute__ ((packed)) long_frame_head; 242 243 typedef struct long_frame { 244 long_frame_head h; 245 uint8_t data[0]; 246 } __attribute__ ((packed)) long_frame; 247 248 /* Typedefinitions for structures used for the multiplexer commands */ 249 typedef struct mcc_type { 250 uint8_t ea:1; 251 uint8_t cr:1; 252 uint8_t type:6; 253 } __attribute__ ((packed)) mcc_type; 254 255 typedef struct mcc_short_frame_head { 256 mcc_type type; 257 short_length length; 258 uint8_t value[0]; 259 } __attribute__ ((packed)) mcc_short_frame_head; 260 261 typedef struct mcc_short_frame { 262 mcc_short_frame_head h; 263 uint8_t value[0]; 264 } __attribute__ ((packed)) mcc_short_frame; 265 266 typedef struct mcc_long_frame_head { 267 mcc_type type; 268 long_length length; 269 uint8_t value[0]; 270 } __attribute__ ((packed)) mcc_long_frame_head; 271 272 typedef struct mcc_long_frame { 273 mcc_long_frame_head h; 274 uint8_t value[0]; 275 } __attribute__ ((packed)) mcc_long_frame; 276 277 /* MSC-command */ 278 typedef struct v24_signals { 279 uint8_t ea:1; 280 uint8_t fc:1; 281 uint8_t rtc:1; 282 uint8_t rtr:1; 283 uint8_t reserved:2; 284 uint8_t ic:1; 285 uint8_t dv:1; 286 } __attribute__ ((packed)) v24_signals; 287 288 typedef struct break_signals { 289 uint8_t ea:1; 290 uint8_t b1:1; 291 uint8_t b2:1; 292 uint8_t b3:1; 293 uint8_t len:4; 294 } __attribute__ ((packed)) break_signals; 295 296 typedef struct msc_msg { 297 short_frame_head s_head; 298 mcc_short_frame_head mcc_s_head; 299 address_field dlci; 300 v24_signals v24_sigs; 301 //break_signals break_sigs; 302 uint8_t fcs; 303 } __attribute__ ((packed)) msc_msg; 304 305 typedef struct rpn_msg { 306 short_frame_head s_head; 307 mcc_short_frame_head mcc_s_head; 308 address_field dlci; 309 rpn_values rpn_val; 310 uint8_t fcs; 311 } __attribute__ ((packed)) rpn_msg; 312 313 /* RLS-command */ 314 typedef struct rls_msg { 315 short_frame_head s_head; 316 mcc_short_frame_head mcc_s_head; 317 address_field dlci; 318 uint8_t error:4; 319 uint8_t res:4; 320 uint8_t fcs; 321 } __attribute__ ((packed)) rls_msg; 322 323 /* PN-command */ 324 typedef struct pn_msg { 325 short_frame_head s_head; 326 mcc_short_frame_head mcc_s_head; 327 /* The res1, res2 and res3 values have to be set to 0 by the sender */ 328 uint8_t dlci:6; 329 uint8_t res1:2; 330 uint8_t frame_type:4; 331 uint8_t credit_flow:4; 332 uint8_t prior:6; 333 uint8_t res2:2; 334 uint8_t ack_timer; 335 uint16_t frame_size:16; 336 uint8_t max_nbrof_retrans; 337 uint8_t credits; 338 uint8_t fcs; 339 } __attribute__ ((packed)) pn_msg; 340 341 /* NSC-command */ 342 typedef struct nsc_msg { 343 short_frame_head s_head; 344 mcc_short_frame_head mcc_s_head; 345 mcc_type command_type; 346 uint8_t fcs; 347 } __attribute__ ((packed)) nsc_msg; 348 349 #elif __BYTE_ORDER == __BIG_ENDIAN 350 351 typedef struct address_field { 352 uint8_t server_chn:5; 353 uint8_t d:1; 354 uint8_t cr:1; 355 uint8_t ea:1; 356 } __attribute__ ((packed)) address_field; 357 358 typedef struct short_length { 359 uint8_t len:7; 360 uint8_t ea:1; 361 } __attribute__ ((packed)) short_length; 362 363 typedef union long_length { 364 struct bits { 365 unsigned short len:15; 366 uint8_t ea:1; 367 } __attribute__ ((packed)) bits; 368 uint16_t val; 369 } __attribute__ ((packed)) long_length; 370 371 typedef struct short_frame_head { 372 address_field addr; 373 uint8_t control; 374 short_length length; 375 } __attribute__ ((packed)) short_frame_head; 376 377 typedef struct short_frame { 378 short_frame_head h; 379 uint8_t data[0]; 380 } __attribute__ ((packed)) short_frame; 381 382 typedef struct long_frame_head { 383 address_field addr; 384 uint8_t control; 385 long_length length; 386 uint8_t data[0]; 387 } __attribute__ ((packed)) long_frame_head; 388 389 typedef struct long_frame { 390 long_frame_head h; 391 uint8_t data[0]; 392 } __attribute__ ((packed)) long_frame; 393 394 typedef struct mcc_type { 395 uint8_t type:6; 396 uint8_t cr:1; 397 uint8_t ea:1; 398 } __attribute__ ((packed)) mcc_type; 399 400 typedef struct mcc_short_frame_head { 401 mcc_type type; 402 short_length length; 403 uint8_t value[0]; 404 } __attribute__ ((packed)) mcc_short_frame_head; 405 406 typedef struct mcc_short_frame { 407 mcc_short_frame_head h; 408 uint8_t value[0]; 409 } __attribute__ ((packed)) mcc_short_frame; 410 411 typedef struct mcc_long_frame_head { 412 mcc_type type; 413 long_length length; 414 uint8_t value[0]; 415 } __attribute__ ((packed)) mcc_long_frame_head; 416 417 typedef struct mcc_long_frame { 418 mcc_long_frame_head h; 419 uint8_t value[0]; 420 } __attribute__ ((packed)) mcc_long_frame; 421 422 typedef struct v24_signals { 423 uint8_t dv:1; 424 uint8_t ic:1; 425 uint8_t reserved:2; 426 uint8_t rtr:1; 427 uint8_t rtc:1; 428 uint8_t fc:1; 429 uint8_t ea:1; 430 } __attribute__ ((packed)) v24_signals; 431 432 typedef struct break_signals { 433 uint8_t len:4; 434 uint8_t b3:1; 435 uint8_t b2:1; 436 uint8_t b1:1; 437 uint8_t ea:1; 438 } __attribute__ ((packed)) break_signals; 439 440 typedef struct msc_msg { 441 short_frame_head s_head; 442 mcc_short_frame_head mcc_s_head; 443 address_field dlci; 444 v24_signals v24_sigs; 445 //break_signals break_sigs; 446 uint8_t fcs; 447 } __attribute__ ((packed)) msc_msg; 448 449 typedef struct rpn_msg { 450 short_frame_head s_head; 451 mcc_short_frame_head mcc_s_head; 452 address_field dlci; 453 rpn_values rpn_val; 454 uint8_t fcs; 455 } __attribute__ ((packed)) rpn_msg; 456 457 typedef struct rls_msg { 458 short_frame_head s_head; 459 mcc_short_frame_head mcc_s_head; 460 address_field dlci; 461 uint8_t res:4; 462 uint8_t error:4; 463 uint8_t fcs; 464 } __attribute__ ((packed)) rls_msg; 465 466 typedef struct pn_msg { 467 short_frame_head s_head; 468 mcc_short_frame_head mcc_s_head; 469 uint8_t res1:2; 470 uint8_t dlci:6; 471 uint8_t credit_flow:4; 472 uint8_t frame_type:4; 473 uint8_t res2:2; 474 uint8_t prior:6; 475 uint8_t ack_timer; 476 uint16_t frame_size:16; 477 uint8_t max_nbrof_retrans; 478 uint8_t credits; 479 uint8_t fcs; 480 } __attribute__ ((packed)) pn_msg; 481 482 typedef struct nsc_msg { 483 short_frame_head s_head; 484 mcc_short_frame_head mcc_s_head; 485 mcc_type command_type; 486 uint8_t fcs; 487 } __attribute__ ((packed)) nsc_msg; 488 489 #else 490 #error "Unknown byte order" 491 #error Processor endianness unknown! 492 #endif 493 494 #endif /* __RFCOMM_H */ 495