boot_serial: Port encoding to use cddl-gen
Non-generated. Using cbor_encode directly
This removes the dependence on TinyCBOR.
Fixes #978
Signed-off-by: Øyvind Rønningstad <oyvind.ronningstad@nordicsemi.no>
diff --git a/boot/boot_serial/src/boot_serial.c b/boot/boot_serial/src/boot_serial.c
index 5fa794a..88c0029 100644
--- a/boot/boot_serial/src/boot_serial.c
+++ b/boot/boot_serial/src/boot_serial.c
@@ -25,6 +25,7 @@
#include "sysflash/sysflash.h"
#include "bootutil/bootutil_log.h"
+#include "cbor_encode.h"
#ifdef __ZEPHYR__
#include <power/reboot.h>
@@ -33,8 +34,6 @@
#include <drivers/flash.h>
#include <sys/crc.h>
#include <sys/base64.h>
-#include <tinycbor/cbor.h>
-#include <tinycbor/cbor_buf_reader.h>
#else
#include <bsp/bsp.h>
#include <hal/hal_system.h>
@@ -42,7 +41,6 @@
#include <os/os_cputime.h>
#include <crc/crc16.h>
#include <base64/base64.h>
-#include <tinycbor/cbor.h>
#endif /* __ZEPHYR__ */
#include <flash_map_backend/flash_map_backend.h>
@@ -97,28 +95,13 @@
static char bs_obuf[BOOT_SERIAL_OUT_MAX];
-static int bs_cbor_writer(struct cbor_encoder_writer *, const char *data,
- int len);
static void boot_serial_output(void);
-static struct cbor_encoder_writer bs_writer = {
- .write = bs_cbor_writer
+static cbor_state_backups_t dummy_backups;
+static cbor_state_t cbor_state = {
+ .backups = &dummy_backups
};
-static CborEncoder bs_root;
-static CborEncoder bs_rsp;
-int
-bs_cbor_writer(struct cbor_encoder_writer *cew, const char *data, int len)
-{
- if (cew->bytes_written + len > sizeof(bs_obuf)) {
- return CborErrorOutOfMemory;
- }
-
- memcpy(&bs_obuf[cew->bytes_written], data, len);
- cew->bytes_written += len;
-
- return 0;
-}
/*
* Convert version into string without use of snprintf().
@@ -172,17 +155,15 @@
static void
bs_list(char *buf, int len)
{
- CborEncoder images;
- CborEncoder image;
struct image_header hdr;
uint8_t tmpbuf[64];
- int slot, area_id;
+ uint32_t slot, area_id;
const struct flash_area *fap;
uint8_t image_index;
- cbor_encoder_create_map(&bs_root, &bs_rsp, CborIndefiniteLength);
- cbor_encode_text_stringz(&bs_rsp, "images");
- cbor_encoder_create_array(&bs_rsp, &images, CborIndefiniteLength);
+ map_start_encode(&cbor_state, 1);
+ tstrx_put(&cbor_state, "images");
+ list_start_encode(&cbor_state, 5);
image_index = 0;
IMAGES_ITER(image_index) {
for (slot = 0; slot < 2; slot++) {
@@ -201,24 +182,24 @@
}
flash_area_close(fap);
- cbor_encoder_create_map(&images, &image, CborIndefiniteLength);
+ map_start_encode(&cbor_state, 20);
#if (BOOT_IMAGE_NUMBER > 1)
- cbor_encode_text_stringz(&image, "image");
- cbor_encode_int(&image, image_index);
+ tstrx_put(&cbor_state, "image");
+ uintx32_put(&cbor_state, image_index);
#endif
- cbor_encode_text_stringz(&image, "slot");
- cbor_encode_int(&image, slot);
- cbor_encode_text_stringz(&image, "version");
+ tstrx_put(&cbor_state, "slot");
+ uintx32_put(&cbor_state, slot);
+ tstrx_put(&cbor_state, "version");
bs_list_img_ver((char *)tmpbuf, sizeof(tmpbuf), &hdr.ih_ver);
- cbor_encode_text_stringz(&image, (char *)tmpbuf);
- cbor_encoder_close_container(&images, &image);
+ tstrx_put_term(&cbor_state, (char *)tmpbuf);
+ map_end_encode(&cbor_state, 20);
}
}
- cbor_encoder_close_container(&bs_rsp, &images);
- cbor_encoder_close_container(&bs_root, &bs_rsp);
+ list_end_encode(&cbor_state, 5);
+ map_end_encode(&cbor_state, 1);
boot_serial_output();
}
@@ -229,10 +210,10 @@
bs_upload(char *buf, int len)
{
const uint8_t *img_data = NULL;
- long long int off = UINT_MAX;
+ long long int off = UINT64_MAX;
size_t img_blen = 0;
uint8_t rem_bytes;
- long long int data_len = UINT_MAX;
+ long long int data_len = UINT64_MAX;
int img_num;
size_t slen;
const struct flash_area *fap = NULL;
@@ -255,7 +236,7 @@
*/
struct Upload upload;
- size_t decoded_len;
+ uint32_t decoded_len;
bool result = cbor_decode_Upload((const uint8_t *)buf, len, &upload, &decoded_len);
if (!result || (len != decoded_len)) {
@@ -286,7 +267,7 @@
}
}
- if (off == UINT_MAX || img_data == NULL) {
+ if (off == UINT64_MAX || img_data == NULL) {
/*
* Offset must be set in every block.
*/
@@ -403,14 +384,14 @@
out:
BOOT_LOG_INF("RX: 0x%x", rc);
- cbor_encoder_create_map(&bs_root, &bs_rsp, CborIndefiniteLength);
- cbor_encode_text_stringz(&bs_rsp, "rc");
- cbor_encode_int(&bs_rsp, rc);
+ map_start_encode(&cbor_state, 10);
+ tstrx_put(&cbor_state, "rc");
+ uintx32_put(&cbor_state, rc);
if (rc == 0) {
- cbor_encode_text_stringz(&bs_rsp, "off");
- cbor_encode_uint(&bs_rsp, curr_off);
+ tstrx_put(&cbor_state, "off");
+ uintx32_put(&cbor_state, curr_off);
}
- cbor_encoder_close_container(&bs_root, &bs_rsp);
+ map_end_encode(&cbor_state, 10);
boot_serial_output();
flash_area_close(fap);
@@ -422,10 +403,10 @@
static void
bs_empty_rsp(char *buf, int len)
{
- cbor_encoder_create_map(&bs_root, &bs_rsp, CborIndefiniteLength);
- cbor_encode_text_stringz(&bs_rsp, "rc");
- cbor_encode_int(&bs_rsp, 0);
- cbor_encoder_close_container(&bs_root, &bs_rsp);
+ map_start_encode(&cbor_state, 10);
+ tstrx_put(&cbor_state, "rc");
+ uintx32_put(&cbor_state, 0);
+ map_end_encode(&cbor_state, 10);
boot_serial_output();
}
@@ -472,8 +453,9 @@
buf += sizeof(*hdr);
len -= sizeof(*hdr);
- bs_writer.bytes_written = 0;
- cbor_encoder_init(&bs_root, &bs_writer, 0);
+ cbor_state.payload_mut = (uint8_t *)bs_obuf;
+ cbor_state.payload_end = (const uint8_t *)bs_obuf
+ + sizeof(bs_obuf);
/*
* Limited support for commands.
@@ -516,7 +498,7 @@
char encoded_buf[BASE64_ENCODE_SIZE(BOOT_SERIAL_OUT_MAX)];
data = bs_obuf;
- len = bs_writer.bytes_written;
+ len = (uint32_t)cbor_state.payload_mut - (uint32_t)bs_obuf;
bs_hdr->nh_op++;
bs_hdr->nh_flags = 0;