iPXE
guestrpc.c File Reference

VMware GuestRPC mechanism. More...

#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <assert.h>
#include <ipxe/vmware.h>
#include <ipxe/guestrpc.h>

Go to the source code of this file.

Macros

#define EPROTO_OPEN   __einfo_error ( EINFO_EPROTO_OPEN )
#define EINFO_EPROTO_OPEN    __einfo_uniqify ( EINFO_EPROTO, 0x00, "GuestRPC open failed" )
#define EPROTO_COMMAND_LEN   __einfo_error ( EINFO_EPROTO_COMMAND_LEN )
#define EINFO_EPROTO_COMMAND_LEN    __einfo_uniqify ( EINFO_EPROTO, 0x01, "GuestRPC command length failed" )
#define EPROTO_COMMAND_DATA   __einfo_error ( EINFO_EPROTO_COMMAND_DATA )
#define EINFO_EPROTO_COMMAND_DATA    __einfo_uniqify ( EINFO_EPROTO, 0x02, "GuestRPC command data failed" )
#define EPROTO_REPLY_LEN   __einfo_error ( EINFO_EPROTO_REPLY_LEN )
#define EINFO_EPROTO_REPLY_LEN    __einfo_uniqify ( EINFO_EPROTO, 0x03, "GuestRPC reply length failed" )
#define EPROTO_REPLY_DATA   __einfo_error ( EINFO_EPROTO_REPLY_DATA )
#define EINFO_EPROTO_REPLY_DATA    __einfo_uniqify ( EINFO_EPROTO, 0x04, "GuestRPC reply data failed" )
#define EPROTO_REPLY_FINISH   __einfo_error ( EINFO_EPROTO_REPLY_FINISH )
#define EINFO_EPROTO_REPLY_FINISH    __einfo_uniqify ( EINFO_EPROTO, 0x05, "GuestRPC reply finish failed" )
#define EPROTO_CLOSE   __einfo_error ( EINFO_EPROTO_CLOSE )
#define EINFO_EPROTO_CLOSE    __einfo_uniqify ( EINFO_EPROTO, 0x06, "GuestRPC close failed" )

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
int guestrpc_open (void)
 Open GuestRPC channel.
static int guestrpc_command_len (int channel, size_t len)
 Send GuestRPC command length.
static int guestrpc_command_data (int channel, uint32_t data)
 Send GuestRPC command data.
static int guestrpc_reply_len (int channel, uint16_t *reply_id)
 Receive GuestRPC reply length.
static int guestrpc_reply_data (int channel, uint16_t reply_id, uint32_t *data)
 Receive GuestRPC reply data.
static int guestrpc_reply_finish (int channel, uint16_t reply_id)
 Finish receiving GuestRPC reply.
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.c.

Macro Definition Documentation

◆ EPROTO_OPEN

#define EPROTO_OPEN   __einfo_error ( EINFO_EPROTO_OPEN )

Definition at line 40 of file guestrpc.c.

Referenced by guestrpc_open().

◆ EINFO_EPROTO_OPEN

#define EINFO_EPROTO_OPEN    __einfo_uniqify ( EINFO_EPROTO, 0x00, "GuestRPC open failed" )

Definition at line 41 of file guestrpc.c.

41#define EINFO_EPROTO_OPEN \
42 __einfo_uniqify ( EINFO_EPROTO, 0x00, "GuestRPC open failed" )

◆ EPROTO_COMMAND_LEN

#define EPROTO_COMMAND_LEN   __einfo_error ( EINFO_EPROTO_COMMAND_LEN )

Definition at line 43 of file guestrpc.c.

Referenced by guestrpc_command_len().

◆ EINFO_EPROTO_COMMAND_LEN

#define EINFO_EPROTO_COMMAND_LEN    __einfo_uniqify ( EINFO_EPROTO, 0x01, "GuestRPC command length failed" )

Definition at line 44 of file guestrpc.c.

44#define EINFO_EPROTO_COMMAND_LEN \
45 __einfo_uniqify ( EINFO_EPROTO, 0x01, "GuestRPC command length failed" )

