diff options
author | Willem de Bruijn <willemb@google.com> | 2016-04-07 11:44:58 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-11 15:31:33 -0400 |
commit | 1da8c681d5c122afe9fbadc02e92a0f9e3f7af44 (patch) | |
tree | 16d382daa5ef48f18f4afe6b0766d35a5a5f45b0 /net | |
parent | a6db4494d218c2e559173661ee972e048dc04fdd (diff) |
sunrpc: do not pull udp headers on receive
Commit e6afc8ace6dd modified the udp receive path by pulling the udp
header before queuing an skbuff onto the receive queue.
Sunrpc also calls skb_recv_datagram to dequeue an skb from a udp
socket. Modify this receive path to also no longer expect udp
headers.
Fixes: e6afc8ace6dd ("udp: remove headers from UDP packets before queueing")
Reported-by: Franklin S Cooper Jr. <fcooper@ti.com>
Signed-off-by: Willem de Bruijn <willemb@google.com>
Tested-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/sunrpc/socklib.c | 2 | ||||
-rw-r--r-- | net/sunrpc/svcsock.c | 5 | ||||
-rw-r--r-- | net/sunrpc/xprtsock.c | 5 |
3 files changed, 5 insertions, 7 deletions
diff --git a/net/sunrpc/socklib.c b/net/sunrpc/socklib.c index de70c78025d7..f217c348b341 100644 --- a/net/sunrpc/socklib.c +++ b/net/sunrpc/socklib.c | |||
@@ -155,7 +155,7 @@ int csum_partial_copy_to_xdr(struct xdr_buf *xdr, struct sk_buff *skb) | |||
155 | struct xdr_skb_reader desc; | 155 | struct xdr_skb_reader desc; |
156 | 156 | ||
157 | desc.skb = skb; | 157 | desc.skb = skb; |
158 | desc.offset = sizeof(struct udphdr); | 158 | desc.offset = 0; |
159 | desc.count = skb->len - desc.offset; | 159 | desc.count = skb->len - desc.offset; |
160 | 160 | ||
161 | if (skb_csum_unnecessary(skb)) | 161 | if (skb_csum_unnecessary(skb)) |
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 1413cdcc131c..71d6072664d2 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -617,7 +617,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
617 | svsk->sk_sk->sk_stamp = skb->tstamp; | 617 | svsk->sk_sk->sk_stamp = skb->tstamp; |
618 | set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); /* there may be more data... */ | 618 | set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); /* there may be more data... */ |
619 | 619 | ||
620 | len = skb->len - sizeof(struct udphdr); | 620 | len = skb->len; |
621 | rqstp->rq_arg.len = len; | 621 | rqstp->rq_arg.len = len; |
622 | 622 | ||
623 | rqstp->rq_prot = IPPROTO_UDP; | 623 | rqstp->rq_prot = IPPROTO_UDP; |
@@ -641,8 +641,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) | |||
641 | skb_free_datagram_locked(svsk->sk_sk, skb); | 641 | skb_free_datagram_locked(svsk->sk_sk, skb); |
642 | } else { | 642 | } else { |
643 | /* we can use it in-place */ | 643 | /* we can use it in-place */ |
644 | rqstp->rq_arg.head[0].iov_base = skb->data + | 644 | rqstp->rq_arg.head[0].iov_base = skb->data; |
645 | sizeof(struct udphdr); | ||
646 | rqstp->rq_arg.head[0].iov_len = len; | 645 | rqstp->rq_arg.head[0].iov_len = len; |
647 | if (skb_checksum_complete(skb)) | 646 | if (skb_checksum_complete(skb)) |
648 | goto out_free; | 647 | goto out_free; |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 65e759569e48..c1fc7b20bbc1 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -995,15 +995,14 @@ static void xs_udp_data_read_skb(struct rpc_xprt *xprt, | |||
995 | u32 _xid; | 995 | u32 _xid; |
996 | __be32 *xp; | 996 | __be32 *xp; |
997 | 997 | ||
998 | repsize = skb->len - sizeof(struct udphdr); | 998 | repsize = skb->len; |
999 | if (repsize < 4) { | 999 | if (repsize < 4) { |
1000 | dprintk("RPC: impossible RPC reply size %d!\n", repsize); | 1000 | dprintk("RPC: impossible RPC reply size %d!\n", repsize); |
1001 | return; | 1001 | return; |
1002 | } | 1002 | } |
1003 | 1003 | ||
1004 | /* Copy the XID from the skb... */ | 1004 | /* Copy the XID from the skb... */ |
1005 | xp = skb_header_pointer(skb, sizeof(struct udphdr), | 1005 | xp = skb_header_pointer(skb, 0, sizeof(_xid), &_xid); |
1006 | sizeof(_xid), &_xid); | ||
1007 | if (xp == NULL) | 1006 | if (xp == NULL) |
1008 | return; | 1007 | return; |
1009 | 1008 | ||