1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (c) 2024 Oracle and/or its affiliates.
5 * This header defines XDR data type primitives specified in
6 * Section 4 of RFC 4506, used by RPC programs implemented
10 #ifndef _SUNRPC_XDRGEN__BUILTINS_H_
11 #define _SUNRPC_XDRGEN__BUILTINS_H_
13 #include <linux/sunrpc/xdr.h>
16 xdrgen_decode_void(struct xdr_stream *xdr)
22 xdrgen_encode_void(struct xdr_stream *xdr)
28 xdrgen_decode_bool(struct xdr_stream *xdr, bool *ptr)
30 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT);
34 *ptr = (*p != xdr_zero);
39 xdrgen_encode_bool(struct xdr_stream *xdr, bool val)
41 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT);
45 *p = val ? xdr_one : xdr_zero;
50 xdrgen_decode_int(struct xdr_stream *xdr, s32 *ptr)
52 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT);
56 *ptr = be32_to_cpup(p);
61 xdrgen_encode_int(struct xdr_stream *xdr, s32 val)
63 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT);
67 *p = cpu_to_be32(val);
72 xdrgen_decode_unsigned_int(struct xdr_stream *xdr, u32 *ptr)
74 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT);
78 *ptr = be32_to_cpup(p);
83 xdrgen_encode_unsigned_int(struct xdr_stream *xdr, u32 val)
85 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT);
89 *p = cpu_to_be32(val);
94 xdrgen_decode_long(struct xdr_stream *xdr, s32 *ptr)
96 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT);
100 *ptr = be32_to_cpup(p);
105 xdrgen_encode_long(struct xdr_stream *xdr, s32 val)
107 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT);
111 *p = cpu_to_be32(val);
116 xdrgen_decode_unsigned_long(struct xdr_stream *xdr, u32 *ptr)
118 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT);
122 *ptr = be32_to_cpup(p);
127 xdrgen_encode_unsigned_long(struct xdr_stream *xdr, u32 val)
129 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT);
133 *p = cpu_to_be32(val);
138 xdrgen_decode_hyper(struct xdr_stream *xdr, s64 *ptr)
140 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT * 2);
144 *ptr = get_unaligned_be64(p);
149 xdrgen_encode_hyper(struct xdr_stream *xdr, s64 val)
151 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT * 2);
155 put_unaligned_be64(val, p);
160 xdrgen_decode_unsigned_hyper(struct xdr_stream *xdr, u64 *ptr)
162 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT * 2);
166 *ptr = get_unaligned_be64(p);
171 xdrgen_encode_unsigned_hyper(struct xdr_stream *xdr, u64 val)
173 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT * 2);
177 put_unaligned_be64(val, p);
182 xdrgen_decode_string(struct xdr_stream *xdr, string *ptr, u32 maxlen)
187 if (unlikely(xdr_stream_decode_u32(xdr, &len) < 0))
189 if (unlikely(maxlen && len > maxlen))
192 p = xdr_inline_decode(xdr, len);
195 ptr->data = (unsigned char *)p;
202 xdrgen_encode_string(struct xdr_stream *xdr, string val, u32 maxlen)
204 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT + xdr_align_size(val.len));
208 xdr_encode_opaque(p, val.data, val.len);
213 xdrgen_decode_opaque(struct xdr_stream *xdr, opaque *ptr, u32 maxlen)
218 if (unlikely(xdr_stream_decode_u32(xdr, &len) < 0))
220 if (unlikely(maxlen && len > maxlen))
223 p = xdr_inline_decode(xdr, len);
233 xdrgen_encode_opaque(struct xdr_stream *xdr, opaque val)
235 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT + xdr_align_size(val.len));
239 xdr_encode_opaque(p, val.data, val.len);
243 #endif /* _SUNRPC_XDRGEN__BUILTINS_H_ */