Mesh: added message response on Node Role 26/257126/4
authoranuj.bhumiya <anuj.bhumiya@samsung.com>
Mon, 19 Apr 2021 10:00:19 +0000 (15:30 +0530)
committeranuj.bhumiya <anuj.bhumiya@samsung.com>
Fri, 23 Apr 2021 06:00:34 +0000 (11:30 +0530)
This patch implements the message response from node
side to Provisioner node when it receive any message
from provisioner.

Change-Id: Ic70c7589f9328dd80ebcf5de7a76937c9c640e6c
Signed-off-by: anuj.bhumiya <anuj.bhumiya@samsung.com>
bt-api/bt-event-handler.c
bt-api/bt-mesh.c
bt-service/services/bt-request-handler.c
bt-service/services/bt-service-event-sender.c
bt-service/services/include/bt-service-mesh-model.h
bt-service/services/mesh/bt-service-mesh-model.c
include/bluetooth-api.h
include/bluetooth-mesh-api.h
include/bt-internal-types.h

index 1c4f329..f4e56e1 100644 (file)
@@ -745,6 +745,22 @@ static void __bt_mesh_event_filter(GDBusConnection *connection,
                _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED,
                                result, info,
                                event_info->cb, event_info->user_data);
+       } else if (strcasecmp(signal_name, BT_MESH_MODEL_MSG_RECEIVED) == 0) {
+               int result;
+               GVariant *param = NULL;
+               GArray *dbus_data = NULL;
+               bluetooth_mesh_model_msg_t *info = NULL;
+
+               g_variant_get(parameters, "(iv)", &result, &param);
+               dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar));
+
+               __bt_fill_garray_from_variant(param, dbus_data);
+               g_variant_unref(param);
+
+               info = &g_array_index(dbus_data, bluetooth_mesh_model_msg_t, 0);
+               _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_MSG_RECEIVED,
+                               result, info,
+                               event_info->cb, event_info->user_data);
        } else if (strcasecmp(signal_name, BT_MESH_JOIN_COMPLETED) == 0) {
                int result;
                GVariant *param = NULL;
index 2d64020..72da1c5 100644 (file)
@@ -785,6 +785,30 @@ BT_EXPORT_API int bluetooth_mesh_model_send_msg(
        return result;
 }
 
+BT_EXPORT_API int bluetooth_mesh_model_send_response(
+               bluetooth_mesh_model_msg_t *req)
+{
+       int result;
+       bt_user_info_t *user_info;
+
+       BT_CHECK_PARAMETER(req, return);
+
+       user_info = _bt_get_user_data(BT_MESH);
+       retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       BT_INIT_PARAMS();
+       BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+       g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_msg_t));
+
+       BT_INFO("Mesh: Node Model Send Response");
+       result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_MODEL_RESPONSE_MSG,
+                       in_param1, in_param2, in_param3, in_param4,
+                               &out_param);
+
+       BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+       return result;
+}
+
 BT_EXPORT_API int bluetooth_mesh_node_configure_key(
                        bluetooth_mesh_key_configure_t *req)
 {
index 232ada1..04e72ac 100644 (file)
@@ -4162,6 +4162,18 @@ normal:
                }
                break;
        }
