bbfdm/docs/guide/libbbfdm-ubus.md
2025-10-15 16:14:01 +05:30

6.6 KiB
Raw Blame History

LIBBBFDM Ubus (libbbfdm-ubus)

libbbfdm-ubus is a library that provides APIs to expose the data model over ubus as microservices. It is used to manage various data models in different microservices and higher-level applications.

Use Cases

The libbbfdm-ubus library can be used by:

libbbfdm-ubus APIs

The following APIs are provided by libbbfdm-ubus to expose the data model over ubus:

bbfdm_ubus_register_init

This method initializes the bbfdm_context structure object and registers ubus data model methods.

int bbfdm_ubus_register_init(struct bbfdm_context *bbfdm_ctx)

Inputs:
    struct bbfdm_context *bbfdm_ctx
        Pointer to the `bbfdm_context` structure to be initialized.

Returns:
    int fault
        Returns 0 on success, or an error code if the registration fails.

bbfdm_ubus_register_free

This method frees the bbfdm_context structure object.

int bbfdm_ubus_register_free(struct bbfdm_context *bbfdm_ctx)

Inputs:
    struct bbfdm_context *bbfdm_ctx
        Pointer to the `bbfdm_context` structure to be freed.

Returns:
    int fault
        Returns 0 on success, or an error code if freeing fails.

bbfdm_ubus_set_service_name

This method sets the service name for the daemon running as a microservice.

void bbfdm_ubus_set_service_name(struct bbfdm_context *bbfdm_ctx, const char *srv_name)

Inputs:
    struct bbfdm_context *bbfdm_ctx
        Pointer to the `bbfdm_context` structure.

    const char *srv_name
        Pointer to the service name to set.

Returns:
    None

bbfdm_ubus_set_log_level

This method sets the log level according to the standard syslog levels.

void bbfdm_ubus_set_log_level(int log_level)

Inputs:
    int log_level
        Desired log level to set.

Returns:
    None

bbfdm_ubus_load_data_model

This method loads an internal data model, allowing you to use an internal model instead of external plugins (e.g., DotSo or JSON).

void bbfdm_ubus_load_data_model(DM_MAP_OBJ *DynamicObj)

Inputs:
    DM_MAP_OBJ *DynamicObj
        Pointer to the internal data model.

Returns:
    None

libbbfdm-ubus Methods

Following are the ubus methods exposed by libbbfdm-ubus when registering a new module:

# ubus -v list bbfdm.sysmngr
'bbfdm.sysmngr' @6931a0bb
    "get":{"path":"String","optional":"Table"}
    "schema":{"path":"String","first_level":"Boolean","optional":"Table"}
    "instances":{"path":"String","optional":"Table"}
    "set":{"path":"String","value":"String","datatype":"String","obj_path":"Table","optional":"Table"}
    "operate":{"path":"String","command_key":"String","input":"Table","optional":"Table"}
    "add":{"path":"String","obj_path":"Table","optional":"Table"}
    "del":{"path":"String","paths":"Array","optional":"Table"}
    "reference_path":{"path":"String","optional":"Table"}
    "reference_value":{"path":"String","optional":"Table"}

libbbfdm-ubus Examples

1. The requested value is correct as per the TR181 standard, but there is a limitation in the device.

root@iowrt:~# ubus call bbfdm.firewallmngr set '{"path":"Device.Firewall.Config", "value":"High"}'
{
    "results": [
        {
            "path": "Device.Firewall.Config",
            "fault": 9007,
            "fault_msg": "The current Firewall implementation supports only 'Advanced' config."
        }
    ]
}

2. The requested value is outside the allowed range.

root@iowrt:~# ubus call bbfdm.firewallmngr set '{"path":"Device.Firewall.Chain.1.Rule.9.DestPort", "value":"123456"}'
{
    "results": [
        {
            "path": "Device.Firewall.Chain.1.Rule.9.DestPort",
            "fault": 9007,
            "fault_msg": "'123456' value is not within range (min: '-1' max: '65535')"
        }
    ]
}

3. Some arguments should be defined to perform the requested operation.

root@iowrt:~# ubus call bbfdm.netmngr operate '{"path":"Device.IP.Diagnostics.IPPing()", "command_key":"ipping_test", "input":{}}'
{
    "results": [
        {
            "path": "Device.IP.Diagnostics.IPPing()",
            "data": "ipping_test",
            "output": [
                {
                    "fault": 7004,
                    "IPPing: 'Host' input should be defined"                    
                }
            ]
        }
    ]
}

4. The path parameter value must start with 'Device.'. The command below doesn't have Device before path "Users.User."

root@iowrt:~# ubus call bbfdm.usermngr get '{"path":"Users.User.", "optional": {"format":"raw", "proto":"usp"}}'
{
    "results": [
        {
            "path": "Users.User.",
            "fault": 7026,
            "fault_msg": "Path is not present in the data model schema"
        }
    ]
}

These fault messages defined in datamodel handlers, users can add such fault message using bbfdm_set_fault_message libbbfdm-api's API, if no specific fault message defined for particular obj/param, datamodel returns standard error messages that are defined in CWMP and USP protocols as the fault message value.

Fault Handling

To indicate a fault and its source, libbbfdm-ubus provides fault along with fault_msg in the response in case of faults, which are then handled by higher-layer applications (e.g., icwmp, obuspa).

This provides a clear insight into the root cause of the fault. Based on fault_msg, its easy to understand the issue, how to fix it, and identify limitations (if any) in the device.

Error Codes

Error Code Meaning
7003 Message failed due to an internal error.
7004 Message failed due to invalid values in the request elements and/or failure to update one or more parameters during Add or Set requests.
7005 Message failed due to memory or processing limitations.
7008 Requested path was invalid or a reference was invalid.
7010 Requested Path Name associated with this ParamError did not match any instantiated parameters.
7011 Unable to convert string value to correct data type.
7012 Out of range or invalid enumeration.
7022 Command failed to operate.
7026 Path is not present in the data model schema.