mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
Bluetooth: Move stream receive functions to a shared location.
This allows streaming mode receive code to be shared between RFCOMM and L2CAP ERTM. Includes handling of non-linear socket buffers. (leftover pieces from 2.6.35 carried forward). Change-Id: If3c20f79c0a0ca1f7cff1ffd75de94cfdcb8e252 Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
This commit is contained in:
parent
ce704ef898
commit
c4306c11b3
1 changed files with 28 additions and 2 deletions
|
@ -387,7 +387,7 @@ int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|||
}
|
||||
|
||||
chunk = min_t(unsigned int, skb->len, size);
|
||||
if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) {
|
||||
if (skb_copy_datagram_iovec(skb, 0, msg->msg_iov, chunk)) {
|
||||
skb_queue_head(&sk->sk_receive_queue, skb);
|
||||
if (!copied)
|
||||
copied = -EFAULT;
|
||||
|
@ -399,7 +399,33 @@ int bt_sock_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|||
sock_recv_ts_and_drops(msg, sk, skb);
|
||||
|
||||
if (!(flags & MSG_PEEK)) {
|
||||
skb_pull(skb, chunk);
|
||||
int skb_len = skb_headlen(skb);
|
||||
|
||||
if (chunk <= skb_len) {
|
||||
__skb_pull(skb, chunk);
|
||||
} else {
|
||||
struct sk_buff *frag;
|
||||
|
||||
__skb_pull(skb, skb_len);
|
||||
chunk -= skb_len;
|
||||
|
||||
skb_walk_frags(skb, frag) {
|
||||
if (chunk <= frag->len) {
|
||||
/* Pulling partial data */
|
||||
skb->len -= chunk;
|
||||
skb->data_len -= chunk;
|
||||
__skb_pull(frag, chunk);
|
||||
break;
|
||||
} else if (frag->len) {
|
||||
/* Pulling all frag data */
|
||||
chunk -= frag->len;
|
||||
skb->len -= frag->len;
|
||||
skb->data_len -= frag->len;
|
||||
__skb_pull(frag, frag->len);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (skb->len) {
|
||||
skb_queue_head(&sk->sk_receive_queue, skb);
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue