iPXE
Macros | Functions
guestrpc.h File Reference

VMware GuestRPC mechanism. More...

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

Go to the source code of this file.

Macros

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

Functions

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

Detailed Description

VMware GuestRPC mechanism.

Definition in file guestrpc.h.

Macro Definition Documentation

◆ GUESTRPC_MAGIC

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

GuestRPC magic number.

Definition at line 16 of file guestrpc.h.

◆ GUESTRPC_OPEN

#define GUESTRPC_OPEN   0x00

Open RPC channel.

Definition at line 19 of file guestrpc.h.

◆ GUESTRPC_OPEN_SUCCESS

#define GUESTRPC_OPEN_SUCCESS   0x00010000

Open RPC channel success status.

Definition at line 22 of file guestrpc.h.

◆ GUESTRPC_COMMAND_LEN

#define GUESTRPC_COMMAND_LEN   0x01

Send RPC command length.

Definition at line 25 of file guestrpc.h.

◆ GUESTRPC_COMMAND_LEN_SUCCESS

#define GUESTRPC_COMMAND_LEN_SUCCESS   0x00810000

Send RPC command length success status.

Definition at line 28 of file guestrpc.h.

◆ GUESTRPC_COMMAND_DATA

#define GUESTRPC_COMMAND_DATA   0x02

Send RPC command data.

Definition at line 31 of file guestrpc.h.

◆ GUESTRPC_COMMAND_DATA_SUCCESS

#define GUESTRPC_COMMAND_DATA_SUCCESS   0x00010000

Send RPC command data success status.

Definition at line 34 of file guestrpc.h.

◆ GUESTRPC_REPLY_LEN

#define GUESTRPC_REPLY_LEN   0x03

Receive RPC reply length.

Definition at line 37 of file guestrpc.h.

◆ GUESTRPC_REPLY_LEN_SUCCESS

#define GUESTRPC_REPLY_LEN_SUCCESS   0x00830000

Receive RPC reply length success status.

Definition at line 40 of file guestrpc.h.

◆ GUESTRPC_REPLY_DATA

#define GUESTRPC_REPLY_DATA   0x04

Receive RPC reply data.

Definition at line 43 of file guestrpc.h.

◆ GUESTRPC_REPLY_DATA_SUCCESS

#define GUESTRPC_REPLY_DATA_SUCCESS   0x00010000

Receive RPC reply data success status.

Definition at line 46 of file guestrpc.h.

◆ GUESTRPC_REPLY_FINISH

#define GUESTRPC_REPLY_FINISH   0x05

Finish receiving RPC reply.

Definition at line 49 of file guestrpc.h.

◆ GUESTRPC_REPLY_FINISH_SUCCESS

#define GUESTRPC_REPLY_FINISH_SUCCESS   0x00010000

Finish receiving RPC reply success status.

Definition at line 52 of file guestrpc.h.

◆ GUESTRPC_CLOSE

#define GUESTRPC_CLOSE   0x06

Close RPC channel.

Definition at line 55 of file guestrpc.h.

◆ GUESTRPC_CLOSE_SUCCESS

#define GUESTRPC_CLOSE_SUCCESS   0x00010000

Close RPC channel success status.

Definition at line 58 of file guestrpc.h.

◆ GUESTRPC_SUCCESS

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

RPC command success status.

Definition at line 61 of file guestrpc.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ guestrpc_open()

int guestrpc_open ( void  )

Open GuestRPC channel.

Return values
channelChannel number, or negative error

Definition at line 67 of file guestrpc.c.

67  {
69  uint32_t discard_b;
71 
72  /* Issue GuestRPC command */
73  status = vmware_cmd_guestrpc ( 0, GUESTRPC_OPEN, GUESTRPC_MAGIC,
74  &channel, &discard_b );
75  if ( status != GUESTRPC_OPEN_SUCCESS ) {
76  DBGC ( GUESTRPC_MAGIC, "GuestRPC open failed: status %08x\n",
77  status );
78  return -EPROTO_OPEN;
79  }
80 
81  DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d opened\n", channel );
82  return channel;
83 }
#define GUESTRPC_OPEN_SUCCESS
Open RPC channel success status.
Definition: guestrpc.h:22
unsigned short uint16_t
Definition: stdint.h:11
#define DBGC(...)
Definition: compiler.h:505
#define EPROTO_OPEN
Definition: guestrpc.c:40
uint8_t status
Status.
Definition: ena.h:16
uint32_t channel
RNDIS channel.
Definition: netvsc.h:14
unsigned int uint32_t
Definition: stdint.h:12
#define GUESTRPC_OPEN
Open RPC channel.
Definition: guestrpc.h:19
#define GUESTRPC_MAGIC
GuestRPC magic number.
Definition: guestrpc.h:16

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

Referenced by guestinfo_init(), and vmconsole_init().

◆ guestrpc_close()

void guestrpc_close ( int  channel)

Close GuestRPC channel.

Parameters
channelChannel number

Definition at line 213 of file guestrpc.c.

213  {
214  uint16_t discard_d;
215  uint32_t discard_b;
217 
218  /* Issue GuestRPC command */
219  status = vmware_cmd_guestrpc ( channel, GUESTRPC_CLOSE, 0,
220  &discard_d, &discard_b );
221  if ( status != GUESTRPC_CLOSE_SUCCESS ) {
222  DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d close failed: "
223  "status %08x\n", channel, status );
224  return;
225  }
226 
227  DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d closed\n", channel );
228 }
unsigned short uint16_t
Definition: stdint.h:11
#define GUESTRPC_CLOSE
Close RPC channel.
Definition: guestrpc.h:55
#define DBGC(...)
Definition: compiler.h:505
uint8_t status
Status.
Definition: ena.h:16
#define GUESTRPC_CLOSE_SUCCESS
Close RPC channel success status.
Definition: guestrpc.h:58
uint32_t channel
RNDIS channel.
Definition: netvsc.h:14
unsigned int uint32_t
Definition: stdint.h:12
#define GUESTRPC_MAGIC
GuestRPC magic number.
Definition: guestrpc.h:16

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