+       case BT_MESH_MODEL_RESPONSE_MSG: {
+               bluetooth_mesh_model_msg_t req;
+               memset(&req, 0x00, sizeof(bluetooth_mesh_model_msg_t));
+               __bt_service_get_parameters(in_param1,
+                               &req, sizeof(bluetooth_mesh_model_msg_t));
+
+               result = _bt_mesh_model_send_response(
+                               requester_unique_creds, sender, &req);
+               if (result != BLUETOOTH_ERROR_NONE)
+                       g_array_append_vals(*out_param1, &req, sizeof(bluetooth_mesh_model_msg_t));
+               break;
+       }
        case BT_MESH_NODE_GET_NETKEYS: {
                bluetooth_mesh_node_discover_t node;
                memset(&node, 0x00, sizeof(bluetooth_mesh_node_discover_t));
@@ -5373,6 +5385,7 @@ gboolean __bt_service_check_privilege(int function_name,
        case BT_MESH_MODEL_CONFIGURE_APPKEY:
        case BT_MESH_MODEL_GET_APPKEY_LIST:
        case BT_MESH_MODEL_EXECUTE_MSG:
+       case BT_MESH_MODEL_RESPONSE_MSG:
        case BT_MESH_NETWORK_CREATE_GROUP:
        case BT_MESH_NETWORK_REMOVE_GROUP:
        case BT_MESH_MODEL_CONFIG_GROUP_SUB:
index 6b136c5..2b84f8f 100644 (file)
@@ -559,6 +559,9 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        case BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED:
                signal = BT_MESH_MODEL_MSG_EXECUTED;
                break;
+       case BLUETOOTH_EVENT_MESH_MODEL_MSG_RECEIVED:
+               signal = BT_MESH_MODEL_MSG_RECEIVED;
+               break;
        case BLUETOOTH_EVENT_MESH_MODEL_APPKEY_LIST:
                signal = BT_MESH_MODEL_APPKEY_LIST;
                break;
index 3257f70..66aba51 100644 (file)
@@ -40,6 +40,10 @@ int _bt_mesh_model_execute_msg(const char *app_cred,
                const char *sender,
                        bluetooth_mesh_model_msg_t *req);
 
+int _bt_mesh_model_send_response(const char *app_cred,
+               const char *sender,
+                       bluetooth_mesh_model_msg_t *req);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 0e5d370..991864d 100644 (file)
@@ -337,9 +337,14 @@ static void __bt_mesh_send_model_msg_event(int result,
                                TRUE, NULL, NULL);
 
                param = g_variant_new("(iv)", result, out_var);
-               _bt_send_event(BT_MESH_EVENT,
-                               BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED,
-                               param);
+               if (!evt->is_prov)
+                       _bt_send_event(BT_MESH_EVENT,
+                                       BLUETOOTH_EVENT_MESH_MODEL_MSG_RECEIVED,
+                                       param);
+               else
+                       _bt_send_event(BT_MESH_EVENT,
+                                       BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED,
+                                       param);
        }
 }
 
@@ -439,6 +444,7 @@ void _bt_mesh_msg_handler(event_mesh_message_t *event)
 
        param.appkey_idx = event->key_idx;
        param.opcode = opcode;
