THREAD_VALIDATE_INPUT_PARAMETER(callback);
THREAD_VALIDATE_INPUT_PARAMETER(instance);
+ GVariantIter iter;
uint8_t *prefix_address = NULL;
uint8_t prefix_len = 0;
uint16_t rloc16 = 0;
thread_instance_s *current_instance = instance;
THREAD_DBG("Process callback for get external route");
+ g_variant_iter_init(&iter, val);
- g_variant_get(val, "((ayy)qybb)",
+ while (g_variant_iter_next(&iter, "((ayy)qybb)",
&prefix_address, &prefix_len, &rloc16, &preference,
- &stable, &next_hop_is_self);
-
- thread_route_info_s *route_info = _create_new_route();
-
- THREAD_DBG("Got the external route...");
-
- THREAD_DBG("prefix_address: %02x%02x:%02x%02x:%02x%02x:%02x%02x",
- prefix_address[0], prefix_address[1], prefix_address[2],
- prefix_address[3], prefix_address[4], prefix_address[5],
- prefix_address[6], prefix_address[7]);
-
- THREAD_DBG("prefix_len: %u", prefix_len);
- THREAD_DBG("rloc16: %u", rloc16);
- THREAD_DBG("preference: %u", preference);
- THREAD_DBG("stable: %s", stable ? "TRUE" : "FALSE");
- THREAD_DBG("next_hop_is_self: %s", next_hop_is_self ?
- "TRUE" : "FALSE");
- memcpy((route_info->prefix).ipv6.fields.m8, prefix_address,
- THREAD_IPV6_PREFIX_SIZE*sizeof(uint8_t));
- (route_info->prefix).length = prefix_len;
- route_info->preference = preference;
- route_info->is_stable = stable;
- route_info->rloc16 = rloc16;
- route_info->is_nexthop_this_device = next_hop_is_self;
- current_instance->route_list = g_slist_append(
- current_instance->route_list,
- route_info);
-
- if (callback)
- (callback)(++count, (thread_route_info_h)route_info,
- user_data);
+ &stable, &next_hop_is_self)) {
+
+ thread_route_info_s *route_info = _create_new_route();
+
+ THREAD_DBG("Got the external route...");
+
+ THREAD_DBG("prefix_address: %02x%02x:%02x%02x:%02x%02x:%02x%02x",
+ prefix_address[0], prefix_address[1], prefix_address[2],
+ prefix_address[3], prefix_address[4], prefix_address[5],
+ prefix_address[6], prefix_address[7]);
+
+ THREAD_DBG("prefix_len: %u", prefix_len);
+ THREAD_DBG("rloc16: %u", rloc16);
+ THREAD_DBG("preference: %u", preference);
+ THREAD_DBG("stable: %s", stable ? "TRUE" : "FALSE");
+ THREAD_DBG("next_hop_is_self: %s", next_hop_is_self ?
+ "TRUE" : "FALSE");
+ memcpy((route_info->prefix).ipv6.fields.m8, prefix_address,
+ THREAD_IPV6_PREFIX_SIZE*sizeof(uint8_t));
+ (route_info->prefix).length = prefix_len;
+ route_info->preference = preference;
+ route_info->is_stable = stable;
+ route_info->rloc16 = rloc16;
+ route_info->is_nexthop_this_device = next_hop_is_self;
+ current_instance->route_list = g_slist_append(
+ current_instance->route_list,
+ route_info);
+ if (callback)
+ (callback)(++count, (thread_route_info_h)route_info,
+ user_data);
+ }
THREAD_DBG("Exiting __thread_br_get_external_route_cb ...");
FUNC_EXIT;
bool stable = TRUE;
bool nextHopIsSelf = TRUE;
+ GVariantBuilder *externalRoutesBuilder =
+ g_variant_builder_new(G_VARIANT_TYPE("a((ayy)qybb)"));
+
GVariantBuilder *prefixBuilder =
g_variant_builder_new(G_VARIANT_TYPE("ay"));
__make_ipv6_prefix(prefixAddress);
for (int i = 0; i < THREAD_IPV6_PREFIX_SIZE; ++i)
g_variant_builder_add(prefixBuilder, "y", prefixAddress[i]);
- GVariant *externalRoutesResult = g_variant_new("((ayy)qybb)",
+ g_variant_builder_add(externalRoutesBuilder, "((ayy)qybb)",
prefixBuilder, prefixLen, rloc16, preference, stable, nextHopIsSelf);
+ GVariant *externalRoutesResult = g_variant_new("a((ayy)qybb)", externalRoutesBuilder);
+
g_variant_builder_unref(prefixBuilder);
+ g_variant_builder_unref(externalRoutesBuilder);
return externalRoutesResult;
}