]> git.baikalelectronics.ru Git - kernel.git/commitdiff
Bluetooth: Add bt_skb_sendmsg helper
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 3 Sep 2021 22:27:29 +0000 (15:27 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 29 Jul 2022 15:14:18 +0000 (17:14 +0200)
commit 1b696bf223cdab8b76a67e8a3568d2f0acb51b77 upstream.

bt_skb_sendmsg helps takes care of allocation the skb and copying the
the contents of msg over to the skb while checking for possible errors
so it should be safe to call it without holding lock_sock.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Cc: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
include/net/bluetooth/bluetooth.h

index fabee6db0abb78ea826cc97d52c622614db900a0..457e4cdf539b661f0166baa4928f9a24d3274e39 100644 (file)
@@ -370,6 +370,34 @@ out:
        return NULL;
 }
 
+/* Shall not be called with lock_sock held */
+static inline struct sk_buff *bt_skb_sendmsg(struct sock *sk,
+                                            struct msghdr *msg,
+                                            size_t len, size_t mtu,
+                                            size_t headroom, size_t tailroom)
+{
+       struct sk_buff *skb;
+       size_t size = min_t(size_t, len, mtu);
+       int err;
+
+       skb = bt_skb_send_alloc(sk, size + headroom + tailroom,
+                               msg->msg_flags & MSG_DONTWAIT, &err);
+       if (!skb)
+               return ERR_PTR(err);
+
+       skb_reserve(skb, headroom);
+       skb_tailroom_reserve(skb, mtu, tailroom);
+
+       if (!copy_from_iter_full(skb_put(skb, size), size, &msg->msg_iter)) {
+               kfree_skb(skb);
+               return ERR_PTR(-EFAULT);
+       }
+
+       skb->priority = sk->sk_priority;
+
+       return skb;
+}
+
 int bt_to_errno(u16 code);
 
 void hci_sock_set_flag(struct sock *sk, int nr);