svc: Add xpo_prep_reply_hdr
authorTom Tucker <tom@opengridcomputing.com>
Mon, 31 Dec 2007 03:07:29 +0000 (21:07 -0600)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Fri, 1 Feb 2008 21:42:08 +0000 (16:42 -0500)
Some transports add fields to the RPC header for replies, e.g. the TCP
record length. This function is called when preparing the reply header
to allow each transport to add whatever fields it requires.

Signed-off-by: Tom Tucker <tom@opengridcomputing.com>
Acked-by: Neil Brown <neilb@suse.de>
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Greg Banks <gnb@sgi.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
include/linux/sunrpc/svc_xprt.h
net/sunrpc/svc.c
net/sunrpc/svcsock.c

index f032fb6b32e97c99e913ffc9ba4d55eab2625943..199cfcb9860b65b7ddbeb9622ee1392133931f5d 100644 (file)
@@ -11,6 +11,7 @@
 
 struct svc_xprt_ops {
        int             (*xpo_recvfrom)(struct svc_rqst *);
+       void            (*xpo_prep_reply_hdr)(struct svc_rqst *);
        int             (*xpo_sendto)(struct svc_rqst *);
        void            (*xpo_release_rqst)(struct svc_rqst *);
        void            (*xpo_detach)(struct svc_xprt *);
index 94eed9b800382321b1732d06b3e98d16bc615616..8281a040265245736f2cdec6f315b0d5a8147783 100644 (file)
@@ -840,9 +840,9 @@ svc_process(struct svc_rqst *rqstp)
        rqstp->rq_res.tail[0].iov_len = 0;
        /* Will be turned off only in gss privacy case: */
        rqstp->rq_splice_ok = 1;
-       /* tcp needs a space for the record length... */
-       if (rqstp->rq_prot == IPPROTO_TCP)
-               svc_putnl(resv, 0);
+
+       /* Setup reply header */
+       rqstp->rq_xprt->xpt_ops->xpo_prep_reply_hdr(rqstp);
 
        rqstp->rq_xid = svc_getu32(argv);
        svc_putu32(resv, rqstp->rq_xid);
index 44a729d6efeaf6e70b67113efcfe1084da8e98d0..492a1dc544f3bf484c4c257a3acb8224976b459d 100644 (file)
@@ -893,12 +893,17 @@ svc_udp_sendto(struct svc_rqst *rqstp)
        return error;
 }
 
+static void svc_udp_prep_reply_hdr(struct svc_rqst *rqstp)
+{
+}
+
 static struct svc_xprt_ops svc_udp_ops = {
        .xpo_recvfrom = svc_udp_recvfrom,
        .xpo_sendto = svc_udp_sendto,
        .xpo_release_rqst = svc_release_skb,
        .xpo_detach = svc_sock_detach,
        .xpo_free = svc_sock_free,
+       .xpo_prep_reply_hdr = svc_udp_prep_reply_hdr,
 };
 
 static struct svc_xprt_class svc_udp_class = {
@@ -1350,12 +1355,24 @@ svc_tcp_sendto(struct svc_rqst *rqstp)
        return sent;
 }
 
+/*
+ * Setup response header. TCP has a 4B record length field.
+ */
+static void svc_tcp_prep_reply_hdr(struct svc_rqst *rqstp)
+{
+       struct kvec *resv = &rqstp->rq_res.head[0];
+
+       /* tcp needs a space for the record length... */
+       svc_putnl(resv, 0);
+}
+
 static struct svc_xprt_ops svc_tcp_ops = {
        .xpo_recvfrom = svc_tcp_recvfrom,
        .xpo_sendto = svc_tcp_sendto,
        .xpo_release_rqst = svc_release_skb,
        .xpo_detach = svc_sock_detach,
        .xpo_free = svc_sock_free,
+       .xpo_prep_reply_hdr = svc_tcp_prep_reply_hdr,
 };
 
 static struct svc_xprt_class svc_tcp_class = {