diff --git a/include/protocol.h b/include/protocol.h new file mode 100644 index 0000000..461ed55 --- /dev/null +++ b/include/protocol.h @@ -0,0 +1,52 @@ +#pragma once + +#include +#include + +#define OWD_MAGIC 0x4f574454 +#define OWD_VERSION 1 + +#define OWD_DECL_DATA_END char _data_end[0] +#define OWD_DATA_LEN(HDR) (offsetof(__typeof__(HDR), _data_end)) + +enum owd_msg_type { + OWD_MSG_ERR, + OWD_MSG_SYNC_REQUEST, + OWD_MSG_SYNC_RESPONSE, +}; + +enum owd_error_code { + OWD_ERR_BAD_HEADER, + OWD_ERR_BAD_TYPE, +}; + +struct owd_timestamp { + uint32_t ts_upper; + uint32_t ts_lower; +}; + +struct owdhdr { + uint32_t magic; + uint8_t version; + uint8_t msg_type; + uint16_t length; +}; + +struct owd_msg_err { + struct owdhdr hdr; + uint8_t err; + OWD_DECL_DATA_END; +}; + +struct owd_msg_sync_response { + struct owdhdr hdr; + struct owd_timestamp ts; + OWD_DECL_DATA_END; +}; + +static inline void owd_hdr_populate(struct owdhdr *hdr, uint8_t msg_type, uint16_t length) { + hdr->magic = htonl(OWD_MAGIC); + hdr->version = OWD_VERSION; + hdr->msg_type = msg_type; + hdr->length = htons(length); +}