Skip to content

Commit 3f19ffb

Browse files
committed
Bluetooth: af_bluetooth: Make BT_PKT_STATUS generic
This makes the handling of BT_PKT_STATUS more generic so it can be reused by sockets other than SCO like BT_DEFER_SETUP, etc. Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
1 parent 0e72e3b commit 3f19ffb

File tree

5 files changed

+14
-28
lines changed

5 files changed

+14
-28
lines changed

include/net/bluetooth/bluetooth.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ struct bt_sock {
386386
enum {
387387
BT_SK_DEFER_SETUP,
388388
BT_SK_SUSPEND,
389+
BT_SK_PKT_STATUS
389390
};
390391

391392
struct bt_sock_list {
@@ -432,10 +433,6 @@ struct l2cap_ctrl {
432433
struct l2cap_chan *chan;
433434
};
434435

435-
struct sco_ctrl {
436-
u8 pkt_status;
437-
};
438-
439436
struct hci_dev;
440437

441438
typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status, u16 opcode);
@@ -466,9 +463,9 @@ struct bt_skb_cb {
466463
u8 force_active;
467464
u16 expect;
468465
u8 incoming:1;
466+
u8 pkt_status:2;
469467
union {
470468
struct l2cap_ctrl l2cap;
471-
struct sco_ctrl sco;
472469
struct hci_ctrl hci;
473470
struct mgmt_ctrl mgmt;
474471
struct scm_creds creds;
@@ -477,6 +474,7 @@ struct bt_skb_cb {
477474
#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
478475

479476
#define hci_skb_pkt_type(skb) bt_cb((skb))->pkt_type
477+
#define hci_skb_pkt_status(skb) bt_cb((skb))->pkt_status
480478
#define hci_skb_expect(skb) bt_cb((skb))->expect
481479
#define hci_skb_opcode(skb) bt_cb((skb))->hci.opcode
482480
#define hci_skb_event(skb) bt_cb((skb))->hci.req_event

include/net/bluetooth/sco.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,4 @@ struct sco_conninfo {
4646
__u8 dev_class[3];
4747
};
4848

49-
#define SCO_CMSG_PKT_STATUS 0x01
50-
5149
#endif /* __SCO_H */

net/bluetooth/af_bluetooth.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,8 +333,12 @@ int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
333333
bt_sk(sk)->skb_msg_name(skb, msg->msg_name,
334334
&msg->msg_namelen);
335335

336-
if (bt_sk(sk)->skb_put_cmsg)
337-
bt_sk(sk)->skb_put_cmsg(skb, msg, sk);
336+
if (test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags)) {
337+
u8 pkt_status = hci_skb_pkt_status(skb);
338+
339+
put_cmsg(msg, SOL_BLUETOOTH, BT_SCM_PKT_STATUS,
340+
sizeof(pkt_status), &pkt_status);
341+
}
338342
}
339343

340344
skb_free_datagram(sk, skb);

net/bluetooth/hci_core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3895,7 +3895,7 @@ static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
38953895

38963896
if (conn) {
38973897
/* Send to upper protocol */
3898-
bt_cb(skb)->sco.pkt_status = flags & 0x03;
3898+
hci_skb_pkt_status(skb) = flags & 0x03;
38993899
sco_recv_scodata(conn, skb);
39003900
return;
39013901
} else {

net/bluetooth/sco.c

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ struct sco_pinfo {
6868
bdaddr_t dst;
6969
__u32 flags;
7070
__u16 setting;
71-
__u8 cmsg_mask;
7271
struct bt_codec codec;
7372
struct sco_conn *conn;
7473
};
@@ -471,15 +470,6 @@ static void sco_sock_close(struct sock *sk)
471470
release_sock(sk);
472471
}
473472

474-
static void sco_skb_put_cmsg(struct sk_buff *skb, struct msghdr *msg,
475-
struct sock *sk)
476-
{
477-
if (sco_pi(sk)->cmsg_mask & SCO_CMSG_PKT_STATUS)
478-
put_cmsg(msg, SOL_BLUETOOTH, BT_SCM_PKT_STATUS,
479-
sizeof(bt_cb(skb)->sco.pkt_status),
480-
&bt_cb(skb)->sco.pkt_status);
481-
}
482-
483473
static void sco_sock_init(struct sock *sk, struct sock *parent)
484474
{
485475
BT_DBG("sk %p", sk);
@@ -488,8 +478,6 @@ static void sco_sock_init(struct sock *sk, struct sock *parent)
488478
sk->sk_type = parent->sk_type;
489479
bt_sk(sk)->flags = bt_sk(parent)->flags;
490480
security_sk_clone(parent, sk);
491-
} else {
492-
bt_sk(sk)->skb_put_cmsg = sco_skb_put_cmsg;
493481
}
494482
}
495483

@@ -907,9 +895,9 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname,
907895
}
908896

909897
if (opt)
910-
sco_pi(sk)->cmsg_mask |= SCO_CMSG_PKT_STATUS;
898+
set_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags);
911899
else
912-
sco_pi(sk)->cmsg_mask &= SCO_CMSG_PKT_STATUS;
900+
clear_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags);
913901
break;
914902

915903
case BT_CODEC:
@@ -1040,7 +1028,6 @@ static int sco_sock_getsockopt(struct socket *sock, int level, int optname,
10401028
int len, err = 0;
10411029
struct bt_voice voice;
10421030
u32 phys;
1043-
int pkt_status;
10441031
int buf_len;
10451032
struct codec_list *c;
10461033
u8 num_codecs, i, __user *ptr;
@@ -1094,9 +1081,8 @@ static int sco_sock_getsockopt(struct socket *sock, int level, int optname,
10941081
break;
10951082

10961083
case BT_PKT_STATUS:
1097-
pkt_status = (sco_pi(sk)->cmsg_mask & SCO_CMSG_PKT_STATUS);
1098-
1099-
if (put_user(pkt_status, (int __user *)optval))
1084+
if (put_user(test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags),
1085+
(int __user *)optval))
11001086
err = -EFAULT;
11011087
break;
11021088

0 commit comments

Comments
 (0)