hc
2024-02-19 890e1df1bec891d9203724541e81f8fbe5183388
kernel/include/net/bluetooth/bluetooth.h
....@@ -41,6 +41,8 @@
4141 #define BLUETOOTH_VER_1_1 1
4242 #define BLUETOOTH_VER_1_2 2
4343 #define BLUETOOTH_VER_2_0 3
44
+#define BLUETOOTH_VER_2_1 4
45
+#define BLUETOOTH_VER_4_0 6
4446
4547 /* Reserv for core and drivers use */
4648 #define BT_SKB_RESERVE 8
....@@ -121,6 +123,35 @@
121123
122124 #define BT_SNDMTU 12
123125 #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
124155
125156 __printf(1, 2)
126157 void bt_info(const char *fmt, ...);
....@@ -128,27 +159,42 @@
128159 void bt_warn(const char *fmt, ...);
129160 __printf(1, 2)
130161 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, ...);
131170 __printf(1, 2)
132171 void bt_err_ratelimited(const char *fmt, ...);
133172
134173 #define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__)
135174 #define BT_WARN(fmt, ...) bt_warn(fmt "\n", ##__VA_ARGS__)
136175 #define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__)
137
-#define BT_DBG(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__)
138176
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")
140184
141185 #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__)
143187 #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__)
145189 #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__)
147191 #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__)
149193
194
+#define bt_dev_warn_ratelimited(hdev, fmt, ...) \
195
+ bt_warn_ratelimited("%s: " fmt, bt_dev_name(hdev), ##__VA_ARGS__)
150196 #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__)
152198
153199 /* Connection and socket states */
154200 enum {
....@@ -248,6 +294,7 @@
248294 struct sock *parent;
249295 unsigned long flags;
250296 void (*skb_msg_name)(struct sk_buff *, void *, int *);
297
+ void (*skb_put_cmsg)(struct sk_buff *, struct msghdr *, struct sock *);
251298 };
252299
253300 enum {
....@@ -297,6 +344,10 @@
297344 struct l2cap_chan *chan;
298345 };
299346
347
+struct sco_ctrl {
348
+ u8 pkt_status;
349
+};
350
+
300351 struct hci_dev;
301352
302353 typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status, u16 opcode);
....@@ -323,6 +374,7 @@
323374 u8 incoming:1;
324375 union {
325376 struct l2cap_ctrl l2cap;
377
+ struct sco_ctrl sco;
326378 struct hci_ctrl hci;
327379 };
328380 };
....@@ -370,6 +422,71 @@
370422 return NULL;
371423 }
372424
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
+
373490 int bt_to_errno(u16 code);
374491
375492 void hci_sock_set_flag(struct sock *sk, int nr);