const char *connman_provider_get_string(struct connman_provider *provider,
const char *key);
-int connman_provider_set_connected(struct connman_provider *provider,
- connman_bool_t connected);
+int connman_provider_set_state(struct connman_provider *provider,
+ enum connman_provider_state state);
void connman_provider_set_index(struct connman_provider *provider, int index);
int connman_provider_get_index(struct connman_provider *provider);
#include "inet.h"
+enum oc_state {
+ OC_STATE_UNKNOWN = 0,
+ OC_STATE_IDLE = 1,
+ OC_STATE_CONNECT = 2,
+ OC_STATE_READY = 3,
+ OC_STATE_DISCONNECT = 4,
+ OC_STATE_FAILURE = 5,
+};
+
struct oc_data {
char *if_name;
unsigned flags;
unsigned int watch;
+ unsigned int state;
struct connman_task *task;
};
{
struct connman_provider *provider = user_data;
struct oc_data *data = connman_provider_get_data(provider);
+ int state = data->state;
DBG("provider %p data %p", provider, data);
g_free(data);
oc_exit:
- connman_provider_set_connected(provider, FALSE);
+ if (state != OC_STATE_READY && state != OC_STATE_DISCONNECT)
+ connman_provider_set_state(provider,
+ CONNMAN_PROVIDER_STATE_FAILURE);
+ else
+ connman_provider_set_state(provider,
+ CONNMAN_PROVIDER_STATE_IDLE);
+
connman_provider_set_index(provider, -1);
connman_provider_unref(provider);
connman_task_destroy(task);
struct oc_data *data = connman_provider_get_data(provider);
if ((data->flags & IFF_UP) != (flags & IFF_UP)) {
- if (flags & IFF_UP)
- connman_provider_set_connected(provider, TRUE);
+ if (flags & IFF_UP) {
+ data->state = OC_STATE_READY;
+ connman_provider_set_state(provider,
+ CONNMAN_PROVIDER_STATE_READY);
+ }
}
data->flags = flags;
}
}
if (strcmp(reason, "connect")) {
- connman_provider_set_connected(provider, FALSE);
+ connman_provider_set_state(provider,
+ CONNMAN_PROVIDER_STATE_DISCONNECT);
return;
}
data->watch = 0;
data->flags = 0;
data->task = NULL;
+ data->state = OC_STATE_IDLE;
connman_provider_set_data(provider, data);
}
connman_provider_ref(provider);
+
+ data->state = OC_STATE_CONNECT;
+
return -EINPROGRESS;
exist_err:
connman_rtnl_remove_watch(data->watch);
data->watch = 0;
+ data->state = OC_STATE_DISCONNECT;
connman_task_stop(data->task);
connman_provider_unref(provider);
return 0;
}
-int connman_provider_set_connected(struct connman_provider *provider,
- connman_bool_t connected)
+static int set_connected(struct connman_provider *provider,
+ connman_bool_t connected)
{
if (connected == TRUE) {
enum connman_element_type type = CONNMAN_ELEMENT_TYPE_UNKNOWN;
return 0;
}
+int connman_provider_set_state(struct connman_provider *provider,
+ enum connman_provider_state state)
+{
+ if (provider == NULL || provider->vpn_service == NULL)
+ return -EINVAL;
+
+ switch (state) {
+ case CONNMAN_PROVIDER_STATE_UNKNOWN:
+ return -EINVAL;
+ case CONNMAN_PROVIDER_STATE_IDLE:
+ return set_connected(provider, FALSE);
+ case CONNMAN_PROVIDER_STATE_CONNECT:
+ return __connman_service_indicate_state(provider->vpn_service,
+ CONNMAN_SERVICE_STATE_ASSOCIATION);
+ case CONNMAN_PROVIDER_STATE_READY:
+ return set_connected(provider, TRUE);
+ case CONNMAN_PROVIDER_STATE_DISCONNECT:
+ return __connman_service_indicate_state(provider->vpn_service,
+ CONNMAN_SERVICE_STATE_DISCONNECT);
+ case CONNMAN_PROVIDER_STATE_FAILURE:
+ return __connman_service_indicate_state(provider->vpn_service,
+ CONNMAN_SERVICE_STATE_FAILURE);
+ }
+
+ return -EINVAL;
+}
+
static void provider_free(gpointer user_data)
{
struct connman_provider *provider = user_data;