AWS IoT Over-the-air Update v2.0.0 (Release Candidate)
Client library for AWS IoT OTA
ota.h
Go to the documentation of this file.
1/*
2 * AWS IoT Over-the-air Update v2.0.0 (Release Candidate)
3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy of
6 * this software and associated documentation files (the "Software"), to deal in
7 * the Software without restriction, including without limitation the rights to
8 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 * the Software, and to permit persons to whom the Software is furnished to do so,
10 * subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in all
13 * copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 */
22
28#ifndef OTA_H
29#define OTA_H
30
31/* Standard includes. */
32/* For FILE type in OtaFileContext_t.*/
33#include <stdio.h>
34#include <stdint.h>
35
36/* OTA Library Interface include. */
37#include "ota_private.h"
38#include "ota_os_interface.h"
39#include "ota_mqtt_interface.h"
40#include "ota_http_interface.h"
42
47#define CONST_STRLEN( s ) ( ( ( uint32_t ) sizeof( s ) ) - 1UL )
48
49
50#define OTA_FILE_SIG_KEY_STR_MAX_LENGTH 32
59/* MISRA rule 8.6 requires identifier with external linkage to have exact one external definition.
60 * However, this variable is defined in OTA platform abstraction layer implementation, which is
61 * not in this repository but in C-SDK and amazon-freertos repo, so it's a false positive. */
62/* coverity[misra_c_2012_rule_8_6_violation] */
64
65/*-------------------------- OTA enumerated types --------------------------*/
66
72typedef enum OtaErr
73{
98
107typedef enum OtaState
108{
109 OtaAgentStateNoTransition = -1,
110 OtaAgentStateInit = 0,
111 OtaAgentStateReady,
112 OtaAgentStateRequestingJob,
113 OtaAgentStateWaitingForJob,
114 OtaAgentStateCreatingFile,
115 OtaAgentStateRequestingFileBlock,
116 OtaAgentStateWaitingForFileBlock,
117 OtaAgentStateClosingFile,
118 OtaAgentStateSuspended,
119 OtaAgentStateShuttingDown,
120 OtaAgentStateStopped,
121 OtaAgentStateAll
122} OtaState_t;
123
128typedef enum OtaJobParseErr
129{
130 OtaJobParseErrUnknown = -1, /* @brief The error code has not yet been set by a logic path. */
131 OtaJobParseErrNone = 0, /* @brief Signifies no error has occurred. */
132 OtaJobParseErrBusyWithExistingJob, /* @brief We're busy with a job but received a new job document. */
133 OtaJobParseErrNullJob, /* @brief A null job was reported (no job ID). */
134 OtaJobParseErrUpdateCurrentJob, /* @brief We're already busy with the reported job ID. */
135 OtaJobParseErrZeroFileSize, /* @brief Job document specified a zero sized file. This is not allowed. */
136 OtaJobParseErrNonConformingJobDoc, /* @brief The job document failed to fulfill the model requirements. */
137 OtaJobParseErrBadModelInitParams, /* @brief There was an invalid initialization parameter used in the document model. */
138 OtaJobParseErrNoContextAvailable, /* @brief There was not an OTA context available. */
139 OtaJobParseErrNoActiveJobs /* @brief No active jobs are available in the service. */
141
159typedef enum OtaJobEvent
160{
166 OtaLastJobEvent = OtaJobEventStartTest
168
169/*------------------------- OTA callbacks --------------------------*/
170
201typedef void (* OtaAppCallback_t)( OtaJobEvent_t eEvent,
202 const void * pData );
203
214typedef OtaJobParseErr_t (* OtaCustomJobCallback_t)( const char * pcJSON,
215 uint32_t ulMsgLen );
216
217/*--------------------------- OTA structs ----------------------------*/
218
219
227typedef struct OtaInterface
228{
234
241typedef struct OtaAppBuffer
242{
243 uint8_t * pUpdateFilePath;
245 uint8_t * pCertFilePath;
247 uint8_t * pStreamName;
248 uint16_t streamNameSize;
249 uint8_t * pDecodeMemory;
251 uint8_t * pFileBitmap;
252 uint16_t fileBitmapSize;
253 uint8_t * pUrl;
254 uint16_t urlSize;
255 uint8_t * pAuthScheme;
256 uint16_t authSchemeSize;
258
264typedef struct OtaAgentContext
265{
267 uint8_t pThingName[ otaconfigMAX_THINGNAME_LEN + 1U ];
269 uint32_t fileIndex;
270 uint32_t serverFileID;
271 uint8_t pActiveJobName[ OTA_JOB_ID_MAX_SIZE ];
282
283/*------------------------- OTA Public API --------------------------*/
284
301/* @[declare_ota_init] */
302OtaErr_t OTA_Init( OtaAppBuffer_t * pOtaBuffer,
303 OtaInterfaces_t * pOtaInterfaces,
304 const uint8_t * pThingName,
305 OtaAppCallback_t OtaAppCallback );
306/* @[declare_ota_init] */
307
321/* @[declare_ota_shutdown] */
322OtaState_t OTA_Shutdown( uint32_t ticksToWait );
323/* @[declare_ota_shutdown] */
324
330/* @[declare_ota_getstate] */
332/* @[declare_ota_getstate] */
333
345/* @[declare_ota_activatenewimage] */
347/* @[declare_ota_activatenewimage] */
348
361/* @[declare_ota_setimagestate] */
363/* @[declare_ota_setimagestate] */
364
373/* @[declare_ota_getimagestate] */
375/* @[declare_ota_getimagestate] */
376
383/* @[declare_ota_checkforupdate] */
385/* @[declare_ota_checkforupdate] */
386
393/* @[declare_ota_suspend] */
394OtaErr_t OTA_Suspend( void );
395/* @[declare_ota_suspend] */
396
403/* @[declare_ota_resume] */
404OtaErr_t OTA_Resume( void );
405/* @[declare_ota_resume] */
406
418/* @[declare_ota_eventprocessingtask] */
419void OTA_EventProcessingTask( void * pUnused );
420/* @[declare_ota_eventprocessingtask] */
421
422
432/* @[declare_ota_signalevent] */
433bool OTA_SignalEvent( const OtaEventMsg_t * const pEventMsg );
434/* @[declare_ota_signalevent] */
435
436/*---------------------------------------------------------------------------*/
437/* Statistics API */
438/*---------------------------------------------------------------------------*/
439
459/* @[declare_ota_getstatistics] */
461/* @[declare_ota_getstatistics] */
462
470/* @[declare_ota_err_strerror] */
471const char * OTA_Err_strerror( OtaErr_t err );
472/* @[declare_ota_err_strerror] */
473
481/* @[declare_ota_jobparse_strerror] */
482const char * OTA_JobParse_strerror( OtaJobParseErr_t err );
483/* @[declare_ota_jobparse_strerror] */
484
492/* @[declare_ota_palstatus_strerror] */
493const char * OTA_PalStatus_strerror( OtaPalMainStatus_t status );
494/* @[declare_ota_palstatus_strerror] */
495
503/* @[declare_ota_osstatus_strerror] */
504const char * OTA_OsStatus_strerror( OtaOsStatus_t status );
505/* @[declare_ota_osstatus_strerror] */
506
507#endif /* ifndef OTA_H */
void(* OtaAppCallback_t)(OtaJobEvent_t eEvent, const void *pData)
OTA update complete callback function typedef.
Definition: ota.h:201
OtaJobParseErr_t(* OtaCustomJobCallback_t)(const char *pcJSON, uint32_t ulMsgLen)
Custom Job callback function typedef.
Definition: ota.h:214
OtaState_t
OTA Agent states.
Definition: ota.h:108
OtaErr_t
The OTA API return status. OTA agent error codes are in the upper 8 bits of the 32 bit OTA error word...
Definition: ota.h:73
OtaPalMainStatus_t
The OTA platform interface main status.
Definition: ota_platform_interface.h:73
OtaJobEvent_t
OTA Job callback events.
Definition: ota.h:160
OtaJobParseErr_t
OTA job document parser error codes.
Definition: ota.h:129
OtaImageState_t
OTA Image states.
Definition: ota_private.h:322
OtaOsStatus_t
The OTA OS interface return status.
Definition: ota_os_interface.h:100
@ OtaErrInvalidDataProtocol
Job does not have a valid protocol for data transfer.
Definition: ota.h:87
@ OtaErrPanic
Unrecoverable Firmware error. Probably should log error and reboot.
Definition: ota.h:76
@ OtaErrUninitialized
The error code has not yet been set by a logic path.
Definition: ota.h:75
@ OtaErrNone
No error occurred during the operation.
Definition: ota.h:74
@ OtaErrDowngradeNotAllowed
Firmware version is older than the previous version.
Definition: ota.h:89
@ OtaErrAgentStopped
Returned when operations are performed that requires OTA Agent running & its stopped.
Definition: ota.h:78
@ OtaErrImageStateMismatch
The OTA job was in Self Test but the platform image state was not. Possible tampering.
Definition: ota.h:91
@ OtaErrMomentumAbort
Too many OTA stream requests without any response.
Definition: ota.h:88
@ OtaErrRequestJobFailed
Failed to request the job document.
Definition: ota.h:80
@ OtaErrJobParserError
An error occurred during job document parsing. See reason sub-code.
Definition: ota.h:86
@ OtaErrRequestFileBlockFailed
Failed to request file block.
Definition: ota.h:82
@ OtaErrInitFileTransferFailed
Failed to update the OTA job status.
Definition: ota.h:81
@ OtaErrNoActiveJob
Attempt to set final image state without an active job.
Definition: ota.h:92
@ OtaErrFailedToDecodeCbor
Failed to decode CBOR object from streaming service response.
Definition: ota.h:95
@ OtaErrSignalEventFailed
Failed to send event to OTA state machine.
Definition: ota.h:79
@ OtaErrCleanupControlFailed
Failed to clean up the control plane.
Definition: ota.h:83
@ OtaErrUpdateJobStatusFailed
Failed to update the OTA job status.
Definition: ota.h:85
@ OtaErrFailedToEncodeCbor
Failed to encode CBOR object for requesting data block from streaming service.
Definition: ota.h:94
@ OtaErrSameFirmwareVersion
Firmware version is the same as previous. New firmware could have failed to commit.
Definition: ota.h:90
@ OtaErrCleanupDataFailed
Failed to clean up the data plane.
Definition: ota.h:84
@ OtaErrInvalidArg
API called with invalid argument.
Definition: ota.h:77
@ OtaErrActivateFailed
Failed to activate the new image.
Definition: ota.h:96
@ OtaErrUserAbort
User aborted the active OTA.
Definition: ota.h:93
@ OtaJobEventStartTest
OTA job is now in self test, perform user tests.
Definition: ota.h:163
@ OtaJobEventSelfTestFailed
OTA self-test failed for current job.
Definition: ota.h:165
@ OtaJobEventFail
OTA receive failed. Unable to use this update.
Definition: ota.h:162
@ OtaJobEventActivate
OTA receive is authenticated and ready to activate.
Definition: ota.h:161
@ OtaJobEventProcessed
OTA event queued by OTA_SignalEvent is processed.
Definition: ota.h:164
OtaErr_t OTA_CheckForUpdate(void)
Request for the next available OTA job from the job service.
Definition: ota.c:3177
bool OTA_SignalEvent(const OtaEventMsg_t *const pEventMsg)
Signal event to the OTA Agent task.
Definition: ota.c:2865
const char * OTA_Err_strerror(OtaErr_t err)
Error code to string conversion for OTA errors.
Definition: ota.c:3368
const char OTA_JsonFileSignatureKey[OTA_FILE_SIG_KEY_STR_MAX_LENGTH]
The OTA signature algorithm string is specified by the PAL.
const char * OTA_OsStatus_strerror(OtaOsStatus_t status)
Status code to string conversion for OTA OS status.
Definition: ota.c:3526
OtaErr_t OTA_ActivateNewImage(void)
Activate the newest MCU image received via OTA.
Definition: ota.c:3205
const char * OTA_PalStatus_strerror(OtaPalMainStatus_t status)
Status code to string conversion for OTA PAL status.
Definition: ota.c:3579
OtaErr_t OTA_GetStatistics(OtaAgentStatistics_t *pStatistics)
Get the statistics of OTA message packets.
Definition: ota.c:3164
OtaErr_t OTA_Suspend(void)
Suspend OTA agent operations .
Definition: ota.c:3306
OtaState_t OTA_GetState(void)
Get the current state of the OTA agent.
Definition: ota.c:3156
#define OTA_FILE_SIG_KEY_STR_MAX_LENGTH
Definition: ota.h:50
OtaState_t OTA_Shutdown(uint32_t ticksToWait)
Signal to the OTA Agent to shut down.
Definition: ota.c:3100
OtaImageState_t OTA_GetImageState(void)
Get the state of the currently running MCU image.
Definition: ota.c:3295
const char * OTA_JobParse_strerror(OtaJobParseErr_t err)
Error code to string conversion for OTA Job Parsing errors.
Definition: ota.c:3473
void OTA_EventProcessingTask(void *pUnused)
OTA agent event processing loop.
Definition: ota.c:2815
OtaErr_t OTA_SetImageState(OtaImageState_t state)
Set the state of the current MCU image.
Definition: ota.c:3241
OtaErr_t OTA_Init(OtaAppBuffer_t *pOtaBuffer, OtaInterfaces_t *pOtaInterfaces, const uint8_t *pThingName, OtaAppCallback_t OtaAppCallback)
OTA Agent initialization function.
Definition: ota.c:3006
OtaErr_t OTA_Resume(void)
Resume OTA agent operations .
Definition: ota.c:3339
#define otaconfigMAX_THINGNAME_LEN
The maximum allowed length of the thing name used by the OTA agent.
Definition: ota_config_defaults.h:132
Contains OTA HTTP Statuses, function type definitions and http interface structure.
Contains OTA MQTT Statuses, function type definitions and mqtt interface structure.
Contains OTA OS Functional Interface statuses, type definitions and structures to store interface rou...
Contains PAL interface statuses, type definitions and structure to store interface routines.
Macros, enums, variables, and definitions internal to the OTA Agent module and shared by other OTA mo...
#define OTA_JOB_ID_MAX_SIZE
Maximum size of the Job ID.
Definition: ota_private.h:107
The OTA agent is a singleton today. The structure keeps it nice and organized.
Definition: ota.h:265
OtaInterfaces_t * pOtaInterface
Definition: ota.h:278
OtaCustomJobCallback_t customJobCallback
Definition: ota.h:280
uint32_t numOfBlocksToReceive
Definition: ota.h:275
uint8_t * pClientTokenFromJob
Definition: ota.h:272
uint32_t timestampFromJob
Definition: ota.h:273
OtaState_t state
Definition: ota.h:266
OtaAgentStatistics_t statistics
Definition: ota.h:276
OtaImageState_t imageState
Definition: ota.h:274
uint32_t fileIndex
Definition: ota.h:269
uint32_t requestMomentum
Definition: ota.h:277
OtaAppCallback_t OtaAppCallback
Definition: ota.h:279
uint32_t serverFileID
Definition: ota.h:270
OtaFileContext_t fileContext
Definition: ota.h:268
This is the OTA statistics structure to hold useful info.
Definition: ota_private.h:299
OTA Application Buffer size information.
Definition: ota.h:242
uint16_t authSchemeSize
Maximum size of the auth scheme.
Definition: ota.h:256
uint8_t * pUpdateFilePath
Path to store the files.
Definition: ota.h:243
uint16_t urlSize
Maximum size of the URL.
Definition: ota.h:254
uint16_t updateFilePathsize
Maximum size of the file path.
Definition: ota.h:244
uint8_t * pAuthScheme
Authentication scheme used to validate download.
Definition: ota.h:255
uint8_t * pUrl
Presigned url to download files from S3.
Definition: ota.h:253
uint32_t decodeMemorySize
Maximum size of the decoded files buffer.
Definition: ota.h:250
uint16_t certFilePathSize
Maximum size of the certificate file path.
Definition: ota.h:246
uint8_t * pCertFilePath
Path to certificate file.
Definition: ota.h:245
uint8_t * pFileBitmap
Bitmap of the parameters received.
Definition: ota.h:251
uint8_t * pStreamName
Name of stream to download the files.
Definition: ota.h:247
uint8_t * pDecodeMemory
Place to store the decoded files.
Definition: ota.h:249
uint16_t fileBitmapSize
Maximum size of the bitmap.
Definition: ota.h:252
uint16_t streamNameSize
Maximum size of the stream name.
Definition: ota.h:248
Stores information about the event message.
Definition: ota_private.h:442
OTA File Context Information.
Definition: ota_private.h:390
OTA Event Interface structure.
Definition: ota_http_interface.h:130
OTA Interface for referencing different components.
Definition: ota.h:228
OtaPalInterface_t pal
OTA PAL callback structure.
Definition: ota.h:232
OtaMqttInterface_t mqtt
MQTT interface that references the publish subscribe methods and callbacks.
Definition: ota.h:230
OtaOSInterface_t os
OS interface to store event, timers and memory operations.
Definition: ota.h:229
OtaHttpInterface_t http
HTTP interface to request data.
Definition: ota.h:231
OTA Event Interface structure.
Definition: ota_mqtt_interface.h:156
OTA OS Interface.
Definition: ota_os_interface.h:302
OTA pal Interface structure.
Definition: ota_platform_interface.h:292