
{"id":12871,"date":"2026-04-14T07:03:00","date_gmt":"2026-04-14T07:03:00","guid":{"rendered":"https:\/\/developer.rdkcentral.com\/documentation\/?page_id=12871"},"modified":"2026-05-06T06:06:57","modified_gmt":"2026-05-06T06:06:57","slug":"ccspcr","status":"publish","type":"page","link":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/","title":{"rendered":"CcspCR"},"content":{"rendered":"\n<p>Component Registry (CR) is a core RDK-B middleware component that serves as the central registration and discovery service for all CCSP components in the system. The Component Registry maintains a comprehensive database of all registered components, their supported namespaces, capabilities, and communication endpoints, enabling dynamic service discovery and component interaction across the RDK-B middleware stack. CR acts as the primary authority for component lifecycle management, namespace resolution, and inter-component communication routing.<\/p>\n\n\n\n<p>The Component Registry loads device profile XML configurations that define expected components and their capabilities, validates component registrations against these profiles, and provides query interfaces for namespace discovery and component lookup. CR supports both RBus and D-Bus messaging protocols, enabling flexible deployment configurations and migration paths between messaging infrastructures. The component exposes methods for capability registration, namespace discovery, data type validation, and system readiness monitoring that are consumed by all other RDK-B middleware components.<\/p>\n\n\n\n<p>Component Registry enables the CCSP middleware architecture by decoupling components from direct dependencies and providing runtime service binding through namespace-based discovery. This architectural pattern supports modular component development, flexible deployment configurations, and dynamic system composition without compile-time component dependencies.<\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">graph TB\n    subgraph External [\"External Systems\"]\n        RM[\"Remote Management&lt;br\/>(TR-069\/WebPA)\"]\n        WEBUI[\"Web UI \/ Dashboard\"]\n    end\n\n    subgraph Middleware [\"RDK-B CCSP Middleware\"]\n        CR[\"Component Registry&lt;br\/>(CcspCrSsp)\"]\n        PAM[\"PandM\"]\n        WIFI[\"WiFi Agent\"]\n        PSM[\"PSM\"]\n        OTHER[\"Other Components\"]\n    end\n\n    subgraph IPC [\"Inter-Process Communication\"]\n        RBUS[\"RBus (Modern)\"]\n        DBUS[\"D-Bus (Legacy)\"]\n    end\n\n    subgraph System [\"System Services\"]\n        SYSCFG[\"Syscfg\"]\n        TELEMETRY[\"Telemetry\"]\n        UNPRIV[\"libunpriv\"]\n    end\n\n    LINUX[\"Linux OS \/ Kernel\"]\n\n    RM -.->|discovery| CR\n    WEBUI -.->|queries| CR\n\n    PAM &lt;-->|register\/discover| CR\n    WIFI &lt;-->|register\/discover| CR\n    PSM &lt;-->|register\/discover| CR\n    OTHER &lt;-->|register\/discover| CR\n\n    CR -->|messages| RBUS\n    CR -->|messages| DBUS\n\n    CR -->|read config| SYSCFG\n    CR -->|publish events| TELEMETRY\n    CR -->|privileges| UNPRIV\n\n    RBUS --> LINUX\n    DBUS --> LINUX\n    SYSCFG --> LINUX\n    TELEMETRY --> LINUX\n\n    classDef external fill:#fff3e0,stroke:#ef6c00,stroke-width:2px\n    classDef middleware fill:#e1f5fe,stroke:#0277bd,stroke-width:2px\n    classDef ipc fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px\n    classDef system fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px\n    classDef kernel fill:#f1f8e9,stroke:#558b2f,stroke-width:2px\n\n    class RM,WEBUI external\n    class CR,PAM,WIFI,PSM,OTHER middleware\n    class RBUS,DBUS ipc\n    class SYSCFG,TELEMETRY,UNPRIV system\n    class LINUX kernel\n    class SYSCFG,TELEMETRY,UNPRIV,LINUX system<\/pre><\/div>\n\n\n\n<p><strong>Key Features &amp; Responsibilities<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Component Registration Management<\/strong>: Accepts and validates component capability registrations including namespace ownership, RBus\/D-Bus endpoints, and version information against device profile configurations<\/li>\n\n\n\n<li><strong>Namespace Discovery Service<\/strong>: Provides lookup services to discover which components support specific data model namespaces and dynamic table instances for inter-component parameter access<\/li>\n\n\n\n<li><strong>Device Profile Loading<\/strong>: Parses and validates XML device profile configurations that define expected component topology, dependencies, and namespace allocations for the platform<\/li>\n\n\n\n<li><strong>Data Type Validation<\/strong>: Verifies data model parameter types against registered namespace schemas to ensure type consistency across component boundaries<\/li>\n\n\n\n<li><strong>System Readiness Coordination<\/strong>: Tracks component registration status and dependency fulfillment to determine overall system readiness state for upper-layer services<\/li>\n\n\n\n<li><strong>Session Management<\/strong>: Manages registration sessions with priority handling and session ID allocation for transactional component registration operations<\/li>\n\n\n\n<li><strong>Dual IPC Support<\/strong>: Supports both RBus and D-Bus messaging protocols through conditional compilation enabling flexible deployment configurations and migration strategies<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ComponentRegistry:-Design\">Design<\/h2>\n\n\n\n<p>Component Registry implements a centralized registration and discovery architecture that serves as the authoritative source for component topology and namespace ownership information in the RDK-B middleware stack. The design prioritizes runtime flexibility, allowing components to dynamically register capabilities while maintaining schema validation against pre-configured device profiles. The architecture separates profile management from runtime registration tracking, enabling static validation rules while supporting dynamic component lifecycle management.<\/p>\n\n\n\n<p>The CR component initializes by loading XML device profile configurations from the filesystem that enumerate expected components, their versions, and namespace ownership patterns. During runtime, components invoke registration APIs providing their RBus\/D-Bus endpoints, version information, and supported namespace arrays which CR validates against profile expectations. The namespace manager sub-component maintains indexed data structures for efficient namespace prefix matching and component lookup operations that service discovery requests from other middleware components. Registration state is maintained in memory queues tracking known components, unknown registrations, and remote CR instances in multi-subsystem deployments.<\/p>\n\n\n\n<p>The northbound interface exposes component registration, namespace discovery, and data type validation APIs through both RBus and D-Bus protocols depending on build configuration. RBus support enables modern deployments with improved performance and reduced complexity while D-Bus support provides backward compatibility with legacy CCSP deployments. The southbound interface reads device profile XML files from the filesystem and integrates with syscfg for configuration data and telemetry services for event reporting. Component Registry does not persist registration state to non-volatile storage; instead, all components must re-register on each system initialization, ensuring registration state reflects current runtime topology.<\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">graph TB\n    Config[\"XML Device Profile&lt;br\/>(cr-deviceprofile.xml)\"] \n\n    ssp_main[\"ssp_main.c&lt;br\/>Initialization &amp; Lifecycle\"]\n    ssp_ipc[\"ssp_rbus.c \/ ssp_dbus.c&lt;br\/>Message Bus Interface\"]\n\n    ProfileLoader[\"Profile Loader&lt;br\/>(ccsp_cr_profile.c)\"]\n    RegHandler[\"Registration Handler&lt;br\/>(ccsp_cr_operation.c)\"]\n    NamespaceMgr[\"Namespace Manager\"]\n    ComponentQueue[\"Component Registry Queue\"]\n\n    libxml2[\"libxml2\"]\n    libunpriv[\"libunpriv\"]\n    libtelemetry[\"libtelemetry\"]\n    rbus_dbus[\"RBus \/ D-Bus\"]\n\n    Config -->|load| ProfileLoader\n    ProfileLoader -->|parse| libxml2\n    ProfileLoader -->|populate| ComponentQueue\n\n    ssp_main -->|init| ProfileLoader\n    ssp_main -->|drop privs| libunpriv\n    ssp_main -->|send events| libtelemetry\n    ssp_main -->|launch| ssp_ipc\n\n    ssp_ipc -->|register methods| rbus_dbus\n    ssp_ipc -->|invoke| RegHandler\n    ssp_ipc -->|publish events| rbus_dbus\n\n    RegHandler -->|lookup| ComponentQueue\n    RegHandler -->|register namespaces| NamespaceMgr\n    RegHandler -->|check readiness| ComponentQueue\n\n    NamespaceMgr -->|index| ComponentQueue\n\n    rbus_dbus -->|component registration| RegHandler\n    rbus_dbus -->|namespace discovery| RegHandler\n\n    classDef config fill:#fce4ec,stroke:#c2185b,stroke-width:2px\n    classDef ssp fill:#e3f2fd,stroke:#0277bd,stroke-width:2px\n    classDef core fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px\n    classDef data fill:#fff3e0,stroke:#ef6c00,stroke-width:2px\n    classDef external fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px\n    classDef bus fill:#e1f5fe,stroke:#01579b,stroke-width:2px\n\n    class Config config\n    class ssp_main,ssp_ipc ssp\n    class ProfileLoader,RegHandler core\n    class NamespaceMgr,ComponentQueue data\n    class libxml2,libunpriv,libtelemetry external\n    class rbus_dbus bus<\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ComponentRegistry:-PrerequisitesandDependencies\">Prerequisites and Dependencies<\/h3>\n\n\n\n<p><strong>Build-Time Flags and Configuration:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Configure Option<\/strong><\/td><td><strong>DISTRO Feature<\/strong><\/td><td><strong>Build Flag<\/strong><\/td><td><strong>Purpose<\/strong><\/td><td><strong>Default<\/strong><\/td><\/tr><tr><td><code>--with-rbus-build=none<\/code><\/td><td>N\/A<\/td><td>N\/A<\/td><td>Build without RBus support (D-Bus only)<\/td><td>N\/A<\/td><\/tr><tr><td><code>--with-rbus-build=only<\/code><\/td><td>N\/A<\/td><td><code>RBUS_MAIN_ENABLED<\/code><\/td><td>Build RBus-only variant (no D-Bus support)<\/td><td>N\/A<\/td><\/tr><tr><td><code>--with-rbus-build=integrated<\/code><\/td><td>N\/A<\/td><td>N\/A<\/td><td>Build with both D-Bus and RBus support enabled<\/td><td><code>integrated<\/code><\/td><\/tr><tr><td><code>--enable-notify<\/code><\/td><td><code>systemd<\/code><\/td><td><code>ENABLE_SD_NOTIFY<\/code><\/td><td>Enable systemd readiness notification via sd_notify()<\/td><td>Disabled<\/td><\/tr><tr><td><code>--enable-gtestapp<\/code><\/td><td>N\/A<\/td><td><code>GTEST_ENABLE<\/code><\/td><td>Enable Google Test unit test suite<\/td><td>Disabled<\/td><\/tr><tr><td>N\/A<\/td><td><code>rdkb_wan_manager<\/code><\/td><td>N\/A<\/td><td>Apply WAN Manager ready event patch<\/td><td>Conditional<\/td><\/tr><tr><td>N\/A<\/td><td><code>no_mta_support<\/code><\/td><td>N\/A<\/td><td>Remove MTA component registration from device profiles<\/td><td>Conditional<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>RDK-B Platform and Integration Requirements:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Build Dependencies<\/strong>:\u00a0<code>ccsp-common-library<\/code>,\u00a0<code>dbus<\/code>,\u00a0<code>telemetry<\/code>,\u00a0<code>utopia<\/code>,\u00a0<code>libunpriv<\/code>,\u00a0<code>rbus<\/code>\u00a0(conditionally),\u00a0<code>libxml2<\/code>,\u00a0<code>syscfg<\/code>,\u00a0<code>utapi<\/code>,\u00a0<code>utctx<\/code>,\u00a0<code>ulog<\/code>,\u00a0<code>cjson<\/code>,\u00a0<code>msgpackc<\/code><\/li>\n\n\n\n<li><strong>RDK-B Components<\/strong>: All CCSP middleware components depend on CR for registration; CR does not depend on other middleware components except during registration operations<\/li>\n\n\n\n<li><strong>Systemd Services<\/strong>: CR should start early in the RDK-B middleware stack before components that depend on registration services; systemd notify support is available via\u00a0<code>--enable-notify<\/code>\u00a0configure option<\/li>\n\n\n\n<li><strong>Message Bus<\/strong>: Registers on RBus or D-Bus depending on build configuration at namespace\u00a0<code>com.cisco.spvtg.ccsp.CR<\/code>; provides registration and discovery methods<\/li>\n\n\n\n<li><strong>Configuration Files<\/strong>:<\/li>\n\n\n\n<li><code>\/usr\/ccsp\/cr-deviceprofile.xml<\/code>\u00a0&#8211; Standard device profile defining expected component topology<\/li>\n\n\n\n<li><code>\/usr\/ccsp\/cr-ethwan-deviceprofile.xml<\/code>\u00a0&#8211; Ethernet WAN device profile used when\u00a0<code>\/nvram\/ETHWAN_ENABLE<\/code>\u00a0exists<\/li>\n\n\n\n<li><strong>Startup Order<\/strong>: CR must initialize and load device profiles before other CCSP components attempt registration; no hard dependencies on other middleware components at startup<\/li>\n<\/ul>\n\n\n\n<p><strong>Threading Model:<\/strong><\/p>\n\n\n\n<p>Component Registry uses a multi-threaded request processing model with dedicated threads for system readiness monitoring and message bus interactions.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Threading Architecture<\/strong>: Multi-threaded with asynchronous message processing<\/li>\n\n\n\n<li><strong>D-Bus variant<\/strong>: Uses CCSP message bus framework with internal threading via\u00a0<code>DslhCreateCpeController::Engage()<\/code>; spawns\u00a0<code>waitingForSystemReadyTask<\/code>\u00a0as separate task<\/li>\n\n\n\n<li><strong>RBus variant<\/strong>: Explicitly spawns threads for waiting on system ready (<code>waitForSystemReady<\/code>) and monitoring component dependencies (<code>pollingComponentReady<\/code>)<\/li>\n\n\n\n<li><strong>Main Thread<\/strong>: Supervises component lifecycle and yields to IPC message processing threads<\/li>\n\n\n\n<li><strong>Synchronization<\/strong>: Uses mutex locks (<code>pthread_mutex_t<\/code>) and condition variables (<code>pthread_cond_t<\/code>) for thread-safe access to component registry and system readiness state; synchronization mechanisms protect shared data structures during concurrent registration and discovery operations<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ComponentRegistry:-ComponentStateFlow\">Component State Flow<\/h3>\n\n\n\n<p><strong>Initialization to Active State<\/strong><\/p>\n\n\n\n<p>Component Registry follows a sequential initialization flow establishing foundational services before entering active registration and discovery mode. The component must successfully load device profile configurations defining expected component topology before accepting registration requests from other middleware components.<\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">stateDiagram-v2\n    [*] --> Initializing: Process Start\n    Initializing --> LoadingProfile: Create CR Manager Object\n    LoadingProfile --> ProfileLoaded: Parse Device Profile XML\n    LoadingProfile --> Failed: XML Parse Error\n    ProfileLoaded --> InitializingIPC: Create Namespace Manager\n    InitializingIPC --> RegisteringBus: Initialize D-Bus\/RBus\n    RegisteringBus --> Active: Register Methods &amp; Properties\n    Active --> Active: Process Registrations &amp; Queries\n    Active --> Shutdown: SIGTERM\/SIGINT\n    Failed --> [*]: Exit Process\n    Shutdown --> [*]: Cleanup &amp; Exit\n\n    note right of LoadingProfile\n        Loads cr-deviceprofile.xml or\n        cr-ethwan-deviceprofile.xml\n        based on ETHWAN_ENABLE flag\n    end note\n\n    note right of Active\n        Accepts RegisterCapabilities()\n        Serves DiscoverComponent()\n        Tracks System Readiness\n    end note<\/pre><\/div>\n\n\n\n<p><strong>Runtime State Changes and Context Switching<\/strong><\/p>\n\n\n\n<p>Component Registry maintains minimal runtime state changes after entering active mode. The primary state tracked is system readiness which transitions from not-ready to ready when all expected components from the device profile have successfully registered.<\/p>\n\n\n\n<p><strong>State Change Triggers:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Component registration completion transitions system readiness state when all profile-defined components have registered capabilities<\/li>\n\n\n\n<li>Configuration file reload (via SIGUSR2 signal) triggers data model XML export without interrupting registration services<\/li>\n\n\n\n<li>Component unregistration or loss triggers removal from namespace manager and component queues<\/li>\n<\/ul>\n\n\n\n<p><strong>Context Switching Scenarios:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Device profile context switches between standard and Ethernet WAN profiles based on\u00a0<code>\/nvram\/ETHWAN_ENABLE<\/code>\u00a0file presence at startup<\/li>\n\n\n\n<li>IPC context varies between RBus and D-Bus processing depending on\u00a0<code>--with-rbus-build<\/code>\u00a0configuration<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ComponentRegistry:-CallFlow\">Call Flow<\/h3>\n\n\n\n<p><strong>Initialization Call Flow:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant Init as System Init\n    participant Main as ssp_main\n    participant CR as CR Manager\n    participant Profile as Profile Loader\n    participant IPC as IPC Layer\n    participant WaitThr as SystemReady&lt;br\/>Monitor Thread\n\n    Init->>Main: Execute CcspCrSsp\n    Main->>Main: Initialize Logging &amp; Tracing\n    Main->>Main: Drop Root Privileges\n    Main->>CR: CcspCreateCR()\n    CR->>CR: Allocate CR Manager&lt;br\/>Initialize Component Queues\n    CR-->>Main: CR Handle\n    Main->>Profile: LoadDeviceProfile()\n    Profile->>Profile: Check \/nvram\/ETHWAN_ENABLE\n    Profile->>Profile: Parse XML Device Profile\n    Profile->>CR: Populate Component Info Queue\n    Profile-->>Main: Success\n    Main->>IPC: Initialize Message Bus&lt;br\/>(RBus or D-Bus)\n    IPC->>IPC: Register Methods &amp; Properties\n    IPC-->>Main: Success\n    Main->>WaitThr: Spawn SystemReady&lt;br\/>Monitor Thread\n    WaitThr->>WaitThr: Wait for All Components&lt;br\/>to Register\n    Main->>Main: Continue in Main Loop&lt;br\/>(Daemon Mode)\n    Note over WaitThr: Publishes SystemReady event&lt;br\/>when all components registered<\/pre><\/div>\n\n\n\n<p><strong>Request Processing Call Flow:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant Comp as CCSP Component\n    participant IPC as RBus\/D-Bus Layer\n    participant CROper as CR Operations\n    participant NS as Namespace Manager\n    participant Queue as Component Queue\n\n    Comp->>IPC: RegisterCapabilities(name, version, bus_path, namespaces[])\n    IPC->>CROper: CcspCrRegisterCapabilities()\n    CROper->>Queue: Lookup Component by Name\n    Queue-->>CROper: Component Profile Info\n    CROper->>CROper: Validate Version Match\n    CROper->>NS: RegisterNamespaces(name, path, namespaces[])\n    NS->>NS: Index Namespaces by Prefix\n    NS->>NS: Store Component to Namespace Mapping\n    NS-->>CROper: Registration Success\n    CROper->>Queue: Mark Component Registered\n    CROper->>CROper: Check System Readiness\n    CROper-->>IPC: Return Status Code\n    IPC-->>Comp: Registration Confirmed\n\n    Note over Comp,Queue: Namespace Discovery Flow\n\n    Comp->>IPC: DiscoverComponentSupportingNamespace(\"Device.WiFi.Radio.\")\n    IPC->>CROper: CcspCrDiscoverComponentSupportingNamespace()\n    CROper->>NS: FindComponentByNamespace(\"Device.WiFi.Radio.\")\n    NS->>NS: Prefix Match Search\n    NS-->>CROper: Component Name and Bus Path\n    CROper-->>IPC: Component Info Array\n    IPC-->>Comp: [Component Name, Bus Path, Subsystem]<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ComponentRegistry:-InternalModules\">Internal Modules<\/h2>\n\n\n\n<p>Component Registry is organized into distinct modules separating platform integration concerns, core registration logic, and data management responsibilities. Each module encapsulates specific functionality while maintaining clear interfaces for inter-module communication and data sharing.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Module\/Class<\/strong><\/td><td><strong>Description<\/strong><\/td><td><strong>Key Files<\/strong><\/td><\/tr><tr><td><strong>SSP Main<\/strong><\/td><td>Process entry point and lifecycle management handling initialization, signal processing, privilege dropping, and message bus setup<\/td><td><code>ssp_main.c<\/code>,&nbsp;<code>ssp_global.h<\/code><\/td><\/tr><tr><td><strong>SSP RBus Interface<\/strong><\/td><td>RBus IPC integration supporting method handlers for registration and system readiness properties over RBus protocol<\/td><td><code>ssp_rbus.c<\/code><\/td><\/tr><tr><td><strong>SSP D-Bus Interface<\/strong><\/td><td>D-Bus IPC integration providing component interface implementation for registration and discovery methods over D-Bus<\/td><td><code>ssp_dbus.c<\/code>,&nbsp;<code>ssp_cmd.c<\/code><\/td><\/tr><tr><td><strong>CR Manager<\/strong><\/td><td>Core component instance providing registration, discovery, and session management APIs with component queue management<\/td><td><code>ccsp_cr_base.c<\/code><\/td><\/tr><tr><td><strong>CR Operations<\/strong><\/td><td>External API implementation for capability registration, namespace discovery, data type validation, and component unregistration<\/td><td><code>ccsp_cr_operation.c<\/code><\/td><\/tr><tr><td><strong>Profile Loader<\/strong><\/td><td>XML device profile parser loading expected component definitions, namespace allocations, and remote CR configurations<\/td><td><code>ccsp_cr_profile.c<\/code><\/td><\/tr><tr><td><strong>Session Manager<\/strong><\/td><td>Transaction management for registration sessions with priority handling and session ID allocation for batch operations<\/td><td><code>ccsp_cr_session.c<\/code><\/td><\/tr><tr><td><strong>CR Utility<\/strong><\/td><td>Helper functions for component lookup, queue management, and common operations supporting core registration logic<\/td><td><code>ccsp_cr_utility.c<\/code><\/td><\/tr><tr><td><strong>Data Model Export<\/strong><\/td><td>Dynamic data model XML generation for Motive-compliant export functionality triggered by SIGUSR2 signal<\/td><td><code>ccsp_cr_exportDM.c<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ComponentRegistry:-ComponentInteractions\">Component Interactions<\/h2>\n\n\n\n<p>Component Registry serves as the central hub for all CCSP middleware interactions enabling component discovery and namespace resolution. CR interacts with every CCSP component during initialization registration and provides ongoing discovery services for inter-component communication routing.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ComponentRegistry:-InteractionMatrix\">Interaction Matrix<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Target Component\/Layer<\/strong><\/td><td><strong>Interaction Purpose<\/strong><\/td><td><strong>Key APIs\/Endpoints<\/strong><\/td><\/tr><tr><td><strong>RDK-B Middleware Components<\/strong><\/td><td><\/td><td><\/td><\/tr><tr><td>All CCSP Components<\/td><td>Component capability registration, namespace ownership declaration<\/td><td><code>Device.CR.RegisterComponent()<\/code>&nbsp;(RBus),&nbsp;<code>com.cisco.spvtg.ccsp.CR.registerCapabilities()<\/code>&nbsp;(D-Bus)<\/td><\/tr><tr><td>All CCSP Components<\/td><td>Namespace-to-component discovery for inter-component parameter access<\/td><td><code>com.cisco.spvtg.ccsp.CR.discoverComponentSupportingNamespace()<\/code><\/td><\/tr><tr><td>All CCSP Components<\/td><td>System readiness monitoring and component lifecycle tracking<\/td><td><code>Device.CR.SystemReady<\/code>,&nbsp;<code>eRT.com.cisco.spvtg.ccsp.CR.GetHealth()<\/code><\/td><\/tr><tr><td>All CCSP Components<\/td><td>Component unregistration and namespace cleanup during shutdown<\/td><td><code>com.cisco.spvtg.ccsp.CR.unregisterComponent()<\/code><\/td><\/tr><tr><td><strong>System &amp; Platform Services<\/strong><\/td><td><\/td><td><\/td><\/tr><tr><td>Syscfg<\/td><td>Read system configuration for initialization parameters<\/td><td><code>syscfg_get()<\/code>&nbsp;via libsyscfg<\/td><\/tr><tr><td>Telemetry<\/td><td>Send component health and operational telemetry events<\/td><td><code>t2_event_s()<\/code>&nbsp;via libtelemetry_msgsender<\/td><\/tr><tr><td>libunpriv<\/td><td>Drop root privileges after initialization and before message loop<\/td><td><code>drop_root()<\/code>&nbsp;via libunpriv<\/td><\/tr><tr><td>libxml2<\/td><td>Parse XML device profile configurations defining component topology<\/td><td><code>xmlParseFile()<\/code>,&nbsp;<code>xmlDocGetRootElement()<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Events Published by Component Registry:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Subscriber Components<\/strong><\/td><td><strong>Event Topic\/Path<\/strong><\/td><td><strong>Trigger Condition<\/strong><\/td><td><strong>Subscriber Components<\/strong><\/td><\/tr><tr><td>Component_Registration<\/td><td><code>Device.CR.ComponentRegistered<\/code><\/td><td>Component successfully registers capabilities<\/td><td>Dependent components waiting for specific component availability<\/td><\/tr><tr><td>System_Ready<\/td><td><code>Device.CR.SystemReady<\/code>&nbsp;(property change)<\/td><td>All profile-defined components have registered<\/td><td>Upper-layer services (WebPA, TR-069) requiring full stack initialization<\/td><\/tr><tr><td>Component_Health<\/td><td><code>eRT.com.cisco.spvtg.ccsp.CR.GetHealth()<\/code><\/td><td>Health query invoked<\/td><td>Watchdog services, diagnostic tools<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ComponentRegistry:-IPCFlowPatterns\">IPC Flow Patterns<\/h3>\n\n\n\n<p><strong>Primary IPC Flow &#8211; Component Registration:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant WiFi as CcspWiFiAgent\/OneWifi\n    participant BusLayer as RBus\/D-Bus\n    participant CRSsp as CR SSP Interface\n    participant CROps as CR Operations\n    participant NSMgr as Namespace Manager\n\n    WiFi->>BusLayer: RegisterCapabilities(name=\"com.cisco.spvtg.ccsp.wifi\", version=1, path=\"\/com\/cisco\/spvtg\/ccsp\/wifi\", namespaces=[\"Device.WiFi.\"])\n    BusLayer->>CRSsp: Method Invocation\n    CRSsp->>CROps: CcspCrRegisterCapabilities()\n    CROps->>CROps: Validate Component in Profile\n    CROps->>CROps: Verify Version Match\n    CROps->>NSMgr: RegisterNamespaces(component, path, namespaces[])\n    NSMgr->>NSMgr: Build Namespace Index\n    NSMgr-->>CROps: Success\n    CROps->>CROps: Update Component Queue (Registered=True)\n    CROps->>CROps: Check System Readiness\n    CROps-->>CRSsp: CCSP_SUCCESS\n    CRSsp-->>BusLayer: Return Status\n    BusLayer-->>WiFi: Registration Confirmed\n\n    Note over CROps: If all components registered, publish SystemReady event<\/pre><\/div>\n\n\n\n<p><strong>Namespace Discovery Flow:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant PAM as CcspPandM\n    participant BusLayer as RBus\/D-Bus\n    participant CRSsp as CR SSP Interface\n    participant CROps as CR Operations\n    participant NSMgr as Namespace Manager\n\n    PAM->>BusLayer: DiscoverComponentSupportingNamespace(\"Device.WiFi.Radio.1.Enable\")\n    BusLayer->>CRSsp: Method Invocation\n    CRSsp->>CROps: CcspCrDiscoverComponentSupportingNamespace()\n    CROps->>NSMgr: FindComponentByNamespace(\"Device.WiFi.Radio.1.Enable\")\n    NSMgr->>NSMgr: Prefix Match: \"Device.WiFi.\"\n    NSMgr-->>CROps: Component Info (name, bus_path, version)\n    CROps-->>CRSsp: Component Array\n    CRSsp-->>BusLayer: Return Component Details\n    BusLayer-->>PAM: [{\"componentName\": \"com.cisco.spvtg.ccsp.wifi\", \"busPath\": \"\/com\/cisco\/spvtg\/ccsp\/wifi\", \"subsystem\": \"eRT.\"}]\n\n    Note over PAM: PAM now knows to contact WiFi component for parameter access<\/pre><\/div>\n\n\n\n<p><strong>System Readiness Monitoring Flow:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant WebPA as WebPA Agent\n    participant BusLayer as RBus\n    participant CRRbus as CR RBus Handler\n    participant CRMgr as CR Manager\n\n    WebPA->>BusLayer: Subscribe(\"Device.CR.SystemReady\")\n    BusLayer->>CRRbus: Subscribe Handler\n    CRRbus->>CRRbus: Add Subscriber to List\n    CRRbus-->>BusLayer: Subscription Confirmed\n    BusLayer-->>WebPA: Ack\n\n    Note over CRMgr: Component Registrations Continue...\n\n    CRMgr->>CRMgr: Last Expected Component Registered\n    CRMgr->>CRMgr: Set isSystemReady = 1\n    CRMgr->>CRRbus: Notify SystemReady Changed\n    CRRbus->>BusLayer: rbusEvent_Publish(\"Device.CR.SystemReady\", value=1)\n    BusLayer->>WebPA: Event Notification (SystemReady = 1)\n\n    Note over WebPA: WebPA proceeds with cloud connection establishment<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ComponentRegistry:-ImplementationDetails\">Implementation Details<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ComponentRegistry:-MajorHALAPIsIntegration\">Major HAL APIs Integration<\/h3>\n\n\n\n<p>Component Registry does not directly integrate with HAL APIs. CR operates entirely within the RDK-B middleware layer and interacts with other CCSP components through message bus protocols. The component reads configuration files from the filesystem and uses standard Linux system calls for file I\/O operations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ComponentRegistry:-KeyImplementationLogic\">Key Implementation Logic<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Device Profile Selection<\/strong>: CR determines which device profile XML to load by checking for\u00a0<code>\/nvram\/ETHWAN_ENABLE<\/code>\u00a0file existence at startup; if present, loads\u00a0<code>cr-ethwan-deviceprofile.xml<\/code>, otherwise loads\u00a0<code>cr-deviceprofile.xml<\/code><\/li>\n\n\n\n<li>Files:\u00a0<code>ccsp_cr_profile.c<\/code>\u00a0&#8211;\u00a0<code>CcspCrLoadDeviceProfile()<\/code>\u00a0function<\/li>\n\n\n\n<li><strong>Component Version Validation<\/strong>: Registration requests validate component version against device profile expectations; mismatched versions result in registration rejection with\u00a0<code>CCSP_CR_ERR_UNKNOWN_COMPONENT<\/code>\u00a0error<\/li>\n\n\n\n<li>Files:\u00a0<code>ccsp_cr_operation.c<\/code>\u00a0&#8211;\u00a0<code>CcspCrRegisterCapabilities()<\/code>\u00a0version check logic<\/li>\n\n\n\n<li><strong>Namespace Prefix Matching<\/strong>: Discovery operations use longest-prefix matching algorithm to find owning component for namespace queries<\/li>\n\n\n\n<li>Files: Namespace Manager from ccsp-common-library &#8211; invoked by\u00a0<code>CcspCrDiscoverComponentSupportingNamespace()<\/code>\u00a0in\u00a0<code>ccsp_cr_operation.c<\/code><\/li>\n\n\n\n<li><strong>System Readiness Determination<\/strong>: CR tracks registered components against expected profile components; system is ready when all profile-defined components have successfully registered capabilities<\/li>\n\n\n\n<li>Files:\u00a0<code>ccsp_cr_base.c<\/code>\u00a0&#8211;\u00a0<code>CcspCrIsSystemReady()<\/code>\u00a0function checking component queue registration status<\/li>\n\n\n\n<li><strong>IPC Protocol Abstraction<\/strong>: Build system conditionally compiles RBus or D-Bus interface layers based on\u00a0<code>--with-rbus-build<\/code>\u00a0configure option; core CR logic remains protocol-agnostic<\/li>\n\n\n\n<li>Files:\u00a0<code>Makefile.am<\/code>\u00a0&#8211; conditional compilation based on\u00a0<code>RBUS_BUILD_ONLY<\/code>\u00a0and\u00a0<code>RBUS_BUILD_INTEGRATED<\/code>\u00a0flags<\/li>\n\n\n\n<li><strong>Error Handling Strategy<\/strong>: Registration failures log warnings but component operation continues; unknown component registrations are accepted and tracked in separate queue for diagnostic purposes<\/li>\n\n\n\n<li>Files:\u00a0<code>ccsp_cr_operation.c<\/code>\u00a0&#8211; registration validates against profile but does not reject unknown components<\/li>\n\n\n\n<li><strong>Logging &amp; Debugging<\/strong>: Both RBus and D-Bus variants use RDK Logger via RDK_LOG macros when\u00a0<code>DISABLE_RDK_LOGGER<\/code>\u00a0is not defined; falls back to rtLog functions when RDK Logger is disabled. Also uses CCSP trace macros (AnscTrace) for general trace output.<\/li>\n\n\n\n<li>Files:\u00a0<code>ssp_main.c<\/code>,\u00a0<code>ssp_rbus.c<\/code>,\u00a0<code>ssp_dbus.c<\/code>; RDK Logger initialized in main via\u00a0<code>RDK_LOGGER_INIT()<\/code>\u00a0when\u00a0<code>FEATURE_SUPPORT_RDKLOG<\/code>\u00a0is defined<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"ComponentRegistry:-KeyConfigurationFiles\">Key Configuration Files<\/h3>\n\n\n\n<p>Component Registry relies on XML device profile configurations that define expected component topology and namespace allocations for the platform.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Configuration File<\/strong><\/td><td><strong>Purpose<\/strong><\/td><td><strong>Override Mechanisms<\/strong><\/td><\/tr><tr><td><code>\/usr\/ccsp\/cr-deviceprofile.xml<\/code><\/td><td>Standard device profile defining expected CCSP component registrations and namespace allocations<\/td><td>Selected by default; overridden by Ethernet WAN profile if&nbsp;<code>\/nvram\/ETHWAN_ENABLE<\/code>&nbsp;exists<\/td><\/tr><tr><td><code>\/usr\/ccsp\/cr-ethwan-deviceprofile.xml<\/code><\/td><td>Ethernet WAN device profile with modified component topology for Ethernet WAN configurations<\/td><td>Automatically selected when&nbsp;<code>\/nvram\/ETHWAN_ENABLE<\/code>&nbsp;file is present<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Component Registry (CR) is a core RDK-B middleware component that serves as the central registration [&hellip;]<\/p>\n","protected":false},"author":659,"featured_media":0,"parent":9575,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"class_list":["post-12871","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>CcspCR - RDK Documentation Portal | Documentation<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CcspCR - RDK Documentation Portal | Documentation\" \/>\n<meta property=\"og:description\" content=\"Component Registry (CR) is a core RDK-B middleware component that serves as the central registration [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/\" \/>\n<meta property=\"og:site_name\" content=\"RDK Documentation Portal | Documentation\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-06T06:06:57+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/\",\"url\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/\",\"name\":\"CcspCR - RDK Documentation Portal | Documentation\",\"isPartOf\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/#website\"},\"datePublished\":\"2026-04-14T07:03:00+00:00\",\"dateModified\":\"2026-05-06T06:06:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Documentation\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"RDK Broadband\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Components\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"CcspCR\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/#website\",\"url\":\"https:\/\/developer.rdkcentral.com\/documentation\/\",\"name\":\"RDK Documentation Portal | Documentation\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/developer.rdkcentral.com\/documentation\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CcspCR - RDK Documentation Portal | Documentation","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/","og_locale":"en_US","og_type":"article","og_title":"CcspCR - RDK Documentation Portal | Documentation","og_description":"Component Registry (CR) is a core RDK-B middleware component that serves as the central registration [&hellip;]","og_url":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/","og_site_name":"RDK Documentation Portal | Documentation","article_modified_time":"2026-05-06T06:06:57+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/","url":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/","name":"CcspCR - RDK Documentation Portal | Documentation","isPartOf":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/#website"},"datePublished":"2026-04-14T07:03:00+00:00","dateModified":"2026-05-06T06:06:57+00:00","breadcrumb":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/ccspcr\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/developer.rdkcentral.com\/documentation\/"},{"@type":"ListItem","position":2,"name":"Documentation","item":"https:\/\/developer.rdkcentral.com\/documentation\/"},{"@type":"ListItem","position":3,"name":"RDK Broadband","item":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/"},{"@type":"ListItem","position":4,"name":"Components","item":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_broadband_documentation\/components\/"},{"@type":"ListItem","position":5,"name":"CcspCR"}]},{"@type":"WebSite","@id":"https:\/\/developer.rdkcentral.com\/documentation\/#website","url":"https:\/\/developer.rdkcentral.com\/documentation\/","name":"RDK Documentation Portal | Documentation","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/developer.rdkcentral.com\/documentation\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/12871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/users\/659"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/comments?post=12871"}],"version-history":[{"count":2,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/12871\/revisions"}],"predecessor-version":[{"id":12891,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/12871\/revisions\/12891"}],"up":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/9575"}],"wp:attachment":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/media?parent=12871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}