]> rtime.felk.cvut.cz Git - frescor/frsh.git/blob - resources/cluster_tree/frm_cluster_tree.c
Merge branch 'master' of rtime.felk.cvut.cz:/var/git/frescor/frsh_forb.git
[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 "functions.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 = 3,
21                 .height = 3,
22                 .h_sink = 2,
23                 .BO = 6,
24                 .SO = 2,
25                 .L_CFP = 14,
26                 .sensing_cap = FALSE,
27         }
28 };
29
30
31 int admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
32 {
33         struct cluster_tree *configuration = priv;
34         TOPOLOGY_PARAMS *topology = &configuration->topology;
35         struct fres_sa_contract *c;
36         APPLICATION_PARAMS application_params;
37         int i, ret;
38         OUTPUT_PARAMS output_params;
39         frsh_rel_time_t min_deadline = fosa_msec_to_rel_time(0);
40
41         application_params.ack_enable = FALSE;
42         application_params.mpdu = 120;
43         application_params.number_of_alfas = scenario->num_contracts;
44
45         application_params.alfa_data =
46                 (ALFA *)malloc((application_params.number_of_alfas)*sizeof(ALFA));
47         if (application_params.alfa_data == NULL) return -1;
48
49         i = 0;
50         fres_sa_scenario_for_each_contract(scenario, c) {
51                 fres_block_cluster_tree_traffic *traffic;
52                 ALFA *alfa = &application_params.alfa_data[i++];
53                 fres_block_timing_reqs *timing;
54
55                 traffic = fres_contract_get_block(c->contract,
56                                                   FRES_BLOCK_CLUSTER_TREE_TRAFFIC);
57                 alfa->r = traffic->r;
58                 alfa->b = traffic->b;
59
60                 /* Find the most restricting deadline */
61                 timing = fres_contract_get_timing_reqs(c->contract);
62                 if (timing) {
63                         fosa_rel_time_t deadline;
64                         if (timing->d_equals_t) {
65                                 fres_block_basic *basic;
66                                 basic = fres_contract_get_basic(c->contract);
67                                 deadline = basic->period;
68                         } else {
69                                 deadline = timing->deadline;
70                         }
71                         if (fosa_rel_time_is_null(min_deadline) ||
72                             fosa_rel_time_smaller(deadline, min_deadline)) {
73                                 min_deadline = deadline;
74                         }
75                 }
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_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.alfa_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 }