Hi Mohamed,

> Add initial vpn support.

I said that I gonna merge it as is, but I have some extra comments on
the patch that I prefer to get fixed before the merge.

It is nothing major actually, mainly some coding style stuff that would
be pointless to fix up after merging the patch.

> +enum connman_provider_error {
> +     CONNMAN_PROVIDER_ERROR_UNKNOWN        = 0,
> +     CONNMAN_PROVIDER_ERROR_CONNECT_FAILED = 1,
> +     CONNMAN_PROVIDER_ERROR_NO_CONNECTION  = 2,
> +};

We are not using the NO_CONNECTION error right no. So leave it out until
it is actually needed.

> +
> +
> +struct connman_provider;
> +
> +struct connman_provider *connman_provider_ref(struct connman_provider 
> *provider);
> +void connman_provider_unref(struct connman_provider *provider);
> +
> +int connman_provider_set_string(struct connman_provider *provider,
> +                             const char *key, const char *value);
> +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);
> +
> +void connman_provider_set_index(struct connman_provider *provider, int 
> index);
> +int connman_provider_get_index(struct connman_provider *provider);
> +
> +void connman_provider_set_data(struct connman_provider *provider, void 
> *data);
> +void *connman_provider_get_data(struct connman_provider *provider);
> +
> +void connman_provider_set_gateway(struct connman_provider *provider,
> +                               const char *gateway);
> +void connman_provider_set_address(struct connman_provider *provider,
> +                               const char *address);
> +void connman_provider_set_netmask(struct connman_provider *provider,
> +                               const char *netmask);
> +void connman_provider_set_dns(struct connman_provider *provider,
> +                           const char *dns);
> +void connman_provider_set_domain(struct connman_provider *provider,
> +                              const char *domain);
> +
> +


> +static gboolean provider_exit = FALSE;

Explain to me why this is needed. Seems like a race condition somewhere
and an ugly hack around it?

> +struct connman_provider {
> +     struct connman_element element;
> +     char *identifier;
> +     char *path;
> +     enum connman_provider_state state;
> +     enum connman_provider_error error;
> +     GTimeVal modified;

Leave the modified field out of this. Since we are not sorting the
provider list, we don't need this detail.

> +     char *name;
> +     char *type;
> +     char *dns;
> +     char *domain;
> +     DBusMessage *pending;
> +     guint timeout;
> +     struct connman_provider_driver *driver;
> +     void *driver_data;
> +};
> +
> +static struct connman_provider *connman_provider_create(const char *name);
> +static int connman_provider_disconnect(struct connman_provider *provider);

