What is on a storage port (v4/system/storage.c): it takes Block read, Block write and Block data and answers Block data or Block done. It holds a view of a common chain, a private chain, or both; private block k is number 2^32 - 1 - k. Behind it is v3's block subsystem, reached through v4/system/store_v3.c, the one v4 file that includes v3's headers. v3's block code links here with its two device back ends, its log and its clock, and nothing else of v3. v4/tests/test_store.c: 36 checks at 64 bits, 35 at 32, and under the sanitizers. docs/v4.0.0/MESH.md 8.3, 8.4. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
76 lines
3.3 KiB
C
76 lines
3.3 KiB
C
/* message.h -- a message, as it is written to a port and read from one.
|
|
* docs/v4.0.0/MESH.md section 6.
|
|
*
|
|
* The ports are the transport; the message is what is transported. It is
|
|
* v3's Hermes message with what it carries, a word at a time:
|
|
*
|
|
* word 0 to: the node it is for
|
|
* word 1 from: the node that sent it
|
|
* word 2 type
|
|
* word 3 heat and TTL
|
|
* word 4 ACL tag: the sender's identity fingerprint
|
|
* word 5 sequence
|
|
* word 6 how many characters of text follow, 0 to 1024
|
|
* word 7.. the text, four characters to a word, the first lowest
|
|
*
|
|
* Words 3, 4 and 5 are carried and not yet used: checking them is the
|
|
* router's, and awaits rulings (MESH.md section 3).
|
|
*
|
|
* This is for whatever is on the other end of a node's port and is not a
|
|
* node -- a console, a host -- to speak what the nodes speak (v4/capsule/
|
|
* core.v4 and quit.v4 are the same thing in the node). Nothing here uses
|
|
* the C library.
|
|
*/
|
|
#ifndef V4_MESSAGE_H
|
|
#define V4_MESSAGE_H
|
|
|
|
#include "v4/cell.h"
|
|
|
|
#define V4_MSG_HEADER 7u
|
|
#define V4_MSG_MAX_CHARS 1024u /* a block */
|
|
#define V4_MSG_MAX_WORDS (V4_MSG_HEADER + V4_MSG_MAX_CHARS / 4u)
|
|
|
|
#define V4_MSG_TEXT 1 /* text to be interpreted */
|
|
#define V4_MSG_OUTPUT 2 /* what a node printed */
|
|
#define V4_MSG_DONE 3 /* how the text ended: one word, V4_TEXT_* */
|
|
|
|
/* Storage (docs/v4.0.0/MESH.md 8.3). A block's number is one word of
|
|
* payload, written as it is; a block is 1024 characters. */
|
|
#define V4_MSG_BLOCK_READ 4 /* the block's number; answered by BLOCK_DATA, or BLOCK_DONE with an error */
|
|
#define V4_MSG_BLOCK_WRITE 5 /* the block's number; a BLOCK_DATA follows; answered by BLOCK_DONE */
|
|
#define V4_MSG_BLOCK_DATA 6 /* 1024 characters */
|
|
#define V4_MSG_BLOCK_DONE 7 /* one word, V4_STORE_* */
|
|
|
|
#define V4_STORE_OK 0
|
|
#define V4_STORE_NONE 1 /* there is no storage for that number */
|
|
#define V4_STORE_REFUSED 2
|
|
#define V4_STORE_RANGE 3 /* there is no such block */
|
|
|
|
/* how text ended */
|
|
#define V4_TEXT_QUIT 0 /* QUIT: nothing is to be said */
|
|
#define V4_TEXT_COMPLETED 1 /* a console says " ok" */
|
|
#define V4_TEXT_ERROR 2 /* the message is printed; a console says " ERROR" */
|
|
|
|
typedef struct {
|
|
v4_cell word[V4_MSG_MAX_WORDS];
|
|
unsigned count; /* words in it */
|
|
} v4_message;
|
|
|
|
/* A message of `len` characters, at most V4_MSG_MAX_CHARS. Returns how many
|
|
* words it is, or 0 if `len` is too many. */
|
|
unsigned v4_message_text(v4_message *m, v4_cell to, v4_cell from, v4_cell type, const char *chars, unsigned len);
|
|
|
|
/* A message arriving a word at a time. Start with m->count = 0 and give
|
|
* each word as it comes: returns 1 when the message is whole, 0 if there is
|
|
* more to come. A length that is not 0 to V4_MSG_MAX_CHARS is taken as 0. */
|
|
int v4_message_word(v4_message *m, v4_cell word);
|
|
|
|
/* Its parts. */
|
|
#define v4_message_to(m) ((m)->word[0])
|
|
#define v4_message_from(m) ((m)->word[1])
|
|
#define v4_message_type(m) ((m)->word[2])
|
|
unsigned v4_message_length(const v4_message *m); /* characters of text */
|
|
char v4_message_char(const v4_message *m, unsigned i); /* the i-th of them */
|
|
|
|
#endif /* V4_MESSAGE_H */
|