| .. | .. |
|---|
| 41 | 41 | #define BLUETOOTH_VER_1_1 1 |
|---|
| 42 | 42 | #define BLUETOOTH_VER_1_2 2 |
|---|
| 43 | 43 | #define BLUETOOTH_VER_2_0 3 |
|---|
| 44 | +#define BLUETOOTH_VER_2_1 4 |
|---|
| 45 | +#define BLUETOOTH_VER_4_0 6 |
|---|
| 44 | 46 | |
|---|
| 45 | 47 | /* Reserv for core and drivers use */ |
|---|
| 46 | 48 | #define BT_SKB_RESERVE 8 |
|---|
| .. | .. |
|---|
| 121 | 123 | |
|---|
| 122 | 124 | #define BT_SNDMTU 12 |
|---|
| 123 | 125 | #define BT_RCVMTU 13 |
|---|
| 126 | +#define BT_PHY 14 |
|---|
| 127 | + |
|---|
| 128 | +#define BT_PHY_BR_1M_1SLOT 0x00000001 |
|---|
| 129 | +#define BT_PHY_BR_1M_3SLOT 0x00000002 |
|---|
| 130 | +#define BT_PHY_BR_1M_5SLOT 0x00000004 |
|---|
| 131 | +#define BT_PHY_EDR_2M_1SLOT 0x00000008 |
|---|
| 132 | +#define BT_PHY_EDR_2M_3SLOT 0x00000010 |
|---|
| 133 | +#define BT_PHY_EDR_2M_5SLOT 0x00000020 |
|---|
| 134 | +#define BT_PHY_EDR_3M_1SLOT 0x00000040 |
|---|
| 135 | +#define BT_PHY_EDR_3M_3SLOT 0x00000080 |
|---|
| 136 | +#define BT_PHY_EDR_3M_5SLOT 0x00000100 |
|---|
| 137 | +#define BT_PHY_LE_1M_TX 0x00000200 |
|---|
| 138 | +#define BT_PHY_LE_1M_RX 0x00000400 |
|---|
| 139 | +#define BT_PHY_LE_2M_TX 0x00000800 |
|---|
| 140 | +#define BT_PHY_LE_2M_RX 0x00001000 |
|---|
| 141 | +#define BT_PHY_LE_CODED_TX 0x00002000 |
|---|
| 142 | +#define BT_PHY_LE_CODED_RX 0x00004000 |
|---|
| 143 | + |
|---|
| 144 | +#define BT_MODE 15 |
|---|
| 145 | + |
|---|
| 146 | +#define BT_MODE_BASIC 0x00 |
|---|
| 147 | +#define BT_MODE_ERTM 0x01 |
|---|
| 148 | +#define BT_MODE_STREAMING 0x02 |
|---|
| 149 | +#define BT_MODE_LE_FLOWCTL 0x03 |
|---|
| 150 | +#define BT_MODE_EXT_FLOWCTL 0x04 |
|---|
| 151 | + |
|---|
| 152 | +#define BT_PKT_STATUS 16 |
|---|
| 153 | + |
|---|
| 154 | +#define BT_SCM_PKT_STATUS 0x03 |
|---|
| 124 | 155 | |
|---|
| 125 | 156 | __printf(1, 2) |
|---|
| 126 | 157 | void bt_info(const char *fmt, ...); |
|---|
| .. | .. |
|---|
| 128 | 159 | void bt_warn(const char *fmt, ...); |
|---|
| 129 | 160 | __printf(1, 2) |
|---|
| 130 | 161 | void bt_err(const char *fmt, ...); |
|---|
| 162 | +#if IS_ENABLED(CONFIG_BT_FEATURE_DEBUG) |
|---|
| 163 | +void bt_dbg_set(bool enable); |
|---|
| 164 | +bool bt_dbg_get(void); |
|---|
| 165 | +__printf(1, 2) |
|---|
| 166 | +void bt_dbg(const char *fmt, ...); |
|---|
| 167 | +#endif |
|---|
| 168 | +__printf(1, 2) |
|---|
| 169 | +void bt_warn_ratelimited(const char *fmt, ...); |
|---|
| 131 | 170 | __printf(1, 2) |
|---|
| 132 | 171 | void bt_err_ratelimited(const char *fmt, ...); |
|---|
| 133 | 172 | |
|---|
| 134 | 173 | #define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__) |
|---|
| 135 | 174 | #define BT_WARN(fmt, ...) bt_warn(fmt "\n", ##__VA_ARGS__) |
|---|
| 136 | 175 | #define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__) |
|---|
| 137 | | -#define BT_DBG(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__) |
|---|
| 138 | 176 | |
|---|
| 139 | | -#define BT_ERR_RATELIMITED(fmt, ...) bt_err_ratelimited(fmt "\n", ##__VA_ARGS__) |
|---|
| 177 | +#if IS_ENABLED(CONFIG_BT_FEATURE_DEBUG) |
|---|
| 178 | +#define BT_DBG(fmt, ...) bt_dbg(fmt "\n", ##__VA_ARGS__) |
|---|
| 179 | +#else |
|---|
| 180 | +#define BT_DBG(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__) |
|---|
| 181 | +#endif |
|---|
| 182 | + |
|---|
| 183 | +#define bt_dev_name(hdev) ((hdev) ? (hdev)->name : "null") |
|---|
| 140 | 184 | |
|---|
| 141 | 185 | #define bt_dev_info(hdev, fmt, ...) \ |
|---|
| 142 | | - BT_INFO("%s: " fmt, (hdev)->name, ##__VA_ARGS__) |
|---|
| 186 | + BT_INFO("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
|---|
| 143 | 187 | #define bt_dev_warn(hdev, fmt, ...) \ |
|---|
| 144 | | - BT_WARN("%s: " fmt, (hdev)->name, ##__VA_ARGS__) |
|---|
| 188 | + BT_WARN("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
|---|
| 145 | 189 | #define bt_dev_err(hdev, fmt, ...) \ |
|---|
| 146 | | - BT_ERR("%s: " fmt, (hdev)->name, ##__VA_ARGS__) |
|---|
| 190 | + BT_ERR("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
|---|
| 147 | 191 | #define bt_dev_dbg(hdev, fmt, ...) \ |
|---|
| 148 | | - BT_DBG("%s: " fmt, (hdev)->name, ##__VA_ARGS__) |
|---|
| 192 | + BT_DBG("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
|---|
| 149 | 193 | |
|---|
| 194 | +#define bt_dev_warn_ratelimited(hdev, fmt, ...) \ |
|---|
| 195 | + bt_warn_ratelimited("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
|---|
| 150 | 196 | #define bt_dev_err_ratelimited(hdev, fmt, ...) \ |
|---|
| 151 | | - BT_ERR_RATELIMITED("%s: " fmt, (hdev)->name, ##__VA_ARGS__) |
|---|
| 197 | + bt_err_ratelimited("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__) |
|---|
| 152 | 198 | |
|---|
| 153 | 199 | /* Connection and socket states */ |
|---|
| 154 | 200 | enum { |
|---|
| .. | .. |
|---|
| 248 | 294 | struct sock *parent; |
|---|
| 249 | 295 | unsigned long flags; |
|---|
| 250 | 296 | void (*skb_msg_name)(struct sk_buff *, void *, int *); |
|---|
| 297 | + void (*skb_put_cmsg)(struct sk_buff *, struct msghdr *, struct sock *); |
|---|
| 251 | 298 | }; |
|---|
| 252 | 299 | |
|---|
| 253 | 300 | enum { |
|---|
| .. | .. |
|---|
| 297 | 344 | struct l2cap_chan *chan; |
|---|
| 298 | 345 | }; |
|---|
| 299 | 346 | |
|---|
| 347 | +struct sco_ctrl { |
|---|
| 348 | + u8 pkt_status; |
|---|
| 349 | +}; |
|---|
| 350 | + |
|---|
| 300 | 351 | struct hci_dev; |
|---|
| 301 | 352 | |
|---|
| 302 | 353 | typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status, u16 opcode); |
|---|
| .. | .. |
|---|
| 323 | 374 | u8 incoming:1; |
|---|
| 324 | 375 | union { |
|---|
| 325 | 376 | struct l2cap_ctrl l2cap; |
|---|
| 377 | + struct sco_ctrl sco; |
|---|
| 326 | 378 | struct hci_ctrl hci; |
|---|
| 327 | 379 | }; |
|---|
| 328 | 380 | }; |
|---|
| .. | .. |
|---|
| 370 | 422 | return NULL; |
|---|
| 371 | 423 | } |
|---|
| 372 | 424 | |
|---|
| 425 | +/* Shall not be called with lock_sock held */ |
|---|
| 426 | +static inline struct sk_buff *bt_skb_sendmsg(struct sock *sk, |
|---|
| 427 | + struct msghdr *msg, |
|---|
| 428 | + size_t len, size_t mtu, |
|---|
| 429 | + size_t headroom, size_t tailroom) |
|---|
| 430 | +{ |
|---|
| 431 | + struct sk_buff *skb; |
|---|
| 432 | + size_t size = min_t(size_t, len, mtu); |
|---|
| 433 | + int err; |
|---|
| 434 | + |
|---|
| 435 | + skb = bt_skb_send_alloc(sk, size + headroom + tailroom, |
|---|
| 436 | + msg->msg_flags & MSG_DONTWAIT, &err); |
|---|
| 437 | + if (!skb) |
|---|
| 438 | + return ERR_PTR(err); |
|---|
| 439 | + |
|---|
| 440 | + skb_reserve(skb, headroom); |
|---|
| 441 | + skb_tailroom_reserve(skb, mtu, tailroom); |
|---|
| 442 | + |
|---|
| 443 | + if (!copy_from_iter_full(skb_put(skb, size), size, &msg->msg_iter)) { |
|---|
| 444 | + kfree_skb(skb); |
|---|
| 445 | + return ERR_PTR(-EFAULT); |
|---|
| 446 | + } |
|---|
| 447 | + |
|---|
| 448 | + skb->priority = sk->sk_priority; |
|---|
| 449 | + |
|---|
| 450 | + return skb; |
|---|
| 451 | +} |
|---|
| 452 | + |
|---|
| 453 | +/* Similar to bt_skb_sendmsg but can split the msg into multiple fragments |
|---|
| 454 | + * accourding to the MTU. |
|---|
| 455 | + */ |
|---|
| 456 | +static inline struct sk_buff *bt_skb_sendmmsg(struct sock *sk, |
|---|
| 457 | + struct msghdr *msg, |
|---|
| 458 | + size_t len, size_t mtu, |
|---|
| 459 | + size_t headroom, size_t tailroom) |
|---|
| 460 | +{ |
|---|
| 461 | + struct sk_buff *skb, **frag; |
|---|
| 462 | + |
|---|
| 463 | + skb = bt_skb_sendmsg(sk, msg, len, mtu, headroom, tailroom); |
|---|
| 464 | + if (IS_ERR_OR_NULL(skb)) |
|---|
| 465 | + return skb; |
|---|
| 466 | + |
|---|
| 467 | + len -= skb->len; |
|---|
| 468 | + if (!len) |
|---|
| 469 | + return skb; |
|---|
| 470 | + |
|---|
| 471 | + /* Add remaining data over MTU as continuation fragments */ |
|---|
| 472 | + frag = &skb_shinfo(skb)->frag_list; |
|---|
| 473 | + while (len) { |
|---|
| 474 | + struct sk_buff *tmp; |
|---|
| 475 | + |
|---|
| 476 | + tmp = bt_skb_sendmsg(sk, msg, len, mtu, headroom, tailroom); |
|---|
| 477 | + if (IS_ERR(tmp)) { |
|---|
| 478 | + return skb; |
|---|
| 479 | + } |
|---|
| 480 | + |
|---|
| 481 | + len -= tmp->len; |
|---|
| 482 | + |
|---|
| 483 | + *frag = tmp; |
|---|
| 484 | + frag = &(*frag)->next; |
|---|
| 485 | + } |
|---|
| 486 | + |
|---|
| 487 | + return skb; |
|---|
| 488 | +} |
|---|
| 489 | + |
|---|
| 373 | 490 | int bt_to_errno(u16 code); |
|---|
| 374 | 491 | |
|---|
| 375 | 492 | void hci_sock_set_flag(struct sock *sk, int nr); |
|---|