]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_data.h
add group negotiations to frescan and change all the requests and messages to map...
[frescor/fna.git] / src_frescan / frescan_data.h
index 320ccaeadc0391f5a118c29ec554dccfe4f5486f..c035f9821c996914ee0e2f112c02c97251786c2e 100644 (file)
 #ifndef _MARTE_FRESCAN_DATA_H_
 #define _MARTE_FRESCAN_DATA_H_
 
-#include <stdint.h>    // uint32_t
-#include <semaphore.h> // sem_t
-#include <time.h>      // struct timespec, timer_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 "frescan.h"         // frescan_node_t, _prio_t, _budget_t
+#include "frescan_types.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 "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 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
- */
-
-typedef struct {
-        struct timespec when;
-        frescan_budget_t amount;
-        struct list_head repl_list;
-        int pool_pos;
-} frescan_repl_op_t;
-
-/**
- * frescan_server_params_t - server parameters
- *
- * @budget: the budget in CAN 8-byte frames
- * @period: the replenishment period for the server
- * @prio: the priority of the server
- */
-
-typedef struct {
-        frescan_budget_t budget;
-        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)
- * @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_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;
-
-/**
- * the_servers_pool - pool of servers structure
- */
-
-extern frescan_server_data_t the_servers_pool[FRESCAN_MX_NETWORKS][FRESCAN_MX_IDS];
-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
- *
- * FRESCAN priority queues are implemented as an array of one 'fifo_queue' for
- * each priority. Where the 'fifo_queues' are implemented using the
- * 'struct list_head fifo_list;' field of each packet structure (Linux lists).
- *
- * So far mutual exclusion is achieved by disabling interrupts and
- * 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
- *               0..max_prio-1
- * @max_prio: defines the number of priorities as (0 .. max_prio - 1)
- * @sem: semaphore used for synchronization
- */
-
-typedef struct {
-        frescan_network_t net;
-        frescan_packet_t *fifo_queues;
-        uint32_t max_prio;
-        sem_t sem;
-} frescan_prio_queue_t;
-
-/**
- * frescan_queues_t - the set of FRESCAN queues for each instance of a protocol
- *
- * @tx_fp_queue: priority queue for the fixed priority packets
- * @rx_channel_queues: a priority queue for each receiving channel
- *
- * TODO: add here the sporadic server queues...
- */
-
-typedef struct {
-        frescan_prio_queue_t *tx_fp_queue;
-        frescan_prio_queue_t **rx_channel_queues;
-        uint32_t num_rx_channels;
-} frescan_queues_t;
-
-/**
- * frescan_network_data_t - data for each network instance
- *
- * @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.
- * @last_packet_prio: prio of the packet in the buffer
- * @id_queues: queues to store received packets while the whole message is
- *             not complete (fragmentation). (id = 0 .. FRESCAN_MX_IDS - 1)
- * @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
- * is allocated as an array where the index is the MINOR number (which also
- * identifies the /dev/canx device for that network)
- */
-
-typedef struct {
-        FRESCAN_MLOCK_T lock;
-        frescan_node_t local_node;
-        int fd;
-        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_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];
-
-/**
- * frescan_data_init() - init the data global variables
- *
- */
+extern frescan_network_data_t frescan_data[FRESCAN_MX_NETWORKS];
 
 extern int frescan_data_init(int fd, frescan_init_params_t *params);