Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 44 additions & 32 deletions .fusa-reqs.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion .fusa.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"configVersion": "1.0",
"project": {
"name": "c-RCP",
"version": "0.107.0"
"version": "0.109.0"
},
"standard": "iso26262",
"strict": false,
Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.16)

project(c-rcp
VERSION 0.107.0
VERSION 0.109.0
DESCRIPTION "OPEN Alliance TC18 Remote Control Protocol (C)"
HOMEPAGE_URL "https://github.com/SoundMatt/c-RCP"
LANGUAGES C
Expand Down
221 changes: 132 additions & 89 deletions include/rcp/ep_can.h

Large diffs are not rendered by default.

11 changes: 9 additions & 2 deletions include/rcp/ep_i2c.h
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,11 @@ typedef enum {
* this module: both op senses are valid on an I2C transfer (see the
* file header), so there is no longer a "wrong" one to reject. */
RCP_EP_I2C_ERR_WRONG_OP = 4,
/* evt[2:0] is not 0b000, TC18 §13.5 Table 30's only legal value for a
* plain (non-configuration) request in I2C's endpoint-type row --
* caller shall respond with error code UNSUPPORTED_CMD (see
* rcp_acf_evt_row2_is_plain()). */
RCP_EP_I2C_ERR_BAD_EVT = 5,
} rcp_ep_i2c_errc_t;

/* Human-readable message for an rcp_ep_i2c_errc_t value. Never returns NULL. */
Expand Down Expand Up @@ -299,8 +304,10 @@ rcp_bytes_t rcp_ep_i2c_encode_transfer_request(rcp_byte_bus_id_t byte_bus_id,
* Fails with RCP_EP_I2C_ERR_SHORT_FRAME if b is shorter than the ACF_ABB
* fixed header or its declared payload length; RCP_EP_I2C_ERR_BAD_MSG_TYPE
* if b is not an ACF_ABB message; RCP_EP_I2C_ERR_WRONG_BUS if its
* byte_bus_id != expected_bus_id. Both op senses are accepted -- see the
* file header -- and reported via *out_direction.
* byte_bus_id != expected_bus_id; RCP_EP_I2C_ERR_BAD_EVT if its evt[2:0]
* is not 0b000 (rcp_acf_evt_row2_is_plain(), TC18 §13.5 Table 30 -- the
* caller shall respond with error code UNSUPPORTED_CMD). Both op senses
* are accepted -- see the file header -- and reported via *out_direction.
*
* On RCP_EP_I2C_OK, *out_direction, *out_read_size (the requested
* read_size for RCP_EP_I2C_DIR_READ, 0 for RCP_EP_I2C_DIR_WRITE, whose
Expand Down
10 changes: 9 additions & 1 deletion include/rcp/ep_iseled.h
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,11 @@ typedef enum {
RCP_EP_ISELED_ERR_CRC_MISMATCH = 6,
RCP_EP_ISELED_ERR_ODD_SYMBOL_COUNT = 7,
RCP_EP_ISELED_ERR_ALLOC = 8,
/* evt[2:0] is not 0b000, TC18 §13.5 Table 30's only legal value for a
* plain (non-configuration) request in ISELED's endpoint-type row --
* caller shall respond with error code UNSUPPORTED_CMD (see
* rcp_acf_evt_row2_is_plain()). */
RCP_EP_ISELED_ERR_BAD_EVT = 9,
} rcp_ep_iseled_errc_t;

/* Human-readable message for an rcp_ep_iseled_errc_t value. Never returns NULL. */
Expand Down Expand Up @@ -410,7 +415,10 @@ rcp_bytes_t rcp_ep_iseled_encode_command_request(rcp_byte_bus_id_t byte_bus_id,
* the ACF_ABB fixed header or its declared payload length;
* RCP_EP_ISELED_ERR_BAD_MSG_TYPE if b is not an ACF_ABB message;
* RCP_EP_ISELED_ERR_WRONG_BUS if its byte_bus_id != expected_bus_id;
* RCP_EP_ISELED_ERR_WRONG_OP if its op is not RCP_ACF_OP_WRITE. On
* RCP_EP_ISELED_ERR_WRONG_OP if its op is not RCP_ACF_OP_WRITE;
* RCP_EP_ISELED_ERR_BAD_EVT if its evt[2:0] is not 0b000
* (rcp_acf_evt_row2_is_plain(), TC18 §13.5 Table 30 -- the caller shall
* respond with error code UNSUPPORTED_CMD). On
* RCP_EP_ISELED_OK, *out_transaction_num is populated, and *out_tx_data /
* *out_tx_len are set to a *borrowed* view into b (not copied) of the raw
* plain content. */
Expand Down
15 changes: 13 additions & 2 deletions include/rcp/ep_mdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,11 @@ typedef enum {
RCP_EP_MDIO_ERR_BAD_ADDR = 5,
RCP_EP_MDIO_ERR_BAD_WORD_COUNT = 6,
RCP_EP_MDIO_ERR_ALLOC = 7,
/* evt[2:0] is not 0b000, TC18 §13.5 Table 30's only legal value for a
* plain (non-configuration) request in MDIO's endpoint-type row --
* caller shall respond with error code UNSUPPORTED_CMD (see
* rcp_acf_evt_row2_is_plain()). */
RCP_EP_MDIO_ERR_BAD_EVT = 8,
} rcp_ep_mdio_errc_t;

/* Human-readable message for an rcp_ep_mdio_errc_t value. Never returns NULL. */
Expand All @@ -382,7 +387,10 @@ rcp_bytes_t rcp_ep_mdio_encode_read_request(rcp_byte_bus_id_t byte_bus_id,
* RCP_EP_MDIO_ERR_WRONG_OP if its op is not RCP_ACF_OP_READ;
* RCP_EP_MDIO_ERR_BAD_ADDR if the decoded address fails
* rcp_ep_mdio_addr_valid(); RCP_EP_MDIO_ERR_BAD_WORD_COUNT if the decoded
* word_count is 0 or exceeds RCP_EP_MDIO_MAX_BURST_WORDS. On
* word_count is 0 or exceeds RCP_EP_MDIO_MAX_BURST_WORDS;
* RCP_EP_MDIO_ERR_BAD_EVT if its evt[2:0] is not 0b000
* (rcp_acf_evt_row2_is_plain(), TC18 §13.5 Table 30 -- the caller shall
* respond with error code UNSUPPORTED_CMD). On
* RCP_EP_MDIO_OK, *out_addr, *out_word_count, and *out_transaction_num
* are populated. */
rcp_ep_mdio_errc_t rcp_ep_mdio_decode_read_request(const uint8_t *b, size_t len,
Expand Down Expand Up @@ -448,7 +456,10 @@ rcp_bytes_t rcp_ep_mdio_encode_write_request(rcp_byte_bus_id_t byte_bus_id,
* RCP_EP_MDIO_ERR_BAD_ADDR if the decoded address fails
* rcp_ep_mdio_addr_valid(); RCP_EP_MDIO_ERR_BAD_WORD_COUNT if the words
* region's own byte length is odd, is 0, or represents more than
* RCP_EP_MDIO_MAX_BURST_WORDS words. On RCP_EP_MDIO_OK, *out_addr and
* RCP_EP_MDIO_MAX_BURST_WORDS words; RCP_EP_MDIO_ERR_BAD_EVT if its
* evt[2:0] is not 0b000 (rcp_acf_evt_row2_is_plain(), TC18 §13.5
* Table 30 -- the caller shall respond with error code UNSUPPORTED_CMD).
* On RCP_EP_MDIO_OK, *out_addr and
* *out_transaction_num are populated, and *out_words_data /
* *out_word_count are set to a *borrowed* view into b (not copied) of the
* packed word bytes following the address prefix. */
Expand Down
15 changes: 13 additions & 2 deletions include/rcp/ep_uart.h
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,11 @@ typedef enum {
RCP_EP_UART_ERR_WRONG_OP = 4,
RCP_EP_UART_ERR_UNKNOWN_CMD = 5, /* payload-bearing read request -- see
the file header */
/* evt[2:0] is not 0b000, TC18 §13.5 Table 30's only legal value for a
* plain (non-configuration) request in UART's endpoint-type row --
* caller shall respond with error code UNSUPPORTED_CMD (see
* rcp_acf_evt_row2_is_plain()). */
RCP_EP_UART_ERR_BAD_EVT = 6,
} rcp_ep_uart_errc_t;

/* Human-readable message for an rcp_ep_uart_errc_t value. Never returns NULL. */
Expand All @@ -319,7 +324,10 @@ rcp_bytes_t rcp_ep_uart_encode_write_request(rcp_byte_bus_id_t byte_bus_id,
* fixed header or its declared payload length; RCP_EP_UART_ERR_BAD_MSG_TYPE
* if b is not an ACF_ABB message; RCP_EP_UART_ERR_WRONG_BUS if its
* byte_bus_id != expected_bus_id; RCP_EP_UART_ERR_WRONG_OP if its op is not
* RCP_ACF_OP_WRITE. On RCP_EP_UART_OK, *out_transaction_num is populated,
* RCP_ACF_OP_WRITE; RCP_EP_UART_ERR_BAD_EVT if its evt[2:0] is not 0b000
* (rcp_acf_evt_row2_is_plain(), TC18 §13.5 Table 30 -- the caller shall
* respond with error code UNSUPPORTED_CMD). On RCP_EP_UART_OK,
* *out_transaction_num is populated,
* and *out_tx_data / *out_tx_len are set to a *borrowed* view into b (not
* copied -- see the file header) of the raw outgoing payload. */
rcp_ep_uart_errc_t rcp_ep_uart_decode_write_request(const uint8_t *b, size_t len,
Expand Down Expand Up @@ -376,7 +384,10 @@ rcp_bytes_t rcp_ep_uart_encode_read_request(rcp_byte_bus_id_t byte_bus_id, uint8
* RCP_EP_UART_ERR_WRONG_BUS if its byte_bus_id != expected_bus_id;
* RCP_EP_UART_ERR_WRONG_OP if its op is not RCP_ACF_OP_READ;
* RCP_EP_UART_ERR_UNKNOWN_CMD if it carries any payload at all -- the
* deliberate asymmetry documented in the file header. On RCP_EP_UART_OK,
* deliberate asymmetry documented in the file header; RCP_EP_UART_ERR_BAD_EVT
* if its evt[2:0] is not 0b000 (rcp_acf_evt_row2_is_plain(), TC18 §13.5
* Table 30 -- the caller shall respond with error code UNSUPPORTED_CMD).
* On RCP_EP_UART_OK,
* *out_read_size and *out_transaction_num are populated. */
rcp_ep_uart_errc_t rcp_ep_uart_decode_read_request(const uint8_t *b, size_t len,
rcp_byte_bus_id_t expected_bus_id,
Expand Down
2 changes: 1 addition & 1 deletion include/rcp/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
#ifndef RCP_VERSION_H
#define RCP_VERSION_H

#define RCP_VERSION "0.107.0"
#define RCP_VERSION "0.109.0"

#endif /* RCP_VERSION_H */
72 changes: 48 additions & 24 deletions src/ep_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ static uint32_t get_u32(const uint8_t *p)
(uint32_t)p[3];
}

/* ── FrameFormat selection (evt[2:0]) ────────────────────────────────────── */
/* ── FrameFormat selection (payload leading quadlet, TC18 Table 54) ──────── */

//cfusa:req REQ-CANEP-001
bool rcp_ep_can_frame_format_valid(uint8_t v)
Expand Down Expand Up @@ -191,33 +191,48 @@ const char *rcp_ep_can_strerror(rcp_ep_can_errc_t e)
case RCP_EP_CAN_ERR_BAD_MSG_TYPE: return "rcp/ep_can: unexpected ACF message type";
case RCP_EP_CAN_ERR_WRONG_BUS: return "rcp/ep_can: wrong byte_bus_id";
case RCP_EP_CAN_ERR_WRONG_OP: return "rcp/ep_can: wrong ACF op";
case RCP_EP_CAN_ERR_BAD_FRAME_FORMAT: return "rcp/ep_can: invalid frame format selector";
case RCP_EP_CAN_ERR_BAD_FRAME_FORMAT: return "rcp/ep_can: invalid frame format";
case RCP_EP_CAN_ERR_BAD_EVT: return "rcp/ep_can: evt[2:0] is not 0b000";
case RCP_EP_CAN_ERR_BAD_ARBITRATION_ID: return "rcp/ep_can: arbitration_id out of range for frame format";
default: return "rcp/ep_can: unknown error";
}
}

/* ── Wire layout helpers (this module's own prefix-then-data choice) ────── */
/* ── Wire layout helpers (TC18 §13.7.11.3 Figure 39) ─────────────────────── */

static size_t prefix_len_for(rcp_ep_can_frame_format_t format)
{
return rcp_ep_can_frame_format_is_xl(format) ? (size_t)10u : (size_t)4u;
}

/* Figure 39's leading quadlet: frame_format in the top 3 bits, the
* (right-aligned, for an 11-bit base id) arbitration_id in the bottom 29
* bits. */
static void write_prefix(uint8_t *p, rcp_ep_can_frame_format_t format, uint32_t arbitration_id,
const rcp_ep_can_xl_header_t *xl_header)
{
put_u32(p, arbitration_id);
uint32_t combined = ((uint32_t)format << 29) | (arbitration_id & 0x1FFFFFFFu);

put_u32(p, combined);
if (rcp_ep_can_frame_format_is_xl(format)) {
p[4] = xl_header->sdt;
p[5] = xl_header->vcid;
put_u32(&p[6], xl_header->af);
}
}

/* Reads just the leading quadlet's top 3 bits -- the only field a caller
* needs before it knows which format (and therefore which full prefix
* length) it is looking at. */
static rcp_ep_can_frame_format_t read_frame_format(const uint8_t *p)
{
return (rcp_ep_can_frame_format_t)((get_u32(p) >> 29) & 0x7u);
}

static void read_prefix(const uint8_t *p, rcp_ep_can_frame_format_t format,
uint32_t *out_arbitration_id, rcp_ep_can_xl_header_t *out_xl_header)
{
*out_arbitration_id = get_u32(p);
*out_arbitration_id = get_u32(p) & 0x1FFFFFFFu;
if (rcp_ep_can_frame_format_is_xl(format)) {
out_xl_header->sdt = p[4];
out_xl_header->vcid = p[5];
Expand Down Expand Up @@ -290,7 +305,7 @@ rcp_bytes_t rcp_ep_can_encode_frame_request(rcp_byte_bus_id_t byte_bus_id,

hdr.byte_bus_id = byte_bus_id;
hdr.op = RCP_ACF_OP_WRITE;
hdr.evt = (uint8_t)frame_format;
hdr.evt = 0; /* TC18 Table 30: plain request in CAN's Row-2 -- frame_format now lives in the payload, see the file header */
hdr.transaction_num = transaction_num;

frame = rcp_acf_encode_abb(&hdr, payload, payload_len);
Expand Down Expand Up @@ -322,14 +337,18 @@ rcp_ep_can_errc_t rcp_ep_can_decode_frame_request(const uint8_t *b, size_t len,

if (hdr.byte_bus_id != expected_bus_id) return RCP_EP_CAN_ERR_WRONG_BUS;
if (hdr.op != RCP_ACF_OP_WRITE) return RCP_EP_CAN_ERR_WRONG_OP;
if (!rcp_acf_evt_row2_is_plain(hdr.evt)) return RCP_EP_CAN_ERR_BAD_EVT;

if (!rcp_ep_can_frame_format_valid(hdr.evt & 0x07u)) return RCP_EP_CAN_ERR_BAD_FRAME_FORMAT;
frame_format = (rcp_ep_can_frame_format_t)(hdr.evt & 0x07u);
if (payload_len < 4u) return RCP_EP_CAN_ERR_SHORT_FRAME;
frame_format = read_frame_format(payload);
if (!rcp_ep_can_frame_format_valid((uint8_t)frame_format)) return RCP_EP_CAN_ERR_BAD_FRAME_FORMAT;

prefix_len = prefix_len_for(frame_format);
if (payload_len < prefix_len) return RCP_EP_CAN_ERR_SHORT_FRAME;

read_prefix(payload, frame_format, out_arbitration_id, out_xl_header);
if (!rcp_ep_can_arbitration_id_valid(frame_format, *out_arbitration_id))
return RCP_EP_CAN_ERR_BAD_ARBITRATION_ID;

*out_frame_format = frame_format;
*out_tx_data = &payload[prefix_len];
Expand Down Expand Up @@ -365,7 +384,7 @@ rcp_bytes_t rcp_ep_can_encode_frame_response(rcp_byte_bus_id_t byte_bus_id,
hdr.info.byte_bus_id = byte_bus_id;
hdr.info.op = RCP_ACF_OP_READ;
hdr.info.rsp = 1; /* TC18.txt:1885 -- rsp=1b identifies a response */
hdr.info.evt = (uint8_t)frame_format;
hdr.info.evt = 0; /* TC18 Table 30: plain response, see the file header */
hdr.info.mtv = RCP_ACF_MTV_VALID;
hdr.info.transaction_num = transaction_num;
hdr.message_timestamp = timestamp;
Expand All @@ -377,7 +396,7 @@ rcp_bytes_t rcp_ep_can_encode_frame_response(rcp_byte_bus_id_t byte_bus_id,
hdr.byte_bus_id = byte_bus_id;
hdr.op = RCP_ACF_OP_READ;
hdr.rsp = 1; /* TC18.txt:1885 -- rsp=1b identifies a response */
hdr.evt = (uint8_t)frame_format;
hdr.evt = 0; /* TC18 Table 30: plain request in CAN's Row-2 -- frame_format now lives in the payload, see the file header */
hdr.transaction_num = transaction_num;

frame = rcp_acf_encode_abb(&hdr, payload, payload_len);
Expand Down Expand Up @@ -439,14 +458,18 @@ rcp_ep_can_errc_t rcp_ep_can_decode_frame_response(const uint8_t *b, size_t len,
}

if (bus_id != expected_bus_id) return RCP_EP_CAN_ERR_WRONG_BUS;
if (!rcp_acf_evt_row2_is_plain(evt)) return RCP_EP_CAN_ERR_BAD_EVT;

if (!rcp_ep_can_frame_format_valid(evt & 0x07u)) return RCP_EP_CAN_ERR_BAD_FRAME_FORMAT;
frame_format = (rcp_ep_can_frame_format_t)(evt & 0x07u);
if (payload_len < 4u) return RCP_EP_CAN_ERR_SHORT_FRAME;
frame_format = read_frame_format(payload);
if (!rcp_ep_can_frame_format_valid((uint8_t)frame_format)) return RCP_EP_CAN_ERR_BAD_FRAME_FORMAT;

prefix_len = prefix_len_for(frame_format);
if (payload_len < prefix_len) return RCP_EP_CAN_ERR_SHORT_FRAME;

read_prefix(payload, frame_format, out_arbitration_id, out_xl_header);
if (!rcp_ep_can_arbitration_id_valid(frame_format, *out_arbitration_id))
return RCP_EP_CAN_ERR_BAD_ARBITRATION_ID;

*out_frame_format = frame_format;
*out_rx_data = &payload[prefix_len];
Expand Down Expand Up @@ -521,7 +544,7 @@ size_t rcp_ep_can_encode_frame_response_fragmented(rcp_byte_bus_id_t byte_bus_id
hdr.info.byte_bus_id = byte_bus_id;
hdr.info.op = RCP_ACF_OP_READ;
hdr.info.rsp = 1; /* TC18.txt:1885 -- rsp=1b identifies a response */
hdr.info.evt = (uint8_t)frame_format;
hdr.info.evt = 0; /* TC18 Table 30: plain response, see the file header */
hdr.info.mtv = RCP_ACF_MTV_VALID;
hdr.info.transaction_num = transaction_num;
hdr.info.ms = segs[i].ms ? 1u : 0u;
Expand All @@ -535,7 +558,7 @@ size_t rcp_ep_can_encode_frame_response_fragmented(rcp_byte_bus_id_t byte_bus_id
hdr.byte_bus_id = byte_bus_id;
hdr.op = RCP_ACF_OP_READ;
hdr.rsp = 1; /* TC18.txt:1885 -- rsp=1b identifies a response */
hdr.evt = (uint8_t)frame_format;
hdr.evt = 0; /* TC18 Table 30: plain response, see the file header */
hdr.transaction_num = transaction_num;
hdr.ms = segs[i].ms ? 1u : 0u;
hdr.read_size_or_segment_num = segs[i].ms ? segs[i].segment_num : 0u;
Expand Down Expand Up @@ -564,7 +587,6 @@ size_t rcp_ep_can_encode_frame_response_fragmented(rcp_byte_bus_id_t byte_bus_id
//cfusa:req REQ-CANEP-026
rcp_ep_can_errc_t rcp_ep_can_decode_frame_response_fragment(const uint8_t *b, size_t len,
rcp_byte_bus_id_t expected_bus_id,
rcp_ep_can_frame_format_t *out_frame_format,
bool *out_ms,
uint8_t *out_segment_num,
const uint8_t **out_payload,
Expand Down Expand Up @@ -592,7 +614,6 @@ rcp_ep_can_errc_t rcp_ep_can_decode_frame_response_fragment(const uint8_t *b, si
uint8_t transaction_num;
bool timed;
uint64_t timestamp;
rcp_ep_can_frame_format_t frame_format;

if (rcp_acf_peek_msg_type(b, len, &msg_type) != RCP_ACF_OK) return RCP_EP_CAN_ERR_SHORT_FRAME;

Expand Down Expand Up @@ -623,11 +644,8 @@ rcp_ep_can_errc_t rcp_ep_can_decode_frame_response_fragment(const uint8_t *b, si
}

if (bus_id != expected_bus_id) return RCP_EP_CAN_ERR_WRONG_BUS;
if (!rcp_acf_evt_row2_is_plain(evt)) return RCP_EP_CAN_ERR_BAD_EVT;

if (!rcp_ep_can_frame_format_valid(evt & 0x07u)) return RCP_EP_CAN_ERR_BAD_FRAME_FORMAT;
frame_format = (rcp_ep_can_frame_format_t)(evt & 0x07u);

*out_frame_format = frame_format;
*out_ms = (ms != 0u);
*out_segment_num = segment_num;
*out_payload = payload;
Expand All @@ -641,22 +659,28 @@ rcp_ep_can_errc_t rcp_ep_can_decode_frame_response_fragment(const uint8_t *b, si
//cfusa:req REQ-CANEP-027
rcp_ep_can_errc_t rcp_ep_can_decode_reassembled_frame_response(const uint8_t *reassembled,
size_t reassembled_len,
rcp_ep_can_frame_format_t frame_format,
rcp_ep_can_frame_format_t *out_frame_format,
uint32_t *out_arbitration_id,
rcp_ep_can_xl_header_t *out_xl_header,
const uint8_t **out_rx_data,
size_t *out_rx_len)
{
size_t prefix_len;
rcp_ep_can_frame_format_t frame_format;
size_t prefix_len;

if (reassembled_len < 4u) return RCP_EP_CAN_ERR_SHORT_FRAME;
frame_format = read_frame_format(reassembled);
if (!rcp_ep_can_frame_format_valid((uint8_t)frame_format)) return RCP_EP_CAN_ERR_BAD_FRAME_FORMAT;

prefix_len = prefix_len_for(frame_format);
if (reassembled_len < prefix_len) return RCP_EP_CAN_ERR_SHORT_FRAME;

read_prefix(reassembled, frame_format, out_arbitration_id, out_xl_header);
if (!rcp_ep_can_arbitration_id_valid(frame_format, *out_arbitration_id))
return RCP_EP_CAN_ERR_BAD_ARBITRATION_ID;

*out_rx_data = &reassembled[prefix_len];
*out_rx_len = reassembled_len - prefix_len;
*out_frame_format = frame_format;
*out_rx_data = &reassembled[prefix_len];
*out_rx_len = reassembled_len - prefix_len;
return RCP_EP_CAN_OK;
}
Loading
Loading