Mesh: Handle network proxy added event 80/242080/1
authorAbhay Agarwal <ay.agarwal@samsung.com>
Mon, 24 Aug 2020 04:56:22 +0000 (10:26 +0530)
committerAbhay Agarwal <ay.agarwal@samsung.com>
Mon, 24 Aug 2020 04:56:29 +0000 (10:26 +0530)
This patch delays to handle the MESH INIT pending request
till the network proxy added callback is received.
This resolves the issue in which network proxy relates MESH API
calls from application like network creation can fail due to
non-availability of network proxy.

Change-Id: Iee712b76a9cd96b5cb8c903b2c12ce0a692f81e6
Signed-off-by: Abhay Agarwal <ay.agarwal@samsung.com>
bt-oal/bluez_hal/inc/bt-hal-msg.h
bt-oal/bluez_hal/src/bt-hal-mesh-dbus-handler.c
bt-oal/bluez_hal/src/bt-hal-mesh.c
bt-oal/hardware/bt_mesh.h
bt-oal/include/oal-event.h
bt-oal/include/oal-mesh.h
bt-oal/oal-mesh.c
bt-service/services/bt-service-event-receiver.c
bt-service/services/mesh/bt-service-mesh-main.c

index 95724ea..cd9c440 100644 (file)
@@ -953,4 +953,12 @@ struct hal_ev_mesh_network_destroyed {
        uint8_t token[8];
 } __attribute__((packed));
 
+#define HAL_EV_MESH_NETWORK_PROXY_ADDED        0xDF
+struct hal_ev_mesh_network_proxy_added {
+       uint8_t status;
+       uint8_t uuid[16];
+       uint8_t token[8];
+} __attribute__((packed));
+
+
 #endif //_BT_HAL_MSG_H_
index b928c05..209ebb4 100644 (file)
@@ -443,11 +443,22 @@ static void __mesh_proxy_added(struct l_dbus_proxy *proxy, void *user_data)
        INFO("MESH: Proxy added: %s (%s)\n", interface, path);
 
        if (!strcmp(interface, BT_HAL_MESH_NETWORK_INTERFACE)) {
+               struct hal_ev_mesh_network_proxy_added ev;
                INFO("Mesh: Network Proxy added");
+
                /* Save Global proxy */
                net_proxy = proxy;
                if (net_proxy)
                        INFO("Mesh: Net Proxy [%p]", net_proxy);
+
+               memset(&ev, 0, sizeof(ev));
+               ev.status = BT_STATUS_SUCCESS;
+
+               /* Send event cb */
+               if (mesh_event_cb)
+                       mesh_event_cb(HAL_EV_MESH_NETWORK_PROXY_ADDED,
+                               (void*)&ev, sizeof(ev));
+
                return;
        }
 
index 54d4937..ad5711d 100644 (file)
@@ -60,6 +60,13 @@ static void __bt_hal_mesh_network_destroyed(void *buf, uint16_t len)
                                (bt_uuid_t*)&ev->uuid);
 }
 
