*
* @license
*
- * See MaRTE OS 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 <stdint.h> // uint32_t
#include <semaphore.h> // sem_t
#include <time.h> // struct timespec, timer_t
-#include <pthread.h> // pthread_t
+#include "fosa_threads_and_signals.h" // fosa_thread_id_t
#include <misc/linux_list.h> // struct list_head
#include <misc/freelist.h> // freelist_t
-#include <drivers/frescan.h> // frescan_node_t, _prio_t, _budget_t
+#include "frescan.h" // frescan_node_t, _prio_t, _budget_t
#include "frescan_config.h" // FRESCAN_MLOCK_T, FRESCAN_MX_XXX
#include "frescan_packets.h" // frescan_packet_t
-#include "frescan_servers_replenishments.h" // frescan_repl_op_t
+
+#include "frsh.h" // for frsh_contract_t
+#include "fsa.h" // for frsh_sa_scenario_t
/**
* frescan_repl_op_t - a replenishment operation
*
* @when: when the replenishment operation is programmed at
- * @amount: number of frames to add to the current_budget
+ * @amount: number of frames to add to the available budget
* @repl_list: to chain the replenishments for a certain sporadic server
* @pool_pos: to know how to free it from the replenishment pool
*/
*
* @budget: the budget in CAN 8-byte frames
* @period: the replenishment period for the server
- * @prio: the priority for the server TODO: this should be a return value
+ * @prio: the priority of the server
*/
typedef struct {
frescan_budget_t budget;
- struct timespec period;
+ struct timespec period;
frescan_prio_t prio;
} frescan_server_params_t;
* frescan_server_data_t - server data
*
* @params: the fixed parameters (budget, period and priority)
- * @current_budget: the current available capacity
+ * @old_params: a copy of old params for the perceived-commit process
* @current_priority: the current priority (0=background)
* @repl_list: the list of pending replenishment operations
* @repl_timer: the timer for the replenishments associated to this server
* NOTE: we could use a single timer for all but for now this is simpler
+ * @act_time: the last activation time for the server
* @packet_list: the packets enqueued on this server
+ * @servers_list: the list of servers
*/
typedef struct {
frescan_server_params_t params;
- frescan_network_t net;
- frescan_ss_t id;
- frescan_budget_t current_budget;
- frescan_prio_t current_priority;
- frescan_budget_t pending_packets;
- frescan_repl_op_t replenishments;
- timer_t repl_timer;
- frescan_packet_t packet_list;
- struct list_head servers_list;
+ frescan_server_params_t old_params;
+ frescan_network_t net;
+ frescan_ss_t id;
+ frescan_prio_t current_priority;
+ frescan_budget_t pending_packets;
+ frescan_repl_op_t replenishments;
+ timer_t repl_timer;
+ struct timespec act_time;
+ frescan_packet_t packet_list;
+ struct list_head servers_list;
} frescan_server_data_t;
/**
extern freelist_t the_servers_pool_freelist[FRESCAN_MX_NETWORKS];
extern frescan_server_data_t the_active_servers[FRESCAN_MX_NETWORKS];
+/**
+ * frescan_sa_vres_t - a frescan vres
+ *
+ * @contract: the contract of the virtual resource
+ * @node: the node where the vres belongs to
+ * @ss: the sporadic server identifier
+ * @list: the list of vres. Note that this is the list of all the vres
+ * in the network instace. As this is a master-slave protocol the master
+ * knows everything about the contracts of the rest of nodes.
+ */
+
+typedef enum {
+ FRESCAN_SA_PERIOD_DEC = 1<<5,
+ FRESCAN_SA_PERIOD_INC = 1<<4,
+ FRESCAN_SA_BUDGET_DEC = 1<<3,
+ FRESCAN_SA_BUDGET_INC = 1<<2,
+ FRESCAN_SA_PRIO_DEC = 1<<1,
+ FRESCAN_SA_PRIO_INC = 1
+} frescan_sa_mode_change_type_t;
+
+typedef struct {
+ frsh_contract_t contract;
+ frescan_node_t node;
+ frescan_ss_t ss;
+ frsh_sa_vres_id_t fsa_vres_global_id;
+ struct list_head list;
+ // mode change variables
+ frsh_sa_time_t old_c;
+ frsh_sa_time_t old_t;
+ frsh_sa_prio_t old_p;
+ frescan_sa_mode_change_type_t mode_change_type;
+ struct list_head mode_change_list;
+} frescan_sa_vres_t;
+
+/**
+ * frescan_sa_scenario_t - the scheduling analysis scenario
+ */
+
+typedef struct {
+ frescan_prio_t max_prio;
+ frescan_prio_t min_prio;
+} frescan_sa_init_params_t;
+
+typedef struct {
+ frescan_sa_init_params_t init_params;
+ frescan_sa_vres_t vres_pool[FRESCAN_MX_NODES][FRESCAN_MX_IDS];
+ frescan_sa_vres_t vres_head;
+ freelist_t fsa_id_freelist;
+ frsh_sa_scenario_t fsa_scenario;
+} frescan_sa_scenario_t;
+
/**
* frescan_prio_queue_t - priority queue
*
* synchronization is done using a semaphore. This is because the queues
* are accesed concurrently from user threads and the IRQ handler.
*
+ * @net: the network this priority queue belongs to (mainly for locking)
* @fifo_queues: an array of packets for each priority where each packet
* is just the head of a fifo_list. The array is allocated
* from the heap, using malloc, at initialization with range
*/
typedef struct {
+ frescan_network_t net;
frescan_packet_t *fifo_queues;
uint32_t max_prio;
sem_t sem;
* @local_node: the local node id for that network. The implementation does not
* support several interfaces for the same network.
* @fd: file descriptor associated to /dev/canXX
+ * @repl_thread_id: replenishment thread id
+ * @manager_thread_id: manager thread id
+ * @acceptor_thread_id: acceptor thread id
+ * @neg_messages_ss_id: sporadic server for negotiation messages
* @queues: the queues of this network instance
* @last_packet: pointer to the last packet from which a frame was inserted
* in the chip and its transmission is not complete.
* @id_fp_queues: the same as id_queues but for fp messages, which have
* id=FRESCAN_MX_IDS and are distinguised through their
* priorities.
+ * @scenario: the scheduling analysis scenario for the network
*
* the implementation can handle several FRESCAN networks at the same time
* in the same node, so we need a place to store its internal data. The data
FRESCAN_MLOCK_T lock;
frescan_node_t local_node;
int fd;
- pthread_t repl_thread_id;
+ fosa_thread_id_t repl_thread_id;
+ fosa_thread_id_t manager_thread_id;
+ fosa_thread_id_t acceptor_thread_id;
+ frescan_ss_t neg_messages_ss_id;
frescan_queues_t queues;
frescan_packet_t *last_packet;
frescan_prio_t last_packet_prio;
- frescan_packet_t *id_queues[FRESCAN_MX_IDS]; // TODO: alloc at init
- frescan_packet_t *id_fp_queues[FRESCAN_MX_PRIOS]; // TODO: alloc at init
+ frescan_packet_t *id_queues[FRESCAN_MX_NODES][FRESCAN_MX_IDS]; // TODO: alloc at init
+ frescan_packet_t *id_fp_queues[FRESCAN_MX_NODES][FRESCAN_MX_PRIOS]; // TODO: alloc at init
+ frescan_sa_scenario_t scenario;
+ struct list_head mode_change_budget_inc_list_head[FRESCAN_MX_NODES];
+ struct list_head mode_change_budget_dec_list_head[FRESCAN_MX_NODES];
} frescan_network_data_t;
extern frescan_network_data_t the_networks[FRESCAN_MX_NETWORKS];
extern int frescan_data_init(int fd, frescan_init_params_t *params);
-
-
#endif // _MARTE_FRESCAN_DATA_H_