blob: 63b9115179786407e19afd4656c9f6483df9508a [file] [log] [blame]
/*
* Copyright (c) 2022-2023 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "smp_test_util.h"
#include <zephyr/mgmt/mcumgr/grp/settings_mgmt/settings_mgmt.h>
#include <zephyr/net/buf.h>
#include <zephyr/sys/byteorder.h>
#include <zcbor_encode.h>
/* SMP header function for generating MCUmgr command header with sequence number set to 1 */
static void smp_make_hdr(struct smp_hdr *rsp_hdr, size_t len, uint8_t type, bool write)
{
*rsp_hdr = (struct smp_hdr) {
.nh_len = sys_cpu_to_be16(len),
.nh_flags = 0,
.nh_op = (write ? MGMT_OP_WRITE : MGMT_OP_READ),
.nh_group = sys_cpu_to_be16(MGMT_GROUP_ID_SETTINGS),
.nh_seq = 1,
.nh_id = type,
.nh_version = 1,
};
}
bool create_settings_mgmt_read_packet(zcbor_state_t *zse, uint8_t *buffer, uint8_t *output_buffer,
uint16_t *buffer_size, char *name, uint32_t max_size)
{
bool ok;
ok = zcbor_map_start_encode(zse, 2) &&
zcbor_tstr_put_lit(zse, "name") &&
zcbor_tstr_put_term(zse, name) &&
(max_size == 0 || (zcbor_tstr_put_lit(zse, "max_size") &&
zcbor_uint32_put(zse, max_size))) &&
zcbor_map_end_encode(zse, 2);
*buffer_size = (zse->payload_mut - buffer);
smp_make_hdr((struct smp_hdr *)output_buffer, *buffer_size, SETTINGS_MGMT_ID_READ_WRITE,
false);
memcpy(&output_buffer[sizeof(struct smp_hdr)], buffer, *buffer_size);
*buffer_size += sizeof(struct smp_hdr);
return ok;
}
bool create_settings_mgmt_write_packet(zcbor_state_t *zse, uint8_t *buffer, uint8_t *output_buffer,
uint16_t *buffer_size, char *name, const uint8_t *val,
size_t val_size)
{
bool ok;
ok = zcbor_map_start_encode(zse, 2) &&
zcbor_tstr_put_lit(zse, "name") &&
zcbor_tstr_put_term(zse, name) &&
zcbor_tstr_put_lit(zse, "val") &&
zcbor_bstr_encode_ptr(zse, val, val_size) &&
zcbor_map_end_encode(zse, 2);
*buffer_size = (zse->payload_mut - buffer);
smp_make_hdr((struct smp_hdr *)output_buffer, *buffer_size, SETTINGS_MGMT_ID_READ_WRITE,
true);
memcpy(&output_buffer[sizeof(struct smp_hdr)], buffer, *buffer_size);
*buffer_size += sizeof(struct smp_hdr);
return ok;
}
bool create_settings_mgmt_delete_packet(zcbor_state_t *zse, uint8_t *buffer,
uint8_t *output_buffer, uint16_t *buffer_size, char *name)
{
bool ok;
ok = zcbor_map_start_encode(zse, 2) &&
zcbor_tstr_put_lit(zse, "name") &&
zcbor_tstr_put_term(zse, name) &&
zcbor_map_end_encode(zse, 2);
*buffer_size = (zse->payload_mut - buffer);
smp_make_hdr((struct smp_hdr *)output_buffer, *buffer_size, SETTINGS_MGMT_ID_DELETE, true);
memcpy(&output_buffer[sizeof(struct smp_hdr)], buffer, *buffer_size);
*buffer_size += sizeof(struct smp_hdr);
return ok;
}
bool create_settings_mgmt_commit_packet(zcbor_state_t *zse, uint8_t *buffer,
uint8_t *output_buffer, uint16_t *buffer_size)
{
bool ok;
ok = zcbor_map_start_encode(zse, 2) &&
zcbor_map_end_encode(zse, 2);
*buffer_size = (zse->payload_mut - buffer);
smp_make_hdr((struct smp_hdr *)output_buffer, *buffer_size, SETTINGS_MGMT_ID_COMMIT, true);
memcpy(&output_buffer[sizeof(struct smp_hdr)], buffer, *buffer_size);
*buffer_size += sizeof(struct smp_hdr);
return ok;
}
bool create_settings_mgmt_load_packet(zcbor_state_t *zse, uint8_t *buffer, uint8_t *output_buffer,
uint16_t *buffer_size)
{
bool ok;
ok = zcbor_map_start_encode(zse, 2) &&
zcbor_map_end_encode(zse, 2);
*buffer_size = (zse->payload_mut - buffer);
smp_make_hdr((struct smp_hdr *)output_buffer, *buffer_size, SETTINGS_MGMT_ID_LOAD_SAVE,
false);
memcpy(&output_buffer[sizeof(struct smp_hdr)], buffer, *buffer_size);
*buffer_size += sizeof(struct smp_hdr);
return ok;
}
bool create_settings_mgmt_save_packet(zcbor_state_t *zse, uint8_t *buffer, uint8_t *output_buffer,
uint16_t *buffer_size)
{
bool ok;
ok = zcbor_map_start_encode(zse, 2) &&
zcbor_map_end_encode(zse, 2);
*buffer_size = (zse->payload_mut - buffer);
smp_make_hdr((struct smp_hdr *)output_buffer, *buffer_size, SETTINGS_MGMT_ID_LOAD_SAVE,
true);
memcpy(&output_buffer[sizeof(struct smp_hdr)], buffer, *buffer_size);
*buffer_size += sizeof(struct smp_hdr);
return ok;
}