aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc')
-rw-r--r--net/sunrpc/svc.c6
-rw-r--r--net/sunrpc/svcsock.c17
2 files changed, 20 insertions, 3 deletions
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index 94eed9b80038..8281a0402652 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -840,9 +840,9 @@ svc_process(struct svc_rqst *rqstp)
840 rqstp->rq_res.tail[0].iov_len = 0; 840 rqstp->rq_res.tail[0].iov_len = 0;
841 /* Will be turned off only in gss privacy case: */ 841 /* Will be turned off only in gss privacy case: */
842 rqstp->rq_splice_ok = 1; 842 rqstp->rq_splice_ok = 1;
843 /* tcp needs a space for the record length... */ 843
844 if (rqstp->rq_prot == IPPROTO_TCP) 844 /* Setup reply header */
845 svc_putnl(resv, 0); 845 rqstp->rq_xprt->xpt_ops->xpo_prep_reply_hdr(rqstp);
846 846
847 rqstp->rq_xid = svc_getu32(argv); 847 rqstp->rq_xid = svc_getu32(argv);
848 svc_putu32(resv, rqstp->rq_xid); 848 svc_putu32(resv, rqstp->rq_xid);
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index 44a729d6efea..492a1dc544f3 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -893,12 +893,17 @@ svc_udp_sendto(struct svc_rqst *rqstp)
893 return error; 893 return error;
894} 894}
895 895
896static void svc_udp_prep_reply_hdr(struct svc_rqst *rqstp)
897{
898}
899
896static struct svc_xprt_ops svc_udp_ops = { 900static struct svc_xprt_ops svc_udp_ops = {
897 .xpo_recvfrom = svc_udp_recvfrom, 901 .xpo_recvfrom = svc_udp_recvfrom,
898 .xpo_sendto = svc_udp_sendto, 902 .xpo_sendto = svc_udp_sendto,
899 .xpo_release_rqst = svc_release_skb, 903 .xpo_release_rqst = svc_release_skb,
900 .xpo_detach = svc_sock_detach, 904 .xpo_detach = svc_sock_detach,
901 .xpo_free = svc_sock_free, 905 .xpo_free = svc_sock_free,
906 .xpo_prep_reply_hdr = svc_udp_prep_reply_hdr,
902}; 907};
903 908
904static struct svc_xprt_class svc_udp_class = { 909static struct svc_xprt_class svc_udp_class = {
@@ -1350,12 +1355,24 @@ svc_tcp_sendto(struct svc_rqst *rqstp)
1350 return sent; 1355 return sent;
1351} 1356}
1352 1357
1358/*
1359 * Setup response header. TCP has a 4B record length field.
1360 */
1361static void svc_tcp_prep_reply_hdr(struct svc_rqst *rqstp)
1362{
1363 struct kvec *resv = &rqstp->rq_res.head[0];
1364
1365 /* tcp needs a space for the record length... */
1366 svc_putnl(resv, 0);
1367}
1368
1353static struct svc_xprt_ops svc_tcp_ops = { 1369static struct svc_xprt_ops svc_tcp_ops = {
1354 .xpo_recvfrom = svc_tcp_recvfrom, 1370 .xpo_recvfrom = svc_tcp_recvfrom,
1355 .xpo_sendto = svc_tcp_sendto, 1371 .xpo_sendto = svc_tcp_sendto,
1356 .xpo_release_rqst = svc_release_skb, 1372 .xpo_release_rqst = svc_release_skb,
1357 .xpo_detach = svc_sock_detach, 1373 .xpo_detach = svc_sock_detach,
1358 .xpo_free = svc_sock_free, 1374 .xpo_free = svc_sock_free,
1375 .xpo_prep_reply_hdr = svc_tcp_prep_reply_hdr,
1359}; 1376};
1360 1377
1361static struct svc_xprt_class svc_tcp_class = { 1378static struct svc_xprt_class svc_tcp_class = {