flatbuffer base
This commit is contained in:
275
src/proto/msg.c
275
src/proto/msg.c
@@ -1,85 +1,250 @@
|
||||
#include "proto/msg.h"
|
||||
#include "panic.h"
|
||||
|
||||
#include "proto/enums.h"
|
||||
#include "proto/pack.h"
|
||||
#include "flatcc/flatcc_builder.h"
|
||||
#include "proto_builder.h"
|
||||
#include "control_builder.h"
|
||||
#include "exec_notif_builder.h"
|
||||
#include "auth_builder.h"
|
||||
#include "stream_builder.h"
|
||||
#include "stream_data_builder.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
BaseMessage* parseMessage(const uint8_t* bytes, size_t size)
|
||||
uint8_t* fb_build_auth_response(uint64_t nonce, uint64_t seat_id, size_t* len_out)
|
||||
{
|
||||
const uint8_t headerSize = 9;
|
||||
BaseMessage* msg = malloc(sizeof(BaseMessage));
|
||||
NULL_GUARD(msg);
|
||||
uint64_t nonce = decodeBytesToU64(bytes);
|
||||
flatcc_builder_t B;
|
||||
if (flatcc_builder_init(&B)) {
|
||||
panic("flatcc_builder_init failed\n");
|
||||
}
|
||||
|
||||
hmmmm_auth_AuthResponse_ref_t ar =
|
||||
hmmmm_auth_AuthResponse_create(&B, seat_id);
|
||||
|
||||
msg->nonce = nonce;
|
||||
hmmmm_ServerPayload_union_ref_t payload =
|
||||
hmmmm_ServerPayload_as_AuthResponse(ar);
|
||||
|
||||
msg->packetType = bytes[8] >> 4;
|
||||
msg->payloadHeader = bytes[8] & 0b1111;
|
||||
hmmmm_ServerMessage_create_as_root(&B, nonce, payload);
|
||||
|
||||
msg->payloadLen = size - headerSize;
|
||||
|
||||
uint8_t* payload = malloc(sizeof(uint8_t) * (msg->payloadLen));
|
||||
NULL_GUARD(payload);
|
||||
|
||||
memcpy(payload, bytes + headerSize, msg->payloadLen);
|
||||
msg->payload = payload;
|
||||
|
||||
return msg;
|
||||
uint8_t* buf = flatcc_builder_finalize_buffer(&B, len_out);
|
||||
flatcc_builder_clear(&B);
|
||||
NULL_GUARD(buf);
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
uint8_t* createControlNotifyMessage(uint64_t nonce, uint64_t clockCounter, uint8_t newEmulState, size_t* lenOut)
|
||||
uint8_t* fb_build_exec_notify(uint64_t nonce, uint64_t tclk, uint8_t state, size_t* len_out)
|
||||
{
|
||||
*lenOut = 9 + 10;
|
||||
uint8_t* outmsg = malloc(sizeof(uint8_t) * (*lenOut));
|
||||
NULL_GUARD(outmsg, "Unable to allocate message");
|
||||
|
||||
encodeUintToBytes(nonce, outmsg);
|
||||
flatcc_builder_t B;
|
||||
if (flatcc_builder_init(&B)) {
|
||||
panic("flatcc_builder_init failed\n");
|
||||
}
|
||||
|
||||
outmsg[8] = PACKET_TYPE_CTRL << 4;
|
||||
outmsg[8] |= CTRL_TYPE_NOTIF_STATE;
|
||||
hmmmm_ctrl_exec_notif_ExecNotifyMessage_ref_t notif =
|
||||
hmmmm_ctrl_exec_notif_ExecNotifyMessage_create(
|
||||
&B, tclk, (hmmmm_ctrl_exec_notif_ExecState_enum_t)(int8_t)state);
|
||||
|
||||
outmsg[9] = NOTIF_TYPE_EXEC;
|
||||
encodeUintToBytes(clockCounter, outmsg + 10);
|
||||
outmsg[18] = newEmulState;
|
||||
return outmsg;
|
||||
hmmmm_ctrl_CtrlServerPayload_union_ref_t ctrl_payload =
|
||||
hmmmm_ctrl_CtrlServerPayload_as_ExecNotifyMessage(notif);
|
||||
|
||||
hmmmm_ctrl_CtrlServerMessage_ref_t ctrl_msg =
|
||||
hmmmm_ctrl_CtrlServerMessage_create(&B, ctrl_payload);
|
||||
|
||||
hmmmm_ServerPayload_union_ref_t payload =
|
||||
hmmmm_ServerPayload_as_CtrlServerMessage(ctrl_msg);
|
||||
|
||||
hmmmm_ServerMessage_create_as_root(&B, nonce, payload);
|
||||
|
||||
uint8_t* buf = flatcc_builder_finalize_buffer(&B, len_out);
|
||||
flatcc_builder_clear(&B);
|
||||
NULL_GUARD(buf);
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
uint8_t* createDoneRegMessage(uint64_t nonce, uint8_t X, uint64_t devId, uint64_t segId, uint64_t startAddr, uint64_t segLength, uint32_t regId, size_t* lenOut)
|
||||
uint8_t* fb_build_stream_data_push(
|
||||
flatcc_builder_t *B,
|
||||
uint64_t nonce, uint32_t stream_id, uint64_t tclk,
|
||||
const uint8_t* data, size_t data_len,
|
||||
size_t* len_out)
|
||||
{
|
||||
*lenOut = 36 + 9;
|
||||
uint8_t* outmsg = malloc(sizeof(uint8_t) * (*lenOut));
|
||||
NULL_GUARD(outmsg);
|
||||
flatcc_builder_reset(B);
|
||||
|
||||
encodeUintToBytes(nonce, outmsg);
|
||||
outmsg[8] = (uint8_t)((PACKET_TYPE_STREAM << 4) | (X << 3) | STREAM_TYPE_REG_CONFIRM);
|
||||
encodeUintToBytes(devId, outmsg + 9);
|
||||
encodeUintToBytes(segId, outmsg + 9 + 8);
|
||||
encodeUintToBytes(startAddr, outmsg + 9 + 8 + 8);
|
||||
encodeUintToBytes(segLength, outmsg + 9 + 8 + 8 + 8);
|
||||
encodeUintToBytes(regId, outmsg + 9 + 8 + 8 + 8 + 8);
|
||||
return outmsg;
|
||||
flatbuffers_uint8_vec_ref_t data_vec =
|
||||
flatbuffers_uint8_vec_create(B, data, data_len);
|
||||
|
||||
hmmmm_stream_StreamDataPush_ref_t push =
|
||||
hmmmm_stream_StreamDataPush_create(B, stream_id, tclk, data_vec);
|
||||
|
||||
hmmmm_stream_StreamServerPayload_union_ref_t stream_payload =
|
||||
hmmmm_stream_StreamServerPayload_as_StreamDataPush(push);
|
||||
|
||||
hmmmm_stream_StreamServerMessage_ref_t stream_msg =
|
||||
hmmmm_stream_StreamServerMessage_create(B, stream_payload);
|
||||
|
||||
hmmmm_ServerPayload_union_ref_t payload =
|
||||
hmmmm_ServerPayload_as_StreamServerMessage(stream_msg);
|
||||
|
||||
hmmmm_ServerMessage_create_as_root(B, nonce, payload);
|
||||
|
||||
uint8_t* buf = flatcc_builder_finalize_buffer(B, len_out);
|
||||
NULL_GUARD(buf);
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
uint8_t* createStreamSegmentPush(uint8_t mode, uint32_t regId, uint64_t clockCounter, uint8_t* payload, size_t payloadLen, size_t* lenOut)
|
||||
uint8_t* fb_build_setup_buf(uint64_t nonce, uint32_t lost_buf_size,
|
||||
uint64_t client_lifetime_ticks, size_t* len_out)
|
||||
{
|
||||
*lenOut = 9 + 4 + 8 + payloadLen;
|
||||
flatcc_builder_t B;
|
||||
if (flatcc_builder_init(&B)) {
|
||||
panic("flatcc_builder_init failed\n");
|
||||
}
|
||||
|
||||
uint8_t* outmsg = malloc(sizeof(uint8_t) * (*lenOut));
|
||||
NULL_GUARD(outmsg);
|
||||
hmmmm_ctrl_setup_buf_SetupBuf_ref_t sb =
|
||||
hmmmm_ctrl_setup_buf_SetupBuf_create(&B, lost_buf_size, client_lifetime_ticks);
|
||||
|
||||
uint64_t nonce = (uint64_t)~0;
|
||||
encodeUintToBytes(nonce, outmsg);
|
||||
outmsg[8] = (uint8_t)((PACKET_TYPE_STREAM << 4) | (mode << 3) | STREAM_TYPE_SEND);
|
||||
hmmmm_ctrl_CtrlServerPayload_union_ref_t ctrl_payload =
|
||||
hmmmm_ctrl_CtrlServerPayload_as_SetupBuf(sb);
|
||||
|
||||
encodeUintToBytes(regId, outmsg + 9);
|
||||
encodeUintToBytes(clockCounter, outmsg + 9 + 4);
|
||||
memcpy(outmsg + 9 + 4 + 8, payload, payloadLen);
|
||||
hmmmm_ctrl_CtrlServerMessage_ref_t ctrl_msg =
|
||||
hmmmm_ctrl_CtrlServerMessage_create(&B, ctrl_payload);
|
||||
|
||||
return outmsg;
|
||||
hmmmm_ServerPayload_union_ref_t setup_outer =
|
||||
hmmmm_ServerPayload_as_CtrlServerMessage(ctrl_msg);
|
||||
|
||||
hmmmm_ServerMessage_create_as_root(&B, nonce, setup_outer);
|
||||
|
||||
uint8_t* buf = flatcc_builder_finalize_buffer(&B, len_out);
|
||||
flatcc_builder_clear(&B);
|
||||
NULL_GUARD(buf);
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
uint8_t* fb_build_orphaned_response(uint64_t nonce, size_t* len_out)
|
||||
{
|
||||
flatcc_builder_t B;
|
||||
if (flatcc_builder_init(&B)) {
|
||||
panic("flatcc_builder_init failed\n");
|
||||
}
|
||||
|
||||
// Use start/end directly: passing 0 to _create causes entries_add to return -1
|
||||
hmmmm_ctrl_orphaned_OrphanedResponse_start(&B);
|
||||
hmmmm_ctrl_orphaned_OrphanedResponse_ref_t resp =
|
||||
hmmmm_ctrl_orphaned_OrphanedResponse_end(&B);
|
||||
|
||||
hmmmm_ctrl_CtrlServerPayload_union_ref_t ctrl_payload =
|
||||
hmmmm_ctrl_CtrlServerPayload_as_OrphanedResponse(resp);
|
||||
|
||||
hmmmm_ctrl_CtrlServerMessage_ref_t ctrl_msg =
|
||||
hmmmm_ctrl_CtrlServerMessage_create(&B, ctrl_payload);
|
||||
|
||||
hmmmm_ServerPayload_union_ref_t orphan_outer =
|
||||
hmmmm_ServerPayload_as_CtrlServerMessage(ctrl_msg);
|
||||
|
||||
hmmmm_ServerMessage_create_as_root(&B, nonce, orphan_outer);
|
||||
|
||||
uint8_t* buf = flatcc_builder_finalize_buffer(&B, len_out);
|
||||
flatcc_builder_clear(&B);
|
||||
NULL_GUARD(buf);
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
uint8_t* fb_build_lost_messages_response(uint64_t nonce, uint64_t seat_id, size_t* len_out)
|
||||
{
|
||||
flatcc_builder_t B;
|
||||
if (flatcc_builder_init(&B)) {
|
||||
panic("flatcc_builder_init failed\n");
|
||||
}
|
||||
|
||||
// Use start/end directly: passing 0 for messages vec causes messages_add to return -1
|
||||
hmmmm_ctrl_lost_LostMessagesResponse_start(&B);
|
||||
hmmmm_ctrl_lost_LostMessagesResponse_seat_id_add(&B, seat_id);
|
||||
hmmmm_ctrl_lost_LostMessagesResponse_ref_t resp =
|
||||
hmmmm_ctrl_lost_LostMessagesResponse_end(&B);
|
||||
|
||||
hmmmm_ctrl_CtrlServerPayload_union_ref_t ctrl_payload =
|
||||
hmmmm_ctrl_CtrlServerPayload_as_LostMessagesResponse(resp);
|
||||
|
||||
hmmmm_ctrl_CtrlServerMessage_ref_t ctrl_msg =
|
||||
hmmmm_ctrl_CtrlServerMessage_create(&B, ctrl_payload);
|
||||
|
||||
hmmmm_ServerPayload_union_ref_t lost_outer =
|
||||
hmmmm_ServerPayload_as_CtrlServerMessage(ctrl_msg);
|
||||
|
||||
hmmmm_ServerMessage_create_as_root(&B, nonce, lost_outer);
|
||||
|
||||
uint8_t* buf = flatcc_builder_finalize_buffer(&B, len_out);
|
||||
flatcc_builder_clear(&B);
|
||||
NULL_GUARD(buf);
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
uint8_t* fb_build_mem_read_response(
|
||||
uint64_t nonce, uint64_t tclk,
|
||||
uint32_t device_id, uint32_t seg_id, uint32_t offset,
|
||||
const uint8_t* data, size_t data_len,
|
||||
size_t* len_out)
|
||||
{
|
||||
flatcc_builder_t B;
|
||||
if (flatcc_builder_init(&B)) {
|
||||
panic("flatcc_builder_init failed\n");
|
||||
}
|
||||
|
||||
flatbuffers_uint8_vec_ref_t data_vec =
|
||||
flatbuffers_uint8_vec_create(&B, data, data_len);
|
||||
|
||||
hmmmm_mem_MemReadResponse_ref_t resp =
|
||||
hmmmm_mem_MemReadResponse_create(&B, tclk, device_id, seg_id, offset, data_vec);
|
||||
|
||||
hmmmm_mem_MemServerPayload_union_ref_t mem_payload =
|
||||
hmmmm_mem_MemServerPayload_as_MemReadResponse(resp);
|
||||
|
||||
hmmmm_mem_MemServerMessage_ref_t mem_msg =
|
||||
hmmmm_mem_MemServerMessage_create(&B, mem_payload);
|
||||
|
||||
hmmmm_ServerPayload_union_ref_t mem_outer =
|
||||
hmmmm_ServerPayload_as_MemServerMessage(mem_msg);
|
||||
|
||||
hmmmm_ServerMessage_create_as_root(&B, nonce, mem_outer);
|
||||
|
||||
uint8_t* buf = flatcc_builder_finalize_buffer(&B, len_out);
|
||||
flatcc_builder_clear(&B);
|
||||
NULL_GUARD(buf);
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
uint8_t* fb_build_stream_reg_confirm(
|
||||
uint64_t nonce, uint32_t stream_id,
|
||||
uint32_t device_id, uint32_t seg_id, uint32_t offset, uint32_t length,
|
||||
uint8_t mode, size_t* len_out)
|
||||
{
|
||||
flatcc_builder_t B;
|
||||
if (flatcc_builder_init(&B)) {
|
||||
panic("flatcc_builder_init failed\n");
|
||||
}
|
||||
|
||||
hmmmm_stream_StreamRegConfirm_ref_t confirm =
|
||||
hmmmm_stream_StreamRegConfirm_create(
|
||||
&B, stream_id, device_id, seg_id, offset, length,
|
||||
(hmmmm_stream_StreamMode_enum_t)(int8_t)mode);
|
||||
|
||||
hmmmm_stream_StreamServerPayload_union_ref_t sreg_payload =
|
||||
hmmmm_stream_StreamServerPayload_as_StreamRegConfirm(confirm);
|
||||
|
||||
hmmmm_stream_StreamServerMessage_ref_t sreg_msg =
|
||||
hmmmm_stream_StreamServerMessage_create(&B, sreg_payload);
|
||||
|
||||
hmmmm_ServerPayload_union_ref_t sreg_outer =
|
||||
hmmmm_ServerPayload_as_StreamServerMessage(sreg_msg);
|
||||
|
||||
hmmmm_ServerMessage_create_as_root(&B, nonce, sreg_outer);
|
||||
|
||||
uint8_t* buf = flatcc_builder_finalize_buffer(&B, len_out);
|
||||
flatcc_builder_clear(&B);
|
||||
NULL_GUARD(buf);
|
||||
return buf;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user