Bluetooth: Consolidate code around sk_alloc into a helper function
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 25 May 2023 23:46:41 +0000 (16:46 -0700)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 11 Aug 2023 18:36:50 +0000 (11:36 -0700)
This consolidates code around sk_alloc into bt_sock_alloc which does
take care of common initialization.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
include/net/bluetooth/bluetooth.h
net/bluetooth/af_bluetooth.c
net/bluetooth/bnep/sock.c
net/bluetooth/hci_sock.c
net/bluetooth/iso.c
net/bluetooth/l2cap_sock.c
net/bluetooth/rfcomm/sock.c
net/bluetooth/sco.c

index af72985..60689a0 100644 (file)
@@ -400,6 +400,8 @@ int  bt_sock_register(int proto, const struct net_proto_family *ops);
 void bt_sock_unregister(int proto);
 void bt_sock_link(struct bt_sock_list *l, struct sock *s);
 void bt_sock_unlink(struct bt_sock_list *l, struct sock *s);
+struct sock *bt_sock_alloc(struct net *net, struct socket *sock,
+                          struct proto *prot, int proto, gfp_t prio, int kern);
 int  bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
                     int flags);
 int  bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
index 1c3c7ff..6035422 100644 (file)
@@ -140,6 +140,27 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto,
        return err;
 }
 
