/* This is taken straight from Appendix C of the specification */ typedef long Device_Link; enum Device_AddrFamily { DEVICE_TCP, DEVICE_UDP }; typedef long Device_Flags; typedef long Device_ErrorCode; struct Device_Error { Device_ErrorCode error; }; struct Create_LinkParms { long clientId; /* implementation specific value */ bool lockDevice; /* attempt to lock the device */ unsigned long lock_timeout; /* time to wait on a lock */ string device<>; /* name of device */ }; struct Create_LinkResp { Device_ErrorCode error; Device_Link lid; unsigned short abortPort; /* for the abort RPC */ unsigned long maxRecvSize; /* specifies max data size in bytes device will accept on a write */ }; struct Device_WriteParms { Device_Link lid; /* link id from create_link */ unsigned long io_timeout; /* time to wait for I/O */ unsigned long lock_timeout; /* time to wait for lock */ Device_Flags flags; opaque data<>; /* data length and the data itself */ }; struct Device_WriteResp { Device_ErrorCode error; unsigned long size; /* number of bytes written */ }; struct Device_ReadParms { Device_Link lid; /* link id from create_link */ unsigned long requestSize; /* bytes requested */ unsigned long io_timeout; /* time to wait for I/O */ unsigned long lock_timeout; /* time to wait for lock */ Device_Flags flags; char termChar; /* valid if flags & termchrset */ }; struct Device_ReadResp { Device_ErrorCode error; long reason; /* reason(s) read completed */ opaque data<>; /* data.len and data.val */ }; struct Device_ReadStbResp { Device_ErrorCode error; /* error code */ unsigned char stb; /* the returned status byte */ }; struct Device_GenericParms { Device_Link lid; /* Device_Link id from connect call */ Device_Flags flags; /* flags with options */ unsigned long lock_timeout; /* time to wait for lock */ unsigned long io_timeout; /* time to wait for I/O */ }; struct Device_RemoteFunc { unsigned long hostAddr; /* host servicing interrupt */ unsigned short hostPort; /* valid port # on client */ unsigned long progNum; /* DEVICE_INTR */ unsigned long progVers; /* DEVICE_INTR_VERSION */ Device_AddrFamily progFamily; /* DEVICE_UDP | DEVICE_TCP */ }; struct Device_EnableSrqParms { Device_Link lid; bool enable; /* enable or disable interrupts */ opaque handle<40>; /* host specific data */ }; struct Device_LockParms { Device_Link lid; /* link id from create_link */ Device_Flags flags; /* contains the waitlock flag */ unsigned long lock_timeout; /* time to wait to acquire lock */ }; struct Device_DocmdParms { Device_Link lid; /* link id from create_link */ Device_Flags flags; /* flags specifying various options */ unsigned long io_timeout; /* time to wait for I/O to complete */ unsigned long lock_timeout; /* time to wait on a lock */ long cmd; /* which command to execute */ bool network_order; /* client's byte order */ long datasize; /* size of individual data elements */ opaque data_in<>; /* docmd data parameters */ }; struct Device_DocmdResp { Device_ErrorCode error; /* returned status */ opaque data_out<>; /* returned data parameter */ }; struct Device_SrqParms { opaque handle<>; }; program DEVICE_ASYNC{ version DEVICE_ASYNC_VERSION { Device_Error device_abort(Device_Link) = 1; } = 1; } = 0x0607B0; program DEVICE_CORE { version DEVICE_CORE_VERSION { Create_LinkResp create_link(Create_LinkParms) = 10; Device_WriteResp device_write(Device_WriteParms) = 11; Device_ReadResp device_read(Device_ReadParms) = 12; Device_ReadStbResp device_readstb(Device_GenericParms) = 13; Device_Error device_trigger(Device_GenericParms) = 14; Device_Error device_clear(Device_GenericParms) = 15; Device_Error device_remote(Device_GenericParms) = 16; Device_Error device_local(Device_GenericParms) = 17; Device_Error device_lock(Device_LockParms) = 18; Device_Error device_unlock(Device_Link) = 19; Device_Error device_enable_srq(Device_EnableSrqParms)= 20; Device_DocmdResp device_docmd(Device_DocmdParms) = 22; Device_Error destroy_link(Device_Link) = 23; Device_Error create_intr_chan(Device_RemoteFunc) = 25; Device_Error destroy_intr_chan(void) = 26; } = 1; } = 0x0607AF; program DEVICE_INTR { version DEVICE_INTR_VERSION { void device_intr_srq(Device_SrqParms) = 30; } = 1; } = 0x0607B1;