X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/6b5e09540e9392a7015fae1ad3b01b0973600ff2..02967a43024ce81912cd1ec96a800397457f8066:/rpc/rpc_protocol.h diff --git a/rpc/rpc_protocol.h b/rpc/rpc_protocol.h index 881de9b..4f03937 100644 --- a/rpc/rpc_protocol.h +++ b/rpc/rpc_protocol.h @@ -8,11 +8,13 @@ namespace rpc_protocol { using status = int32_t; using rpc_sz_t = uint32_t; + using nonce_t = uint32_t; + using xid_t = int32_t; enum : status { timeout_failure = -1, - unmarshal_args_failure = -2, - unmarshal_reply_failure = -3, + unmarshall_args_failure = -2, + unmarshall_reply_failure = -3, atmostonce_failure = -4, oldsrv_failure = -5, bind_failure = -6, @@ -20,40 +22,46 @@ namespace rpc_protocol { }; struct request_header { - int xid; + xid_t xid; proc_id_t proc; - unsigned int clt_nonce; - unsigned int srv_nonce; - int xid_rep; + nonce_t clt_nonce; + nonce_t srv_nonce; + xid_t xid_rep; MEMBERS(xid, proc, clt_nonce, srv_nonce, xid_rep) }; struct reply_header { - int xid; + xid_t xid; int ret; MEMBERS(xid, ret) }; - template struct proc_t { - using signature = Signature; proc_id_t id; + const char * name; + }; + + template + struct proc_checked_t : proc_t { + using signature = Signature; + constexpr inline proc_checked_t(proc_id_t id, const char * name) : proc_t{id, name} {} }; - const size_t RPC_HEADER_SZ = max(sizeof(request_header), sizeof(reply_header)) + sizeof(rpc_sz_t); + union header_t { request_header req; reply_header rep; }; + const size_t RPC_HEADER_SZ = sizeof(header_t) + sizeof(rpc_sz_t); const size_t DEFAULT_RPC_SZ = 1024; // size of initial buffer allocation - const size_t MAX_PDU = 10<<20; //maximum PDF is 10M + const size_t MAX_PDU = 10<<20; // maximum PDF is 10M -#define REMOTE_PROCEDURE_BASE(_base_) enum proc_no : ::rpc_protocol::proc_id_t { base = _base_ }; -#define REMOTE_PROCEDURE(_offset_, _name_, _args_) static constexpr ::rpc_protocol::proc_t _name_{base + _offset_}; +#define REMOTE_PROCEDURE_BASE(_base_) \ + static constexpr rpc_protocol::proc_id_t base = _base_ - REMOTE_PROCEDURE_BASE(0); - REMOTE_PROCEDURE(1, bind, (unsigned int &, int)); // handler number reserved for bind -}; +#define REMOTE_PROCEDURE(_offset_, _name_, _args_) \ + static constexpr rpc_protocol::proc_checked_t _name_{base + _offset_, #_name_} -ENDIAN_SWAPPABLE(rpc_protocol::request_header) -ENDIAN_SWAPPABLE(rpc_protocol::reply_header) + REMOTE_PROCEDURE_BASE(0); + REMOTE_PROCEDURE(1, bind, (nonce_t &)); // handler number reserved for bind +} #endif