diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2010-06-08 21:43:58 +0200 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-06-08 21:43:58 +0200 |
commit | 1c182788c3e895462fa6e58c85a3704c69fdc8d2 (patch) | |
tree | 847dcb24ff937450934b58ea2dbf1ed0cefab1fa /src/connection.c | |
parent | 0394ef444535bb2c5551dfb33dfb6673ef7dd740 (diff) | |
download | connman-1c182788c3e895462fa6e58c85a3704c69fdc8d2.tar.gz connman-1c182788c3e895462fa6e58c85a3704c69fdc8d2.tar.bz2 connman-1c182788c3e895462fa6e58c85a3704c69fdc8d2.zip |
Set default gateway when route deletion fails
When del_routes fails, no gateway deletion event is sent and thus the
connection layer doesn't set a proper default gateway.
Diffstat (limited to 'src/connection.c')
-rw-r--r-- | src/connection.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/connection.c b/src/connection.c index 9320fbd2..fd029c90 100644 --- a/src/connection.c +++ b/src/connection.c @@ -191,18 +191,22 @@ static struct gateway_data *find_default_gateway(void) return found; } -static void remove_gateway(struct gateway_data *data) +static int remove_gateway(struct gateway_data *data) { + int ret; + DBG("gateway %s", data->gateway); gateway_list = g_slist_remove(gateway_list, data); if (data->active == TRUE) - del_routes(data); + ret = del_routes(data); g_free(data->gateway); g_free(data->vpn_ip); g_free(data); + + return ret; } static void connection_delgateway(int index, const char *gateway) @@ -313,6 +317,7 @@ static void connection_remove(struct connman_element *element) const char *gateway = NULL; struct gateway_data *data = NULL; gboolean set_default = FALSE; + int ret; DBG("element %p name %s", element, element->name); @@ -339,13 +344,14 @@ static void connection_remove(struct connman_element *element) if (data->vpn == TRUE && data->vpn_phy_index >= 0) connman_inet_del_host_route(data->vpn_phy_index, data->gateway); - remove_gateway(data); + ret = remove_gateway(data); /* with vpn this will be called after the network was deleted, * we need to call set_default here because we will not recieve any * gateway delete notification. + * We hit the same issue if remove_gateway() fails. */ - if (set_default) { + if (set_default || ret) { data = find_default_gateway(); if (data != NULL) set_default_gateway(data); |