}
}
-
/**
* Propagates the results when MLP problem was solved
*
if (GNUNET_NO == address->active)
{
/* Address was not used before, enabling address */
- LOG (GNUNET_ERROR_TYPE_DEBUG, "%s %.2f : enabling address\n", (1 == mlp_use) ? "[x]": "[ ]", mlp_bw_out);
- address->active = GNUNET_YES;
- address->assigned_bw_in.value__ = htonl (mlp_bw_in);
- mlpi->b_in.value__ = htonl(mlp_bw_in);
- address->assigned_bw_out.value__ = htonl (mlp_bw_out);
- mlpi->b_out.value__ = htonl(mlp_bw_out);
- mlp->bw_changed_cb (mlp->bw_changed_cb_cls, address);
+ LOG (GNUNET_ERROR_TYPE_DEBUG, "%s %.2f : enabling address\n",
+ (1 == mlp_use) ? "[x]": "[ ]", mlp_bw_out);
+ address->active = GNUNET_YES;
+ address->assigned_bw_in.value__ = htonl (mlp_bw_in);
+ mlpi->b_in.value__ = htonl(mlp_bw_in);
+ address->assigned_bw_out.value__ = htonl (mlp_bw_out);
+ mlpi->b_out.value__ = htonl(mlp_bw_out);
+ if ((NULL == mlp->exclude_peer) || (0 != memcmp (&address->peer, mlp->exclude_peer, sizeof (address->peer))))
+ mlp->bw_changed_cb (mlp->bw_changed_cb_cls, address);
+ return GNUNET_OK;
}
else if (GNUNET_YES == address->active)
{
mlpi->b_in.value__ = htonl(mlp_bw_in);
address->assigned_bw_out.value__ = htonl (mlp_bw_out);
mlpi->b_out.value__ = htonl(mlp_bw_out);
- mlp->bw_changed_cb (mlp->bw_changed_cb_cls, address);
+ if ((NULL == mlp->exclude_peer) || (0 != memcmp (&address->peer, mlp->exclude_peer, sizeof (address->peer))))
+ mlp->bw_changed_cb (mlp->bw_changed_cb_cls, address);
+ return GNUNET_OK;
}
}
else
- GNUNET_break (0);
+ GNUNET_break (0);
}
else if (GLP_NO == mlp_use)
{
/* Address was not used before, nothing to do */
LOG (GNUNET_ERROR_TYPE_DEBUG, "%s %.2f : no change\n",
(1 == mlp_use) ? "[x]": "[ ]", mlp_bw_out);
+ return GNUNET_OK;
}
else if (GNUNET_YES == address->active)
{
address->assigned_bw_out = BANDWIDTH_ZERO;
mlpi->b_out.value__ = htonl(mlp_bw_out);
//mlp->bw_changed_cb (mlp->bw_changed_cb_cls, address);
+ return GNUNET_OK;
}
else
GNUNET_break (0);
return GNUNET_OK;
}
-
-
/**
* Solves the MLP problem
*
/* Propagate result*/
if ((GNUNET_OK == res_lp) && (GNUNET_OK == res_mip))
+ {
GNUNET_CONTAINER_multihashmap_iterate (mlp->addresses, &mlp_propagate_results, mlp);
+ }
struct GNUNET_TIME_Absolute time = GNUNET_TIME_absolute_get();
if (GNUNET_YES == mlp->write_mip_mps)
struct ATS_Peer *p;
struct GAS_MLP_Handle *mlp = solver;
struct MLP_information *mlpi;
+ int was_active;
GNUNET_assert (NULL != solver);
GNUNET_assert (NULL != address);
GNUNET_free (mlpi);
address->solver_information = NULL;
}
+ was_active = address->active;
address->active = GNUNET_NO;
+ address->assigned_bw_in = BANDWIDTH_ZERO;
+ address->assigned_bw_out = BANDWIDTH_ZERO;
/* Is this peer included in the problem? */
if (NULL == (p = GNUNET_CONTAINER_multihashmap_get (mlp->requested_peers, &address->peer.hashPubKey)))
{
GAS_mlp_solve_problem (solver);
}
+ if (GNUNET_YES == was_active)
+ {
+ if (NULL == GAS_mlp_get_preferred_address (solver, &address->peer))
+ {
+ /* No alternative address, disconnecting peer */
+ mlp->bw_changed_cb (mlp->bw_changed_cb_cls, address);
+ }
+ }
+
return;
}
if ((GNUNET_YES == mlp->mlp_auto_solve)&&
(GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(mlp->addresses,
&peer->hashPubKey)))
+ {
+ mlp->exclude_peer = peer;
GAS_mlp_solve_problem (mlp);
+ mlp->exclude_peer = NULL;
+ }
}
/* Get prefered address */
res = NULL;