iPXE
Defines | Functions
guestrpc.h File Reference

VMware GuestRPC mechanism. More...

#include <stdint.h>
#include <ipxe/vmware.h>

Go to the source code of this file.

Defines

#define GUESTRPC_MAGIC   0x49435052 /* "RPCI" */
 GuestRPC magic number.
#define GUESTRPC_OPEN   0x00
 Open RPC channel.
#define GUESTRPC_OPEN_SUCCESS   0x00010000
 Open RPC channel success status.
#define GUESTRPC_COMMAND_LEN   0x01
 Send RPC command length.
#define GUESTRPC_COMMAND_LEN_SUCCESS   0x00810000
 Send RPC command length success status.
#define GUESTRPC_COMMAND_DATA   0x02
 Send RPC command data.
#define GUESTRPC_COMMAND_DATA_SUCCESS   0x00010000
 Send RPC command data success status.
#define GUESTRPC_REPLY_LEN   0x03
 Receive RPC reply length.
#define GUESTRPC_REPLY_LEN_SUCCESS   0x00830000
 Receive RPC reply length success status.
#define GUESTRPC_REPLY_DATA   0x04
 Receive RPC reply data.
#define GUESTRPC_REPLY_DATA_SUCCESS   0x00010000
 Receive RPC reply data success status.
#define GUESTRPC_REPLY_FINISH   0x05
 Finish receiving RPC reply.
#define GUESTRPC_REPLY_FINISH_SUCCESS   0x00010000
 Finish receiving RPC reply success status.
#define GUESTRPC_CLOSE   0x06
 Close RPC channel.
#define GUESTRPC_CLOSE_SUCCESS   0x00010000
 Close RPC channel success status.
#define GUESTRPC_SUCCESS   0x2031 /* "1 " */
 RPC command success status.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
int guestrpc_open (void)
 Open GuestRPC channel.
void guestrpc_close (int channel)
 Close GuestRPC channel.
int guestrpc_command (int channel, const char *command, char *reply, size_t reply_len)
 Issue GuestRPC command.

Detailed Description

VMware GuestRPC mechanism.

Definition in file guestrpc.h.


Define Documentation

#define GUESTRPC_MAGIC   0x49435052 /* "RPCI" */
#define GUESTRPC_OPEN   0x00

Open RPC channel.

Definition at line 19 of file guestrpc.h.

Referenced by guestrpc_open().

#define GUESTRPC_OPEN_SUCCESS   0x00010000

Open RPC channel success status.

Definition at line 22 of file guestrpc.h.

Referenced by guestrpc_open().

#define GUESTRPC_COMMAND_LEN   0x01

Send RPC command length.

Definition at line 25 of file guestrpc.h.

Referenced by guestrpc_command_len().

#define GUESTRPC_COMMAND_LEN_SUCCESS   0x00810000

Send RPC command length success status.

Definition at line 28 of file guestrpc.h.

Referenced by guestrpc_command_len().

#define GUESTRPC_COMMAND_DATA   0x02

Send RPC command data.

Definition at line 31 of file guestrpc.h.

Referenced by guestrpc_command_data().

#define GUESTRPC_COMMAND_DATA_SUCCESS   0x00010000

Send RPC command data success status.

Definition at line 34 of file guestrpc.h.

Referenced by guestrpc_command_data().

#define GUESTRPC_REPLY_LEN   0x03

Receive RPC reply length.

Definition at line 37 of file guestrpc.h.

Referenced by guestrpc_reply_len().

#define GUESTRPC_REPLY_LEN_SUCCESS   0x00830000

Receive RPC reply length success status.

Definition at line 40 of file guestrpc.h.

Referenced by guestrpc_reply_len().

#define GUESTRPC_REPLY_DATA   0x04

Receive RPC reply data.

Definition at line 43 of file guestrpc.h.

Referenced by guestrpc_reply_data().

#define GUESTRPC_REPLY_DATA_SUCCESS   0x00010000

Receive RPC reply data success status.

Definition at line 46 of file guestrpc.h.

Referenced by guestrpc_reply_data().

#define GUESTRPC_REPLY_FINISH   0x05

Finish receiving RPC reply.

Definition at line 49 of file guestrpc.h.

Referenced by guestrpc_reply_finish().

#define GUESTRPC_REPLY_FINISH_SUCCESS   0x00010000

Finish receiving RPC reply success status.

Definition at line 52 of file guestrpc.h.

Referenced by guestrpc_reply_finish().

#define GUESTRPC_CLOSE   0x06

Close RPC channel.

Definition at line 55 of file guestrpc.h.

Referenced by guestrpc_close().

#define GUESTRPC_CLOSE_SUCCESS   0x00010000

Close RPC channel success status.

Definition at line 58 of file guestrpc.h.

Referenced by guestrpc_close().

#define GUESTRPC_SUCCESS   0x2031 /* "1 " */

RPC command success status.

Definition at line 61 of file guestrpc.h.

Referenced by guestrpc_command().


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
int guestrpc_open ( void  )

Open GuestRPC channel.

Return values:
channelChannel number, or negative error

Definition at line 67 of file guestrpc.c.

References channel, DBGC, EPROTO_OPEN, GUESTRPC_MAGIC, GUESTRPC_OPEN, GUESTRPC_OPEN_SUCCESS, and status.

