The RDK firmware upgrader, the RDK agent at the CPE device side with the goal to provide an efficient and safe way to upgrade Firmware on the Field boxes. The module has the capability to
The module supports the upgrade of multiple Firmware types to RDK unit (RDK Video and stream boxes.)
| draw.io Diagram | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
...
This service provides the download location (URL) required for RDK download Manager for dynamic Apps/packages/certs/tools installation. This module is responsible to trigger RDM Application. The module will do the security evaluation of the downloaded packages and verify the signature to ensure the installation of packages.
The App or binary name as part of rootfs is "rdkvfwupgrader". This module having below components
...
Broadcast Event For Maintenance Manager:
| EVENT NAME | VALUE |
|---|---|
| MAINT_FWDOWNLOAD_COMPLETE | 8 |
| MAINT_FWDOWNLOAD_ERROR | 9 |
| MAINT_FWDOWNLOAD_ABORTED | 10 |
| MAINT_CRITICAL_UPDATE | 11 |
| MAINT_REBOOT_REQUIRED | 12 |
| MAINT_FWDOWNLOAD_INPROGRESS | 15 |
| MAINT_FWDOWNLOAD_FG | 17 |
| MAINT_FWDOWNLOAD_BG | 18 |
Broadcast Event For System Service
| EVENT NAME | VALUE |
|---|---|
| FW_STATE_UNINITIALIZED | 0 |
| FW_STATE_REQUESTING | 1 |
| FW_STATE_DOWNLOADING | 2 |
| FW_STATE_FAILED | 3 |
| FW_STATE_DOWNLOAD_COMPLETE | 4 |
| FW_STATE_VALIDATION_COMPLETE | 5 |
| FW_STATE_PREPARING_TO_REBOOT | 6 |
| FW_STATE_ONHOLD_FOR_OPTOUT | 7 |
| FW_STATE_CRITICAL_REBOOT | 8 |
| FW_STATE_NO_UPGRADE_REQUIRED | 9 |
| IMAGE_FWDNLD_UNINITIALIZED | 0 |
| IMAGE_FWDNLD_DOWNLOAD_INPROGRESS | 1 |
| IMAGE_FWDNLD_DOWNLOAD_COMPLETE | 2 |
| IMAGE_FWDNLD_DOWNLOAD_FAILED | 3 |
| IMAGE_FWDNLD_FLASH_INPROGRESS | 4 |
| IMAGE_FWDNLD_FLASH_COMPLETE | 5 |
| IMAGE_FWDNLD_FLASH_FAILED | 6 |
This component is responsible for processing the xconf response and parse the json file. Then create a data structure to use further.
The firmware upgrader queries Xconf to check whether any upgrade is available for this device. The API is used to communicate with the Xconf and below are its typical parameters. The device details are fetched using the APIs as part of the deviceutils component.
Function Name | Parameter | Description |
|---|---|---|
MakeXconfComms | pResponse | Pointer to structure to receive output data Xconf Http status |
createJsonString | Char * pPostFieldOut, Size_t szPostFieldOut | The json string is looks like |
|
osClass=Not Available&accountId= |
1234& |
serial= |
10000000e33bf0d4&localtime= |
Wed Nov 26 13:44:09 UTC 2025&dlCertBundle=&rdmCatalogueVersion=&timezone= |
Asia/ |
Calcutta&capabilities=rebootDecoupled&capabilities=RCDL&capabilities=supportsFullHttpUrl | ||
upgradeRequest | int upgrade_type,int server_type,constchar* artifactLocationUrl,constvoid* dwlloc,char*pPostFields,int*pHttp_code | Use For requesting upgrade pci, pdri and xconf. Param-1: Upgrade type pci, pdri, xconf Param-2: Type of server. HTTP_XCONF_DIRECT, HTTP_XCONF_CODEBIG, HTTP_SSR_DIRECT, HTTP_SSR_CODEBIG Param-3: Download server url Param-4: To store download data Param-5: http code |
getXconfRespData | XCONFRES *pResponse,char*pJsonStr | The response looks like below {"firmwareDownloadProtocol":"http","firmwareFilename":" |
lib32-application-test-image-RPI4-raspberrypi4-64-rdke-feature-RDKECOREMW-863-OTA.wic.tar.gz","firmwareLocation":" |
https://tools.rdkcentral.com:8443/images/","firmwareVersion":" |
lib32-application-test-image-RPI4-raspberrypi4-64-rdke-feature-RDKECOREMW-863-OTA.wic.tar.gz","mandatoryUpdate":false,"rebootImmediately":false} |
The response from Xconf is processed as part of the jsonparser Component. This is a typical response from the Xconf.
| Code Block |
|---|
{ "firmwareDownloadProtocol |
...
":"http",
"firmwareFilename":"lib32-application-test-image-RPI4-raspberrypi4-64-rdke-feature-RDKECOREMW-863-OTA.wic.tar.gz",
"firmwareLocation":"https://tools.rdkcentral.com:8443/images/",
"firmwareVersion":"lib32-application-test-image-RPI4-raspberrypi4-64-rdke-feature-RDKECOREMW-863-OTA.wic.tar.gz",
"mandatoryUpdate":false,
"rebootImmediately":false
} |
The key parameters of this json response are populated The key parameters of this json response are populated as part of this datastructure.
...
This component is responsible for reading the rfc value and writing the rfc value. Below are the rfc used in this module.
| RFC name | Description | Default Value |
|---|---|---|
| Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.SWDLSpLimit.Enable | Use for throttle feature | FALSE |
Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.SWDLSpLimit.TopSpeed | Use for set throttle speed | 1MB => 1 *1024 * 1024 |
Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.IncrementalCDL.Enable | Use For Incremental Download | TRUE |
Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.SWDLDirect.Enable | Use For Direct CDN Download | FALSE |
...
Low Level Design Flow From Start To End
Low Level Design Flow From Start To End
Firmware Download Trigger Sequence Diagram in RDK-V Device:
Below Sequence diagram is for device where maintenance manager is running
eStbMac=D8:3A:DD:0A:43:71&firmwareVersion=lib32-middleware-test-image-RPI4-20251118074027&env=dev&model=RPI4&manufacturer=RaspberryPi&partnerId=community&activationInProgress=false&osClass=Not Available&accountId=1234&serial=10000000e33bf0d4&localtime=Wed Nov 26 13:44:09 UTC 2025&dlCertBundle=&rdmCatalogueVersion=&timezone=Asia/Calcutta&capabilities=rebootDecoupled&capabilities=RCDL&capabilities=supportsFullHttpUrl |
|---|
{
"firmwareDownloadProtocol":"http",
"firmwareFilename":"lib32-application-test-image-RPI4-raspberrypi4-64-rdke-feature-RDKECOREMW-863-OTA.wic.tar.gz",
"firmwareLocation":"https://tools.rdkcentral.com:8443/images/",
"firmwareVersion":"lib32-application-test-image-RPI4-raspberrypi4-64-rdke-feature-RDKECOREMW-863-OTA.wic.tar.gz",
"mandatoryUpdate":false,
"rebootImmediately":false
} |
|---|
Below Sequence diagram is for device where maintenance manager is running
| draw.io Diagram | |||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||
| draw.io Diagram | |||||||||||||||||||
|
...
| PlantUML Macro |
|---|
@startuml title Reference legend |<back:Green> | Libraries | |<back:Yellow> | Cloud Endpoints | |<back:Grey> | Daemon | end legend @enduml |
...
...
| PlantUML Macro | ||
|---|---|---|
| ||
@startuml
participant mm
participant rdkvfwupdater
participant iarmlib #Green
participant rfclib #Green
participant jsonlib #Green
participant upgradelib #Green
participant utilslib #Green
participant downloadlib #Green
participant xconfserver #Yellow
participant parsinglib #Green
participant ssrserver #Yellow
participant flashapp
mm -> rdkvfwupdater : trigger
rdkvfwupdater -> rdkvfwupdater : initial validation
alt validation success
rdkvfwupdater -> utilslib : get device details
utilslib | ||
| PlantUML Macro | ||
| ||
@startuml participant mm participant rdkvfwupdater participant iarmlib #Green participant rfclib #Green participant jsonlib #Green participant upgradelib #Green participant utilslib #Green participant downloadlib #Green participant xconfserver #Yellow participant parsinglib #Green participant ssrserver #Yellow participant flashapp mm -> rdkvfwupdater : trigger rdkvfwupdater -> rdkvfwupdater : initial validation alt validation success rdkvfwupdater -> utilslib : get device details utilslib --> rdkvfwupdater : device details rdkvfwupdater -> rfclib : get rfc data rfclib --> rdkvfwupdater : rfc data rdkvfwupdater -> jsonlib : create json request jsonlib -> parsinglib : generic JSON parse/construct parsinglib --> jsonlib : result jsonlib --> rdkvfwupdater : json payload rdkvfwupdater -> upgradelib : request xconf connection upgradelib -> downloadlib : connect to xconf server downloadlib -> xconfserver : request alt xconf response success xconfserver --> downloadlib : success response downloadlib --> upgradelib : success response upgradelib --> rdkvfwupdater : success response rdkvfwupdater -> jsonlib : parse json data jsonlib -> parsinglib : generic JSON parse/construct parsinglib --> jsonlib : result alt parsing success jsonlib --> rdkvfwupdater : success response rdkvfwupdater -> rdkvfwupdater : process json data alt new image different rdkvfwupdater -> upgradelib : download image upgradelib -> downloadlib : download image downloadlib -> ssrserver : request ssrserver --> downloadlib : server status alt server status 0 downloadlib --> upgradelib : success response upgradelib --> rdkvfwupdater : success response rdkvfwupdater -> flashapp : flash image flashapp --> rdkvfwupdater : flashdevice statusdetails rdkvfwupdater -> rfclib : get rfc data rfclib --> rdkvfwupdater : rfc data rdkvfwupdater -> iarmlibjsonlib : successcreate json statusrequest jsonlib -> parsinglib : generic JSON parse/construct parsinglib --> jsonlib : result iarmlibjsonlib --> mmrdkvfwupdater : successjson statuspayload rdkvfwupdater -> upgradelib : request xconf connection upgradelib -> elsedownloadlib server: statusconnect 18to orxconf 28server downloadlib -> xconfserver : request alt xconf response success downloadlib xconfserver --> upgradelibdownloadlib : chunkdownloadsuccess response upgradelibdownloadlib --> upgradelib rdkvfwupdater: :success chunkdownloadresponse upgradelib --> rdkvfwupdater : success response rdkvfwupdater -> flashappjsonlib : parse flashjson imagedata jsonlib -> parsinglib : generic JSON parse/construct flashapp parsinglib --> rdkvfwupdaterjsonlib : flashresult status alt parsing success rdkvfwupdaterjsonlib --> iarmlibrdkvfwupdater : success statusresponse iarmlib --rdkvfwupdater -> mmrdkvfwupdater : process successjson statusdata else server status 58 alt new image different rdkvfwupdater -> rdkvfwupdaterupgradelib : recoverydownload downloadimage elseupgradelib other-> serverdownloadlib status : download image downloadlib --> upgradelibssrserver : retry downloadrequest ssrserver upgradelib --> rdkvfwupdaterdownloadlib : retryserver downloadstatus alt server rdkvfwupdater -> iarmlib : fail statusstatus 0 iarmlibdownloadlib --> mmupgradelib : failsuccess statusresponse end upgradelib --> rdkvfwupdater : success response else same image rdkvfwupdater -> iarmlibflashapp : successflash statusimage iarmlibflashapp --> mmrdkvfwupdater : successflash status end elserdkvfwupdater parsing-> fail iarmlib : success status rdkvfwupdater -> iarmlib : fail status iarmlib --> mm : failsuccess status end else xconf response failserver status 18 or 28 xconfserver --> downloadlib : fail response downloadlib --> upgradelib : fail responsechunkdownload upgradelib --> rdkvfwupdater : fail response upgradelib rdkvfwupdater --> iarmlibrdkvfwupdater : fail statuschunkdownload iarmlib --> mm : fail status end else validation fail rdkvfwupdater -> iarmlibflashapp : errorflash statusimage iarmlib --> mm : error status end @enduml |
...
| PlantUML Macro | ||
|---|---|---|
| ||
@startuml skinparam componentStyle rectangle skinparam packageStyle rectangle ' Layer 1: Device System Components package "New Device System" {flashapp --> rdkvfwupdater : flash status [rdkvfwupdater Daemon] <<daemon>> as RDKV [App Plugin] <<component>> as AppPlugin [Firmwarerdkvfwupdater Update-> Library]iarmlib <<library>>: assuccess FWUpdatestatus package "Common Utilities" { [libdwnl] <<library>> iarmlib --> mm : [libjsonparser]success <<library>>status [libutils] <<library>> } [Flash Memory]else <<storage>>server asstatus FlashMem }58 ' Layer 2: External Network Servers package "External Servers" { [XConf Server] <<cloud>> as XConf [SSR Server] <<cloud>> as SSR } ' App Plugin interactions AppPlugin --> FWUpdate : download + flash API calls ' Firmware update lib communicates with rdkvfwupdater FWUpdate ..> RDKV : IPC Request\n(download/flash tasks) RDKV ..> FWUpdate : IPC Response\n(task result) ' rdkvfwupdater uses common utilities and flash memory RDKV --> libdwnl : fetch/download helpers RDKV --> libjsonparser : parse JSON config RDKV --> libutils : device info/utils RDKV --> FlashMem : flash firmware ' Common utils interaction with servers libdwnl --> XConf : fetch xconf data libdwnl --> SSR : download firmware image @enduml |
NEW DEVICE SYSTEM:
| PlantUML Macro |
|---|
@startuml skinparam componentStyle rectangle skinparam packageStyle rectangle ' Layer 1: Device System Components package "NEW Device System" { [rdkvfwupdater Daemon] <<daemon>> as RDKV [App Plugin] <<component>> as AppPlugin [Firmware Update Library] <<library>> as FWUpdate package "Common Utilities" { rdkvfwupdater -> rdkvfwupdater : recovery download else other server status downloadlib --> upgradelib : retry download upgradelib --> rdkvfwupdater : retry download rdkvfwupdater -> iarmlib : fail status iarmlib --> mm : fail status [libdwnl] <<library>>end [libjsonparser] <<library>> else same image [libutils] <<library>> } ' New libs placed outsiderdkvfwupdater "Common Utilities" per your instruction-> iarmlib : success status [iarmlib] <<library>> [rfclib] <<library>> [jsonlib] <<library>> iarmlib --> mm : [upgradelib]success <<library>>status [Flash Memory] <<storage>> as FlashMem } ' Layer 2: External Network Serversend package "External Servers" { [XConf Server]else <<cloud>>parsing as XConffail [SSR Server] <<cloud>> as SSR } ' App Plugin interactions (unchanged) AppPlugin --> FWUpdate : download + flash API calls ' Preserve original communication between daemon and Firmware Update Library (unchanged) FWUpdate ..> RDKV : IPC Request\n(download/flash tasks) RDKV ..> FWUpdate : IPC Response\n(task result) ' rdkvfwupdater uses new libs and common utilities and flash memory RDKV --> rfclib : fetch RFC data RDKV --> iarmlib : send status/notify MM RDKV --> jsonlib : prepare JSON request RDKV --> upgradelib : coordinate upgrade policies rdkvfwupdater -> iarmlib : fail status iarmlib --> mm : fail status end else xconf response fail xconfserver --> downloadlib : fail response downloadlib --> upgradelib : fail response upgradelib --> libdwnlrdkvfwupdater : delegate network download calls RDKV - fail response rdkvfwupdater -> libjsonparseriarmlib : fail parsestatus JSON config (responses) RDKV --> libutils : device info/utils RDKViarmlib --> FlashMemmm : flashfail firmwarestatus end 'else Commonvalidation utilsfail interaction with servers (unchanged) libdwnlrdkvfwupdater --> XConfiarmlib : fetch xconf data libdwnl error status iarmlib --> SSRmm : download firmware imageerror status end @enduml |
Children Display