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:
parent
c87b2bc9d7
commit
3cce0e771f
@ -450,6 +450,44 @@ static inline struct sk_buff *bt_skb_sendmsg(struct sock *sk,
|
||||
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);
|
||||
|
||||
void hci_sock_set_flag(struct sock *sk, int nr);
|
||||
|
Loading…
Reference in New Issue
Block a user