+static void __bt_hal_mesh_network_proxy_added(void *buf, uint16_t len)
+{
+       struct hal_ev_mesh_network_proxy_added *ev = buf;
+       if (bt_hal_mesh_cbacks->network_proxy_added_cb)
+               bt_hal_mesh_cbacks->network_proxy_added_cb(ev->status);
+}
+
 static void __bt_hal_handle_network_scan_result(void *buf, uint16_t len)
 {
        struct hal_ev_mesh_scan_result *ev = buf;
@@ -177,6 +184,10 @@ static void __bt_hal_handle_mesh_events(int message, void *buf, uint16_t len)
                return;
 
        switch (message) {
+       case HAL_EV_MESH_NETWORK_PROXY_ADDED:
+               DBG("Mesh Event: HAL_EV_MESH_NETWORK_PROXY_ADDED");
+               __bt_hal_mesh_network_proxy_added(buf, len);
+               break;
        case HAL_EV_MESH_NETWORK_ATTACHED:
                DBG("Mesh Event: HAL_EV_MESH_NETWORK_ATTACHED");
                __bt_hal_mesh_network_attached(buf, len);
index bf64cda..e383fe0 100644 (file)
@@ -131,6 +131,8 @@ typedef enum {
 } bt_mesh_key_op_e;
 
 /** Callback Signatures */
+typedef void (*btmesh_network_proxy_added_callback)(bt_status_t status);
+
 typedef void (*btmesh_network_attached_callback)(bt_status_t status,
                bt_mesh_token_t *token, bt_uuid_t *uuid);
 
@@ -178,6 +180,7 @@ typedef void (*btmesh_message_received_callback)(bt_uuid_t *net_uuid,
 typedef struct {
        /** set to sizeof(btmesh_callbacks_t) */
        size_t      size;
+       btmesh_network_proxy_added_callback  network_proxy_added_cb;
        btmesh_network_attached_callback  network_attached_cb;
        btmesh_network_destroyed_callback  network_destroyed_cb;
        btmesh_network_scan_status_callback  scan_status_cb;
index 9d1a563..320efc8 100644 (file)
@@ -186,6 +186,7 @@ extern "C" {
        EVENT(OAL_EVENT_GATTC_EXECUTE_WRITE)    /* gattc execute write */\
        EVENT(OAL_EVENT_GATTS_REQUEST_ACQUIRE_WRITE)    /* gattc acquire write */\
        EVENT(OAL_EVENT_GATTS_REQUEST_ACQUIRE_NOTIFY)    /* gattc acquire notify */\
+       EVENT(OAL_EVENT_MESH_NETWORK_PROXY_ADDED)    /* mesh network proxy_added */\
        EVENT(OAL_EVENT_MESH_NETWORK_ATTACHED)    /* mesh network attached */\
        EVENT(OAL_EVENT_MESH_NETWORK_DESTROYED)    /* mesh network destroyed */\
        EVENT(OAL_EVENT_MESH_SCAN_STARTED)    /* mesh network scan start status */\
index f8bf778..c84a277 100644 (file)
@@ -141,6 +141,10 @@ typedef struct {
 
 typedef struct {
        oal_status_t status;
+} event_mesh_network_proxy_added_t;
+
+typedef struct {
+       oal_status_t status;
        uint8_t token[8];
        oal_uuid_t uuid;
 } event_mesh_network_attached_t;
index ecb675c..3c88100 100644 (file)
@@ -43,6 +43,7 @@ static const btmesh_interface_t *mesh_api;
        } while (0)
 
 /* Forward declaration: Callbacks from HAL */
+static void mesh_network_proxy_added_callback(bt_status_t status);
 static void mesh_network_attached_callback(bt_status_t status,
                bt_mesh_token_t *token, bt_uuid_t *uuid);
 static void mesh_network_destroyed_callback(bt_status_t status,
@@ -76,6 +77,7 @@ static void mesh_message_received_callback(bt_uuid_t *net_uuid,
 
 static btmesh_callbacks_t sBluetoothMeshCallbacks = {
        .size = sizeof(sBluetoothMeshCallbacks),
+       .network_proxy_added_cb = mesh_network_proxy_added_callback,
        .network_attached_cb = mesh_network_attached_callback,
        .network_destroyed_cb = mesh_network_destroyed_callback,
        .scan_status_cb = mesh_network_scan_status_callback,
@@ -91,6 +93,18 @@ static btmesh_callbacks_t sBluetoothMeshCallbacks = {
 };
 
 /* Mesh HAL event handlers */
+static void mesh_network_proxy_added_callback(bt_status_t status)
+{
+       event_mesh_network_proxy_added_t *event = g_new0(event_mesh_network_proxy_added_t, 1);
+
+       event->status = convert_to_oal_status(status);
+       BT_INFO("Mesh Event: Network Proxy Added, status: [%s]",
+               status2string(status));
+
+       send_event_bda_trace(OAL_EVENT_MESH_NETWORK_PROXY_ADDED,
+               event, sizeof(event_mesh_network_proxy_added_t), NULL);
+}
+
 static void mesh_network_attached_callback(bt_status_t status,
                bt_mesh_token_t *token, bt_uuid_t *uuid)
 {
index 3305136..867e661 100644 (file)
@@ -402,6 +402,7 @@ static gboolean __bt_handle_oal_events(gpointer data)
                if (adapter_le_cb)
                        adapter_le_cb(event_type, event_data);
                break;
+       case OAL_EVENT_MESH_NETWORK_PROXY_ADDED:
        case OAL_EVENT_MESH_NETWORK_ATTACHED:
        case OAL_EVENT_MESH_NETWORK_DESTROYED:
        case OAL_EVENT_MESH_SCAN_STARTED:
index 849edbc..d818cb7 100644 (file)
@@ -381,6 +381,21 @@ static void  __handle_mesh_message_received_event(
        _bt_mesh_msg_handler(event);
 }
 
+static void  __handle_mesh_network_proxy_added_event(
+               event_mesh_network_proxy_added_t *event)
+{
+       int result = BLUETOOTH_ERROR_NONE;
+
+       if (event->status != OAL_STATUS_SUCCESS)
+               result = BLUETOOTH_ERROR_INTERNAL;
+
+       /* Handle DBUS Context return */
+       BT_INFO("Mesh: Handle DBUS Context return");
+       __bt_mesh_handle_pending_request_info(result,
+                       BT_MESH_INIT,
+                       NULL, 0);
+}
+
 static void __handle_mesh_network_attached_event(
                event_mesh_network_attached_t *event)
 {
@@ -683,6 +698,11 @@ static void __handle_mesh_events(int event_type,
                BT_INFO("Mesh: Provisioning started event");
 
        switch (event_type) {
+       case OAL_EVENT_MESH_NETWORK_PROXY_ADDED:
+               __handle_mesh_network_proxy_added_event(
+                       (event_mesh_network_proxy_added_t*)event_data);
+               BT_PERMANENT_LOG("Mesh: Network proxy added!!");
+               break;
        case OAL_EVENT_MESH_NETWORK_ATTACHED:
                __handle_mesh_network_attached_event(
                        (event_mesh_network_attached_t*)event_data);
@@ -807,12 +827,6 @@ static gboolean __bt_mesh_launch_timer_expired_cb(gpointer data)
                BLUETOOTH_ERROR_ALREADY_INITIALIZED != ret)
                BT_ERR("Mesh: Mesh enable failed: %d", ret);
 
-       /* Handle DBUS Context return */
-       BT_INFO("Mesh: Handle DBUS Context return");
-       __bt_mesh_handle_pending_request_info(ret,
-                       BT_MESH_INIT,
-                       NULL, 0);
-
        /* Reset launch timer ID */
        BT_INFO("Mesh: Timer ID after expiry [%u]", launch_timer);
        launch_timer = 0;