◆ EPROTO_COMMAND_DATA

#define EPROTO_COMMAND_DATA   __einfo_error ( EINFO_EPROTO_COMMAND_DATA )

Definition at line 46 of file guestrpc.c.

Referenced by guestrpc_command_data().

◆ EINFO_EPROTO_COMMAND_DATA

#define EINFO_EPROTO_COMMAND_DATA    __einfo_uniqify ( EINFO_EPROTO, 0x02, "GuestRPC command data failed" )

Definition at line 47 of file guestrpc.c.

47#define EINFO_EPROTO_COMMAND_DATA \
48 __einfo_uniqify ( EINFO_EPROTO, 0x02, "GuestRPC command data failed" )

◆ EPROTO_REPLY_LEN

#define EPROTO_REPLY_LEN   __einfo_error ( EINFO_EPROTO_REPLY_LEN )

Definition at line 49 of file guestrpc.c.

Referenced by guestrpc_reply_len().

◆ EINFO_EPROTO_REPLY_LEN

#define EINFO_EPROTO_REPLY_LEN    __einfo_uniqify ( EINFO_EPROTO, 0x03, "GuestRPC reply length failed" )

Definition at line 50 of file guestrpc.c.

50#define EINFO_EPROTO_REPLY_LEN \
51 __einfo_uniqify ( EINFO_EPROTO, 0x03, "GuestRPC reply length failed" )

◆ EPROTO_REPLY_DATA

#define EPROTO_REPLY_DATA   __einfo_error ( EINFO_EPROTO_REPLY_DATA )

Definition at line 52 of file guestrpc.c.

Referenced by guestrpc_reply_data().

◆ EINFO_EPROTO_REPLY_DATA

#define EINFO_EPROTO_REPLY_DATA    __einfo_uniqify ( EINFO_EPROTO, 0x04, "GuestRPC reply data failed" )

Definition at line 53 of file guestrpc.c.

53#define EINFO_EPROTO_REPLY_DATA \
54 __einfo_uniqify ( EINFO_EPROTO, 0x04, "GuestRPC reply data failed" )

◆ EPROTO_REPLY_FINISH

#define EPROTO_REPLY_FINISH   __einfo_error ( EINFO_EPROTO_REPLY_FINISH )

Definition at line 55 of file guestrpc.c.

Referenced by guestrpc_reply_finish().

◆ EINFO_EPROTO_REPLY_FINISH

#define EINFO_EPROTO_REPLY_FINISH    __einfo_uniqify ( EINFO_EPROTO, 0x05, "GuestRPC reply finish failed" )

Definition at line 56 of file guestrpc.c.

56#define EINFO_EPROTO_REPLY_FINISH \
57 __einfo_uniqify ( EINFO_EPROTO, 0x05, "GuestRPC reply finish failed" )

◆ EPROTO_CLOSE

#define EPROTO_CLOSE   __einfo_error ( EINFO_EPROTO_CLOSE )

Definition at line 58 of file guestrpc.c.

◆ EINFO_EPROTO_CLOSE

#define EINFO_EPROTO_CLOSE    __einfo_uniqify ( EINFO_EPROTO, 0x06, "GuestRPC close failed" )

Definition at line 59 of file guestrpc.c.

59#define EINFO_EPROTO_CLOSE \
60 __einfo_uniqify ( EINFO_EPROTO, 0x06, "GuestRPC close failed" )

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 );
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}
unsigned short uint16_t
Definition stdint.h:11
unsigned int uint32_t
Definition stdint.h:12
uint8_t status
Status.
Definition ena.h:5
#define DBGC(...)
Definition compiler.h:505
#define EPROTO_OPEN
Definition guestrpc.c:40
#define GUESTRPC_MAGIC
GuestRPC magic number.
Definition guestrpc.h:16
#define GUESTRPC_OPEN
Open RPC channel.
Definition guestrpc.h:19
#define GUESTRPC_OPEN_SUCCESS
Open RPC channel success status.
Definition guestrpc.h:22
uint32_t channel
RNDIS channel.
Definition netvsc.h:3

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

