Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}