]> rtime.felk.cvut.cz Git - frescor/frsh.git/blob - resources/cluster_tree/frm_cluster_tree.c
modification of contract interface (application contract)
[frescor/frsh.git] / resources / cluster_tree / frm_cluster_tree.c
1 #include <frm_generic.h>
2 #include <forb.h>
3 #include <error.h>
4 #include <errno.h>
5 #include <fres_sa_scenario.h>
6 #include <stdbool.h>
7 #include <ul_log.h>
8 #include <stdio.h>
9 #include <frsh_distributed.h>
10 #include "ct_wsn.h"
11 #include <cluster_tree.h>
12
13 struct cluster_tree {
14         TOPOLOGY_PARAMS topology;
15 };
16
17 struct cluster_tree configuration = {
18         .topology = {
19                 .max_routers = 2,
20                 .max_end_nodes = 2,
21                 .height = 2,
22                 .h_sink = 1,
23                 .SO = 3,
24                 .sensing_cap = FALSE,
25         }
26 };
27
28
29 int admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
30 {
31         struct cluster_tree *configuration = priv;
32         TOPOLOGY_PARAMS *topology = &configuration->topology;
33         struct fres_sa_contract *c;
34         APPLICATION_PARAMS application_params;
35         int i, ret;
36         OUTPUT_PARAMS output_params;
37         ALPHA alpha_data_max;
38         TRAFFIC cum_traffic;
39         frsh_rel_time_t min_deadline = fosa_msec_to_rel_time(0);
40         
41         cum_traffic.length = 0;
42         cum_traffic.p_nodes = NULL;
43
44         fres_sa_scenario_for_each_contract(scenario, c) {
45                 fres_block_cluster_tree_traffic *contract_traffic;
46                 fres_block_timing_reqs *timing;
47
48                 /* Extract the cumulative traffic through all contracts */
49                 contract_traffic = fres_contract_get_block(c->contract,
50                                                   FRES_BLOCK_CLUSTER_TREE_TRAFFIC);
51                                                   
52                 if(traffic_fill(contract_traffic->nodes, &cum_traffic) == -1)
53                         return -1;
54                 
55
56                 /* Find the most restricting deadline */
57                 timing = fres_contract_get_timing_reqs(c->contract);
58                 if (timing) {
59                         fosa_rel_time_t deadline;
60                         if (timing->d_equals_t) {
61                                 fres_block_basic *basic;
62                                 basic = fres_contract_get_basic(c->contract);
63                                 deadline = basic->period;
64                         } else {
65                                 deadline = timing->deadline;
66                         }
67                         if (fosa_rel_time_is_null(min_deadline) ||
68                             fosa_rel_time_smaller(deadline, min_deadline)) {
69                                 min_deadline = deadline;
70                         }
71                 }
72         }
73         
74         application_params.ack_enable = FALSE;
75         application_params.alpha_data = max_alpha(cum_traffic); /* Find the maximal arrival curve from sensory traffic */
76         
77         output_params.buffer_requirements =
78                 (int *) malloc((topology->height+topology->h_sink+2)*sizeof(int));
79         if (output_params.buffer_requirements == NULL)
80                 return -1;
81
82         output_params.number_of_time_slots =
83                 (int *) malloc((topology->height+topology->h_sink)*sizeof(int));
84         if(output_params.number_of_time_slots == NULL) 
85                 return -1;
86
87         /* Call the real admission test */
88         ret = ct_wsn(*topology, application_params, &output_params);
89         if(ret == -1)
90         {
91                 *schedulable = false;
92                 printf("error-code: %d\n", output_params.error_code);
93         } else {
94                 /* Compare the deadlines */
95                 if (output_params.d_e2e > fosa_rel_time_to_double(min_deadline)) {
96                         *schedulable = false;
97                 } else {
98                         *schedulable = true;
99                 }
100         }
101
102         free((void *)output_params.number_of_time_slots);
103         free((void *)output_params.buffer_requirements);
104         free((void *)application_params.alpha_data);
105                 
106         return 0;
107 }
108
109 static const struct fres_res_manager frm = {
110         .res_type = FRSH_RT_NETWORK,
111         .res_id = FRSH_NETPF_CLUSTER_TREE,
112         .admission_test = admission_test,
113         .priv = &configuration,
114 };
115
116
117 int main(int argc, char *argv[])
118 {
119         forb_orb orb;
120         int ret;
121
122         orb = forb_init(&argc, &argv, "frm_cluster_tree");
123         if (!orb) error(1, errno, "forb_init");
124
125         fres_block_register_cluster_tree();
126
127         ret = frm_register_and_run(orb, &frm);
128
129         if (ret != 0) {
130                 error(1, errno, "frm_generic_run failed");
131         }
132         
133         return 0;
134 }