When running nmos-cpp Node in Docker (host networking), registration with the Registry fails with 400 Bad Request due to IS-04 schema validation failure. The node resource includes a tunnel interface (tunl0) whose port_id is 4 octets instead of the required 6-octet MAC.
- nmos-cpp Node and Registry in separate Docker containers
- Host networking / multiple host_addresses (physical NIC + Docker bridge IPs)
- Linux host with interfaces such as enP7s7, docker0, br-*, tunl0
Registry log
warning: JSON error: schema validation failed at root - no subschema has succeeded ...
{"type":"node","data":{...,"interfaces":[
{"name":"enP7s7","port_id":"4c-bb-47-81-1f-e8",...},
{"name":"docker0","port_id":"be-e8-aa-9a-16-c2",...},
{"name":"br-47379b15f1c5","port_id":"d2-38-b9-d4-7e-80",...},
{"name":"tunl0","port_id":"00-00-00-00",...}
]}}
Node log
Registration creation error: 400 Bad Request
Discovery and the POST to the Registration API succeed; only schema validation fails.
Root cause
On Linux, host_utils.cpp reads link-layer addresses from AF_PACKET and formats sll_halen bytes as-is. Tunnel interfaces like tunl0 report sll_halen == 4, producing "00-00-00-00".
IS-04 requires port_id to match ^([0-9a-f]{2}-){5}([0-9a-f]{2})$ (6 octets).
make_node_interfaces_port_id() in node_interfaces.cpp falls back to "00-00-00-00-00-00" only when port_id is empty — not when it is non-empty but invalid:
return value::string(!port_id.empty() ? port_id : U("00-00-00-00-00-00"));
Workaround
Restrict host_addresses to the single IP clients should use (e.g. the physical NIC), so tunnel interfaces are excluded:
"host_address": "192.168.6.54",
"host_addresses": ["192.168.6.54"]
Suggested fix
When physical_address is not a valid 6-octet MAC, either:
- normalize to
"00-00-00-00-00-00" (already used for missing addresses), or
- exclude the interface from the node resource
This would make container/virtualised deployments more robust without requiring users to know which kernel-reported interfaces have non-MAC link addresses.
When running nmos-cpp Node in Docker (host networking), registration with the Registry fails with 400 Bad Request due to IS-04 schema validation failure. The node resource includes a tunnel interface (tunl0) whose port_id is 4 octets instead of the required 6-octet MAC.
Registry log
Node log
Discovery and the POST to the Registration API succeed; only schema validation fails.
Root cause
On Linux,
host_utils.cppreads link-layer addresses fromAF_PACKETand formatssll_halenbytes as-is. Tunnel interfaces liketunl0reportsll_halen == 4, producing"00-00-00-00".IS-04 requires
port_idto match^([0-9a-f]{2}-){5}([0-9a-f]{2})$(6 octets).make_node_interfaces_port_id()innode_interfaces.cppfalls back to"00-00-00-00-00-00"only whenport_idis empty — not when it is non-empty but invalid:Workaround
Restrict
host_addressesto the single IP clients should use (e.g. the physical NIC), so tunnel interfaces are excluded:Suggested fix
When
physical_addressis not a valid 6-octet MAC, either:"00-00-00-00-00-00"(already used for missing addresses), orThis would make container/virtualised deployments more robust without requiring users to know which kernel-reported interfaces have non-MAC link addresses.