I do dislike forward declarations. Why are they needed?
> +
> +static const char *state2string(enum connman_provider_state state)
> +{
> +     switch (state) {
> +     case CONNMAN_PROVIDER_STATE_UNKNOWN:
> +             break;
> +     case CONNMAN_PROVIDER_STATE_IDLE:
> +             return "idle";
> +     case CONNMAN_PROVIDER_STATE_CONNECT:
> +             return "connecting";

Please call this one "connect".

> +void __connman_provider_list(DBusMessageIter *iter)
> +{
> +     g_hash_table_foreach(provider_hash, append_path, iter);
> +}
> +
> +

Please stop these double empty lines. We don't do that.

> +static void connman_provider_setup_vpn_ipv4(struct connman_provider 
> *provider,
> +                                         struct connman_element *element)
> +{
> +
> +     if ((element == NULL) || (provider == NULL))
> +             return;

The extra ( ) is pointless. Just do if (element == NULL && ...).

> +void connman_provider_unref(struct connman_provider *provider)
> +{
> +     connman_element_unref(&provider->element);
> +}
> +
> +

And again double empty lines.

> +             if ((driver->probe != NULL) && (driver->probe(provider) == 0)) {
> +                     provider->driver = driver;
> +                     break;

Here we have the pointless ( ) again. Really? What are you trying to
protect here. The C arithmetic is pretty clear and this is not needed.

> +     dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
> +                             DBUS_TYPE_STRING_AS_STRING, &value);
> +     dbus_message_iter_append_basic(&value, DBUS_TYPE_STRING, &str);
> +     dbus_message_iter_close_container(&entry, &value);
> +
> +     g_dbus_send_message(connection, signal);
> +}
> +
> +

Again?

> +int __connman_provider_indicate_state(struct connman_provider *provider,
> +                                   enum connman_provider_state state)
> +{
> +
> +     DBG("provider %p state %d", provider, state);

And what is this extra empty line before DBG for? Remove it.

> +
> +     if (provider_exit)
> +             return -EINVAL;
> +
> +     if (provider == NULL)
> +             return -EINVAL;
> +
> +     if (provider->state == state)
> +             return -EALREADY;
> +
> +     if (provider->state == CONNMAN_PROVIDER_STATE_FAILURE &&
> +                             state == CONNMAN_PROVIDER_STATE_IDLE)
> +             return -EINVAL;
> +
> +     if (provider->state == CONNMAN_PROVIDER_STATE_IDLE &&
> +                             state == CONNMAN_PROVIDER_STATE_DISCONNECT)
> +             return -EINVAL;
> +
> +     if (state == CONNMAN_PROVIDER_STATE_IDLE &&
> +         provider->state != CONNMAN_PROVIDER_STATE_DISCONNECT) {
> +             provider->state = CONNMAN_PROVIDER_STATE_DISCONNECT;
> +             state_changed(provider);
> +
> +             connman_provider_disconnect(provider);
> +     }

Please turn this into a switch statement. All the ifs make it
unreadable.


> +
> +     provider->state = state;
> +     state_changed(provider);
> +
> +     if (state == CONNMAN_PROVIDER_STATE_READY) {
> +             reply_pending(provider, 0);
> +             g_get_current_time(&provider->modified);
> +
> +     }

You have an extra empty line here before } for no reason. Remove that.

> +     return __connman_provider_indicate_state(provider,
> +                                     CONNMAN_PROVIDER_STATE_FAILURE);
> +}
> +
> +

And again. Seriously, I don't even see a pattern here.

> +static gboolean connect_timeout(gpointer user_data)
> +{
> +     struct connman_provider *provider = user_data;
> +
> +     DBG("provider %p", provider);
> +
> +     provider->timeout = 0;
> +
> +

And what are these two for?

> +     if (provider->pending != NULL) {
> +             DBusMessage *reply;
> +
> +             reply = __connman_error_operation_timeout(provider->pending);
> +             if (reply != NULL)
> +                     g_dbus_send_message(connection, reply);
> +
> +             dbus_message_unref(provider->pending);
> +             provider->pending = NULL;
> +     }
> +
> +     __connman_provider_indicate_error(provider,
> +                             CONNMAN_PROVIDER_ERROR_CONNECT_FAILED);
> +
> +     return FALSE;
> +}
> +
> +

And some more.

> +     if ((provider->driver != NULL) && (provider->driver->connect != NULL))
> +             err = provider->driver->connect(provider);

The extra ( ) have to go away.

> +     else
> +             return -EOPNOTSUPP;
> +
> +     if (err < 0) {
> +             if (err != -EINPROGRESS)
> +                     return err;
> +
> +             provider->timeout = g_timeout_add_seconds(60,
> +                                     connect_timeout, provider);
> +
> +             __connman_provider_indicate_state(provider,
> +                                     CONNMAN_PROVIDER_STATE_CONNECT);
> +
> +

And some more extra empty lines on sale ;)

> +             return -EINPROGRESS;
> +     }
> +
> +     return 0;
> +}
> +
> +

Some more.

> +static int connman_provider_disconnect(struct connman_provider *provider)
> +{
> +     int err;
> +
> +     DBG("provider %p", provider);
> +
> +     reply_pending(provider, ECONNABORTED);
> +
> +     if ((provider->driver != NULL) &&
> +         (provider->driver->disconnect != NULL))
> +             err = provider->driver->disconnect(provider);

The extra ( ) have to go.

> +     g_hash_table_remove(provider_hash, path);
> +     return 0;
> +}
> +
> +

And again.

> +     if (path != NULL) {
> +             g_dbus_unregister_interface(connection, path,
> +                                             CONNMAN_PROVIDER_INTERFACE);
> +             g_free(path);
> +     }
> +
> +

Found some more.

> +     if (provider_exit)
> +             if ((provider->driver != NULL) && (provider->driver->remove))
> +                             provider->driver->remove(provider);

Extra ( ).

> +
> +     connman_element_unregister(&provider->element);
> +     connman_provider_unref(provider);
> +}
> +
> +

More empty lines.

> +     provider->identifier = NULL;
> +     provider->path = NULL;
> +
> +     provider->pending = NULL;
> +

Useless empty line.

> +}
> +
> +

And again.

> +     g_dbus_register_interface(connection, provider->path,
> +                               CONNMAN_PROVIDER_INTERFACE,
> +                               provider_methods, provider_signals,
> +                               NULL, provider, NULL);
> +
> +     return 0;
> +}
> +
> +

I am getting tried of this now.

> +failed:
> +     if (provider != NULL && created == TRUE) {
> +             DBG("can not connect delete provider");
> +             connman_provider_unref(provider);
> +     }
> +
> +     return err;
> +}
> +
> +

It never ends, does it?

> +void connman_provider_set_data(struct connman_provider *provider, void *data)
> +{
> +     provider->driver_data = data;
> +}
> +
> +

And I did think it was over ...

> +void connman_provider_driver_unregister(struct connman_provider_driver 
> *driver)
> +{
> +     DBG("driver %p name %s", driver, driver->name);
> +
> +     driver_list = g_slist_remove(driver_list, driver);
> +
> +}

What is that empty line for. Remove it.

Regards

Marcel


_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to