1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * include/linux/sunrpc/xdr.h
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de>
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _SUNRPC_XDR_H_
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _SUNRPC_XDR_H_
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/uio.h>
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/byteorder.h>
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Buffer adjustment
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define XDR_QUADLEN(l)		(((l) + 3) >> 2)
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Generic opaque `network object.' At the kernel level, this type
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is used only by lockd.
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define XDR_MAX_NETOBJ		1024
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct xdr_netobj {
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int		len;
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	u8 *			data;
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This is the generic XDR function. rqstp is either a rpc_rqst (client
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * side) or svc_rqst pointer (server side).
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Encode functions always assume there's enough room in the buffer.
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int	(*kxdrproc_t)(void *rqstp, u32 *data, void *obj);
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Basic structure for transmission/reception of a client XDR message.
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Features a header (for a linear buffer containing RPC headers
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * and the data payload for short messages), and then an array of
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * pages.
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The tail iovec allows you to append data after the page array. Its
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * main interest is for appending padding to the pages in order to
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * satisfy the int_32-alignment requirements in RFC1832.
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * For the future, we might want to string several of these together
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * in a list if anybody wants to make use of NFSv4 COMPOUND
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * operations and/or has a need for scatter/gather involving pages.
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct xdr_buf {
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct kvec	head[1],	/* RPC header + non-page data */
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			tail[1];	/* Appended after page data */
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct page **	pages;		/* Array of contiguous pages */
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int	page_base,	/* Start of page data */
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			page_len;	/* Length of page data */
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int	buflen,		/* Total length of storage buffer */
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			len;		/* Length of XDR encoded message */
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * pre-xdr'ed macros.
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	xdr_zero	__constant_htonl(0)
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	xdr_one		__constant_htonl(1)
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	xdr_two		__constant_htonl(2)
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_success		__constant_htonl(RPC_SUCCESS)
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_prog_unavail	__constant_htonl(RPC_PROG_UNAVAIL)
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_prog_mismatch	__constant_htonl(RPC_PROG_MISMATCH)
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_proc_unavail	__constant_htonl(RPC_PROC_UNAVAIL)
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_garbage_args	__constant_htonl(RPC_GARBAGE_ARGS)
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_system_err		__constant_htonl(RPC_SYSTEM_ERR)
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_auth_ok		__constant_htonl(RPC_AUTH_OK)
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_autherr_badcred	__constant_htonl(RPC_AUTH_BADCRED)
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_autherr_rejectedcred __constant_htonl(RPC_AUTH_REJECTEDCRED)
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_autherr_badverf	__constant_htonl(RPC_AUTH_BADVERF)
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_autherr_rejectedverf __constant_htonl(RPC_AUTH_REJECTEDVERF)
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_autherr_tooweak	__constant_htonl(RPC_AUTH_TOOWEAK)
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpcsec_gsserr_credproblem	__constant_htonl(RPCSEC_GSS_CREDPROBLEM)
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpcsec_gsserr_ctxproblem	__constant_htonl(RPCSEC_GSS_CTXPROBLEM)
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define	rpc_autherr_oldseqnum	__constant_htonl(101)
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Miscellaneous XDR helper functions
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruu32 *	xdr_encode_opaque_fixed(u32 *p, const void *ptr, unsigned int len);
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruu32 *	xdr_encode_opaque(u32 *p, const void *ptr, unsigned int len);
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruu32 *	xdr_encode_string(u32 *p, const char *s);
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruu32 *	xdr_decode_string_inplace(u32 *p, char **sp, int *lenp, int maxlen);
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruu32 *	xdr_encode_netobj(u32 *p, const struct xdr_netobj *);
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruu32 *	xdr_decode_netobj(u32 *p, struct xdr_netobj *);
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid	xdr_encode_pages(struct xdr_buf *, struct page **, unsigned int,
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			 unsigned int);
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid	xdr_inline_pages(struct xdr_buf *, unsigned int,
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			 struct page **, unsigned int, unsigned int);
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline u32 *xdr_encode_array(u32 *p, const void *s, unsigned int len)
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return xdr_encode_opaque(p, s, len);
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Decode 64bit quantities (NFSv3 support)
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline u32 *
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruxdr_encode_hyper(u32 *p, __u64 val)
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	*p++ = htonl(val >> 32);
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	*p++ = htonl(val & 0xFFFFFFFF);
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return p;
117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline u32 *
120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruxdr_decode_hyper(u32 *p, __u64 *valp)
121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	*valp  = ((__u64) ntohl(*p++)) << 32;
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	*valp |= ntohl(*p++);
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return p;
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Adjust kvec to reflect end of xdr'ed data (RPC client XDR)
129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int
131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruxdr_adjust_iovec(struct kvec *iov, u32 *p)
132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return iov->iov_len = ((u8 *) p - (u8 *) iov->iov_base);
134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * XDR buffer helper functions
138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void xdr_shift_buf(struct xdr_buf *, size_t);
140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void xdr_buf_from_iov(struct kvec *, struct xdr_buf *);
141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int xdr_buf_subsegment(struct xdr_buf *, struct xdr_buf *, int, int);
142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int xdr_buf_read_netobj(struct xdr_buf *, struct xdr_netobj *, int);
143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int read_bytes_from_xdr_buf(struct xdr_buf *, int, void *, int);
144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int write_bytes_to_xdr_buf(struct xdr_buf *, int, void *, int);
145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Helper structure for copying from an sk_buff.
148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct {
150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct sk_buff	*skb;
151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int	offset;
152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	size_t		count;
153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int	csum;
154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} skb_reader_t;
155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef size_t (*skb_read_actor_t)(skb_reader_t *desc, void *to, size_t len);
157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int csum_partial_copy_to_xdr(struct xdr_buf *, struct sk_buff *);
159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern ssize_t xdr_partial_copy_from_skb(struct xdr_buf *, unsigned int,
160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		skb_reader_t *, skb_read_actor_t);
161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int xdr_encode_word(struct xdr_buf *, int, u32);
163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int xdr_decode_word(struct xdr_buf *, int, u32 *);
164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct xdr_array2_desc;
166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef int (*xdr_xcode_elem_t)(struct xdr_array2_desc *desc, void *elem);
167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct xdr_array2_desc {
168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int elem_size;
169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int array_len;
170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int array_maxlen;
171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	xdr_xcode_elem_t xcode;
172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int xdr_decode_array2(struct xdr_buf *buf, unsigned int base,
175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru                             struct xdr_array2_desc *desc);
176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int xdr_encode_array2(struct xdr_buf *buf, unsigned int base,
177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			     struct xdr_array2_desc *desc);
178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Provide some simple tools for XDR buffer overflow-checking etc.
181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct xdr_stream {
183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	uint32_t *p;		/* start of available buffer */
184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct xdr_buf *buf;	/* XDR buffer to read/write */
185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	uint32_t *end;		/* end of available buffer space */
187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct kvec *iov;	/* pointer to the current kvec */
188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p);
191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern uint32_t *xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes);
192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages,
193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		unsigned int base, unsigned int len);
194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p);
195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern uint32_t *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes);
196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void xdr_read_pages(struct xdr_stream *xdr, unsigned int len);
197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len);
198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */
200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _SUNRPC_XDR_H_ */
202