blob: 0e4230ba094163f92d8154cfbb110160c22d7412 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef H_IMG_MGMT_
#define H_IMG_MGMT_
#include <inttypes.h>
#include "img_mgmt_config.h"
#include "mgmt/mgmt.h"
struct image_version;
#ifdef __cplusplus
extern "C" {
#endif
#define IMG_MGMT_HASH_STR 48
#define IMG_MGMT_HASH_LEN 32
#define IMG_MGMT_DATA_SHA_LEN 32 /* SHA256 */
/*
* Image state flags
*/
#define IMG_MGMT_STATE_F_PENDING 0x01
#define IMG_MGMT_STATE_F_CONFIRMED 0x02
#define IMG_MGMT_STATE_F_ACTIVE 0x04
#define IMG_MGMT_STATE_F_PERMANENT 0x08
#define IMG_MGMT_VER_MAX_STR_LEN 25 /* 255.255.65535.4294967295\0 */
/*
* Swap Types for image management state machine
*/
#define IMG_MGMT_SWAP_TYPE_NONE 0
#define IMG_MGMT_SWAP_TYPE_TEST 1
#define IMG_MGMT_SWAP_TYPE_PERM 2
#define IMG_MGMT_SWAP_TYPE_REVERT 3
/**
* Command IDs for image management group.
*/
#define IMG_MGMT_ID_STATE 0
#define IMG_MGMT_ID_UPLOAD 1
#define IMG_MGMT_ID_FILE 2
#define IMG_MGMT_ID_CORELIST 3
#define IMG_MGMT_ID_CORELOAD 4
#define IMG_MGMT_ID_ERASE 5
/*
* IMG_MGMT_ID_UPLOAD statuses.
*/
#define IMG_MGMT_ID_UPLOAD_STATUS_START 0
#define IMG_MGMT_ID_UPLOAD_STATUS_ONGOING 1
#define IMG_MGMT_ID_UPLOAD_STATUS_COMPLETE 2
extern int boot_current_slot;
extern struct img_mgmt_state g_img_mgmt_state;
/** Represents an individual upload request. */
struct img_mgmt_upload_req {
unsigned long long int image; /* 0 by default */
unsigned long long int off; /* -1 if unspecified */
unsigned long long int size; /* -1 if unspecified */
size_t data_len;
size_t data_sha_len;
uint8_t img_data[IMG_MGMT_UL_CHUNK_SIZE];
uint8_t data_sha[IMG_MGMT_DATA_SHA_LEN];
bool upgrade; /* Only allow greater version numbers. */
};
/** Global state for upload in progress. */
struct img_mgmt_state {
/** Flash area being written; -1 if no upload in progress. */
int area_id;
/** Flash offset of next chunk. */
uint32_t off;
/** Total size of image data. */
uint32_t size;
/** Hash of image data; used for resumption of a partial upload. */
uint8_t data_sha_len;
uint8_t data_sha[IMG_MGMT_DATA_SHA_LEN];
#if IMG_MGMT_LAZY_ERASE
int sector_id;
uint32_t sector_end;
#endif
};
/** Describes what to do during processing of an upload request. */
struct img_mgmt_upload_action {
/** The total size of the image. */
unsigned long long size;
/** The number of image bytes to write to flash. */
int write_bytes;
/** The flash area to write to. */
int area_id;
/** Whether to process the request; false if offset is wrong. */
bool proceed;
/** Whether to erase the destination flash area. */
bool erase;
};
/**
* @brief Registers the image management command handler group.
*/
void img_mgmt_register_group(void);
/**
* @brief Unregisters the image management command handler group.
*/
void img_mgmt_unregister_group(void);
/*
* @brief Read info of an image give the slot number
*
* @param image_slot Image slot to read info from
* @param image_version Image version to be filled up
* @param hash Ptr to the read image hash
* @param flags Ptr to flags filled up from the image
*/
int img_mgmt_read_info(int image_slot, struct image_version *ver,
uint8_t *hash, uint32_t *flags);
/**
* @brief Get the current running image version
*
* @param image_version Given image version
*
* @return 0 on success, non-zero on failure
*/
int img_mgmt_my_version(struct image_version *ver);
/**
* @brief Get image version in string from image_version
*
* @param image_version Structure filled with image version
* information
* @param dst Destination string created from the given
* in image version
*
* @return 0 on success, non-zero on failure
*/
int img_mgmt_ver_str(const struct image_version *ver, char *dst);
/**
* @brief Check if the image slot is in use
*
* @param slot Slot to check if its in use
*
* @return 0 on success, non-zero on failure
*/
int img_mgmt_slot_in_use(int slot);
/**
* @brief Check if the DFU status is pending
*
* @return 1 if there's pending DFU otherwise 0.
*/
int img_mgmt_state_any_pending(void);
/**
* @brief Collects information about the specified image slot
*
* @param query_slot Slot to read state flags from
*
* @return return the state flags
*/
uint8_t img_mgmt_state_flags(int query_slot);
/**
* @brief Sets the pending flag for the specified image slot. That is, the system
* will swap to the specified image on the next reboot. If the permanent
* argument is specified, the system doesn't require a confirm after the swap
* occurs.
*
* @param slot Image slot to set pending
* @param permanent If set no confirm is required after image swap
*
* @return 0 on success, non-zero on failure
*/
int img_mgmt_state_set_pending(int slot, int permanent);
/**
* Confirms the current image state. Prevents a fallback from occurring on the
* next reboot if the active image is currently being tested.
*
* @return 0 on success, non -zero on failure
*/
int img_mgmt_state_confirm(void);
/** @brief Generic callback function for events */
typedef void (*img_mgmt_dfu_cb)(void);
/** Callback function pointers */
typedef struct {
img_mgmt_dfu_cb dfu_started_cb;
img_mgmt_dfu_cb dfu_stopped_cb;
img_mgmt_dfu_cb dfu_pending_cb;
img_mgmt_dfu_cb dfu_confirmed_cb;
} img_mgmt_dfu_callbacks_t;
/** @typedef img_mgmt_upload_fn
* @brief Application callback that is executed when an image upload request is
* received.
*
* The callback's return code determines whether the upload request is accepted
* or rejected. If the callback returns 0, processing of the upload request
* proceeds. If the callback returns nonzero, the request is rejected with a
* response containing an `rc` value equal to the return code.
*
* @param offset The offset specified by the incoming request.
* @param size The total size of the image being uploaded.
* @param arg Optional argument specified when the callback
* was configured.
*
* @return 0 if the upload request should be accepted;
* nonzero to reject the request with the
* specified status.
*/
typedef int img_mgmt_upload_fn(uint32_t offset, uint32_t size, void *arg);
/**
* @brief Configures a callback that gets called whenever a valid image upload
* request is received.
*
* The callback's return code determines whether the upload request is accepted
* or rejected. If the callback returns 0, processing of the upload request
* proceeds. If the callback returns nonzero, the request is rejected with a
* response containing an `rc` value equal to the return code.
*
* @param cb The callback to execute on rx of an upload
* request.
* @param arg Optional argument that gets passed to the
* callback.
*/
void img_mgmt_set_upload_cb(img_mgmt_upload_fn *cb, void *arg);
void img_mgmt_register_callbacks(const img_mgmt_dfu_callbacks_t *cb_struct);
void img_mgmt_dfu_stopped(void);
void img_mgmt_dfu_started(void);
void img_mgmt_dfu_pending(void);
void img_mgmt_dfu_confirmed(void);
#if IMG_MGMT_VERBOSE_ERR
int img_mgmt_error_rsp(struct mgmt_ctxt *ctxt, int rc, const char *rsn);
extern const char *img_mgmt_err_str_app_reject;
extern const char *img_mgmt_err_str_hdr_malformed;
extern const char *img_mgmt_err_str_magic_mismatch;
extern const char *img_mgmt_err_str_no_slot;
extern const char *img_mgmt_err_str_flash_open_failed;
extern const char *img_mgmt_err_str_flash_erase_failed;
extern const char *img_mgmt_err_str_flash_write_failed;
extern const char *img_mgmt_err_str_downgrade;
extern const char *img_mgmt_err_str_image_bad_flash_addr;
#else
#define img_mgmt_error_rsp(ctxt, rc, rsn) (rc)
#define img_mgmt_err_str_app_reject NULL
#define img_mgmt_err_str_hdr_malformed NULL
#define img_mgmt_err_str_magic_mismatch NULL
#define img_mgmt_err_str_no_slot NULL
#define img_mgmt_err_str_flash_open_failed NULL
#define img_mgmt_err_str_flash_erase_failed NULL
#define img_mgmt_err_str_flash_write_failed NULL
#define img_mgmt_err_str_downgrade NULL
#define img_mgmt_err_str_image_bad_flash_addr NULL
#endif
#ifdef __cplusplus
}
#endif
#endif /* H_IMG_MGMT_ */