[PATCH 1/2] connection: Fix indentation.
--- src/connection.c |8 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/connection.c b/src/connection.c index 9ceefd3..3cd89eb 100644 --- a/src/connection.c +++ b/src/connection.c @@ -269,8 +269,8 @@ static void set_default_gateway(struct gateway_data *data, connman_inet_set_gateway_address(data-index, data-ipv4_gateway-vpn_ip); connman_inet_add_host_route(data-ipv4_gateway-vpn_phy_index, - data-ipv4_gateway-vpn_ip, - data-ipv4_gateway-vpn_phy_ip); + data-ipv4_gateway-vpn_ip, + data-ipv4_gateway-vpn_phy_ip); data-ipv4_gateway-active = TRUE; __connman_service_indicate_default(data-service); @@ -283,8 +283,8 @@ static void set_default_gateway(struct gateway_data *data, connman_inet_set_ipv6_gateway_address(data-index, data-ipv6_gateway-vpn_ip); connman_inet_add_host_route(data-ipv6_gateway-vpn_phy_index, - data-ipv6_gateway-vpn_ip, - data-ipv6_gateway-vpn_phy_ip); + data-ipv6_gateway-vpn_ip, + data-ipv6_gateway-vpn_phy_ip); data-ipv6_gateway-active = TRUE; __connman_service_indicate_default(data-service); -- 1.7.1 ___ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman
[PATCH 2/2] connection: Fix IPv6 host route setting when using VPN.
--- src/connection.c |3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/src/connection.c b/src/connection.c index 3cd89eb..5ea3c9b 100644 --- a/src/connection.c +++ b/src/connection.c @@ -282,7 +282,8 @@ static void set_default_gateway(struct gateway_data *data, data-ipv6_gateway-vpn == TRUE) { connman_inet_set_ipv6_gateway_address(data-index, data-ipv6_gateway-vpn_ip); - connman_inet_add_host_route(data-ipv6_gateway-vpn_phy_index, + connman_inet_add_ipv6_host_route( + data-ipv6_gateway-vpn_phy_index, data-ipv6_gateway-vpn_ip, data-ipv6_gateway-vpn_phy_ip); data-ipv6_gateway-active = TRUE; -- 1.7.1 ___ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman
Re: [PATCH 2/2] connection: Fix IPv6 host route setting when using VPN.
On Thu, 2011-08-18 at 10:07 +0300, Jukka Rissanen wrote: - connman_inet_add_host_route(data-ipv6_gateway-vpn_phy_index, + connman_inet_add_ipv6_host_route( + data-ipv6_gateway-vpn_phy_index, Good catch! Patrik ___ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman
Re: vpnc troubles
Hi, Thanks for taking time debugging vpnc and sending the crash logs. Maybe you could file a bug for those crashes, even if they are not reproducible so the information won't get lost? Unfortunately I'm slightly busy trying to figure out a bunch of bugs at the moment... On Tue, 2011-08-16 at 12:25 +0200, Johannes Schauer wrote: I also (kinda) figured out why vpnc quits after 60 seconds by enabling VPNC.Debug and commenting out G_SPAWN_STDERR_TO_DEV_NULL as described above. vpnc quits after the message: /usr/sbin/vpnc: no response from target I'd like to be more clear in my reports but as I said: it's all not reproducible even after I do a reboot stuff happens randomly. This sounds to me that routes are not correct. I'd check routes and ifconfig before, during and after attempting to connect with vpnc, especially when it fails. Cheers, Patrik ___ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman
[PATCH service move 1/6] service: Ignore ipconfig that is not active when moving service.
--- src/service.c | 49 + 1 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/service.c b/src/service.c index 7cd21b5..4cb90fb 100644 --- a/src/service.c +++ b/src/service.c @@ -2920,6 +2920,8 @@ static DBusMessage *move_service(DBusConnection *conn, struct connman_service *target; const char *path; GSequenceIter *src, *dst; + enum connman_ipconfig_method target4, target6; + enum connman_ipconfig_method service4, service6; DBG(service %p, service); @@ -2933,11 +2935,50 @@ static DBusMessage *move_service(DBusConnection *conn, if (target == NULL || target-favorite == FALSE || target == service) return __connman_error_invalid_service(msg); - DBG(target %s, target-identifier); + target4 = __connman_ipconfig_get_method(target-ipconfig_ipv4); + target6 = __connman_ipconfig_get_method(target-ipconfig_ipv6); + service4 = __connman_ipconfig_get_method(service-ipconfig_ipv4); + service6 = __connman_ipconfig_get_method(service-ipconfig_ipv6); - if (target-state_ipv4 != service-state_ipv4 - target-state_ipv6 != service-state_ipv6) - return __connman_error_invalid_service(msg); + DBG(target %s method %d/%d state %d/%d, target-identifier, + target4, target6, + target-state_ipv4, target-state_ipv6); + + DBG(service %s method %d/%d state %d/%d, service-identifier, + service4, service6, + service-state_ipv4, service-state_ipv6); + + /* +* If method is OFF, then we do not need to check the corresponding +* ipconfig state. +*/ + if (target4 == CONNMAN_IPCONFIG_METHOD_OFF) { + if (service6 != CONNMAN_IPCONFIG_METHOD_OFF) { + if (target-state_ipv6 != service-state_ipv6) + return __connman_error_invalid_service(msg); + } + } + + if (target6 == CONNMAN_IPCONFIG_METHOD_OFF) { + if (service4 != CONNMAN_IPCONFIG_METHOD_OFF) { + if (target-state_ipv4 != service-state_ipv4) + return __connman_error_invalid_service(msg); + } + } + + if (service4 == CONNMAN_IPCONFIG_METHOD_OFF) { + if (target6 != CONNMAN_IPCONFIG_METHOD_OFF) { + if (target-state_ipv6 != service-state_ipv6) + return __connman_error_invalid_service(msg); + } + } + + if (service6 == CONNMAN_IPCONFIG_METHOD_OFF) { + if (target4 != CONNMAN_IPCONFIG_METHOD_OFF) { + if (target-state_ipv4 != service-state_ipv4) + return __connman_error_invalid_service(msg); + } + } g_get_current_time(service-modified); __connman_storage_save_service(service); -- 1.7.1 ___ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman
[PATCH service move 2/6] service: Allow ready service to be moved before online one.
--- src/service.c | 28 1 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/service.c b/src/service.c index 4cb90fb..5f7242d 100644 --- a/src/service.c +++ b/src/service.c @@ -2912,6 +2912,22 @@ static DBusMessage *remove_service(DBusConnection *conn, return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } +static gboolean check_suitable_state(enum connman_service_state a, + enum connman_service_state b) +{ + /* +* Special check so that ready service can be moved before +* online one. +*/ + if ((a == CONNMAN_SERVICE_STATE_ONLINE + b == CONNMAN_SERVICE_STATE_READY) || + (b == CONNMAN_SERVICE_STATE_ONLINE + a == CONNMAN_SERVICE_STATE_READY)) + return TRUE; + + return a == b; +} + static DBusMessage *move_service(DBusConnection *conn, DBusMessage *msg, void *user_data, gboolean before) @@ -2954,28 +2970,32 @@ static DBusMessage *move_service(DBusConnection *conn, */ if (target4 == CONNMAN_IPCONFIG_METHOD_OFF) { if (service6 != CONNMAN_IPCONFIG_METHOD_OFF) { - if (target-state_ipv6 != service-state_ipv6) + if (check_suitable_state(target-state_ipv6, + service-state_ipv6) == FALSE) return __connman_error_invalid_service(msg); } } if (target6 == CONNMAN_IPCONFIG_METHOD_OFF) { if (service4 != CONNMAN_IPCONFIG_METHOD_OFF) { - if (target-state_ipv4 != service-state_ipv4) + if (check_suitable_state(target-state_ipv4, + service-state_ipv4) == FALSE) return __connman_error_invalid_service(msg); } } if (service4 == CONNMAN_IPCONFIG_METHOD_OFF) { if (target6 != CONNMAN_IPCONFIG_METHOD_OFF) { - if (target-state_ipv6 != service-state_ipv6) + if (check_suitable_state(target-state_ipv6, + service-state_ipv6) == FALSE) return __connman_error_invalid_service(msg); } } if (service6 == CONNMAN_IPCONFIG_METHOD_OFF) { if (target4 != CONNMAN_IPCONFIG_METHOD_OFF) { - if (target-state_ipv4 != service-state_ipv4) + if (check_suitable_state(target-state_ipv4, + service-state_ipv4) == FALSE) return __connman_error_invalid_service(msg); } } -- 1.7.1 ___ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman
[PATCH service move 3/6] service: Allow state downgrade from online to ready.
--- src/connman.h |1 + src/service.c | 19 +++ 2 files changed, 20 insertions(+), 0 deletions(-) diff --git a/src/connman.h b/src/connman.h index 6e68c99..3d9f459 100644 --- a/src/connman.h +++ b/src/connman.h @@ -559,6 +559,7 @@ void __connman_service_notify(struct connman_service *service, int __connman_service_counter_register(const char *counter); void __connman_service_counter_unregister(const char *counter); +void __connman_service_downgrade_state(struct connman_service *service); struct connman_session; struct service_entry; diff --git a/src/service.c b/src/service.c index 5f7242d..e92412e 100644 --- a/src/service.c +++ b/src/service.c @@ -5145,6 +5145,25 @@ __connman_service_create_from_provider(struct connman_provider *provider) return service; } +void __connman_service_downgrade_state(struct connman_service *service) +{ + if (service == NULL) + return; + + DBG(service %p state4 %d state6 %d, service, service-state_ipv4, + service-state_ipv6); + + if (service-state_ipv4 == CONNMAN_SERVICE_STATE_ONLINE) + __connman_service_ipconfig_indicate_state(service, + CONNMAN_SERVICE_STATE_READY, + CONNMAN_IPCONFIG_TYPE_IPV4); + + if (service-state_ipv6 == CONNMAN_SERVICE_STATE_ONLINE) + __connman_service_ipconfig_indicate_state(service, + CONNMAN_SERVICE_STATE_READY, + CONNMAN_IPCONFIG_TYPE_IPV6); +} + static int service_load(struct connman_service *service) { const char *ident = service-profile; -- 1.7.1 ___ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman
[PATCH service move 4/6] service: Prefer online state over ready when comparing services.
--- src/service.c | 16 ++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/service.c b/src/service.c index e92412e..1382705 100644 --- a/src/service.c +++ b/src/service.c @@ -3297,9 +3297,21 @@ static gint service_compare(gconstpointer a, gconstpointer b, state_b = service_b-state; if (state_a != state_b) { - if (is_connected(service_a) == TRUE) + gboolean a_connected = is_connected(service_a), + b_connected = is_connected(service_b); + + if (a_connected == TRUE b_connected == TRUE) { + /* We prefer online over ready state */ + if (state_a == CONNMAN_SERVICE_STATE_ONLINE) + return -1; + + if (state_b == CONNMAN_SERVICE_STATE_ONLINE) + return 1; + } + + if (a_connected == TRUE) return -1; - if (is_connected(service_b) == TRUE) + if (b_connected == TRUE) return 1; if (is_connecting(service_a) == TRUE) -- 1.7.1 ___ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman
[PATCH service move 6/6] connection: Default gateway is changed when reorganizing services.
Fixes BMC#22540 --- src/connection.c | 93 - 1 files changed, 91 insertions(+), 2 deletions(-) diff --git a/src/connection.c b/src/connection.c index 84e3ab4..ef39ff2 100644 --- a/src/connection.c +++ b/src/connection.c @@ -326,6 +326,70 @@ done: __connman_service_indicate_default(data-service); } +static void unset_default_gateway(struct gateway_data *data, + enum connman_ipconfig_type type) +{ + int index; + int status4 = 0, status6 = 0; + int do_ipv4 = FALSE, do_ipv6 = FALSE; + + if (type == CONNMAN_IPCONFIG_TYPE_IPV4) + do_ipv4 = TRUE; + else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) + do_ipv6 = TRUE; + else + do_ipv4 = do_ipv6 = TRUE; + + DBG(type %d gateway ipv4 %p ipv6 %p, type, data-ipv4_gateway, + data-ipv6_gateway); + + if (do_ipv4 == TRUE data-ipv4_gateway != NULL + data-ipv4_gateway-vpn == TRUE) { + connman_inet_del_host_route(data-index, + data-ipv4_gateway-vpn_ip); + connman_inet_clear_gateway_address(data-index, + data-ipv4_gateway-vpn_ip); + data-ipv4_gateway-active = FALSE; + + return; + } + + if (do_ipv6 == TRUE data-ipv6_gateway != NULL + data-ipv6_gateway-vpn == TRUE) { + connman_inet_del_ipv6_host_route(data-index, + data-ipv6_gateway-vpn_ip); + connman_inet_clear_ipv6_gateway_address(data-index, + data-ipv6_gateway-vpn_ip); + data-ipv6_gateway-active = FALSE; + + return; + } + + index = __connman_service_get_index(data-service); + + if (do_ipv4 == TRUE data-ipv4_gateway != NULL + g_strcmp0(data-ipv4_gateway-gateway, + 0.0.0.0) == 0) { + connman_inet_clear_gateway_interface(index); + return; + } + + if (do_ipv6 == TRUE data-ipv6_gateway != NULL + g_strcmp0(data-ipv6_gateway-gateway, + ::) == 0) { + connman_inet_clear_ipv6_gateway_interface(index); + return; + } + + if (do_ipv6 == TRUE data-ipv6_gateway != NULL) + status6 = connman_inet_clear_ipv6_gateway_address(index, + data-ipv6_gateway-gateway); + + if (do_ipv4 == TRUE data-ipv4_gateway != NULL) + status4 = connman_inet_clear_gateway_address(index, + data-ipv4_gateway-gateway); +} + static struct gateway_data *find_default_gateway(void) { struct gateway_data *found = NULL; @@ -684,14 +748,39 @@ gboolean __connman_connection_update_gateway(void) if (gateway_hash == NULL) return updated; + active_gateway = find_active_gateway(); + update_order(); - active_gateway = find_active_gateway(); default_gateway = find_default_gateway(); - if (active_gateway active_gateway != default_gateway) + if (active_gateway active_gateway != default_gateway) { updated = TRUE; + if (active_gateway) { + if (active_gateway-ipv4_gateway) + unset_default_gateway(active_gateway, + CONNMAN_IPCONFIG_TYPE_IPV4); + + if (active_gateway-ipv6_gateway) + unset_default_gateway(active_gateway, + CONNMAN_IPCONFIG_TYPE_IPV6); + + __connman_service_downgrade_state( + active_gateway-service); + } + + if (default_gateway) { + if (default_gateway-ipv4_gateway) + set_default_gateway(default_gateway, + CONNMAN_IPCONFIG_TYPE_IPV4); + + if (default_gateway-ipv6_gateway) + set_default_gateway(default_gateway, + CONNMAN_IPCONFIG_TYPE_IPV6); + } + } + return updated; } -- 1.7.1 ___ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman