31typedef enum : uint16_t {
60 if (text ==
nullptr) {
63 const size_t length =
strnlen(text, cap);
67 for (
size_t index = 0U; index < length; index++) {
68 if ((text[index] ==
'\r') || (text[index] ==
'\n')) {
107 return (aligned <= capacity) && (used <= (capacity - aligned));
131 arena->
used += aligned;
171 if ((len == 0U) || (len > response_cap)) {
198 size_t* response_len)
233 size_t* response_len)
264 if (request->
url ==
nullptr) {
267 const size_t https_prefix_len =
sizeof(
"https://") - 1U;
271 (
strncmp(request->
url,
"https://", https_prefix_len) == 0) &&
272 (request->
url[https_prefix_len] !=
'\0') &&
305 ProtobufCAllocator* alloc,
306 const uint8_t* request,
310 size_t* response_len)
313 if (req ==
nullptr) {
316 if (req->
base.n_unknown_fields != 0U) {
326 if (next_job_id == 0U) {
348 const ra8_err_t begun = service->backend.begin(service->backend.ctx, &backend_request);
353 service->next_job_id = next_job_id;
354 service->active_job_id = service->next_job_id;
355 service->next_sequence = 0U;
356 service->next_offset = 0U;
358 service->active =
true;
423 memset(filler,
'x',
sizeof(filler) - 1U);
424 filler[
sizeof(filler) - 1U] =
'\0';
427 data.protocol_version = UINT32_MAX;
428 data.job_id = UINT32_MAX;
429 data.sequence = UINT32_MAX;
430 data.offset = UINT64_MAX;
431 data.data = (ProtobufCBinaryData){.len = max_data, .data = (uint8_t*)filler};
432 data.total_bytes = UINT64_MAX;
443 terminal.
job_id = UINT32_MAX;
445 terminal.
offset = UINT64_MAX;
452 terminal.
etag = filler;
494 const bool offset_overflow = service->
next_offset > (UINT64_MAX - result->
got);
496 bool total_invalid =
false;
499 }
else if (result->
total != 0U) {
502 if ((result->
got > max_data) || ((!result->
complete) && (result->
got == 0U)) ||
503 (result->
complete && (result->
got != 0U)) || offset_overflow || total_invalid ||
537 out->
data = (ProtobufCBinaryData){.len = result->
got, .data = result->
bytes};
577 ProtobufCAllocator* alloc,
578 const uint8_t* request,
582 size_t* response_len)
585 if (req ==
nullptr) {
588 if (req->
base.n_unknown_fields != 0U) {
650 ProtobufCAllocator* alloc,
651 const uint8_t* request,
655 size_t* response_len)
659 if (req ==
nullptr) {
662 if (req->
base.n_unknown_fields != 0U) {
707 if ((service ==
nullptr) || (backend ==
nullptr) || (backend->
begin ==
nullptr) ||
708 (backend->
read ==
nullptr) || (backend->
cancel ==
nullptr)) {
717 const uint8_t* request,
721 size_t* response_len)
723 if ((ctx ==
nullptr) || (request ==
nullptr) || (request_len == 0U) || (response ==
nullptr) ||
724 (response_len ==
nullptr)) {
735 .allocator_data = &service->
arena};
Annotation-attribute framework macros for ra8-firmware.
#define RA8_PRIV
Module-private helper: shared across TUs but only inside one library.
#define RA8_TEST_HELPER
Mark a symbol as externally-linked but only callable from tests.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Media service dispatch contract for the ESP32-C6 integration.
struct ra8_mdl_service ra8_mdl_service_t
@ k_ra8_mdl_decode_align
Alignment every arena span is issued on.
struct ra8_mdl_decode_arena ra8_mdl_decode_arena_t
struct ra8_mdl_service_backend ra8_mdl_service_backend_t
static ra8_err_t internal_mdl_next_capacity(uint32_t max_data, size_t response_cap)
Prove the worst-case Chunk for one request fits before backend I/O.
static ra8_err_t internal_mdl_pack_chunk(const Ra8__Mdl__Chunk *msg, uint8_t *response, size_t response_cap, size_t *response_len)
Pack a Chunk response into a bounded caller buffer.
static ra8_err_t internal_mdl_pack_accepted(const Ra8__Mdl__Accepted *msg, uint8_t *response, size_t response_cap, size_t *response_len)
Pack an Accepted response into a bounded caller buffer.
bool priv_c6link_mdl_decode_allocation_fits(size_t used, size_t len, size_t capacity)
Decide whether one aligned protobuf allocation fits an arena.
bool ra8_mdl_service_field_valid_test(const char *text, size_t cap)
Judge one decoded request header exactly as dispatch does.
static bool internal_mdl_request_field_valid(const char *text, size_t cap)
Validate one decoded optional request header.
static void internal_mdl_decode_free(void *data, void *ptr)
Ignore individual protobuf frees for the linear dispatch arena.
static ra8_err_t internal_mdl_check_response_size(size_t len, size_t response_cap)
Reject a response that cannot fit before invoking the backend.
mdl_svc_const_t
Rounding mask derived from the arena's published alignment.
@ k_mdl_decode_align_mask
Mask used to round sizes.
static ra8_err_t internal_mdl_dispatch_cancel(ra8_mdl_service_t *service, ProtobufCAllocator *alloc, const uint8_t *request, size_t request_len, uint8_t *response, size_t response_cap, size_t *response_len)
Validate and cancel one correlated active service job.
ra8_err_t ra8_mdl_service_dispatch(void *ctx, uint32_t operation, const uint8_t *request, size_t request_len, uint8_t *response, size_t response_cap, size_t *response_len)
Dispatch Start, Next, or Cancel generated protobuf payloads.
static ra8_err_t internal_mdl_dispatch_next(ra8_mdl_service_t *service, ProtobufCAllocator *alloc, const uint8_t *request, size_t request_len, uint8_t *response, size_t response_cap, size_t *response_len)
Validate one pull, read bounded bytes, and pack a correlated Chunk.
ra8_err_t ra8_mdl_service_check_size_test(size_t len, size_t response_cap)
Judge one packed-response length exactly as dispatch does.
static void * internal_mdl_decode_alloc(void *data, size_t len)
Allocate one aligned span from a per-dispatch bounded arena.
bool ra8_mdl_service_response_valid_test(const ra8_mdl_http_response_t *response)
Judge one backend terminal response exactly as dispatch does.
static ra8_err_t internal_mdl_read_next(ra8_mdl_service_t *service, uint32_t max_data, internal_mdl_next_read_t *result)
Pull and validate one backend response without advancing service state.
static ra8_err_t internal_mdl_dispatch_start(ra8_mdl_service_t *service, ProtobufCAllocator *alloc, const uint8_t *request, size_t request_len, uint8_t *response, size_t response_cap, size_t *response_len)
Validate and begin one typed-artifact service job.
static ra8_err_t internal_mdl_fail_job(ra8_mdl_service_t *service, ra8_err_t error)
Cancel and deactivate one backend job after a terminal error.
ra8_err_t ra8_mdl_service_init(ra8_mdl_service_t *service, const ra8_mdl_service_backend_t *backend)
Initialise portable service state with a complete backend seam.
static bool internal_mdl_response_valid(const ra8_mdl_http_response_t *response)
Validate fixed terminal response metadata returned by a backend.
static bool internal_mdl_start_valid(const Ra8__Mdl__StartRequest *request)
Validate every generated Start field before backend activation.
static void internal_mdl_build_chunk(const ra8_mdl_service_t *service, internal_mdl_next_read_t *result, Ra8__Mdl__Chunk *out)
Build one Chunk message from a completed backend pull.
Private bounded-allocation seam for the portable media service.
@ k_ra8_err_not_supported
Requested feature not compiled in, not wired, or not supported by this MCU variant.
@ k_ra8_err_busy
Resource busy – blocking operation cannot proceed.
@ k_ra8_err_invalid_arg
Invalid function argument.
@ k_ra8_err_invalid_state
Module in wrong state for requested operation.
@ k_ra8_err_validation_failed
Validation rule failed (caller-supplied invariant not satisfied).
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
@ k_ra8_err_protocol_error
Protocol-level error (e.g.
@ k_ra8_err_invalid_size
Invalid size parameter (too large, too small, or misaligned).
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
int strncmp(const char *s1, const char *s2, size_t n)
Compare two strings up to a specified length.
void * memset(void *dst, int value, size_t n)
Fill memory with a constant byte value.
size_t strnlen(const char *s, size_t maxlen)
Calculate bounded string length.
@ k_ra8_mdl_user_agent_max
Maximum User-Agent size, including NUL.
@ k_ra8_mdl_referer_max
Maximum Referer size, including NUL.
@ k_ra8_mdl_chunk_data_max
Maximum raw body bytes in one chunk.
@ k_ra8_mdl_url_max
Maximum URL buffer size, including NUL.
@ k_ra8_mdl_http_date_max
Maximum HTTP-date size, including NUL.
@ k_ra8_mdl_etag_max
Maximum ETag size, including NUL.
@ k_ra8_mdl_content_type_max
Maximum Content-Type size, including NUL.
@ k_ra8_mdl_sha256_bytes
SHA-256 digest size in bytes.
@ k_ra8_mdl_retry_after_max
Maximum Retry-After size, including NUL.
@ k_ra8_mdl_timeout_ms_max
Maximum caller-selected HTTP timeout in ms.
@ k_ra8_mdl_http_status_max
Highest well-formed HTTP status code.
@ k_ra8_mdl_http_status_min
Lowest well-formed HTTP status code.
@ k_ra8_mdl_protocol_version
Typed HTTP-artifact transfer protocol.
@ k_ra8_mdl_rpc_start
Start one typed-artifact job.
@ k_ra8_mdl_rpc_cancel
Cancel one active job.
@ k_ra8_mdl_rpc_next
Pull one ordered bounded chunk.
uint32_t protocol_version
uint32_t protocol_version
uint32_t protocol_version
ProtobufCBinaryData sha256
uint32_t protocol_version
uint32_t protocol_version
uint64_t acknowledged_offset
uint32_t protocol_version
Caller-bounded bytes and metadata returned by one backend pull.
uint16_t got
Valid body byte count.
bool complete
Whether this is terminal.
uint8_t digest[k_ra8_mdl_sha256_bytes]
Terminal SHA-256 digest.
uint64_t end_offset
Offset after returned data.
uint64_t total
Declared complete size.
ra8_mdl_http_response_t response
Terminal HTTP metadata.
uint8_t bytes[k_ra8_mdl_chunk_data_max]
Returned body bytes.
uint8_t bytes[k_ra8_mdl_decode_arena_bytes]
Fixed protobuf decode storage.
size_t used
Bytes already allocated.
HTTP status and selected response headers proven by the C6 backend.
char last_modified[k_ra8_mdl_http_date_max]
Last-Modified or empty.
int32_t status
Final HTTP status.
char retry_after[k_ra8_mdl_retry_after_max]
Retry-After or empty.
char content_type[k_ra8_mdl_content_type_max]
Content-Type or empty.
char etag[k_ra8_mdl_etag_max]
ETag or empty.
Complete typed HTTPS request accepted by protocol version 3.
ra8_err_t(* begin)(void *ctx, const ra8_mdl_request_t *request)
Validate and begin one bounded typed HTTPS request.
ra8_err_t(* read)(void *ctx, uint8_t *out, uint16_t cap, uint16_t *got, uint64_t *total_bytes, bool *complete, uint8_t sha256[k_ra8_mdl_sha256_bytes], ra8_mdl_http_response_t *response)
Pull bytes or terminal metadata.
void * ctx
Backend callback context.
ra8_err_t(* cancel)(void *ctx)
Cancel and release the active backend job.
uint32_t next_sequence
Sequence required from the next pull.
uint32_t active_job_id
Correlation id of the current job.
bool active
Whether Next or Cancel is currently valid.
uint64_t next_offset
Byte offset required from the next pull.
ra8_mdl_service_backend_t backend
Injected typed-artifact source mechanism.
ra8_mdl_decode_arena_t arena
Decode storage for the running dispatch.
uint32_t next_job_id
Monotonic id candidate for the next Start.