1/* $NetBSD: rpc_msg.h,v 1.11 2000/06/02 22:57:56 fvdl Exp $ */
2
3/*-
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 * Copyright (c) 2009, Sun Microsystems, Inc.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 * - Redistributions of source code must retain the above copyright notice,
12 * this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above copyright notice,
14 * this list of conditions and the following disclaimer in the documentation
15 * and/or other materials provided with the distribution.
16 * - Neither the name of Sun Microsystems, Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived
18 * from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33/*
34 * rpc_msg.h
35 * rpc message definition
36 *
37 * Copyright (C) 1984, Sun Microsystems, Inc.
38 */
39
40#ifndef _RPC_RPC_MSG_H
41#define _RPC_RPC_MSG_H
42
43#define RPC_MSG_VERSION ((u_int32_t) 2)
44#define RPC_SERVICE_PORT ((u_short) 2048)
45
46/*
47 * Bottom up definition of an rpc message.
48 * NOTE: call and reply use the same overall struct but
49 * different parts of unions within it.
50 */
51
52enum msg_type {
53 CALL=0,
54 REPLY=1
55};
56
57enum reply_stat {
58 MSG_ACCEPTED=0,
59 MSG_DENIED=1
60};
61
62enum accept_stat {
63 SUCCESS=0,
64 PROG_UNAVAIL=1,
65 PROG_MISMATCH=2,
66 PROC_UNAVAIL=3,
67 GARBAGE_ARGS=4,
68 SYSTEM_ERR=5
69};
70
71enum reject_stat {
72 RPC_MISMATCH=0,
73 AUTH_ERROR=1
74};
75
76/*
77 * Reply part of an rpc exchange
78 */
79
80/*
81 * Reply to an rpc request that was accepted by the server.
82 * Note: there could be an error even though the request was
83 * accepted.
84 */
85struct accepted_reply {
86 struct opaque_auth ar_verf;
87 enum accept_stat ar_stat;
88 union {
89 struct {
90 rpcvers_t low;
91 rpcvers_t high;
92 } AR_versions;
93 struct {
94 caddr_t where;
95 xdrproc_t proc;
96 } AR_results;
97 /* and many other null cases */
98 } ru;
99#define ar_results ru.AR_results
100#define ar_vers ru.AR_versions
101};
102
103/*
104 * Reply to an rpc request that was rejected by the server.
105 */
106struct rejected_reply {
107 enum reject_stat rj_stat;
108 union {
109 struct {
110 rpcvers_t low;
111 rpcvers_t high;
112 } RJ_versions;
113 enum auth_stat RJ_why; /* why authentication did not work */
114 } ru;
115#define rj_vers ru.RJ_versions
116#define rj_why ru.RJ_why
117};
118
119/*
120 * Body of a reply to an rpc request.
121 */
122struct reply_body {
123 enum reply_stat rp_stat;
124 union {
125 struct accepted_reply RP_ar;
126 struct rejected_reply RP_dr;
127 } ru;
128#define rp_acpt ru.RP_ar
129#define rp_rjct ru.RP_dr
130};
131
132/*
133 * Body of an rpc request call.
134 */
135struct call_body {
136 rpcvers_t cb_rpcvers; /* must be equal to two */
137 rpcprog_t cb_prog;
138 rpcvers_t cb_vers;
139 rpcproc_t cb_proc;
140 struct opaque_auth cb_cred;
141 struct opaque_auth cb_verf; /* protocol specific - provided by client */
142};
143
144/*
145 * The rpc message
146 */
147struct rpc_msg {
148 u_int32_t rm_xid;
149 enum msg_type rm_direction;
150 union {
151 struct call_body RM_cmb;
152 struct reply_body RM_rmb;
153 } ru;
154#define rm_call ru.RM_cmb
155#define rm_reply ru.RM_rmb
156};
157#define acpted_rply ru.RM_rmb.ru.RP_ar
158#define rjcted_rply ru.RM_rmb.ru.RP_dr
159
160__BEGIN_DECLS
161/*
162 * XDR routine to handle a rpc message.
163 * xdr_callmsg(xdrs, cmsg)
164 * XDR *xdrs;
165 * struct rpc_msg *cmsg;
166 */
167extern bool_t xdr_callmsg(XDR *, struct rpc_msg *);
168
169/*
170 * XDR routine to pre-serialize the static part of a rpc message.
171 * xdr_callhdr(xdrs, cmsg)
172 * XDR *xdrs;
173 * struct rpc_msg *cmsg;
174 */
175extern bool_t xdr_callhdr(XDR *, struct rpc_msg *);
176
177/*
178 * XDR routine to handle a rpc reply.
179 * xdr_replymsg(xdrs, rmsg)
180 * XDR *xdrs;
181 * struct rpc_msg *rmsg;
182 */
183extern bool_t xdr_replymsg(XDR *, struct rpc_msg *);
184
185
186/*
187 * XDR routine to handle an accepted rpc reply.
188 * xdr_accepted_reply(xdrs, rej)
189 * XDR *xdrs;
190 * struct accepted_reply *rej;
191 */
192extern bool_t xdr_accepted_reply(XDR *, struct accepted_reply *);
193
194/*
195 * XDR routine to handle a rejected rpc reply.
196 * xdr_rejected_reply(xdrs, rej)
197 * XDR *xdrs;
198 * struct rejected_reply *rej;
199 */
200extern bool_t xdr_rejected_reply(XDR *, struct rejected_reply *);
201
202/*
203 * Fills in the error part of a reply message.
204 * _seterr_reply(msg, error)
205 * struct rpc_msg *msg;
206 * struct rpc_err *error;
207 */
208extern void _seterr_reply(struct rpc_msg *, struct rpc_err *);
209__END_DECLS
210
211#endif /* !_RPC_RPC_MSG_H */