X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/fna.git/blobdiff_plain/5c8e141653df488eaefd495f239a9aef51c9e0a7..e1cc80051455d1a561c136c8b04abc86c3d67d9a:/src_frescan/frescan_bwres.c diff --git a/src_frescan/frescan_bwres.c b/src_frescan/frescan_bwres.c index 33918f2..ebffa1a 100644 --- a/src_frescan/frescan_bwres.c +++ b/src_frescan/frescan_bwres.c @@ -12,6 +12,56 @@ * * @author Daniel Sangorrin * + * @license + * + * ----------------------------------------------------------------------- + * Copyright (C) 2006 - 2008 FRESCOR consortium partners: + * + * Universidad de Cantabria, SPAIN + * University of York, UK + * Scuola Superiore Sant'Anna, ITALY + * Kaiserslautern University, GERMANY + * Univ. Politécnica Valencia, SPAIN + * Czech Technical University in Prague, CZECH REPUBLIC + * ENEA SWEDEN + * Thales Communication S.A. FRANCE + * Visual Tools S.A. SPAIN + * Rapita Systems Ltd UK + * Evidence ITALY + * + * See http://www.frescor.org for a link to partners' websites + * + * FRESCOR project (FP6/2005/IST/5-034026) is funded + * in part by the European Union Sixth Framework Programme + * The European Union is not liable of any use that may be + * made of this code. + * + * This file is part of FRESCAN + * + * FRESCAN is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * FRESCAN is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * distributed with FRESCAN; see file COPYING. If not, write to the + * Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * As a special exception, including FRESCAN header files in a file, + * instantiating FRESCAN generics or templates, or linking other files + * with FRESCAN objects to produce an executable application, does not + * by itself cause the resulting executable application to be covered + * by the GNU General Public License. This exception does not + * however invalidate any other reasons why the executable file might be + * covered by the GNU Public License. + * ----------------------------------------------------------------------- + * */ #include "frescan_bwres.h" @@ -43,9 +93,9 @@ int frescan_bwres_init(frescan_network_t net) &sa_init_params); if (ret != 0) return ret; - server_params.values.budget = 5; - server_params.values.period.tv_sec = 1; - server_params.values.period.tv_nsec = 0; + server_params.budget = 5; + server_params.period.tv_sec = 1; + server_params.period.tv_nsec = 0; server_params.prio = FRESCAN_BWRES_NEG_MESSAGES_PRIO; ret = frescan_servers_create(net, &server_params, @@ -81,12 +131,11 @@ int frescan_bwres_init(frescan_network_t net) * 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, + const frsh_contract_t *contract, + frescan_ss_t *ss, bool *accepted) { int ret; @@ -104,7 +153,7 @@ int frescan_bwres_negotiate(frescan_network_t net, req_data->type = FRESCAN_REQ_NEG; req_data->req = req; - req_data->contract = (frescan_contract_t *)contract; + req_data->contract = (frsh_contract_t *)contract; req_data->request_node = the_networks[net].local_node; req_data->net = net; @@ -112,9 +161,10 @@ int frescan_bwres_negotiate(frescan_network_t net, if (ret != 0) return ret; // NOTE: we preallocate a server for the negotiation process - server_params.values.budget = contract->min_values.budget; - server_params.values.period = contract->min_values.period; - server_params.prio = contract->prio; + server_params.budget = 0; + server_params.period.tv_sec = 0; + server_params.period.tv_nsec = 0; + server_params.prio = 0; ret = frescan_servers_create(net, &server_params, &req_data->ss); if (ret != 0) return ret; @@ -133,27 +183,144 @@ int frescan_bwres_negotiate(frescan_network_t net, 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 = req_data->final_values; + 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: + FRESCAN_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 frsh_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 = (frsh_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 = req_data->final_values; + 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: + FRESCAN_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; +}