summaryrefslogtreecommitdiff
path: root/src/connection.c
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2010-06-08 21:43:58 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2010-06-08 21:43:58 +0200
commit1c182788c3e895462fa6e58c85a3704c69fdc8d2 (patch)
tree847dcb24ff937450934b58ea2dbf1ed0cefab1fa /src/connection.c
parent0394ef444535bb2c5551dfb33dfb6673ef7dd740 (diff)
downloadconnman-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.c14
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);