sunrpc: do not pull udp headers on receive
Commite6afc8ace6
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:e6afc8ace6
("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>
This commit is contained in:
Родитель
a6db4494d2
Коммит
1da8c681d5
|
@ -155,7 +155,7 @@ int csum_partial_copy_to_xdr(struct xdr_buf *xdr, struct sk_buff *skb)
|
|||
struct xdr_skb_reader desc;
|
||||
|
||||
desc.skb = skb;
|
||||
desc.offset = sizeof(struct udphdr);
|
||||
desc.offset = 0;
|
||||
desc.count = skb->len - desc.offset;
|
||||
|
||||
if (skb_csum_unnecessary(skb))
|
||||
|
|
|
@ -617,7 +617,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
|
|||
svsk->sk_sk->sk_stamp = skb->tstamp;
|
||||
set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags); /* there may be more data... */
|
||||
|
||||
len = skb->len - sizeof(struct udphdr);
|
||||
len = skb->len;
|
||||
rqstp->rq_arg.len = len;
|
||||
|
||||
rqstp->rq_prot = IPPROTO_UDP;
|
||||
|
@ -641,8 +641,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
|
|||
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||
} else {
|
||||
/* we can use it in-place */
|
||||
rqstp->rq_arg.head[0].iov_base = skb->data +
|
||||
sizeof(struct udphdr);
|
||||
rqstp->rq_arg.head[0].iov_base = skb->data;
|
||||
rqstp->rq_arg.head[0].iov_len = len;
|
||||
if (skb_checksum_complete(skb))
|
||||
goto out_free;
|
||||
|
|
|
@ -995,15 +995,14 @@ static void xs_udp_data_read_skb(struct rpc_xprt *xprt,
|
|||
u32 _xid;
|
||||
__be32 *xp;
|
||||
|
||||
repsize = skb->len - sizeof(struct udphdr);
|
||||
repsize = skb->len;
|
||||
if (repsize < 4) {
|
||||
dprintk("RPC: impossible RPC reply size %d!\n", repsize);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Copy the XID from the skb... */
|
||||
xp = skb_header_pointer(skb, sizeof(struct udphdr),
|
||||
sizeof(_xid), &_xid);
|
||||
xp = skb_header_pointer(skb, 0, sizeof(_xid), &_xid);
|
||||
if (xp == NULL)
|
||||
return;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче