OpenSync BUS

General

Currently OpenSync relies on OVSDB config/status tables and custom unix sockets apis for inter-process communication. We have requests from multiple sources to support a BUS architecture in OpenSync. Introducing a BUS in opensync should help us in:

  • moving to a modular architecture

  • standardize the IPC between OpenSync managers

  • easier integration into various platforms (OpenWRT, RDK, PRPL,...)

  • adding data models other than OVSDB such as TR181

Northbound API

No northbound API changes - no OVSDB or MQTT changes.

Southbound API

Since we intend to support different underlying APIs, we will use a wrapper library that sits on top of the UBUS/RBUS APIs. The name of the OpenSync wrapper library is osbus. Below are described bus concepts and osbus API mappings.

BUS message handling

The messages  that are exchanged on the BUS are a JSON-like structure. This is valid for both ubus and rbus. However the message is not a textual representation of a JSON but a binary one and it supports some additional field types such as binary buffers. For OpenSync we’ll introduce our own message api that can translate a messages between different representations - opensync internal, ubus, rbus, json

OpenSync

UBUS

RBUS

osbus_msg_new_*()

osbus_msg_get_*()

osbus_msg_set_*()

osbus_msg_add_*()

osbus_msg_map_*()

blob_buf_*()

blobmsg_data_*()

blobmsg_get_*()

blobmsg_add_*()

blobmsg_open_*()

blobmsg_close_*()

rbusObject_*()

rbusProperty_*()

rbusValue_*()

 

Method invocation (1:1)

Method invocation uses a 1 to 1 communication delivery with a request and a reply sent back.

MethodInvokaton1x1.png

 

OpenSync

UBUS

RBUS

osbus_method_invoke()

ubus_invoke()

rbusMethod_Invoke()

Events (1:N)

Events provide a one to N communication delivery, with no reply. Unfortunately ubus and rbus use different naming conventions for this but we’ll pick rbus naming for this.

events1xn.png

 

OpenSync

UBUS

RBUS

osbus_event_subscribe()

osbus_event_publish()

 

ubus_register_subscriber()

ubus_unregister_subscriber()

ubus_subscribe()

ubus_unsubscribe()

ubus_notify()

ubus_notify_async()

rbusEvent_SubscribeEx()

rbusEvent_UnsubscribeEx()

rbusEvent_Publish()

 

Topics (M:N)

Topics provide a M to N communication delivery, with no reply. Unfortunately ubus and rbus use different naming conventions for this but we’ll pick rbus naming for this.

 

OpenSync

UBUS

RBUS

osbus_topic_listen()

osbus_topic_send()

 

ubus_register_event_handler()

ubus_unregister_event_handler()

ubus_send_event()

rbusMessage_AddListener()

rbusMessage_RemoveListener()

rbusMessage_Send()

Data Model

A data model provides a set of parameters which can be set, get and subscribed to change events. This concept is fully integrated in RBUS but not in UBUS. In UBUS this is implemented as a set of method calls, so there is no standardized interface for this in UBUS.

 

OpenSync

UBUS

RBUS

not used

 

ubus_invoke()

 

rbus_regDataElements()

rbus_unregDataElements()

rbus_get()

rbus_set()

rbusTable_addRow()

rbusTable_removeRow()

RbusTable_getRowNames()

rbusElementInfo_get()

Resources

https://hackmd.io/@rYMqzC-9Rxy0Isn3zClURg/H1BY98bRw

https://www.snaums.de/informatik/everything-ubus.html

https://programmer.ink/think/openwrt-process-communication-using-ubus.html

GitHub - rdkcentral/rbus: The rdkbus component is a generic message bus implementation intended for use across all RDK profiles

Requirements

Here write what kind of OpenSync requirements are needed, like:

  • SDK with UBUS or RBUS enabled (OpenWRT has ubus support out of the box, for BCM SDK changes are done as patches on top of the SDK)

  • RAM: 512MB or more

  • CPU: quad-core or better