1/* 2 * 3 * BlueZ - Bluetooth protocol stack for Linux 4 * 5 * Copyright (C) 2001-2002 Wayne Lee <waynelee@qualcomm.com> 6 * Copyright (C) 2003-2011 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 116typedef 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 134typedef 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 156typedef 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 175typedef 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 205typedef 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 212typedef struct short_length { 213 uint8_t ea:1; 214 uint8_t len:7; 215} __attribute__ ((packed)) short_length; 216 217typedef 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 225typedef struct short_frame_head { 226 address_field addr; 227 uint8_t control; 228 short_length length; 229} __attribute__ ((packed)) short_frame_head; 230 231typedef struct short_frame { 232 short_frame_head h; 233 uint8_t data[0]; 234} __attribute__ ((packed)) short_frame; 235 236typedef 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 243typedef 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 */ 249typedef struct mcc_type { 250 uint8_t ea:1; 251 uint8_t cr:1; 252 uint8_t type:6; 253} __attribute__ ((packed)) mcc_type; 254 255typedef 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 261typedef struct mcc_short_frame { 262 mcc_short_frame_head h; 263 uint8_t value[0]; 264} __attribute__ ((packed)) mcc_short_frame; 265 266typedef 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 272typedef 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 */ 278typedef 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 288typedef 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 296typedef 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 305typedef 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 */ 314typedef 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 */ 324typedef 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 */ 342typedef 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 351typedef 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 358typedef struct short_length { 359 uint8_t len:7; 360 uint8_t ea:1; 361} __attribute__ ((packed)) short_length; 362 363typedef 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 371typedef struct short_frame_head { 372 address_field addr; 373 uint8_t control; 374 short_length length; 375} __attribute__ ((packed)) short_frame_head; 376 377typedef struct short_frame { 378 short_frame_head h; 379 uint8_t data[0]; 380} __attribute__ ((packed)) short_frame; 381 382typedef 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 389typedef struct long_frame { 390 long_frame_head h; 391 uint8_t data[0]; 392} __attribute__ ((packed)) long_frame; 393 394typedef struct mcc_type { 395 uint8_t type:6; 396 uint8_t cr:1; 397 uint8_t ea:1; 398} __attribute__ ((packed)) mcc_type; 399 400typedef 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 406typedef struct mcc_short_frame { 407 mcc_short_frame_head h; 408 uint8_t value[0]; 409} __attribute__ ((packed)) mcc_short_frame; 410 411typedef 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 417typedef struct mcc_long_frame { 418 mcc_long_frame_head h; 419 uint8_t value[0]; 420} __attribute__ ((packed)) mcc_long_frame; 421 422typedef 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 432typedef 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 440typedef 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 449typedef 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 457typedef 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 466typedef 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 482typedef 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