+       param.is_prov = event->is_prov;
        BT_INFO("Send response");
 
        if (!event->is_prov) {
@@ -517,3 +523,49 @@ int _bt_mesh_model_execute_msg(const char *app_cred, const char *sender,
 
        return BLUETOOTH_ERROR_NONE;
 }
+
+int _bt_mesh_model_send_response(const char *app_cred, const char *sender,
+       bluetooth_mesh_model_msg_t *req)
+{
+       int ret = OAL_STATUS_SUCCESS;
+       uint16_t appkey_idx;
+       oal_uuid_t net_uuid;
+       uint16_t data_len;
+       uint16_t msg_hex_len = 0;
+       uint32_t opcode = 0;
+       uint8_t buffer[MESH_CONFIG_BUFFER_MAX_LEN];
+       uint8_t msg[BLUETOOTH_MESH_MODEL_MSG_LENGTH_MAX + 1];
+
+       opcode = req->opcode;
+       if (_bt_mesh_check_pending_msg_request(opcode, req->primary_unicast,
+               net_uuid.uuid)) {
+               BT_ERR("Device is buzy..");
+               return BLUETOOTH_ERROR_DEVICE_BUSY;
+       }
+       _bt_mesh_util_convert_string_to_hex(req->net_uuid, strlen(req->net_uuid), net_uuid.uuid, 16);
+       appkey_idx = req->appkey_idx;
+       data_len = _bt_mesh_util_opcode_set(req->opcode, buffer);
+       BT_DBG("Mesh: Model string msg opcode: 0x%2.2X msg_len: %d",
+               req->opcode, req->msg_len);
+       if (req->msg_len > 0) {
+               /* Convert Mesh msg to hex*/
+               BT_DBG("Mesh: Model string msg_len: %zd, msg: %s", strlen(req->msg), req->msg);
+               msg_hex_len = strlen(req->msg)/2;
+               _bt_mesh_util_convert_string_to_hex(req->msg, strlen(req->msg), msg, msg_hex_len);
+               for (int msg_idx = 0; msg_idx < msg_hex_len; msg_idx++)
+                       BT_DBG("Mesh: Model hex msg[%d]: msg: 0x%2.2X", msg_idx, msg[msg_idx]);
+
+               /* Append model msg */
+               if (msg_hex_len > 0) {
+                       memcpy(buffer + data_len, msg, msg_hex_len);
+                       data_len += msg_hex_len;
+               }
+       }
+       ret = mesh_model_send_message(&net_uuid, req->primary_unicast, appkey_idx, buffer, data_len);
+
+       if (ret != OAL_STATUS_SUCCESS) {
+               BT_ERR("ret: %d", ret);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+       return BLUETOOTH_ERROR_NONE;
+}
index a4c74bb..7ee62b6 100644 (file)
@@ -958,6 +958,7 @@ typedef enum {
        BLUETOOTH_EVENT_MESH_MODEL_APPKEY_BIND,
        BLUETOOTH_EVENT_MESH_MODEL_APPKEY_LIST,
        BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED,
+       BLUETOOTH_EVENT_MESH_MODEL_MSG_RECEIVED,
        BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_LIST,
        BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_CONFGURED,
        BLUETOOTH_EVENT_MESH_MODEL_VIRTUAL_SUBSCRIPTION_CONFGURED,
index 0dd41a1..ab3fbd7 100644 (file)
@@ -193,6 +193,7 @@ typedef struct {
        uint16_t opcode;
        uint16_t msg_len;
        char msg[BLUETOOTH_MESH_MODEL_MSG_LENGTH_MAX + 1];
+       bool is_prov;
 } bluetooth_mesh_model_msg_t;
 
 typedef struct {
@@ -428,6 +429,12 @@ int bluetooth_mesh_model_send_msg(
                        bluetooth_mesh_model_msg_t *req);
 
 /**
+ * Send response to provisioner node
+ */
+int bluetooth_mesh_model_send_response(
+                       bluetooth_mesh_model_msg_t *req);
+
+/**
  * Get all application keys added to a model of a node
  */
 int bluetooth_mesh_model_get_all_appkeys(
index 36c8308..86415ea 100644 (file)
@@ -500,6 +500,7 @@ typedef enum {
        BT_MESH_MODEL_CONFIGURE_APPKEY,
        BT_MESH_MODEL_GET_APPKEY_LIST,
        BT_MESH_MODEL_EXECUTE_MSG,
+       BT_MESH_MODEL_RESPONSE_MSG,
        BT_MESH_MODEL_GET_SUBSCRIPTION_LIST,
        BT_MESH_MODEL_SET_PUBLICATION,
        BT_MESH_MODEL_GET_PUBLICATION,
@@ -747,6 +748,7 @@ typedef struct {
 #define BT_MESH_NODE_TTL_CONFIGURED "MeshNodeTTLConfigured"
 #define BT_MESH_MODEL_APPKEY_CONFIGURED  "MeshModelAppKeyConfigured"
 #define BT_MESH_MODEL_MSG_EXECUTED  "MeshModelMsgExecuted"
+#define BT_MESH_MODEL_MSG_RECEIVED  "MeshModelMsgReceived"
 #define BT_MESH_MODEL_APPKEY_LIST "MeshModelAppKeyList"
 #define BT_MESH_MODEL_SUB_LIST "MeshModelSubscriptionList"
 #define BT_MESH_MODEL_SUB_CONF "MeshModelSubConfiguration"