| /* |
| * Copyright Runtime.io 2018. All rights reserved. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <assert.h> |
| #include <string.h> |
| #include "net/buf.h" |
| #include "mgmt/buf.h" |
| #include "compilersupport_p.h" |
| |
| NET_BUF_POOL_DEFINE(pkt_pool, CONFIG_MCUMGR_BUF_COUNT, CONFIG_MCUMGR_BUF_SIZE, |
| CONFIG_MCUMGR_BUF_USER_DATA_SIZE, NULL); |
| |
| struct net_buf * |
| mcumgr_buf_alloc(void) |
| { |
| return net_buf_alloc(&pkt_pool, K_NO_WAIT); |
| } |
| |
| void |
| mcumgr_buf_free(struct net_buf *nb) |
| { |
| net_buf_unref(nb); |
| } |
| |
| static uint8_t |
| cbor_nb_reader_get8(struct cbor_decoder_reader *d, int offset) |
| { |
| struct cbor_nb_reader *cnr; |
| |
| cnr = (struct cbor_nb_reader *) d; |
| |
| if (offset < 0 || offset >= cnr->nb->len) { |
| return UINT8_MAX; |
| } |
| |
| return cnr->nb->data[offset]; |
| } |
| |
| static uint16_t |
| cbor_nb_reader_get16(struct cbor_decoder_reader *d, int offset) |
| { |
| struct cbor_nb_reader *cnr; |
| uint16_t val; |
| |
| cnr = (struct cbor_nb_reader *) d; |
| |
| if (offset < 0 || offset > cnr->nb->len - (int)sizeof(val)) { |
| return UINT16_MAX; |
| } |
| |
| memcpy(&val, cnr->nb->data + offset, sizeof(val)); |
| return cbor_ntohs(val); |
| } |
| |
| static uint32_t |
| cbor_nb_reader_get32(struct cbor_decoder_reader *d, int offset) |
| { |
| struct cbor_nb_reader *cnr; |
| uint32_t val; |
| |
| cnr = (struct cbor_nb_reader *) d; |
| |
| if (offset < 0 || offset > cnr->nb->len - (int)sizeof(val)) { |
| return UINT32_MAX; |
| } |
| |
| memcpy(&val, cnr->nb->data + offset, sizeof(val)); |
| return cbor_ntohl(val); |
| } |
| |
| static uint64_t |
| cbor_nb_reader_get64(struct cbor_decoder_reader *d, int offset) |
| { |
| struct cbor_nb_reader *cnr; |
| uint64_t val; |
| |
| cnr = (struct cbor_nb_reader *) d; |
| |
| if (offset < 0 || offset > cnr->nb->len - (int)sizeof(val)) { |
| return UINT64_MAX; |
| } |
| |
| memcpy(&val, cnr->nb->data + offset, sizeof(val)); |
| return cbor_ntohll(val); |
| } |
| |
| static uintptr_t |
| cbor_nb_reader_cmp(struct cbor_decoder_reader *d, char *buf, int offset, |
| size_t len) |
| { |
| struct cbor_nb_reader *cnr; |
| |
| cnr = (struct cbor_nb_reader *) d; |
| |
| if (offset < 0 || offset > cnr->nb->len - (int)len) { |
| return -1; |
| } |
| |
| return memcmp(cnr->nb->data + offset, buf, len); |
| } |
| |
| static uintptr_t |
| cbor_nb_reader_cpy(struct cbor_decoder_reader *d, char *dst, int offset, |
| size_t len) |
| { |
| struct cbor_nb_reader *cnr; |
| |
| cnr = (struct cbor_nb_reader *) d; |
| |
| if (offset < 0 || offset > cnr->nb->len - (int)len) { |
| return -1; |
| } |
| |
| return (uintptr_t)memcpy(dst, cnr->nb->data + offset, len); |
| } |
| |
| static uintptr_t |
| cbor_nb_get_string_chunk(struct cbor_decoder_reader *d, int offset, |
| size_t *len) |
| { |
| struct cbor_nb_reader *cnr; |
| |
| cnr = (struct cbor_nb_reader *) d; |
| return (uintptr_t)cnr->nb->data + offset; |
| } |
| |
| void |
| cbor_nb_reader_init(struct cbor_nb_reader *cnr, |
| struct net_buf *nb) |
| { |
| cnr->r.get8 = &cbor_nb_reader_get8; |
| cnr->r.get16 = &cbor_nb_reader_get16; |
| cnr->r.get32 = &cbor_nb_reader_get32; |
| cnr->r.get64 = &cbor_nb_reader_get64; |
| cnr->r.cmp = &cbor_nb_reader_cmp; |
| cnr->r.cpy = &cbor_nb_reader_cpy; |
| cnr->r.get_string_chunk = &cbor_nb_get_string_chunk; |
| |
| cnr->nb = nb; |
| cnr->r.message_size = nb->len; |
| } |
| |
| static int |
| cbor_nb_write(struct cbor_encoder_writer *writer, const char *data, int len) |
| { |
| struct cbor_nb_writer *cnw; |
| |
| cnw = (struct cbor_nb_writer *) writer; |
| if (len > net_buf_tailroom(cnw->nb)) { |
| return CborErrorOutOfMemory; |
| } |
| |
| net_buf_add_mem(cnw->nb, data, len); |
| cnw->enc.bytes_written += len; |
| |
| return CborNoError; |
| } |
| |
| void |
| cbor_nb_writer_init(struct cbor_nb_writer *cnw, struct net_buf *nb) |
| { |
| cnw->nb = nb; |
| cnw->enc.bytes_written = 0; |
| cnw->enc.write = &cbor_nb_write; |
| } |