+struct sock *bt_sock_alloc(struct net *net, struct socket *sock,
+                          struct proto *prot, int proto, gfp_t prio, int kern)
+{
+       struct sock *sk;
+
+       sk = sk_alloc(net, PF_BLUETOOTH, prio, prot, kern);
+       if (!sk)
+               return NULL;
+
+       sock_init_data(sock, sk);
+       INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
+
+       sock_reset_flag(sk, SOCK_ZAPPED);
+
+       sk->sk_protocol = proto;
+       sk->sk_state    = BT_OPEN;
+
+       return sk;
+}
+EXPORT_SYMBOL(bt_sock_alloc);
+
 void bt_sock_link(struct bt_sock_list *l, struct sock *sk)
 {
        write_lock(&l->lock);
index 57d509d..00d47bc 100644 (file)
@@ -205,21 +205,13 @@ static int bnep_sock_create(struct net *net, struct socket *sock, int protocol,
        if (sock->type != SOCK_RAW)
                return -ESOCKTNOSUPPORT;
 
-       sk = sk_alloc(net, PF_BLUETOOTH, GFP_ATOMIC, &bnep_proto, kern);
+       sk = bt_sock_alloc(net, sock, &bnep_proto, protocol, GFP_ATOMIC, kern);
        if (!sk)
                return -ENOMEM;
 
-       sock_init_data(sock, sk);
-
        sock->ops = &bnep_sock_ops;
-
        sock->state = SS_UNCONNECTED;
 
-       sock_reset_flag(sk, SOCK_ZAPPED);
-
-       sk->sk_protocol = protocol;
-       sk->sk_state    = BT_OPEN;
-
        bt_sock_link(&bnep_sk_list, sk);
        return 0;
 }
index 1d249d8..9c45586 100644 (file)
@@ -2143,18 +2143,12 @@ static int hci_sock_create(struct net *net, struct socket *sock, int protocol,
 
        sock->ops = &hci_sock_ops;
 
-       sk = sk_alloc(net, PF_BLUETOOTH, GFP_ATOMIC, &hci_sk_proto, kern);
+       sk = bt_sock_alloc(net, sock, &hci_sk_proto, protocol, GFP_ATOMIC,
+                          kern);
        if (!sk)
                return -ENOMEM;
 
-       sock_init_data(sock, sk);
-
-       sock_reset_flag(sk, SOCK_ZAPPED);
-
-       sk->sk_protocol = protocol;
-
        sock->state = SS_UNCONNECTED;
-       sk->sk_state = BT_OPEN;
        sk->sk_destruct = hci_sock_destruct;
 
        bt_sock_link(&hci_sk_list, sk);
index 5db4d68..84d238d 100644 (file)
@@ -738,21 +738,13 @@ static struct sock *iso_sock_alloc(struct net *net, struct socket *sock,
 {
        struct sock *sk;
 
-       sk = sk_alloc(net, PF_BLUETOOTH, prio, &iso_proto, kern);
+       sk = bt_sock_alloc(net, sock, &iso_proto, proto, prio, kern);
        if (!sk)
                return NULL;
 
-       sock_init_data(sock, sk);
-       INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
-
        sk->sk_destruct = iso_sock_destruct;
        sk->sk_sndtimeo = ISO_CONN_TIMEOUT;
 
-       sock_reset_flag(sk, SOCK_ZAPPED);
-
-       sk->sk_protocol = proto;
-       sk->sk_state    = BT_OPEN;
-
        /* Set address type as public as default src address is BDADDR_ANY */
        iso_pi(sk)->src_type = BDADDR_LE_PUBLIC;
 
index 947ca58..9ef936f 100644 (file)
@@ -1858,21 +1858,13 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
        struct sock *sk;
        struct l2cap_chan *chan;
 
-       sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto, kern);
+       sk = bt_sock_alloc(net, sock, &l2cap_proto, proto, prio, kern);
        if (!sk)
                return NULL;
 
-       sock_init_data(sock, sk);
-       INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
-
        sk->sk_destruct = l2cap_sock_destruct;
        sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
 
-       sock_reset_flag(sk, SOCK_ZAPPED);
-
-       sk->sk_protocol = proto;
-       sk->sk_state = BT_OPEN;
-
        chan = l2cap_chan_create();
        if (!chan) {
                sk_free(sk);
index 4397e14..b54e8a5 100644 (file)
@@ -268,18 +268,16 @@ static struct proto rfcomm_proto = {
        .obj_size       = sizeof(struct rfcomm_pinfo)
 };
 
-static struct sock *rfcomm_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio, int kern)
+static struct sock *rfcomm_sock_alloc(struct net *net, struct socket *sock,
+                                     int proto, gfp_t prio, int kern)
 {
        struct rfcomm_dlc *d;
        struct sock *sk;
 
-       sk = sk_alloc(net, PF_BLUETOOTH, prio, &rfcomm_proto, kern);
+       sk = bt_sock_alloc(net, sock, &rfcomm_proto, proto, prio, kern);
        if (!sk)
                return NULL;
 
-       sock_init_data(sock, sk);
-       INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
-
        d = rfcomm_dlc_alloc(prio);
        if (!d) {
                sk_free(sk);
@@ -298,11 +296,6 @@ static struct sock *rfcomm_sock_alloc(struct net *net, struct socket *sock, int
        sk->sk_sndbuf = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
        sk->sk_rcvbuf = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
 
-       sock_reset_flag(sk, SOCK_ZAPPED);
-
-       sk->sk_protocol = proto;
-       sk->sk_state    = BT_OPEN;
-
        bt_sock_link(&rfcomm_sk_list, sk);
 
        BT_DBG("sk %p", sk);
index 7762604..ec6dce4 100644 (file)
@@ -504,21 +504,13 @@ static struct sock *sco_sock_alloc(struct net *net, struct socket *sock,
 {
        struct sock *sk;
 
-       sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto, kern);
+       sk = bt_sock_alloc(net, sock, &sco_proto, proto, prio, kern);
        if (!sk)
                return NULL;
 
-       sock_init_data(sock, sk);
-       INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
-
        sk->sk_destruct = sco_sock_destruct;
        sk->sk_sndtimeo = SCO_CONN_TIMEOUT;
 
-       sock_reset_flag(sk, SOCK_ZAPPED);
-
-       sk->sk_protocol = proto;
-       sk->sk_state    = BT_OPEN;
-
        sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT;
        sco_pi(sk)->codec.id = BT_CODEC_CVSD;
        sco_pi(sk)->codec.cid = 0xffff;