ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_c6link_tlv.c
Go to the documentation of this file.
1
28
29#include <stdint.h>
30
31#include "ra8_attributes.h"
32#include "ra8_c6link.h"
33#include "ra8_c6link_internal.h"
34
35/* Upstream requires both endpoint names to be the same length, and the
36 receive path below relies on it to accept either without a second offset
37 calculation. */
38static_assert(sizeof(RPC_EP_NAME_RSP) == sizeof(RPC_EP_NAME_EVT),
39 "esp-hosted requires every RPC endpoint name to have one length");
40
58RA8_INTERNAL static uint16_t
59internal_c6link_tlv_tag(uint8_t* out, uint16_t at, uint8_t type, uint16_t len)
60{
61 out[at + (uint16_t)k_ra8_c6link_tlv_type] = type;
62 out[at + (uint16_t)k_ra8_c6link_tlv_len_lo] = (uint8_t)(len & (uint16_t)k_ra8_c6link_tlv_mask);
63 out[at + (uint16_t)k_ra8_c6link_tlv_len_hi] =
64 (uint8_t)((len >> (uint16_t)k_ra8_c6link_tlv_shift) & (uint16_t)k_ra8_c6link_tlv_mask);
65 return (uint16_t)(at + (uint16_t)k_ra8_c6link_tlv_value);
66}
67
84RA8_INTERNAL static uint16_t internal_c6link_tlv_len(const uint8_t* buf, uint16_t at)
85{
86 const uint16_t lo = (uint16_t)buf[at + (uint16_t)k_ra8_c6link_tlv_len_lo];
87 const uint16_t hi = (uint16_t)buf[at + (uint16_t)k_ra8_c6link_tlv_len_hi];
88 return (uint16_t)(lo | (uint16_t)(hi << (uint16_t)k_ra8_c6link_tlv_shift));
89}
90
92 uint16_t cap,
93 uint16_t proto_len,
94 uint16_t* body_at)
95{
96 if ((out == nullptr) || (body_at == nullptr)) {
97 return k_ra8_err_null_ptr;
98 }
99 *body_at = 0U;
100 if ((uint32_t)cap < ((uint32_t)proto_len + (uint32_t)k_ra8_c6link_tlv_overhead)) {
102 }
103
104 uint16_t at = internal_c6link_tlv_tag(out,
105 0U,
107 (uint16_t)k_ra8_c6link_tlv_ep_len);
108 for (uint16_t i = 0U; i < (uint16_t)k_ra8_c6link_tlv_ep_len; i++) {
109 out[at + i] = (uint8_t)RPC_EP_NAME_RSP[i];
110 }
111 at = (uint16_t)(at + (uint16_t)k_ra8_c6link_tlv_ep_len);
112 *body_at = internal_c6link_tlv_tag(out, at, (uint8_t)k_ra8_c6link_tlv_t_data, proto_len);
113 return k_ra8_ok;
114}
115
133RA8_INTERNAL static bool internal_c6link_tlv_named(const uint8_t* payload)
134{
135 bool named = true;
136 for (uint16_t i = 0U; i < (uint16_t)k_ra8_c6link_tlv_ep_len; i++) {
137 const uint8_t got = payload[(uint16_t)k_ra8_c6link_tlv_value + i];
138 if ((got != (uint8_t)RPC_EP_NAME_RSP[i]) && (got != (uint8_t)RPC_EP_NAME_EVT[i])) {
139 named = false;
140 }
141 }
142 return named;
143}
144
145RA8_PRIV const uint8_t*
146priv_c6link_tlv_body(const uint8_t* payload, uint16_t len, uint16_t* proto_len)
147{
148 if ((payload == nullptr) || (proto_len == nullptr)) {
149 return nullptr;
150 }
151 *proto_len = 0U;
152 const uint16_t data_tag =
153 (uint16_t)((uint16_t)k_ra8_c6link_tlv_value + (uint16_t)k_ra8_c6link_tlv_ep_len);
154
155 if ((len < (uint16_t)k_ra8_c6link_tlv_overhead) ||
156 (payload[k_ra8_c6link_tlv_type] != (uint8_t)k_ra8_c6link_tlv_t_epname) ||
157 (payload[data_tag] != (uint8_t)k_ra8_c6link_tlv_t_data)) {
158 return nullptr;
159 }
160 if (internal_c6link_tlv_len(payload, 0U) != (uint16_t)k_ra8_c6link_tlv_ep_len) {
161 return nullptr;
162 }
163 if (!internal_c6link_tlv_named(payload)) {
164 return nullptr;
165 }
166
167 const uint16_t body = internal_c6link_tlv_len(payload, data_tag);
168 if ((body == 0U) || (((uint32_t)body + (uint32_t)k_ra8_c6link_tlv_overhead) > (uint32_t)len)) {
169 return nullptr;
170 }
171 *proto_len = body;
172 return &payload[k_ra8_c6link_tlv_overhead];
173}
Annotation-attribute framework macros for ra8-firmware.
#define RA8_PRIV
Module-private helper: shared across TUs but only inside one library.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
Definition ra8_err.h:478
@ k_ra8_err_invalid_size
Invalid size parameter (too large, too small, or misaligned).
Definition ra8_err.h:167
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546