129 lines
3.2 KiB
C
129 lines
3.2 KiB
C
#ifndef _IPXE_ONCRPC_H
|
|
#define _IPXE_ONCRPC_H
|
|
|
|
#include <stdint.h>
|
|
#include <ipxe/interface.h>
|
|
#include <ipxe/iobuf.h>
|
|
|
|
/** @file
|
|
*
|
|
* SUN ONC RPC protocol.
|
|
*
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|
|
|
/** ONC RCP Version */
|
|
#define ONCRPC_VERS 2
|
|
|
|
/** ONC RPC Null Authentication */
|
|
#define ONCRPC_AUTH_NONE 0
|
|
|
|
/** ONC RPC System Authentication (also called UNIX Authentication) */
|
|
#define ONCRPC_AUTH_SYS 1
|
|
|
|
/** Size of an ONC RPC header */
|
|
#define ONCRPC_HEADER_SIZE ( 11 * sizeof ( uint32_t ) )
|
|
|
|
#define ONCRPC_FIELD( type, value ) { oncrpc_ ## type, { .type = value } }
|
|
#define ONCRPC_SUBFIELD( type, args... ) \
|
|
{ oncrpc_ ## type, { .type = { args } } }
|
|
|
|
#define ONCRPC_FIELD_END { oncrpc_none, { } }
|
|
|
|
/** Enusure that size is a multiple of four */
|
|
#define oncrpc_align( size ) ( ( (size) + 3 ) & ~3 )
|
|
|
|
/**
|
|
* Calculate the length of a string, including padding bytes.
|
|
*
|
|
* @v str String
|
|
* @ret size Length of the padded string
|
|
*/
|
|
#define oncrpc_strlen( str ) ( oncrpc_align ( strlen ( str ) ) + \
|
|
sizeof ( uint32_t ) )
|
|
|
|
struct oncrpc_cred {
|
|
uint32_t flavor;
|
|
uint32_t length;
|
|
};
|
|
|
|
struct oncrpc_cred_sys {
|
|
struct oncrpc_cred credential;
|
|
uint32_t stamp;
|
|
char *hostname;
|
|
uint32_t uid;
|
|
uint32_t gid;
|
|
uint32_t aux_gid_len;
|
|
uint32_t aux_gid[16];
|
|
};
|
|
|
|
struct oncrpc_reply
|
|
{
|
|
struct oncrpc_cred *verifier;
|
|
uint32_t rpc_id;
|
|
uint32_t reply_state;
|
|
uint32_t accept_state;
|
|
uint32_t frame_size;
|
|
struct io_buffer *data;
|
|
};
|
|
|
|
struct oncrpc_session {
|
|
struct oncrpc_reply pending_reply;
|
|
struct oncrpc_cred *credential;
|
|
struct oncrpc_cred *verifier;
|
|
uint32_t rpc_id;
|
|
uint32_t prog_name;
|
|
uint32_t prog_vers;
|
|
};
|
|
|
|
enum oncrpc_field_type {
|
|
oncrpc_none = 0,
|
|
oncrpc_int32,
|
|
oncrpc_int64,
|
|
oncrpc_str,
|
|
oncrpc_array,
|
|
oncrpc_intarray,
|
|
oncrpc_cred,
|
|
};
|
|
|
|
union oncrpc_field_value {
|
|
struct {
|
|
size_t length;
|
|
const void *ptr;
|
|
} array;
|
|
|
|
struct {
|
|
size_t length;
|
|
const uint32_t *ptr;
|
|
} intarray;
|
|
|
|
int64_t int64;
|
|
int32_t int32;
|
|
const char *str;
|
|
const struct oncrpc_cred *cred;
|
|
};
|
|
|
|
struct oncrpc_field {
|
|
enum oncrpc_field_type type;
|
|
union oncrpc_field_value value;
|
|
};
|
|
|
|
extern struct oncrpc_cred oncrpc_auth_none;
|
|
|
|
int oncrpc_init_cred_sys ( struct oncrpc_cred_sys *auth_sys );
|
|
void oncrpc_init_session ( struct oncrpc_session *session,
|
|
struct oncrpc_cred *credential,
|
|
struct oncrpc_cred *verifier, uint32_t prog_name,
|
|
uint32_t prog_vers );
|
|
|
|
int oncrpc_call ( struct interface *intf, struct oncrpc_session *session,
|
|
uint32_t proc_name, const struct oncrpc_field fields[] );
|
|
|
|
size_t oncrpc_compute_size ( const struct oncrpc_field fields[] );
|
|
|
|
int oncrpc_get_reply ( struct oncrpc_session *session,
|
|
struct oncrpc_reply *reply, struct io_buffer *io_buf );
|
|
|
|
#endif /* _IPXE_ONCRPC_H */
|