1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
enum gp_rpc_auth_flavor {
GP_RPC_AUTH_NONE = 0,
GP_RPC_AUTH_SYS = 1,
GP_RPC_AUTH_SHORT = 2,
GP_RPC_AUTH_DH = 3,
GP_RPC_RPCSEC_GSS = 6
/* and more to be defined */
};
struct gp_rpc_opaque_auth {
gp_rpc_auth_flavor flavor;
opaque body<400>;
};
enum gp_rpc_msg_type {
GP_RPC_CALL = 0,
GP_RPC_REPLY = 1
};
enum gp_rpc_reply_status {
GP_RPC_MSG_ACCEPTED = 0,
GP_RPC_MSG_DENIED = 1
};
enum gp_rpc_accept_status {
GP_RPC_SUCCESS = 0, /* RPC executed successfully */
GP_RPC_PROG_UNAVAIL = 1, /* remote hasn't exported program */
GP_RPC_PROG_MISMATCH = 2, /* remote can't support version # */
GP_RPC_PROC_UNAVAIL = 3, /* program can't support procedure */
GP_RPC_GARBAGE_ARGS = 4, /* procedure can't decode params */
GP_RPC_SYSTEM_ERR = 5 /* e.g. memory allocation failure */
};
enum gp_rpc_reject_status {
GP_RPC_RPC_MISMATCH = 0, /* RPC version number != 2 */
GP_RPC_AUTH_ERROR = 1 /* remote can't authenticate caller */
};
enum gp_rpc_auth_status {
GP_RPC_AUTH_OK = 0, /* success */
/*
* failed at remote end
*/
GP_RPC_AUTH_BADCRED = 1, /* bad credential (seal broken) */
GP_RPC_AUTH_REJECTEDCRED = 2, /* client must begin new session */
GP_RPC_AUTH_BADVERF = 3, /* bad verifier (seal broken) */
GP_RPC_AUTH_REJECTEDVERF = 4, /* verifier expired or replayed */
GP_RPC_AUTH_TOOWEAK = 5, /* rejected for security reasons */
/*
* failed locally
*/
GP_RPC_AUTH_INVALIDRESP = 6, /* bogus response verifier */
GP_RPC_AUTH_FAILED = 7, /* reason unknown */
/*
* AUTH_KERB errors; deprecated. See [RFC2695]
*/
GP_RPC_AUTH_KERB_GENERIC = 8, /* kerberos generic error */
GP_RPC_AUTH_TIMEEXPIRE = 9, /* time of credential expired */
GP_RPC_AUTH_TKT_FILE = 10, /* problem with ticket file */
GP_RPC_AUTH_DECODE = 11, /* can't decode authenticator */
GP_RPC_AUTH_NET_ADDR = 12, /* wrong net address in ticket */
/*
* RPCSEC_GSS GSS related errors
*/
GP_RPC_RPCSEC_GSS_CREDPROBLEM = 13, /* no credentials for user */
GP_RPC_RPCSEC_GSS_CTXPROBLEM = 14 /* problem with context */
};
struct gp_rpc_mismatch_info {
unsigned int low;
unsigned int high;
};
union gp_rpc_reply_union switch (gp_rpc_accept_status status) {
case GP_RPC_SUCCESS:
opaque results[0];
/*
* procedure-specific results start here
*/
case GP_RPC_PROG_MISMATCH:
gp_rpc_mismatch_info mismatch_info;
default:
/*
* Void. Cases include PROG_UNAVAIL, PROC_UNAVAIL,
* GARBAGE_ARGS, and SYSTEM_ERR.
*/
void;
};
struct gp_rpc_accepted_reply {
gp_rpc_opaque_auth verf;
gp_rpc_reply_union reply_data;
};
union gp_rpc_rejected_reply switch (gp_rpc_reject_status status) {
case GP_RPC_RPC_MISMATCH:
gp_rpc_mismatch_info mismatch_info;
case GP_RPC_AUTH_ERROR:
gp_rpc_auth_status status;
};
struct gp_rpc_call_header {
unsigned int rpcvers; /* must be equal to two (2) */
unsigned int prog;
unsigned int vers;
unsigned int proc;
gp_rpc_opaque_auth cred;
gp_rpc_opaque_auth verf;
/* procedure-specific parameters start here */
};
union gp_rpc_reply_header switch (gp_rpc_reply_status status) {
case GP_RPC_MSG_ACCEPTED:
gp_rpc_accepted_reply accepted;
case GP_RPC_MSG_DENIED:
gp_rpc_rejected_reply rejected;
};
union gp_rpc_msg_union switch (gp_rpc_msg_type type) {
case GP_RPC_CALL:
gp_rpc_call_header chdr;
case GP_RPC_REPLY:
gp_rpc_reply_header rhdr;
};
struct gp_rpc_msg {
unsigned int xid;
gp_rpc_msg_union header;
};
|