#include "types.h"
-using proc_t = uint32_t;
-using status_t = int32_t;
-using rpc_sz_t = uint32_t;
-
-struct request_header {
- int xid;
- proc_t proc;
- unsigned int clt_nonce;
- unsigned int srv_nonce;
- int xid_rep;
-
- MEMBERS(xid, proc, clt_nonce, srv_nonce, xid_rep)
-};
-
-ENDIAN_SWAPPABLE(request_header)
-
-struct reply_header {
- int xid;
- int ret;
-
- MEMBERS(xid, ret)
-};
-
-ENDIAN_SWAPPABLE(reply_header)
-
-const size_t RPC_HEADER_SZ = max(sizeof(request_header), sizeof(reply_header)) + 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
+namespace rpc_protocol {
+ using proc_id_t = uint32_t;
+
+ 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,
+ unmarshall_args_failure = -2,
+ unmarshall_reply_failure = -3,
+ atmostonce_failure = -4,
+ oldsrv_failure = -5,
+ bind_failure = -6,
+ cancel_failure = -7
+ };
+
+ struct request_header {
+ xid_t xid;
+ proc_id_t proc;
+ nonce_t clt_nonce;
+ nonce_t srv_nonce;
+ xid_t xid_rep;
+
+ MEMBERS(xid, proc, clt_nonce, srv_nonce, xid_rep)
+ };
+
+ struct reply_header {
+ xid_t xid;
+ int ret;
+
+ MEMBERS(xid, ret)
+ };
+
+ template <typename Signature>
+ struct proc_t {
+ using signature = Signature;
+ proc_id_t id;
+ };
+
+ 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
+
+#define REMOTE_PROCEDURE_BASE(_base_) static constexpr rpc_protocol::proc_id_t base = _base_
+#define REMOTE_PROCEDURE(_offset_, _name_, _args_) static constexpr rpc_protocol::proc_t<status _args_> _name_{base + _offset_}
+
+ REMOTE_PROCEDURE_BASE(0);
+ REMOTE_PROCEDURE(1, bind, (nonce_t &)); // handler number reserved for bind
+}
#endif