#ifndef __KVS_RW_TOOLS_H__ #define __KVS_RW_TOOLS_H__ #include #include int kvs_need(const uint8_t *p, const uint8_t *end, size_t n); int kvs_read_u8(const uint8_t **pp, const uint8_t *end, uint8_t *out); int kvs_read_u16(const uint8_t **pp, const uint8_t *end, uint16_t *out); int kvs_read_u32(const uint8_t **pp, const uint8_t *end, uint32_t *out); int kvs_write_u8(uint8_t **pp, const uint8_t *end, uint8_t v); int kvs_write_u16(uint8_t **pp, const uint8_t *end, uint16_t v); int kvs_write_u32(uint8_t **pp, const uint8_t *end, uint32_t v); /** * Request * Cmd: | OP(1) | argc(1) | repeat { arglen(4) | arg } | * * Response * Rsp: | OP(1) | status(1) | datalen(4) | data | */ #define KVS_MAX_CMDS_PER_CALL 64 // 1MB #define KVS_MAX_RESPONSE (1024u * 1024u) #define KVS_MAX_ARGC 64 #define KVS_MAX_ARGLEN (1024u * 1024u) #define KVS_MAX_CMD_BYTES (4u * 1024u * 1024u) enum { KVS_STATUS_OK = 0, KVS_STATUS_ERROR = 1, KVS_STATUS_NO_EXIST = 2, KVS_STATUS_EXIST = 3, KVS_STATUS_BADREQ = 4 }; typedef enum { KVS_OK = 1, KVS_NEED_MORE = 0, KVS_ERROR = -1 }kvs_rc_t; typedef struct kvs_arg_s{ uint32_t len; const uint8_t *data; } kvs_arg_t; typedef struct kvs_req_s{ uint8_t op; uint8_t argc; kvs_arg_t *args; }kvs_req_t; typedef struct kvs_rsp_s{ uint8_t op; uint8_t status; uint32_t dlen; const uint8_t *data; } kvs_rsp_t; int kvs_parse_one_cmd(const uint8_t *request, int request_length, kvs_req_t *req_out); void kvs_free_request(kvs_req_t *req); int kvs_execute_one_cmd(const kvs_req_t *req, kvs_rsp_t *rsp_out); int kvs_build_one_rsp(const kvs_rsp_t *results, uint8_t *response, size_t response_cap); #endif