◆ guestrpc_command()

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.

243  {
244  const uint8_t *command_bytes = ( ( const void * ) command );
245  uint8_t *reply_bytes = ( ( void * ) reply );
246  size_t command_len = strlen ( command );
247  int orig_reply_len = reply_len;
249  uint8_t *status_bytes = ( ( void * ) &status );
250  size_t status_len = sizeof ( status );
251  uint32_t data;
252  uint16_t reply_id;
253  int len;
254  int remaining;
255  unsigned int i;
256  int rc;
257 
258  DBGC2 ( GUESTRPC_MAGIC, "GuestRPC channel %d issuing command:\n",
259  channel );
261 
262  /* Sanity check */
263  assert ( ( reply != NULL ) || ( reply_len == 0 ) );
264 
265  /* Send command length */
266  if ( ( rc = guestrpc_command_len ( channel, command_len ) ) < 0 )
267  return rc;
268 
269  /* Send command data */
270  while ( command_len ) {
271  data = 0;
272  for ( i = sizeof ( data ) ; i ; i-- ) {
273  if ( command_len ) {
274  data = ( ( data & ~0xff ) |
275  *(command_bytes++) );
276  command_len--;
277  }
278  data = ( ( data << 24 ) | ( data >> 8 ) );
279  }
280  if ( ( rc = guestrpc_command_data ( channel, data ) ) < 0 )
281  return rc;
282  }
283 
284  /* Receive reply length */
285  if ( ( len = guestrpc_reply_len ( channel, &reply_id ) ) < 0 ) {
286  rc = len;
287  return rc;
288  }
289 
290  /* Receive reply */
291  for ( remaining = len ; remaining > 0 ; remaining -= sizeof ( data ) ) {
292  if ( ( rc = guestrpc_reply_data ( channel, reply_id,
293  &data ) ) < 0 ) {
294  return rc;
295  }
296  for ( i = sizeof ( data ) ; i ; i-- ) {
297  if ( status_len ) {
298  *(status_bytes++) = ( data & 0xff );
299  status_len--;
300  len--;
301  } else if ( reply_len ) {
302  *(reply_bytes++) = ( data & 0xff );
303  reply_len--;
304  }
305  data = ( ( data << 24 ) | ( data >> 8 ) );
306  }
307  }
308 
309  /* Finish receiving RPC reply */
310  if ( ( rc = guestrpc_reply_finish ( channel, reply_id ) ) < 0 )
311  return rc;
312 
313  DBGC2 ( GUESTRPC_MAGIC, "GuestRPC channel %d received reply (id %d, "
314  "length %d):\n", channel, reply_id, len );
315  DBGC2_HDA ( GUESTRPC_MAGIC, 0, &status, sizeof ( status ) );
316  DBGC2_HDA ( GUESTRPC_MAGIC, sizeof ( status ), reply,
317  ( ( len < orig_reply_len ) ? len : orig_reply_len ) );
318 
319  /* Check reply status */
320  if ( status != GUESTRPC_SUCCESS ) {
321  DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d command failed "
322  "(status %04x, reply id %d, reply length %d):\n",
323  channel, status, reply_id, len );
325  DBGC_HDA ( GUESTRPC_MAGIC, 0, &status, sizeof ( status ) );
326  DBGC_HDA ( GUESTRPC_MAGIC, sizeof ( status ), reply,
327  ( ( len < orig_reply_len ) ? len : orig_reply_len ));
328  return -EIO;
329  }
330 
331  return len;
332 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
unsigned short uint16_t
Definition: stdint.h:11
device command_len
Definition: threewire.h:59
static int guestrpc_reply_data(int channel, uint16_t reply_id, uint32_t *data)
Receive GuestRPC reply data.
Definition: guestrpc.c:166
A command-line command.
Definition: command.h:9
static int guestrpc_command_data(int channel, uint32_t data)
Send GuestRPC command data.
Definition: guestrpc.c:117
#define DBGC(...)
Definition: compiler.h:505
uint8_t status
Status.
Definition: ena.h:16
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define DBGC_HDA(...)
Definition: compiler.h:506
static int guestrpc_command_len(int channel, size_t len)
Send GuestRPC command length.
Definition: guestrpc.c:92
uint32_t channel
RNDIS channel.
Definition: netvsc.h:14
static int guestrpc_reply_len(int channel, uint16_t *reply_id)
Receive GuestRPC reply length.
Definition: guestrpc.c:142
#define DBGC2_HDA(...)
Definition: compiler.h:523
size_t strlen(const char *src)
Get length of string.
Definition: string.c:213
unsigned char uint8_t
Definition: stdint.h:10
unsigned int uint32_t
Definition: stdint.h:12
static int guestrpc_reply_finish(int channel, uint16_t reply_id)
Finish receiving GuestRPC reply.
Definition: guestrpc.c:191
uint32_t len
Length.
Definition: ena.h:14
#define DBGC2(...)
Definition: compiler.h:522
#define GUESTRPC_SUCCESS
RPC command success status.
Definition: guestrpc.h:61
#define EIO
Input/output error.
Definition: errno.h:433
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12
#define GUESTRPC_MAGIC
GuestRPC magic number.
Definition: guestrpc.h:16
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References assert(), channel, command_len, 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().