11#ifndef ASRT_PARAM_PROTO_H
12#define ASRT_PARAM_PROTO_H
19#include "./flat_tree.h"
24enum asrt_param_message_id_e
26 ASRT_PARAM_MSG_READY = 0x01,
27 ASRT_PARAM_MSG_READY_ACK = 0x02,
28 ASRT_PARAM_MSG_QUERY = 0x03,
29 ASRT_PARAM_MSG_RESPONSE = 0x04,
30 ASRT_PARAM_MSG_ERROR = 0x05,
31 ASRT_PARAM_MSG_FIND_BY_KEY = 0x06,
33typedef uint8_t asrt_param_message_id;
36#define ASRT_PARAM_NONE_ID ( (asrt_flat_id) 0 )
41 ASRT_PARAM_ERR_NONE = 0x00,
42 ASRT_PARAM_ERR_RESPONSE_TOO_LARGE = 0x01,
43 ASRT_PARAM_ERR_INVALID_QUERY = 0x02,
44 ASRT_PARAM_ERR_ENCODE_FAILURE = 0x03,
45 ASRT_PARAM_ERR_TYPE_MISMATCH = 0x04,
46 ASRT_PARAM_ERR_TIMEOUT = 0x05,
51 asrt_flat_id root_id )
53 uint8_t* p = ready_msg->buff;
54 *p++ = ASRT_PARAM_MSG_READY;
55 asrt_add_u32( &p, root_id );
62 return &ready_msg->req;
65static inline struct asrt_send_req* asrt_msg_rtoc_param_ready_ack(
67 uint32_t max_msg_size )
69 uint8_t* p = msg->buff;
70 *p++ = ASRT_PARAM_MSG_READY_ACK;
71 asrt_add_u32( &p, max_msg_size );
74 .e = msg->buff +
sizeof msg->buff,
83 asrt_flat_id node_id )
85 uint8_t* p = msg->buff;
86 *p++ = ASRT_PARAM_MSG_QUERY;
87 asrt_add_u32( &p, node_id );
90 .e = msg->buff +
sizeof msg->buff,
105static inline struct asrt_send_req* asrt_msg_rtoc_param_find_by_key(
107 asrt_flat_id parent_id,
110 uint8_t* h = msg->hdr;
111 *h++ = ASRT_PARAM_MSG_FIND_BY_KEY;
112 asrt_add_u32( &h, parent_id );
113 size_t key_len = strlen( key );
115 msg->spans[0] = (
struct asrt_span ){ .
b = (uint8_t*) key, .
e = (uint8_t*) key + key_len };
116 msg->spans[1] = (
struct asrt_span ){ .
b = &msg->nul, .e = &msg->nul + 1 };
119 .e = msg->hdr +
sizeof msg->hdr,
126static inline struct asrt_send_req* asrt_msg_ctor_param_error(
128 enum asrt_param_err_e error_code,
129 asrt_flat_id node_id )
131 uint8_t* p = msg->buff;
132 *p++ = ASRT_PARAM_MSG_ERROR;
134 asrt_add_u32( &p, node_id );
146static inline size_t asrt_param_value_wire_size(
struct asrt_flat_value v )
148 return asrt_flat_value_wire_size( v );
151static inline void asrt_param_write_value( uint8_t** p,
struct asrt_flat_value v )
153 asrt_flat_value_write( p, v );
156static inline enum asrt_status asrt_param_decode_value(
161 return asrt_flat_value_decode( buff, raw_type, val );
168static inline enum asrt_status asrt_msg_ctor_param_response(
170 asrt_flat_id start_id,
175 if ( !tree || !out_buff || !out_len )
177 if ( max_bytes < 11U )
178 return ASRT_SIZE_ERR;
180 uint8_t* p = out_buff;
181 uint8_t* nodes_end = out_buff + max_bytes - 4;
182 asrt_flat_id current = start_id;
183 asrt_flat_id next_sib = ASRT_PARAM_NONE_ID;
186 *p++ = ASRT_PARAM_MSG_RESPONSE;
188 while ( current != ASRT_PARAM_NONE_ID ) {
190 int not_found = ( asrt_flat_tree_query( tree, current, &qr ) != ASRT_SUCCESS );
194 qr.value.type = ASRT_FLAT_STYPE_NONE;
195 qr.next_sibling = ASRT_PARAM_NONE_ID;
198 size_t key_len = qr.key ? strlen( qr.key ) : 0U;
199 size_t node_size = 4U + key_len + 1U + 1U
200 + asrt_param_value_wire_size( qr.value );
202 if ( p + node_size > nodes_end ) {
204 return ASRT_SIZE_ERR;
209 asrt_add_u32( &p, qr.id );
211 memcpy( p, qr.key, key_len );
215 *p++ = (uint8_t) qr.value.type;
216 asrt_param_write_value( &p, qr.value );
221 current = qr.next_sibling;
224 asrt_add_u32( &p, next_sib );
225 *out_len = (uint32_t) ( p - out_buff );
Definition: flat_tree.h:156
node_id maps to blocks[node_id / node_capacity][node_id % node_capacity].
Definition: flat_tree.h:121
Definition: flat_tree.h:90
Definition: param_proto.h:98
An outgoing message request placed in a module's send queue.
Definition: chann.h:64
struct asrt_span_span buff
Message payload (scatter-gather).
Definition: chann.h:65
Scatter-gather buffer: a primary byte range [b, e) followed by rest_count additional spans.
Definition: span.h:37
uint8_t * b
Primary buffer start.
Definition: span.h:38
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee ...
Definition: span.h:23
uint8_t * b
Pointer to the first byte.
Definition: span.h:24
uint8_t * e
One-past-the-end pointer.
Definition: span.h:25