Bluetooth: Add bt_skb_sendmmsg helper
commit 97e4e80299844bb5f6ce5a7540742ffbffae3d97 upstream. This works similarly to bt_skb_sendmsg but can split the msg into multiple skb fragments which is useful for stream sockets. 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>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
c87b2bc9d7
commit
3cce0e771f
@@ -450,6 +450,44 @@ static inline struct sk_buff *bt_skb_sendmsg(struct sock *sk,
|
|||||||
return skb;
|
return skb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Similar to bt_skb_sendmsg but can split the msg into multiple fragments
|
||||||
|
* accourding to the MTU.
|
||||||
|
*/
|
||||||
|
static inline struct sk_buff *bt_skb_sendmmsg(struct sock *sk,
|
||||||
|
struct msghdr *msg,
|
||||||
|
size_t len, size_t mtu,
|
||||||
|
size_t headroom, size_t tailroom)
|
||||||
|
{
|
||||||
|
struct sk_buff *skb, **frag;
|
||||||
|
|
||||||
|
skb = bt_skb_sendmsg(sk, msg, len, mtu, headroom, tailroom);
|
||||||
|
if (IS_ERR_OR_NULL(skb))
|
||||||
|
return skb;
|
||||||
|
|
||||||
|
len -= skb->len;
|
||||||
|
if (!len)
|
||||||
|
return skb;
|
||||||
|
|
||||||
|
/* Add remaining data over MTU as continuation fragments */
|
||||||
|
frag = &skb_shinfo(skb)->frag_list;
|
||||||
|
while (len) {
|
||||||
|
struct sk_buff *tmp;
|
||||||
|
|
||||||
|
tmp = bt_skb_sendmsg(sk, msg, len, mtu, headroom, tailroom);
|
||||||
|
if (IS_ERR_OR_NULL(tmp)) {
|
||||||
|
kfree_skb(skb);
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
len -= tmp->len;
|
||||||
|
|
||||||
|
*frag = tmp;
|
||||||
|
frag = &(*frag)->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return skb;
|
||||||
|
}
|
||||||
|
|
||||||
int bt_to_errno(u16 code);
|
int bt_to_errno(u16 code);
|
||||||
|
|
||||||
void hci_sock_set_flag(struct sock *sk, int nr);
|
void hci_sock_set_flag(struct sock *sk, int nr);
|
||||||
|
Reference in New Issue
Block a user