]> rtime.felk.cvut.cz Git - frescor/frsh.git/blob - resources/cluster_tree/frm_cluster_tree.c
forb: executable resources and fcb changed into dynamic libs
[frescor/frsh.git] / resources / cluster_tree / frm_cluster_tree.c
1 /**************************************************************************/
2 /* ---------------------------------------------------------------------- */
3 /* Copyright (C) 2006 - 2008 FRESCOR consortium partners:                 */
4 /*                                                                        */
5 /*   Universidad de Cantabria,              SPAIN                         */
6 /*   University of York,                    UK                            */
7 /*   Scuola Superiore Sant'Anna,            ITALY                         */
8 /*   Kaiserslautern University,             GERMANY                       */
9 /*   Univ. Politécnica  Valencia,           SPAIN                        */
10 /*   Czech Technical University in Prague,  CZECH REPUBLIC                */
11 /*   ENEA                                   SWEDEN                        */
12 /*   Thales Communication S.A.              FRANCE                        */
13 /*   Visual Tools S.A.                      SPAIN                         */
14 /*   Rapita Systems Ltd                     UK                            */
15 /*   Evidence                               ITALY                         */
16 /*                                                                        */
17 /*   See http://www.frescor.org for a link to partners' websites          */
18 /*                                                                        */
19 /*          FRESCOR project (FP6/2005/IST/5-034026) is funded             */
20 /*       in part by the European Union Sixth Framework Programme          */
21 /*       The European Union is not liable of any use that may be          */
22 /*       made of this code.                                               */
23 /*                                                                        */
24 /*                                                                        */
25 /*  This file is part of FRSH (FRescor ScHeduler)                         */
26 /*                                                                        */
27 /* FRSH is free software; you can redistribute it and/or modify it        */
28 /* under terms of the GNU General Public License as published by the      */
29 /* Free Software Foundation; either version 2, or (at your option) any    */
30 /* later version.  FRSH is distributed in the hope that it will be        */
31 /* useful, but WITHOUT ANY WARRANTY; without even the implied warranty    */
32 /* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU    */
33 /* General Public License for more details. You should have received a    */
34 /* copy of the GNU General Public License along with FRSH; see file       */
35 /* COPYING. If not, write to the Free Software Foundation, 675 Mass Ave,  */
36 /* Cambridge, MA 02139, USA.                                              */
37 /*                                                                        */
38 /* As a special exception, including FRSH header files in a file,         */
39 /* instantiating FRSH generics or templates, or linking other files       */
40 /* with FRSH objects to produce an executable application, does not       */
41 /* by itself cause the resulting executable application to be covered     */
42 /* by the GNU General Public License. This exception does not             */
43 /* however invalidate any other reasons why the executable file might be  */
44 /* covered by the GNU Public License.                                     */
45 /**************************************************************************/
46
47 /**
48  * @file   frm_cluster_tree.c
49  * @author Michal Sojka <sojkam1@fel.cvut.cz>
50  * @date   Wed Feb 18 16:14:35 2009
51  * 
52  * @brief  Resource manager for cluster tree WSN
53  * 
54  */
55
56
57 #include <frm_generic.h>
58 #include <forb.h>
59 #include <error.h>
60 #include <errno.h>
61 #include <fres_sa_scenario.h>
62 #include <stdbool.h>
63 #include <ul_log.h>
64 #include <stdio.h>
65 #include <frsh_distributed.h>
66 #include "ct_wsn.h"
67 #include <cluster_tree.h>
68
69 struct cluster_tree {
70         TOPOLOGY_PARAMS topology;
71 };
72
73 struct cluster_tree configuration = {
74         .topology = {
75                 .max_routers = 2,
76                 .max_end_nodes = 2,
77                 .height = 2,
78                 .h_sink = 1,
79                 .SO = 3,
80                 .sensing_cap = FALSE,
81         }
82 };
83
84
85 int admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
86 {
87         struct cluster_tree *configuration = priv;
88         TOPOLOGY_PARAMS *topology = &configuration->topology;
89         struct fres_sa_contract *c;
90         APPLICATION_PARAMS application_params;
91         int ret;
92         OUTPUT_PARAMS output_params;
93         TRAFFIC cum_traffic;
94         frsh_rel_time_t min_deadline = fosa_msec_to_rel_time(0);
95         
96         cum_traffic.length = 0;
97         cum_traffic.p_nodes = NULL;
98
99         fres_sa_scenario_for_each_no_cancel_contract(scenario, c) {
100                 fres_block_cluster_tree_traffic *contract_traffic;
101                 frsh_rel_time_t deadline;
102
103                 /* Extract the cumulative traffic through all contracts */
104                 contract_traffic = fres_contract_get_cluster_tree_traffic(c->contract);
105                 if(traffic_fill(&contract_traffic->nodes, &cum_traffic) == -1) {
106                         ret = -1;
107                         goto err_free_traffic;
108                 }               
109
110                 /* Find the most restricting deadline */
111                 if (fres_contract_get_deadline(&c->contract, &deadline)) {
112                         if (fosa_rel_time_is_null(min_deadline) ||
113                             fosa_rel_time_smaller(deadline, min_deadline)) {
114                                 min_deadline = deadline;
115                         }
116                 }
117         }
118         
119         application_params.ack_enable = FALSE;
120         application_params.alpha_data = max_alpha(cum_traffic); /* Find the maximal arrival curve from sensory traffic */
121         
122         output_params.p_buffer_requirements =
123                 (int *) malloc((topology->height+topology->h_sink+2)*sizeof(int));
124         if (output_params.p_buffer_requirements == NULL) {
125                 ret = -1;
126                 goto err_free_traffic;
127         }
128
129         output_params.p_number_of_time_slots =
130                 (unsigned short *) malloc((topology->height+topology->h_sink)*sizeof(int));
131         if(output_params.p_number_of_time_slots == NULL) {
132                 ret = -1;
133                 goto err_free_req;
134         }
135
136         /* Call the real admission test */
137         ret = ct_wsn(*topology, application_params, &output_params);
138         if(ret == -1)
139         {
140                 *schedulable = false;
141                 printf("error-code: %d\n", output_params.error_code);
142         } else {
143                 /* Compare the deadlines */
144                 if (output_params.d_e2e > fosa_rel_time_to_double(min_deadline)) {
145                         *schedulable = false;
146                 } else {
147                         *schedulable = true;
148                 }
149         }
150
151         ret = 0;
152
153         free((void *)output_params.p_number_of_time_slots);
154 err_free_req:
155         free((void *)output_params.p_buffer_requirements);
156 err_free_traffic:
157         free(cum_traffic.p_nodes);
158         return ret;
159 }
160
161 static const struct fres_res_manager frm = {
162         .res_type = FRSH_RT_NETWORK,
163         .res_id = FRSH_NETPF_CLUSTER_TREE,
164         .admission_test = admission_test,
165         .priv = &configuration,
166 };
167
168
169 int forb_main(forb_orb orb, int argc, char *argv[])
170 {
171         int ret;
172         forb_init_attr_t attr = { .orb_id = "org.frescor.frm.cluster_tree" };
173
174         fres_block_register_cluster_tree();
175
176         ret = frm_register_and_run(orb, &frm);
177
178         if (ret != 0) {
179                 error(1, errno, "frm_generic_run failed");
180         }
181         
182         return 0;
183 }