#define BT_MESH_MAX_NODES 32767
#define BT_MESH_MAX_SUBNETS 4096
+#define BT_MESH_FIXED_GROUP_LOW 0xff00
+#define BT_MESH_FIXED_GROUP_HIGH 0xffff
+#define BT_MESH_ALL_NODES_ADDRESS 0xffff
+#define BT_MESH_VIRTUAL_ADDRESS_LOW 0x8000
+#define BT_MESH_VIRTUAL_ADDRESS_HIGH 0xbfff
+#define BT_MESH_GROUP_ADDRESS_LOW 0xc000
+#define BT_MESH_GROUP_ADDRESS_HIGH 0xfeff
+
+#define BT_MESH_IS_GROUP(x) ((((x) >= BT_MESH_GROUP_ADDRESS_LOW) && \
+ ((x) < BT_MESH_FIXED_GROUP_HIGH)) || \
+ ((x) == BT_MESH_ALL_NODES_ADDRESS))
+
static bool is_mesh_initialized = false;
/**< List of Local handles >*/
return i;
}
+static int __compare_group_address(gconstpointer a, gconstpointer b)
+{
+ const bt_mesh_group_s *group = a;
+ uint16_t addr = GPOINTER_TO_UINT(b);
+
+ return (group->addr - addr);
+}
+
static int __compare_node_primary_unicast(gconstpointer a, gconstpointer b)
{
const bt_mesh_node_s *node = a;
if (!l) {
group_s = g_malloc0(sizeof(bt_mesh_group_s));
group_s->addr = group_addr;
- if (group_addr >= 0x8000 && group_addr <= 0xbfff)
+ if (!BT_MESH_IS_GROUP(group_addr))
group_s->is_virtual = true;
else
group_s->is_virtual = false;
bluetooth_mesh_network_t net;
bt_mesh_network_s *network_s;
GPtrArray *groups = NULL;
- GSList *l;
- uint16_t *group_addr = NULL;
+ GSList *l = NULL;
+ bluetooth_mesh_network_group_info_t *group_info = NULL;
int i;
int total;
return error_code;
}
+ BT_INFO("Mesh: Total number of Groups in network [%d]", groups->len);
for (i = 0; i < groups->len; i++) {
- group_addr = g_ptr_array_index(groups, i);
- if (group_addr) {
+ group_info = g_ptr_array_index(groups, i);
+ if (group_info) {
+ BT_INFO("Mesh: Group Is Virtual [%s] Group Addr [0x%2.2x]",
+ group_info->is_virtual ? "YES" : "NO", group_info->group_addr);
+
+ if (group_info->is_virtual)
+ BT_INFO("Mesh: Virtual label UUID [%s]", group_info->label_uuid);
+
+ BT_INFO("Mesh: Total groups already present in Network [%d]",
+ g_slist_length(network_s->groups));
/* Find or create group in network list */
- if (!_bt_mesh_network_get_group(network_s, *group_addr)) {
- BT_ERR("Mesh: OPERATION_FAILED(0x%08x)",
- BT_ERROR_OPERATION_FAILED);
- error_code = BT_ERROR_OPERATION_FAILED;
- break;
- }
+ if (!g_slist_find_custom(network_s->groups,
+ GUINT_TO_POINTER(group_info->group_addr),
+ (GCompareFunc)__compare_network_group_address)) {
+ BT_INFO("Mesh: Its a new Group, add in network");
+ bt_mesh_group_s *group_s;
+ group_s = g_malloc0(sizeof(bt_mesh_group_s));
+ group_s->addr = group_info->group_addr;
+ group_s->parent = network_s;
+ group_s->is_virtual = group_info->is_virtual;
+ if (group_s->is_virtual)
+ g_strlcpy(group_s->label_uuid, group_info->label_uuid,
+ sizeof(group_s->label_uuid));
+ BT_INFO("Mesh: Group [0x%2.2x] added in network", group_s->addr);
+
+ network_s->groups = g_slist_append(network_s->groups, group_s);
+ group_list = g_slist_append(group_list, group_s);
+ } else
+ BT_INFO("Mesh: Group [0x%2.2x] Already Added in network",
+ group_info->group_addr);
} else {
BT_ERR("Mesh: OPERATION_FAILED(0x%08x)",
BT_ERROR_OPERATION_FAILED);
}
total = g_slist_length(network_s->groups);
+ BT_INFO("Mesh: Total number of groups [%d]", total);
if (total == 0) {
BT_INFO("Mesh: No Groups added in network");
callback(BT_ERROR_NONE, (bt_mesh_network_h)network_s, total,
group_s->addr = req.group_addr;
group_s->is_virtual = true;
group_s->parent = network_s;
- if (g_slist_append(network_s->groups, group_s))
- BT_INFO("Mesh: Group created");
-
- __bt_mesh_util_convert_hex_to_string((uint8_t *)req.label_uuid, 16,
- group_s->label_uuid, sizeof(group_s->label_uuid));
+ g_strlcpy(group_s->label_uuid, req.label_uuid, BT_MESH_UUID_STRING_LEN + 1);
+ BT_INFO("Mesh: Virtual Group created : Addr [0x%2.2x]", req.group_addr);
+ BT_INFO("Mesh: Virtual Group label UUID [%s]", group_s->label_uuid);
+ network_s->groups = g_slist_append(network_s->groups, group_s);
group_list = g_slist_append(group_list, group_s);
+
*group = (bt_mesh_group_h) group_s;
FUNC_EXIT;
return error_code;
int bt_mesh_network_remove_group(bt_mesh_group_h group)
{
+ int error_code = BT_ERROR_NONE;
bt_mesh_network_s *network_s;
bt_mesh_group_s *group_s;
+ bluetooth_mesh_network_group_info_t req;
+ bluetooth_mesh_network_t net;
FUNC_ENTRY;
BT_CHECK_MESH_SUPPORT();
BT_CHECK_INPUT_PARAMETER(group);
group_s = (bt_mesh_group_s*) group;
+ BT_MESH_VALIDATE_HANDLE(group_s, group_list);
network_s = group_s->parent;
- BT_MESH_VALIDATE_HANDLE(group_s, group_list);
+ memset(&net, 0x00, sizeof(bluetooth_mesh_network_t));
+ memset(&req, 0x00, sizeof(bluetooth_mesh_network_group_info_t));
+
+ BT_INFO("Mesh: Remove Group [0x%2.2x] from network", group_s->addr);
+ BT_INFO("Mesh: Is Group Virtual [%s]", group_s->is_virtual? "YES": "NO");
+ if (group_s->is_virtual)
+ BT_INFO("Mesh: Group Label UUID [%s]", group_s->label_uuid);
+
+ /* Fill Network Info */
+ g_strlcpy(net.uuid, network_s->uuid, 33);
+ g_strlcpy(net.token.token, network_s->token, 17);
+ g_strlcpy(net.name.name, network_s->name, BT_MESH_NETWORK_NAME_STRING_MAX_LEN + 1);
+
+ /* Fill Group Info */
+ g_strlcpy(req.net_uuid, network_s->uuid, 33);
+ req.is_virtual = group_s->is_virtual;
+ req.group_addr = group_s->addr;
+ if (req.is_virtual)
+ g_strlcpy(req.label_uuid, group_s->label_uuid, sizeof(req.label_uuid));
+
+ error_code = _bt_get_error_code(bluetooth_mesh_network_remove_group(&net, &req));
+ if (error_code != BT_ERROR_NONE) {
+ BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code);
+ FUNC_EXIT;
+ return error_code;
+ }
network_s->groups = g_slist_remove(network_s->groups, group_s);
group_list = g_slist_remove(group_list, group_s);
bt_mesh_group_s *group_s;
bluetooth_mesh_network_t net;
bluetooth_mesh_network_group_info_t req;
+ GSList *l;
FUNC_ENTRY;
BT_CHECK_MESH_SUPPORT();
BT_CHECK_MESH_INIT_STATUS();
BT_CHECK_INPUT_PARAMETER(network);
+ BT_CHECK_INPUT_PARAMETER(group);
network_s = (bt_mesh_network_s*) network;
BT_MESH_VALIDATE_HANDLE(network_s, networks);
+ /* Check for valid Group Address */
+ if (!BT_MESH_IS_GROUP(grp_addr)) {
+ BT_INFO("Mesh: group Address [0x%2.2x] is not valid Group Address",
+ grp_addr);
+ return BT_ERROR_INVALID_PARAMETER;
+ }
+
+ l = g_slist_find_custom(network_s->groups, GUINT_TO_POINTER(grp_addr),
+ (GCompareFunc)__compare_group_address);
+
+ if (l) {
+ BT_INFO("Mesh: Group [0x%2.2x]Already exist", grp_addr);
+ group_s = l->data;
+ *group = (bt_mesh_group_h) group_s;
+ FUNC_EXIT;
+ return error_code;
+ }
memset(&net, 0x00, sizeof(bluetooth_mesh_network_t));
memset(&req, 0x00, sizeof(bluetooth_mesh_network_group_info_t));
return error_code;
}
+ BT_INFO("Mesh: Group created [0x%2.2x]", grp_addr);
group_s = g_malloc0(sizeof(bt_mesh_group_s));
group_s->addr = grp_addr;
group_s->is_virtual = false;
group_s->parent = network_s;
- if (g_slist_append(network_s->groups, group_s))
- BT_INFO("Mesh: Group created");
+ network_s->groups = g_slist_append(network_s->groups, group_s);
group_list = g_slist_append(group_list, group_s);
+
*group = (bt_mesh_group_h) group_s;
FUNC_EXIT;
return error_code;