While considering a use case where cloud may have added support to groups/blobs which CPE doesn’t support, approach that was decided is to have a metadata header with a bitmask indicating supported features in CPE.
When CPE contacts cloud server to get the latest version of documents due a forced sync/bootup sync, then CPE may add a header X-System-Supported-Docs: to the request. This header will contain a bitmask string which indicates what feature is supported in CPE FW.
Within RDK, each feature will be supported by different components. Hence the subdocs may be arranged into groups to form a series of bit masked values separated by commas. Placeholder of each group in the header could be predefined and can be identified by the two MS nibbles. So, cloud may parse the bitstreams as per the group ID shared by RDK. Within each group’s bitmap, cloud can check the bits turned ON to identify supported feature.
Here RDK reserves two MS nibbles for identifying the group, hence it won’t change. Rest of the bits will be used to indicate a subdoc is supported or not.
To identify schema version supported by each group, a new metadata header will be added as X-System-Schema-Version with comma separated version numbers along with a bit mask subdoc id. That will ensure cloud knows the schema version of subdoc supported by CPE in each FW release. Versions in the header may not follow the same ordinal status of bitstream in the supported docs metadata. As all subdoc versions start from 1.0, RDK need not have to add this header or version of a subdoc in header until there is a change in version of a subdoc.
Both version and supported docs information is populated during build time. So, it won’t change during runtime in CPE.
X-System-Supported-Docs: <Group1>,<Group2>,<Group3>,...,<GroupN> |
Points for future:
X-System-Schema-version: <bitmask1:version_1>,<bitmask2:version_2>,<bitmask3:version_3>,<bitmask4:version_4>,... |

Fig 1: Bits arrangement in bitstream.
In supported subdoc metadata, bitmask will be a value considering all bits corresponding to supported subdocs turned ON in LS 6 nibbles.
In version metadata, bitmask value generated for identifying subdoc will be having only one bit turned ON in 6 LS nibbles.
As mentioned in figure above, MS two nibbles will be group identifier field.
X-System-Product-Class: XB3 X-System-Model-Name: TG1682G Authorization: Bearer <JWT token> IF-NONE-MATCH:NONE Schema-Version: v1.0 Transaction-ID: 79098228695636680012 X-System-Schema-Version: 16777217-1.1, 16777218-1.2, 33554433-1.1, 50331649-2.0,.... X-System-Supported-Docs: 16777219, 33554435, 50331649,... X-System-Boot-Time: 1557198030 X-System-Ready-Time: 1557199130 X-System-Current-Time: 1557199333 X-System-Status: Operational\Non-Operational X-System-Firmware-Version: TG1682_DEV-default_20190510072402sdy.bin |
Here, metadata for supported docs will be populated as per placeholder mentioned here.
As per the placeholders, in this sample request header
The cloud converts each decimal bitmask value into its corresponding binary pattern for decoding the supported subdocs.
Example:
| Decimal Bitmask | Binary Conversion |
|---|---|
| 16777219 | 00000001 0000 0000 0000 0000 0000 0011 |
| 33554435 | 00000010 0000 0000 0000 0000 0000 0011 |
| 50331649 | 00000011 0000 0000 0000 0000 0000 0001 |
Each binary bit represents the enablement status of a specific subdoc within that group.
The mapping between bit positions and subdocs is explained here.
If only two MS nibbles have bits turned ON, that means no feature is supported by that Group in that FW version
This header will hold comma separated strings where each string will have 2 parts.
Example:
| Example (Decimal–Version) | Binary Conversion | Description |
|---|---|---|
| 16777218–1.2 | 00000001 0000 0000 0000 0000 0000 0010 | Represents the version of the subdoc corresponding to the second least significant bit of the first group in the supported docs metadata. |
| 16777217–1.1 | 00000001 0000 0000 0000 0000 0000 0001 | Represents the version of subdoc represented by least significant bit of first group in the list of supported docs metadata. Version: 1.1 |
| 33554433–1.1 | 00000010 0000 0000 0000 0000 0000 0001 | Represents the version of the last subdoc of the second group in the list of supported docs. Version: 1.1 |
Here, two MS nibbles can be directly translated to decimal to identify the position/group in the list represented by supported docs.
RDK may not include the version details of a supported subdoc in the header, if it supports default version 1.0. This is to reduce the string length that will be passed in header. |
Since cloud may not know about what RDK group hosts a particular subdoc, below table will give an idea of Group vs Feature mapping.
Table 1: Subdoc to bit position mapping
Group Identifier (MS nibble) | Subdocs of group |
00000001 | portforwarding
|
lan | |
wan | |
macbinding
| |
hotspot | |
bridge
| |
connectedbuilding | |
xmspeedboost | |
webui | |
00000010 | privatessid
|
homessid
| |
radio
| |
00000011 | moca |
00000100 | xdns
|
00000101 | advsecurity
|
00000110 | mesh
|
clienttosteeringprofile | |
meshsteeringprofiles | |
wifistatsconfig | |
mwoconfigs | |
interference | |
wifimotionsettings | |
00000111 | aker
|
00001000 | telemetry |
defaultrfc | |
rfc | |
00001001 | trafficreport
|
statusreport
| |
00001010 | radioreport
|
interfacereport
| |
00001011 | telcovoip |
telcovoice | |
00001100 | wanmanager |
wanfailover | |
00001101 | voiceservice |
00001110 | cellularconfig |
00001111 | gwfailover |
gwrestore | |
00010000 | prioritizedmacs |
00010001 | lldqoscontrol |
This section will depict what feature/subdoc each bit field denotes in the bitmask:
Group-1

