Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / include / ipxe / oncrpc.h
1 #ifndef _IPXE_ONCRPC_H
2 #define _IPXE_ONCRPC_H
3
4 #include <stdint.h>
5 #include <ipxe/interface.h>
6 #include <ipxe/iobuf.h>
7
8 /** @file
9  *
10  * SUN ONC RPC protocol.
11  *
12  */
13
14 FILE_LICENCE ( GPL2_OR_LATER );
15
16 /** ONC RCP Version */
17 #define ONCRPC_VERS 2
18
19 /** ONC RPC Null Authentication */
20 #define ONCRPC_AUTH_NONE 0
21
22 /** ONC RPC System Authentication (also called UNIX Authentication) */
23 #define ONCRPC_AUTH_SYS  1
24
25 /** Size of an ONC RPC header */
26 #define ONCRPC_HEADER_SIZE ( 11 * sizeof ( uint32_t ) )
27
28 #define ONCRPC_FIELD( type, value ) { oncrpc_ ## type, { .type = value } }
29 #define ONCRPC_SUBFIELD( type, args... ) \
30         { oncrpc_ ## type, { .type = { args } } }
31
32 #define ONCRPC_FIELD_END { oncrpc_none, { } }
33
34 /** Enusure that size is a multiple of four */
35 #define oncrpc_align( size ) ( ( (size) + 3 ) & ~3 )
36
37 /**
38  * Calculate the length of a string, including padding bytes.
39  *
40  * @v str               String
41  * @ret size            Length of the padded string
42  */
43 #define oncrpc_strlen( str ) ( oncrpc_align ( strlen ( str ) ) + \
44                                sizeof ( uint32_t ) )
45
46 struct oncrpc_cred {
47         uint32_t               flavor;
48         uint32_t               length;
49 };
50
51 struct oncrpc_cred_sys {
52         struct oncrpc_cred     credential;
53         uint32_t               stamp;
54         char                   *hostname;
55         uint32_t               uid;
56         uint32_t               gid;
57         uint32_t               aux_gid_len;
58         uint32_t               aux_gid[16];
59 };
60
61 struct oncrpc_reply
62 {
63         struct oncrpc_cred      *verifier;
64         uint32_t                rpc_id;
65         uint32_t                reply_state;
66         uint32_t                accept_state;
67         uint32_t                frame_size;
68         struct io_buffer        *data;
69 };
70
71 struct oncrpc_session {
72         struct oncrpc_reply     pending_reply;
73         struct oncrpc_cred      *credential;
74         struct oncrpc_cred      *verifier;
75         uint32_t                rpc_id;
76         uint32_t                prog_name;
77         uint32_t                prog_vers;
78 };
79
80 enum oncrpc_field_type {
81         oncrpc_none = 0,
82         oncrpc_int32,
83         oncrpc_int64,
84         oncrpc_str,
85         oncrpc_array,
86         oncrpc_intarray,
87         oncrpc_cred,
88 };
89
90 union oncrpc_field_value {
91         struct {
92                 size_t           length;
93                 const void       *ptr;
94         }                        array;
95
96         struct {
97                 size_t           length;
98                 const uint32_t   *ptr;
99         }                        intarray;
100
101         int64_t                  int64;
102         int32_t                  int32;
103         const char               *str;
104         const struct oncrpc_cred *cred;
105 };
106
107 struct oncrpc_field {
108         enum oncrpc_field_type       type;
109         union oncrpc_field_value     value;
110 };
111
112 extern struct oncrpc_cred oncrpc_auth_none;
113
114 int oncrpc_init_cred_sys ( struct oncrpc_cred_sys *auth_sys );
115 void oncrpc_init_session ( struct oncrpc_session *session,
116                            struct oncrpc_cred *credential,
117                            struct oncrpc_cred *verifier, uint32_t prog_name,
118                            uint32_t prog_vers );
119
120 int oncrpc_call ( struct interface *intf, struct oncrpc_session *session,
121                   uint32_t proc_name, const struct oncrpc_field fields[] );
122
123 size_t oncrpc_compute_size ( const struct oncrpc_field fields[] );
124
125 int oncrpc_get_reply ( struct oncrpc_session *session,
126                        struct oncrpc_reply *reply, struct io_buffer *io_buf );
127
128 #endif /* _IPXE_ONCRPC_H */