Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v6.12-rc3 243 lines 4.7 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Copyright (c) 2024 Oracle and/or its affiliates. 4 * 5 * This header defines XDR data type primitives specified in 6 * Section 4 of RFC 4506, used by RPC programs implemented 7 * in the Linux kernel. 8 */ 9 10#ifndef _SUNRPC_XDRGEN__BUILTINS_H_ 11#define _SUNRPC_XDRGEN__BUILTINS_H_ 12 13#include <linux/sunrpc/xdr.h> 14 15static inline bool 16xdrgen_decode_void(struct xdr_stream *xdr) 17{ 18 return true; 19} 20 21static inline bool 22xdrgen_encode_void(struct xdr_stream *xdr) 23{ 24 return true; 25} 26 27static inline bool 28xdrgen_decode_bool(struct xdr_stream *xdr, bool *ptr) 29{ 30 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT); 31 32 if (unlikely(!p)) 33 return false; 34 *ptr = (*p != xdr_zero); 35 return true; 36} 37 38static inline bool 39xdrgen_encode_bool(struct xdr_stream *xdr, bool val) 40{ 41 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT); 42 43 if (unlikely(!p)) 44 return false; 45 *p = val ? xdr_one : xdr_zero; 46 return true; 47} 48 49static inline bool 50xdrgen_decode_int(struct xdr_stream *xdr, s32 *ptr) 51{ 52 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT); 53 54 if (unlikely(!p)) 55 return false; 56 *ptr = be32_to_cpup(p); 57 return true; 58} 59 60static inline bool 61xdrgen_encode_int(struct xdr_stream *xdr, s32 val) 62{ 63 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT); 64 65 if (unlikely(!p)) 66 return false; 67 *p = cpu_to_be32(val); 68 return true; 69} 70 71static inline bool 72xdrgen_decode_unsigned_int(struct xdr_stream *xdr, u32 *ptr) 73{ 74 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT); 75 76 if (unlikely(!p)) 77 return false; 78 *ptr = be32_to_cpup(p); 79 return true; 80} 81 82static inline bool 83xdrgen_encode_unsigned_int(struct xdr_stream *xdr, u32 val) 84{ 85 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT); 86 87 if (unlikely(!p)) 88 return false; 89 *p = cpu_to_be32(val); 90 return true; 91} 92 93static inline bool 94xdrgen_decode_long(struct xdr_stream *xdr, s32 *ptr) 95{ 96 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT); 97 98 if (unlikely(!p)) 99 return false; 100 *ptr = be32_to_cpup(p); 101 return true; 102} 103 104static inline bool 105xdrgen_encode_long(struct xdr_stream *xdr, s32 val) 106{ 107 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT); 108 109 if (unlikely(!p)) 110 return false; 111 *p = cpu_to_be32(val); 112 return true; 113} 114 115static inline bool 116xdrgen_decode_unsigned_long(struct xdr_stream *xdr, u32 *ptr) 117{ 118 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT); 119 120 if (unlikely(!p)) 121 return false; 122 *ptr = be32_to_cpup(p); 123 return true; 124} 125 126static inline bool 127xdrgen_encode_unsigned_long(struct xdr_stream *xdr, u32 val) 128{ 129 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT); 130 131 if (unlikely(!p)) 132 return false; 133 *p = cpu_to_be32(val); 134 return true; 135} 136 137static inline bool 138xdrgen_decode_hyper(struct xdr_stream *xdr, s64 *ptr) 139{ 140 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT * 2); 141 142 if (unlikely(!p)) 143 return false; 144 *ptr = get_unaligned_be64(p); 145 return true; 146} 147 148static inline bool 149xdrgen_encode_hyper(struct xdr_stream *xdr, s64 val) 150{ 151 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT * 2); 152 153 if (unlikely(!p)) 154 return false; 155 put_unaligned_be64(val, p); 156 return true; 157} 158 159static inline bool 160xdrgen_decode_unsigned_hyper(struct xdr_stream *xdr, u64 *ptr) 161{ 162 __be32 *p = xdr_inline_decode(xdr, XDR_UNIT * 2); 163 164 if (unlikely(!p)) 165 return false; 166 *ptr = get_unaligned_be64(p); 167 return true; 168} 169 170static inline bool 171xdrgen_encode_unsigned_hyper(struct xdr_stream *xdr, u64 val) 172{ 173 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT * 2); 174 175 if (unlikely(!p)) 176 return false; 177 put_unaligned_be64(val, p); 178 return true; 179} 180 181static inline bool 182xdrgen_decode_string(struct xdr_stream *xdr, string *ptr, u32 maxlen) 183{ 184 __be32 *p; 185 u32 len; 186 187 if (unlikely(xdr_stream_decode_u32(xdr, &len) < 0)) 188 return false; 189 if (unlikely(maxlen && len > maxlen)) 190 return false; 191 if (len != 0) { 192 p = xdr_inline_decode(xdr, len); 193 if (unlikely(!p)) 194 return false; 195 ptr->data = (unsigned char *)p; 196 } 197 ptr->len = len; 198 return true; 199} 200 201static inline bool 202xdrgen_encode_string(struct xdr_stream *xdr, string val, u32 maxlen) 203{ 204 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT + xdr_align_size(val.len)); 205 206 if (unlikely(!p)) 207 return false; 208 xdr_encode_opaque(p, val.data, val.len); 209 return true; 210} 211 212static inline bool 213xdrgen_decode_opaque(struct xdr_stream *xdr, opaque *ptr, u32 maxlen) 214{ 215 __be32 *p; 216 u32 len; 217 218 if (unlikely(xdr_stream_decode_u32(xdr, &len) < 0)) 219 return false; 220 if (unlikely(maxlen && len > maxlen)) 221 return false; 222 if (len != 0) { 223 p = xdr_inline_decode(xdr, len); 224 if (unlikely(!p)) 225 return false; 226 ptr->data = (u8 *)p; 227 } 228 ptr->len = len; 229 return true; 230} 231 232static inline bool 233xdrgen_encode_opaque(struct xdr_stream *xdr, opaque val) 234{ 235 __be32 *p = xdr_reserve_space(xdr, XDR_UNIT + xdr_align_size(val.len)); 236 237 if (unlikely(!p)) 238 return false; 239 xdr_encode_opaque(p, val.data, val.len); 240 return true; 241} 242 243#endif /* _SUNRPC_XDRGEN__BUILTINS_H_ */