Simplifications and clean-ups
[invirt/third/libt4.git] / rpc / rpc_protocol.h
index 8107f04..80089ff 100644 (file)
@@ -3,33 +3,57 @@
 
 #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