Referenced by guestinfo_init(), and vmconsole_init().

◆ guestrpc_command_len()

int guestrpc_command_len ( int channel,
size_t len )
static

Send GuestRPC command length.

Parameters
channelChannel number
lenCommand length
Return values
rcReturn status code

Definition at line 92 of file guestrpc.c.

92 {
93 uint16_t discard_d;
94 uint32_t discard_b;
96
97 /* Issue GuestRPC command */
98 status = vmware_cmd_guestrpc ( channel, GUESTRPC_COMMAND_LEN, len,
99 &discard_d, &discard_b );
101 DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d send command "
102 "length %zd failed: status %08x\n",
103 channel, len, status );
104 return -EPROTO_COMMAND_LEN;
105 }
106
107 return 0;
108}
ring len
Length.
Definition dwmac.h:226
#define EPROTO_COMMAND_LEN
Definition guestrpc.c:43
#define GUESTRPC_COMMAND_LEN
Send RPC command length.
Definition guestrpc.h:25
#define GUESTRPC_COMMAND_LEN_SUCCESS
Send RPC command length success status.
Definition guestrpc.h:28

References channel, DBGC, EPROTO_COMMAND_LEN, GUESTRPC_COMMAND_LEN, GUESTRPC_COMMAND_LEN_SUCCESS, GUESTRPC_MAGIC, len, and status.

Referenced by guestrpc_command().

◆ guestrpc_command_data()

int guestrpc_command_data ( int channel,
uint32_t data )
static

Send GuestRPC command data.

Parameters
channelChannel number
dataCommand data
Return values
rcReturn status code

Definition at line 117 of file guestrpc.c.

117 {
118 uint16_t discard_d;
119 uint32_t discard_b;
121
122 /* Issue GuestRPC command */
123 status = vmware_cmd_guestrpc ( channel, GUESTRPC_COMMAND_DATA, data,
124 &discard_d, &discard_b );
126 DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d send command "
127 "data %08x failed: status %08x\n",
128 channel, data, status );
129 return -EPROTO_COMMAND_DATA;
130 }
131
132 return 0;
133}
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define EPROTO_COMMAND_DATA
Definition guestrpc.c:46
#define GUESTRPC_COMMAND_DATA
Send RPC command data.
Definition guestrpc.h:31
#define GUESTRPC_COMMAND_DATA_SUCCESS
Send RPC command data success status.
Definition guestrpc.h:34

References channel, data, DBGC, EPROTO_COMMAND_DATA, GUESTRPC_COMMAND_DATA, GUESTRPC_COMMAND_DATA_SUCCESS, GUESTRPC_MAGIC, and status.

Referenced by guestrpc_command().

◆ guestrpc_reply_len()

int guestrpc_reply_len ( int channel,
uint16_t * reply_id )
static

Receive GuestRPC reply length.

Parameters
channelChannel number
Return values
reply_idReply ID
lenReply length, or negative error

Definition at line 142 of file guestrpc.c.

142 {
145
146 /* Issue GuestRPC command */
147 status = vmware_cmd_guestrpc ( channel, GUESTRPC_REPLY_LEN, 0,
148 reply_id, &len );
150 DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d receive reply "
151 "length failed: status %08x\n", channel, status );
152 return -EPROTO_REPLY_LEN;
153 }
154
155 return len;
156}
#define EPROTO_REPLY_LEN
Definition guestrpc.c:49
#define GUESTRPC_REPLY_LEN_SUCCESS
Receive RPC reply length success status.
Definition guestrpc.h:40
#define GUESTRPC_REPLY_LEN
Receive RPC reply length.
Definition guestrpc.h:37

References channel, DBGC, EPROTO_REPLY_LEN, GUESTRPC_MAGIC, GUESTRPC_REPLY_LEN, GUESTRPC_REPLY_LEN_SUCCESS, len, and status.

Referenced by guestrpc_command().

◆ guestrpc_reply_data()

int guestrpc_reply_data ( int channel,
uint16_t reply_id,
uint32_t * data )
static

Receive GuestRPC reply data.

