bool __connman_connection_update_gateway(void) { struct gateway_data *default_gateway; bool updated = false; GHashTableIter iter; gpointer value, key; if (!gateway_hash) return updated; update_order(); default_gateway = find_default_gateway(); __connman_service_update_ordering(); DBG("default %p", default_gateway); /* * There can be multiple active gateways so we need to * check them all. */ g_hash_table_iter_init(&iter, gateway_hash); while (g_hash_table_iter_next(&iter, &key, &value)) { struct gateway_data *active_gateway = value; if (active_gateway == default_gateway) continue; if (active_gateway->ipv4_gateway && active_gateway->ipv4_gateway->active) { unset_default_gateway(active_gateway, CONNMAN_IPCONFIG_TYPE_IPV4); updated = true; } if (active_gateway->ipv6_gateway && active_gateway->ipv6_gateway->active) { unset_default_gateway(active_gateway, CONNMAN_IPCONFIG_TYPE_IPV6); updated = true; } } if (updated && 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; }
static bool choose_default_gateway(struct gateway_data *data, struct gateway_data *candidate) { bool downgraded = false; /* * If the current default is not active, then we mark * this one as default. If the other one is already active * we mark this one as non default. */ if (data->ipv4_gateway) { if (candidate->ipv4_gateway && !candidate->ipv4_gateway->active) { DBG("ipv4 downgrading %p", candidate); unset_default_gateway(candidate, CONNMAN_IPCONFIG_TYPE_IPV4); } if (candidate->ipv4_gateway && candidate->ipv4_gateway->active && candidate->order > data->order) { DBG("ipv4 downgrading this %p", data); unset_default_gateway(data, CONNMAN_IPCONFIG_TYPE_IPV4); downgraded = true; } } if (data->ipv6_gateway) { if (candidate->ipv6_gateway && !candidate->ipv6_gateway->active) { DBG("ipv6 downgrading %p", candidate); unset_default_gateway(candidate, CONNMAN_IPCONFIG_TYPE_IPV6); } if (candidate->ipv6_gateway && candidate->ipv6_gateway->active && candidate->order > data->order) { DBG("ipv6 downgrading this %p", data); unset_default_gateway(data, CONNMAN_IPCONFIG_TYPE_IPV6); downgraded = true; } } return downgraded; }
static gboolean choose_default_gateway(struct gateway_data *data, struct gateway_data *candidate) { gboolean downgraded = FALSE; /* * If the current default is not active, then we mark * this one as default. If the other one is already active * we mark this one as non default. */ if (data->ipv4_gateway != NULL) { if (candidate->ipv4_gateway != NULL && candidate->ipv4_gateway->active == FALSE) { DBG("ipv4 downgrading %p", candidate); unset_default_gateway(candidate, CONNMAN_IPCONFIG_TYPE_IPV4); } if (candidate->ipv4_gateway != NULL && candidate->ipv4_gateway->active == TRUE && candidate->order > data->order) { DBG("ipv4 downgrading this %p", data); unset_default_gateway(data, CONNMAN_IPCONFIG_TYPE_IPV4); downgraded = TRUE; } } if (data->ipv6_gateway != NULL) { if (candidate->ipv6_gateway != NULL && candidate->ipv6_gateway->active == FALSE) { DBG("ipv6 downgrading %p", candidate); unset_default_gateway(candidate, CONNMAN_IPCONFIG_TYPE_IPV6); } if (candidate->ipv6_gateway != NULL && candidate->ipv6_gateway->active == TRUE && candidate->order > data->order) { DBG("ipv6 downgrading this %p", data); unset_default_gateway(data, CONNMAN_IPCONFIG_TYPE_IPV6); downgraded = TRUE; } } return downgraded; }