* 2.- enqueue the request
* 3.- wait in the reply object for a reply
* 4.- return the final values and free the request
- *
*/
int frescan_bwres_negotiate(frescan_network_t net,
const frescan_contract_t *contract,
- frescan_ss_t *id,
+ frescan_ss_t *ss,
bool *accepted)
{
int ret;
if (ret != 0) return ret;
switch (req_data->return_value) {
- case FRESCAN_REQ_ACCEPTED:
- DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n");
- *accepted = true;
- *id = req_data->ss;
- server_params.prio = req_data->final_values.server_prio;
- ret = frescan_servers_update(net, &server_params, *id);
- if (ret != 0) return ret;
- break;
-
- case FRESCAN_REQ_NOT_ACCEPTED:
- DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
- *accepted = false;
- ret = frescan_servers_destroy(net, req_data->ss);
- if (ret != 0) return ret;
- break;
-
- default:
- ERROR("return_value unknown\n");
- return -1;
+ case FRESCAN_REQ_ACCEPTED:
+ DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n");
+ *accepted = true;
+ *ss = req_data->ss;
+ server_params.prio = req_data->final_values.server_prio;
+ ret = frescan_servers_update(net, &server_params, *ss);
+ if (ret != 0) return ret;
+ break;
+
+ case FRESCAN_REQ_NOT_ACCEPTED:
+ DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
+ *accepted = false;
+ ret = frescan_servers_destroy(net, req_data->ss);
+ if (ret != 0) return ret;
+ break;
+
+ default:
+ ERROR("return_value unknown\n");
+ return -1;
}
frescan_requests_free(req);
return 0;
}
+
+/**
+ * frescan_bwres_renegotiate()
+ */
+
+int frescan_bwres_renegotiate(frescan_network_t net,
+ const frescan_contract_t *contract,
+ frescan_ss_t ss,
+ bool *accepted)
+{
+ int ret;
+ frescan_request_id_t req;
+ frescan_request_data_t *req_data;
+ frescan_server_params_t server_params;
+
+ DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing renegotiation request\n");
+
+ ret = frescan_requests_alloc(&req);
+ if (ret != 0) return ret;
+
+ ret = frescan_requests_get_data(req, &req_data);
+ if (ret != 0) return ret;
+
+ req_data->type = FRESCAN_REQ_RENEG;
+ req_data->req = req;
+ req_data->contract = (frescan_contract_t *)contract;
+ req_data->request_node = the_networks[net].local_node;
+ req_data->net = net;
+ req_data->ss = ss;
+
+ ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
+ if (ret != 0) return ret;
+
+ DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue renegotiation request\n");
+
+ ret = frescan_requests_enqueue(req);
+ if (ret != 0) return ret;
+
+ DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a reply\n");
+
+ ret = frescan_bwres_robjs_wait(req_data->robj);
+ if (ret != 0) return ret;
+
+ ret = frescan_bwres_robjs_free(req_data->robj);
+ if (ret != 0) return ret;
+
+ switch (req_data->return_value) {
+ case FRESCAN_REQ_ACCEPTED:
+ DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "renegotiation OK\n");
+ *accepted = true;
+ server_params.values.budget = contract->min_values.budget;
+ server_params.values.period = contract->min_values.period;
+ server_params.prio = req_data->final_values.server_prio;
+ ret = frescan_servers_update(net, &server_params, ss);
+ if (ret != 0) return ret;
+ break;
+
+ case FRESCAN_REQ_NOT_ACCEPTED:
+ DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
+ *accepted = false;
+ if (ret != 0) return ret;
+ break;
+
+ default:
+ ERROR("return_value unknown\n");
+ return -1;
+ }
+
+ frescan_requests_free(req);
+ return 0;
+}
+
+/**
+ * frescan_bwres_cancel()
+ */
+
+int frescan_bwres_cancel(frescan_network_t net,
+ frescan_ss_t ss)
+{
+ int ret;
+ frescan_request_id_t req;
+ frescan_request_data_t *req_data;
+
+ DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing cancel request\n");
+
+ ret = frescan_requests_alloc(&req);
+ if (ret != 0) return ret;
+
+ ret = frescan_requests_get_data(req, &req_data);
+ if (ret != 0) return ret;
+
+ req_data->type = FRESCAN_REQ_CANCEL;
+ req_data->req = req;
+ req_data->request_node = the_networks[net].local_node;
+ req_data->net = net;
+ req_data->ss = ss;
+
+ ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
+ if (ret != 0) return ret;
+
+ DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue cancel request\n");
+
+ ret = frescan_requests_enqueue(req);
+ if (ret != 0) return ret;
+
+ DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a signal\n");
+
+ ret = frescan_bwres_robjs_wait(req_data->robj);
+ if (ret != 0) return ret;
+
+ ret = frescan_bwres_robjs_free(req_data->robj);
+ if (ret != 0) return ret;
+
+ ret = frescan_servers_destroy(net, ss);
+ if (ret != 0) return ret;
+
+ frescan_requests_free(req);
+ return 0;
+}