]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_data.h
changes in frescan, programming the changes of mode and the reservation commit mechan...
[frescor/fna.git] / src_frescan / frescan_data.h
index 0e78bdaec1ab5440e1b85c94b466df6c12be62d2..320ccaeadc0391f5a118c29ec554dccfe4f5486f 100644 (file)
  *
  * @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
  */
@@ -58,12 +106,12 @@ typedef struct {
  *
  * @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;
 
@@ -71,25 +119,28 @@ typedef struct {
  * 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;
 
 /**
@@ -100,6 +151,57 @@ extern frescan_server_data_t the_servers_pool[FRESCAN_MX_NETWORKS][FRESCAN_MX_ID
 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
  *
@@ -111,6 +213,7 @@ extern frescan_server_data_t the_active_servers[FRESCAN_MX_NETWORKS];
  * 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
@@ -120,6 +223,7 @@ extern frescan_server_data_t the_active_servers[FRESCAN_MX_NETWORKS];
  */
 
 typedef struct {
+        frescan_network_t net;
         frescan_packet_t *fifo_queues;
         uint32_t max_prio;
         sem_t sem;
@@ -146,6 +250,10 @@ typedef struct {
  * @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.
@@ -155,6 +263,7 @@ typedef struct {
  * @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
@@ -166,12 +275,18 @@ typedef struct {
         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];
@@ -183,6 +298,4 @@ 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_