near_bool_t polling;
GList *target_list;
+ struct near_target *active_target;
};
static void free_adapter(gpointer data)
if (adapter == NULL)
return -ENODEV;
+ if (adapter->active_target == target) {
+ __near_netlink_deactivate_target(idx, target_idx);
+ adapter->active_target = NULL;
+ }
+
adapter->target_list = g_list_remove(adapter->target_list, target);
return 0;
}
-int near_adapter_connect(uint32_t idx)
+static struct near_target *find_target(struct near_adapter *adapter,
+ uint32_t target_idx)
+{
+ GList *list;
+
+ for (list = adapter->target_list; list; list = list->next) {
+ struct near_target *target = list->data;
+ uint32_t idx;
+
+ idx = __near_target_get_idx(target);
+ if (idx == target_idx)
+ return target;
+
+ }
+
+ return NULL;
+}
+
+int near_adapter_connect(uint32_t idx, uint32_t target_idx)
{
struct near_adapter *adapter;
struct near_target *target;
- GList *list;
- uint32_t target_idx, protocols;
+ uint32_t protocols;
+ int err;
DBG("idx %d", idx);
if (adapter == NULL)
return -ENODEV;
- list = g_list_first(adapter->target_list);
- if (list == NULL)
- return -ENOLINK;
+ if (adapter->active_target != NULL)
+ return -EALREADY;
- target = list->data;
+ target = find_target(adapter, target_idx);
+ if (target == NULL)
+ return -ENOLINK;
- target_idx = __near_target_get_idx(target);
protocols = __near_target_get_protocols(target);
- return __near_netlink_activate_target(idx, target_idx, protocols);
+ err = __near_netlink_activate_target(idx, target_idx, protocols);
+ if (err == 0)
+ adapter->active_target = target;
+
+ return err;
}
-int near_adapter_disconnect(uint32_t idx)
+int near_adapter_disconnect(uint32_t idx, uint32_t target_idx)
{
struct near_adapter *adapter;
struct near_target *target;
- GList *list;
- uint32_t target_idx;
+ int err;
DBG("idx %d", idx);
if (adapter == NULL)
return -ENODEV;
- list = g_list_first(adapter->target_list);
- if (list == NULL)
+ target = find_target(adapter, target_idx);
+ if (target == NULL || adapter->active_target == NULL)
return -ENOLINK;
- target = list->data;
-
- target_idx = __near_target_get_idx(target);
+ err = __near_netlink_deactivate_target(idx, target_idx);
+ if (err == 0)
+ adapter->active_target = NULL;
- return __near_netlink_deactivate_target(idx, target_idx);
+ return err;
}
int __near_adapter_init(void)