Parameters
channelChannel number
reply_idReply ID
Return values
dataReply data
rcReturn status code

Definition at line 166 of file guestrpc.c.

167 {
168 uint16_t discard_d;
170
171 /* Issue GuestRPC command */
172 status = vmware_cmd_guestrpc ( channel, GUESTRPC_REPLY_DATA, reply_id,
173 &discard_d, data );
175 DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d receive reply "
176 "%d data failed: status %08x\n",
177 channel, reply_id, status );
178 return -EPROTO_REPLY_DATA;
179 }
180
181 return 0;
182}
#define EPROTO_REPLY_DATA
Definition guestrpc.c:52
#define GUESTRPC_REPLY_DATA_SUCCESS
Receive RPC reply data success status.
Definition guestrpc.h:46
#define GUESTRPC_REPLY_DATA
Receive RPC reply data.
Definition guestrpc.h:43

References channel, data, DBGC, EPROTO_REPLY_DATA, GUESTRPC_MAGIC, GUESTRPC_REPLY_DATA, GUESTRPC_REPLY_DATA_SUCCESS, and status.

Referenced by guestrpc_command().

◆ guestrpc_reply_finish()

int guestrpc_reply_finish ( int channel,
uint16_t reply_id )
static

Finish receiving GuestRPC reply.

Parameters
channelChannel number
reply_idReply ID
Return values
rcReturn status code

Definition at line 191 of file guestrpc.c.

191 {
192 uint16_t discard_d;
193 uint32_t discard_b;
195
196 /* Issue GuestRPC command */
197 status = vmware_cmd_guestrpc ( channel, GUESTRPC_REPLY_FINISH, reply_id,
198 &discard_d, &discard_b );
200 DBGC ( GUESTRPC_MAGIC, "GuestRPC channel %d finish reply %d "
201 "failed: status %08x\n", channel, reply_id, status );
202 return -EPROTO_REPLY_FINISH;
203 }
204
205 return 0;
206}
#define EPROTO_REPLY_FINISH
Definition guestrpc.c:55
#define GUESTRPC_REPLY_FINISH
Finish receiving RPC reply.
Definition guestrpc.h:49
#define GUESTRPC_REPLY_FINISH_SUCCESS
Finish receiving RPC reply success status.
Definition guestrpc.h:52

References channel, DBGC, EPROTO_REPLY_FINISH, GUESTRPC_MAGIC, GUESTRPC_REPLY_FINISH, GUESTRPC_REPLY_FINISH_SUCCESS, and status.

Referenced by guestrpc_command().

◆ 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 );
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}
#define GUESTRPC_CLOSE_SUCCESS
Close RPC channel success status.
Definition guestrpc.h:58
#define GUESTRPC_CLOSE
Close RPC channel.
Definition guestrpc.h:55

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 );
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}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
unsigned char uint8_t
Definition stdint.h:10
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
#define DBGC2(...)
Definition compiler.h:522
#define DBGC2_HDA(...)
Definition compiler.h:523
#define DBGC_HDA(...)
Definition compiler.h:506
#define EIO
Input/output error.
Definition errno.h:434
device command_len
Definition threewire.h:60
static int guestrpc_reply_data(int channel, uint16_t reply_id, uint32_t *data)
Receive GuestRPC reply data.
Definition guestrpc.c:166
static int guestrpc_command_data(int channel, uint32_t data)
Send GuestRPC command data.
Definition guestrpc.c:117
static int guestrpc_command_len(int channel, size_t len)
Send GuestRPC command length.
Definition guestrpc.c:92
static int guestrpc_reply_finish(int channel, uint16_t reply_id)
Finish receiving GuestRPC reply.
Definition guestrpc.c:191
static int guestrpc_reply_len(int channel, uint16_t *reply_id)
Receive GuestRPC reply length.
Definition guestrpc.c:142
#define GUESTRPC_SUCCESS
RPC command success status.
Definition guestrpc.h:61
size_t strlen(const char *src)
Get length of string.
Definition string.c:244
A command-line command.
Definition command.h:10

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().