*
* @author Daniel Sangorrin <daniel.sangorrin@unican.es>
*
+ * @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 <assert.h>
#include "frescan_bwres_messages.h"
#include "frescan_bwres_requests.h"
#include "frescan_bwres_analysis.h"
+#include "frescan_bwres_mode_change.h"
#include "frescan_config.h"
#include "frescan_debug.h"
#include "frescan_data.h"
frescan_manager_repneg(req_data);
break;
default:
- ERROR("request type not supported\n");
+ FRESCAN_ERROR("request type not supported\n");
assert(0);
}
if(req_data->request_node != the_networks[net].local_node) {
- ret = frescan_requests_free(req);
+ ret = frescan_requests_free(req); // acceptor request
assert(ret == 0);
}
}
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "negotiation request\n");
if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
- // scheduling analysis
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "add contract to scenario\n");
+
ret = frescan_sa_add_contract
(&the_networks[req_data->net].scenario,
- req_data->contract,
req_data->ss,
- req_data->request_node);
+ req_data->request_node,
+ req_data->contract);
assert(ret == 0);
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "assign priorities\n");
+
+ ret = frsh_sa_assign_priorities
+ (&the_networks[req_data->net].scenario);
+ assert(ret == 0);
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "perform sched analysis\n");
+
ret = frescan_sa_sched_test
(&the_networks[req_data->net].scenario,
&accepted);
assert(ret == 0);
if (accepted) {
- ret = frescan_sa_get_final_values
- (&the_networks[req_data->net].scenario,
- req_data->ss,
- req_data->request_node,
- &req_data->final_values);
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "schedulable! distribute spare capacity\n");
+
+ ret = frescan_sa_spare_capacity
+ (&the_networks[req_data->net].scenario);
assert(ret == 0);
+
req_data->return_value = FRESCAN_REQ_ACCEPTED;
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "perform the mode change protocol!\n");
+
+ ret = frescan_bwres_mode_change_protocol(req_data);
+ assert(ret == 0);
} else {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "not schedulable!\n");
+
ret = frescan_sa_remove_contract
(&the_networks[req_data->net].scenario,
req_data->ss,
req_data->request_node);
assert(ret == 0);
- req_data->return_value = FRESCAN_REQ_NOT_ACCEPTED;
- }
- // signal or reply the results
- if (req_data->request_node == FRESCAN_NEG_MASTER_NODE) {
- DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "master local\n");
- ret = frescan_bwres_robjs_signal(req_data->robj);
- assert(ret == 0);
- } else {
- DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
- "master external, sending reply\n");
+ req_data->return_value = FRESCAN_REQ_NOT_ACCEPTED;
- req_data->type = FRESCAN_REP_NEG;
- ret = frescan_messages_send_request(req_data);
- assert(ret == 0);
+ if (req_data->request_node == FRESCAN_NEG_MASTER_NODE) {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "signal local request\n");
+ ret = frescan_bwres_robjs_signal(req_data->robj);
+ assert(ret == 0);
+ } else {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "sending reply\n");
+ req_data->type = FRESCAN_REP_NEG;
+ ret = frescan_messages_send_request(req_data);
+ assert(ret == 0);
+ }
}
} else {
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
}
/**
- * frescan_manager_neg
+ * frescan_manager_reneg
*/
static void frescan_manager_reneg(frescan_request_data_t *req_data)
{
+ int ret;
+ bool is_schedulable;
+ frsh_contract_t old_contract;
+
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "renegotiation request\n");
+
+ if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
+ // scheduling analysis
+ ret = frescan_sa_update_contract
+ (&the_networks[req_data->net].scenario,
+ req_data->ss,
+ req_data->request_node,
+ req_data->contract,
+ &old_contract);
+ assert(ret == 0);
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "assign priorities\n");
+
+ ret = frsh_sa_assign_priorities
+ (&the_networks[req_data->net].scenario);
+ assert(ret == 0);
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "perform sched analysis\n");
+
+ ret = frescan_sa_sched_test
+ (&the_networks[req_data->net].scenario,
+ &is_schedulable);
+ assert(ret == 0);
+
+ if (accepted) {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "schedulable! distribute spare capacity\n");
+
+ ret = frescan_sa_spare_capacity
+ (&the_networks[req_data->net].scenario);
+ assert(ret == 0);
+
+ req_data->return_value = FRESCAN_REQ_ACCEPTED;
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "perform the mode change protocol!\n");
+
+ ret = frescan_bwres_mode_change_protocol(req_data);
+ assert(ret == 0);
+ } else {
+ ret = frescan_sa_update_contract
+ (&the_networks[req_data->net].scenario,
+ req_data->ss,
+ req_data->request_node,
+ &old_contract,
+ NULL);
+ assert(ret == 0);
+ req_data->return_value = FRESCAN_REQ_NOT_ACCEPTED;
+ }
+
+ // signal or reply the results
+ if (req_data->request_node == FRESCAN_NEG_MASTER_NODE) {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "master local\n");
+ ret = frescan_bwres_robjs_signal(req_data->robj);
+ assert(ret == 0);
+ }
+ } else {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "send renegotiation request to master\n");
+ ret = frescan_messages_send_request(req_data);
+ assert(ret == 0);
+ }
}
/**
- * frescan_manager_neg
+ * frescan_manager_cancel
*/
static void frescan_manager_cancel(frescan_request_data_t *req_data)
{
+ int ret;
+ bool is_schedulable;
+
DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "cancel request\n");
+
+ if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
+ ret = frescan_sa_remove_contract
+ (&the_networks[req_data->net].scenario,
+ req_data->ss,
+ req_data->request_node);
+ assert(ret == 0);
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "assign priorities\n");
+
+ ret = frsh_sa_assign_priorities
+ (&the_networks[req_data->net].scenario);
+ assert(ret == 0);
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "perform sched analysis\n");
+
+ ret = frescan_sa_sched_test
+ (&the_networks[req_data->net].scenario,
+ &is_schedulable);
+ assert(ret == 0);
+
+ assert(is_schedulable == true);
+
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "redistribute spare capacity\n");
+
+ ret = frescan_sa_spare_capacity
+ (&the_networks[req_data->net].scenario);
+ assert(ret == 0);
+
+ ret = frescan_bwres_mode_change_protocol(req_data);
+ assert(ret == 0);
+ } else {
+ DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+ "send cancel request to master\n");
+ ret = frescan_messages_send_request(req_data);
+ assert(ret == 0);
+ }
+
+ if (req_data->request_node == the_networks[req_data->net].local_node) {
+ ret = frescan_bwres_robjs_signal(req_data->robj);
+ assert(ret == 0);
+ }
}
/**
- * frescan_manager_neg
+ * frescan_manager_repneg
*/
static void frescan_manager_repneg(frescan_request_data_t *req_data)