mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
Bluetooth: Consolidate code around sk_alloc into a helper function
[ Upstream commit 6bfa273e53 ]
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>
Stable-dep-of: ce60b9231b66 ("Bluetooth: compute LE flow credits based on recvbuf space")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
80dea5ae7c
commit
1cfc3ab941
@@ -383,6 +383,8 @@ int bt_sock_register(int proto, const struct net_proto_family *ops);
|
|||||||
void bt_sock_unregister(int proto);
|
void bt_sock_unregister(int proto);
|
||||||
void bt_sock_link(struct bt_sock_list *l, struct sock *s);
|
void bt_sock_link(struct bt_sock_list *l, struct sock *s);
|
||||||
void bt_sock_unlink(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 bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||||
int flags);
|
int flags);
|
||||||
int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
|
int bt_sock_stream_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||||
|
|||||||
@@ -140,6 +140,27 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto,
|
|||||||
return err;
|
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)
|
void bt_sock_link(struct bt_sock_list *l, struct sock *sk)
|
||||||
{
|
{
|
||||||
write_lock(&l->lock);
|
write_lock(&l->lock);
|
||||||
|
|||||||
@@ -205,21 +205,13 @@ static int bnep_sock_create(struct net *net, struct socket *sock, int protocol,
|
|||||||
if (sock->type != SOCK_RAW)
|
if (sock->type != SOCK_RAW)
|
||||||
return -ESOCKTNOSUPPORT;
|
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)
|
if (!sk)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
sock_init_data(sock, sk);
|
|
||||||
|
|
||||||
sock->ops = &bnep_sock_ops;
|
sock->ops = &bnep_sock_ops;
|
||||||
|
|
||||||
sock->state = SS_UNCONNECTED;
|
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);
|
bt_sock_link(&bnep_sk_list, sk);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2144,18 +2144,12 @@ static int hci_sock_create(struct net *net, struct socket *sock, int protocol,
|
|||||||
|
|
||||||
sock->ops = &hci_sock_ops;
|
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)
|
if (!sk)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
sock_init_data(sock, sk);
|
|
||||||
|
|
||||||
sock_reset_flag(sk, SOCK_ZAPPED);
|
|
||||||
|
|
||||||
sk->sk_protocol = protocol;
|
|
||||||
|
|
||||||
sock->state = SS_UNCONNECTED;
|
sock->state = SS_UNCONNECTED;
|
||||||
sk->sk_state = BT_OPEN;
|
|
||||||
sk->sk_destruct = hci_sock_destruct;
|
sk->sk_destruct = hci_sock_destruct;
|
||||||
|
|
||||||
bt_sock_link(&hci_sk_list, sk);
|
bt_sock_link(&hci_sk_list, sk);
|
||||||
|
|||||||
@@ -695,21 +695,13 @@ static struct sock *iso_sock_alloc(struct net *net, struct socket *sock,
|
|||||||
{
|
{
|
||||||
struct sock *sk;
|
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)
|
if (!sk)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sock_init_data(sock, sk);
|
|
||||||
INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
|
|
||||||
|
|
||||||
sk->sk_destruct = iso_sock_destruct;
|
sk->sk_destruct = iso_sock_destruct;
|
||||||
sk->sk_sndtimeo = ISO_CONN_TIMEOUT;
|
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 */
|
/* Set address type as public as default src address is BDADDR_ANY */
|
||||||
iso_pi(sk)->src_type = BDADDR_LE_PUBLIC;
|
iso_pi(sk)->src_type = BDADDR_LE_PUBLIC;
|
||||||
|
|
||||||
|
|||||||
@@ -1847,21 +1847,13 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock,
|
|||||||
struct sock *sk;
|
struct sock *sk;
|
||||||
struct l2cap_chan *chan;
|
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)
|
if (!sk)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sock_init_data(sock, sk);
|
|
||||||
INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
|
|
||||||
|
|
||||||
sk->sk_destruct = l2cap_sock_destruct;
|
sk->sk_destruct = l2cap_sock_destruct;
|
||||||
sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
|
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();
|
chan = l2cap_chan_create();
|
||||||
if (!chan) {
|
if (!chan) {
|
||||||
sk_free(sk);
|
sk_free(sk);
|
||||||
|
|||||||
@@ -268,18 +268,16 @@ static struct proto rfcomm_proto = {
|
|||||||
.obj_size = sizeof(struct rfcomm_pinfo)
|
.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 rfcomm_dlc *d;
|
||||||
struct sock *sk;
|
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)
|
if (!sk)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sock_init_data(sock, sk);
|
|
||||||
INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
|
|
||||||
|
|
||||||
d = rfcomm_dlc_alloc(prio);
|
d = rfcomm_dlc_alloc(prio);
|
||||||
if (!d) {
|
if (!d) {
|
||||||
sk_free(sk);
|
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_sndbuf = RFCOMM_MAX_CREDITS * RFCOMM_DEFAULT_MTU * 10;
|
||||||
sk->sk_rcvbuf = 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_sock_link(&rfcomm_sk_list, sk);
|
||||||
|
|
||||||
BT_DBG("sk %p", sk);
|
BT_DBG("sk %p", sk);
|
||||||
|
|||||||
@@ -484,21 +484,13 @@ static struct sock *sco_sock_alloc(struct net *net, struct socket *sock,
|
|||||||
{
|
{
|
||||||
struct sock *sk;
|
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)
|
if (!sk)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sock_init_data(sock, sk);
|
|
||||||
INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
|
|
||||||
|
|
||||||
sk->sk_destruct = sco_sock_destruct;
|
sk->sk_destruct = sco_sock_destruct;
|
||||||
sk->sk_sndtimeo = SCO_CONN_TIMEOUT;
|
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)->setting = BT_VOICE_CVSD_16BIT;
|
||||||
sco_pi(sk)->codec.id = BT_CODEC_CVSD;
|
sco_pi(sk)->codec.id = BT_CODEC_CVSD;
|
||||||
sco_pi(sk)->codec.cid = 0xffff;
|
sco_pi(sk)->codec.cid = 0xffff;
|
||||||
|
|||||||
Reference in New Issue
Block a user