0000 0001 | 0000 0000 0000 000 | webui | xmspeedboost | connectedbuilding | bridge
| hotspot | macbinding
| lan | wan | portforwarding |
Group-2
0000 0010 | 0000 0000 0000 0000 0000 | 0 | radio | homessid | privatessid |
Group-3
0000 0011 | 0000 | 0000 | 0000 | 0000 | 0000 | 000 | moca |
Group-4
0000 0100 | 0000 | 0000 | 0000 | 0000 | 0000 | 000 | xdns |
Group-5
0000 0101 | 0000 | 0000 | 0000 | 0000 | 0000 | 000 | advsecurity |
Group-6
0000 0110 | 0000 0000 0000 0000 | 0 | wifimotionsettings | interference | mwoconfigs | wifistatsconfig | meshsteeringprofiles | clienttosteeringprofile | mesh |
Group-7
0000 0111 | 0000 | 0000 | 0000 | 0000 | 0000 | 000 | aker |
Group-8
0000 1000 | 0000 | 0000 | 0000 | 0000 | 0000 | 0 | rfc | defaultrfc | telemetry |
Group-9
0000 1001 | 0000 | 0000 | 0000 | 0000 | 0000 | 00 | statusreport | trafficreport |
Group-10
0000 1010 | 0000 | 0000 | 0000 | 0000 | 0000 | 00 | interfacereport | radioreport |
Group-11
0000 1011 | 0000 | 0000 | 0000 | 0000 | 0000 | 00 | telcovoice | telcovoip |
Group-12
0000 1100 | 0000 | 0000 | 0000 | 0000 | 0000 | 00 | wanfailover | wanmanager |
Group-13
0000 1101 | 0000 | 0000 | 0000 | 0000 | 0000 | 000 | voiceservice |
Group-14
0000 1110 | 0000 | 0000 | 0000 | 0000 | 0000 | 000 | cellularconfig |
Group-15
0000 1111 | 0000 | 0000 | 0000 | 0000 | 0000 | 00 | gwrestore | gwfailover |
Group-16
0001 0000 | 0000 | 0000 | 0000 | 0000 | 0000 | 000 | prioritizedmacs |
Group-17
0001 0001 | 0000 | 0000 | 0000 | 0000 | 0000 | 000 | lldqoscontrol |
This section is for RDKB component owners.
In RDKB, a common JSON file (webconfig_metadata.json) will be shared among components during build time. File webconfig_metadata.json will provide information of subdocs supported per platform. When a new feature is coming in for a platform, then that feature details has to be added under that specific platform during a code check-in of feature. Build scripts will convert the json to webconfig.properties and install into root file system.
webconfig_metadata.json will provide following details:
Sample json file: metadata.txt
Placeholder for each group is predefined, but component owner can decide bit position for a new subdoc added in that group. Bit position for all the defined features are identified and shown in Section 3.
As an example, how bitstream mapping will be considered to generate webconfig.properties is as shown below:
Group-1 | Group-2 | Group-3 | Group-4 | Group-5 | Group-6 | Group-7 | Group-8 |
0000 0001 0000 0000 0000 0000 0000 0011 | 0010 0000 0000 0000 0000 0000 0000 0011 | 0011 0000 0000 0000 0000 0000 0000 0001 | 0100 0000 0000 0000 0000 0000 0000 0000 | 0101 0000 0000 0000 0000 0000 0000 0000 | 0110 0000 0000 0000 0000 0000 0000 0000 | 0111 0000 0000 0000 0000 0000 0000 0000 | 1000 0000 0000 0000 0000 0000 0000 0000 |
0000 0001 (Fixed Nibbles) | 0000 0000 0000 0000 | 00 | bridge
| hotspot | macbinding
| lan | wan | portforwarding
|
Group-1 bitstream as mentioned in here.
Sample webconfig.properties file with contents:
/* WEBCONFIG_SUPPORTED_DOCS_BIT variable holds the bitstream of supported docs in each component. Placeholder will be as: <Group-1>,<Group-2>,<Group-3>,<Group-4>,<Group-5>,<Group-6>,<Group-7>,<Group-8>,<Group-9>,<Group-10> */ WEBCONFIG_SUPPORTED_DOCS_BIT=16777247,33554435,50331649,67108865,83886081,100663297,117440513,134217729,201326594,218103809,251658241 /* WEBCONFIG_DOC_SCHEMA_VERSION variable will hold the hex conversion of each nibble in above bit pattern. If the supported schema version of a subdoc hasn’t changed from base version “1.0” then that need not have to be applied to header.*/ WEBCONFIG_DOC_SCHEMA_VERSION=16777217-2.0,16777220-1.3,16777224-2.1,33554433-1.1,67108865-2.0,117440513-3.0,... /* Subdoc mapping as per bit position for each group. Format:<Group><subdoc name>:<bit position>:<supported> */ WEBCONFIG_SUBDOC_MAP_1=portforwarding:1:true,wan:2:true,lan:3:true,macbinding:4:true,hotspot:5:true,bridge:6:false,connectedbuilding:7:true WEBCONFIG_SUBDOC_MAP_2=privatessid:1:true,homesid:2:true,radio:3:false WEBCONFIG_SUBDOC_MAP_3=moca:1:true WEBCONFIG_SUBDOC_MAP_4=dns:1:true WEBCONFIG_SUBDOC_MAP_5=adsecurity:1:true WEBCONFIG_SUBDOC_MAP_6=mesh:1:true,clientsteeringprofile:2:true WEBCONFIG_SUBDOC_MAP_7=aker:1:true WEBCONFIG_SUBDOC_MAP_8=telemetry:1:true WEBCONFIG_SUBDOC_MAP_9=trafficreport:1:false,statusreport:2:false WEBCONFIG_SUBDOC_MAP_10=radioreport:1:false,interfacereport:2:false WEBCONFIG_SUBDOC_MAP_11=telcovoip:1:false,televoice:2:false WEBCONFIG_SUBDOC_MAP_12=wanmanager:1:false,wanfailover:2:true WEBCONFIG_SUBDOC_MAP_13=voiceservice:1:true WEBCONFIG_SUBDOC_MAP_14=cellularconfig:1:false WEBCONFIG_SUBDOC_MAP_15=gwfailover:1:true,grewafservice:2:false WEBCONFIG_SUBDOC_MAP_16=prioritizedmacs:1:true WEBCONFIG_SUBDOC_MAP_17=telmetrynotification:1:true WEBCONFIG_SUPPLEMENTARY_DOCS=telemetry |