Referenced by guestinfo_init(), and vmconsole_init().

                           {
        uint16_t channel;
        uint32_t discard_b;
        uint32_t status;

        /* Issue GuestRPC command */
        status = vmware_cmd_guestrpc ( 0, GUESTRPC_OPEN, GUESTRPC_MAGIC,
                                       &channel, &discard_b );
        if ( status != GUESTRPC_OPEN_SUCCESS ) {
                DBGC ( GUESTRPC_MAGIC, "GuestRPC open failed: status %08x\n",
                       status );
                return -EPROTO_OPEN;
        }

        DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d opened\n", channel );
        return channel;
}
void guestrpc_close ( int  channel)

Close GuestRPC channel.

Parameters:
channelChannel number

Definition at line 213 of file guestrpc.c.

References DBGC, GUESTRPC_CLOSE, GUESTRPC_CLOSE_SUCCESS, GUESTRPC_MAGIC, and status.

                                    {
        uint16_t discard_d;
        uint32_t discard_b;
        uint32_t status;

        /* Issue GuestRPC command */
        status = vmware_cmd_guestrpc ( channel, GUESTRPC_CLOSE, 0,
                                       &discard_d, &discard_b );
        if ( status != GUESTRPC_CLOSE_SUCCESS ) {
                DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d close failed: "
                       "status %08x\n", channel, status );
                return;
        }

        DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d closed\n", channel );
}
int guestrpc_command ( int  channel,
const char *  command,
char *  reply,
size_t  reply_len 
)

Issue GuestRPC command.

Parameters:
channelChannel number
commandCommand
replyReply buffer
reply_lenLength of reply buffer
Return values:
lenLength of reply, or negative error

The actual length of the reply will be returned even if the buffer was too small.

Definition at line 242 of file guestrpc.c.

References assert, data, DBGC, DBGC2, DBGC2_HDA, DBGC_HDA, EIO, guestrpc_command_data(), guestrpc_command_len(), GUESTRPC_MAGIC, guestrpc_reply_data(), guestrpc_reply_finish(), guestrpc_reply_len(), GUESTRPC_SUCCESS, len, NULL, rc, status, and strlen().

Referenced by guestinfo_fetch_type(), and vmconsole_putchar().

                                          {
        const uint8_t *command_bytes = ( ( const void * ) command );
        uint8_t *reply_bytes = ( ( void * ) reply );
        size_t command_len = strlen ( command );
        int orig_reply_len = reply_len;
        uint16_t status;
        uint8_t *status_bytes = ( ( void * ) &status );
        size_t status_len = sizeof ( status );
        uint32_t data;
        uint16_t reply_id;
        int len;
        int remaining;
        unsigned int i;
        int rc;

        DBGC2 ( GUESTRPC_MAGIC, "GuestRPC channel %d issuing command:\n",
                channel );
        DBGC2_HDA ( GUESTRPC_MAGIC, 0, command, command_len );

        /* Sanity check */
        assert ( ( reply != NULL ) || ( reply_len == 0 ) );

        /* Send command length */
        if ( ( rc = guestrpc_command_len ( channel, command_len ) ) < 0 )
                return rc;

        /* Send command data */
        while ( command_len ) {
                data = 0;
                for ( i = sizeof ( data ) ; i ; i-- ) {
                        if ( command_len ) {
                                data = ( ( data & ~0xff ) |
                                         *(command_bytes++) );
                                command_len--;
                        }
                        data = ( ( data << 24 ) | ( data >> 8 ) );
                }
                if ( ( rc = guestrpc_command_data ( channel, data ) ) < 0 )
                        return rc;
        }

        /* Receive reply length */
        if ( ( len = guestrpc_reply_len ( channel, &reply_id ) ) < 0 ) {
                rc = len;
                return rc;
        }

        /* Receive reply */
        for ( remaining = len ; remaining > 0 ; remaining -= sizeof ( data ) ) {
                if ( ( rc = guestrpc_reply_data ( channel, reply_id,
                                                  &data ) ) < 0 ) {
                        return rc;
                }
                for ( i = sizeof ( data ) ; i ; i-- ) {
                        if ( status_len ) {
                                *(status_bytes++) = ( data & 0xff );
                                status_len--;
                                len--;
                        } else if ( reply_len ) {
                                *(reply_bytes++) = ( data & 0xff );
                                reply_len--;
                        }
                        data = ( ( data << 24 ) | ( data >> 8 ) );
                }
        }

        /* Finish receiving RPC reply */
        if ( ( rc = guestrpc_reply_finish ( channel, reply_id ) ) < 0 )
                return rc;

        DBGC2 ( GUESTRPC_MAGIC, "GuestRPC channel %d received reply (id %d, "
                "length %d):\n", channel, reply_id, len );
        DBGC2_HDA ( GUESTRPC_MAGIC, 0, &status, sizeof ( status ) );
        DBGC2_HDA ( GUESTRPC_MAGIC, sizeof ( status ), reply,
                    ( ( len < orig_reply_len ) ? len : orig_reply_len ) );

        /* Check reply status */
        if ( status != GUESTRPC_SUCCESS ) {
                DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d command failed "
                       "(status %04x, reply id %d, reply length %d):\n",
                       channel, status, reply_id, len );
                DBGC_HDA ( GUESTRPC_MAGIC, 0, command, command_len );
                DBGC_HDA ( GUESTRPC_MAGIC, 0, &status, sizeof ( status ) );
                DBGC_HDA ( GUESTRPC_MAGIC, sizeof ( status ), reply,
                           ( ( len < orig_reply_len ) ? len : orig_reply_len ));
                return -EIO;
        }

        return len;
}