1 #include <frm_generic.h>
5 #include <fres_sa_scenario.h>
9 #include <frsh_distributed.h>
11 #include <cluster_tree.h>
14 TOPOLOGY_PARAMS topology;
17 struct cluster_tree configuration = {
29 int admission_test(struct fres_sa_scenario *scenario, void *priv, bool *schedulable)
31 struct cluster_tree *configuration = priv;
32 TOPOLOGY_PARAMS *topology = &configuration->topology;
33 struct fres_sa_contract *c;
34 APPLICATION_PARAMS application_params;
36 OUTPUT_PARAMS output_params;
39 frsh_rel_time_t min_deadline = fosa_msec_to_rel_time(0);
41 cum_traffic.length = 0;
42 cum_traffic.p_nodes = NULL;
44 fres_sa_scenario_for_each_contract(scenario, c) {
45 fres_block_cluster_tree_traffic *contract_traffic;
46 fres_block_timing_reqs *timing;
48 /* Extract the cumulative traffic through all contracts */
49 contract_traffic = fres_contract_get_block(c->contract,
50 FRES_BLOCK_CLUSTER_TREE_TRAFFIC);
52 if(traffic_fill(contract_traffic->nodes, &cum_traffic) == -1)
56 /* Find the most restricting deadline */
57 timing = fres_contract_get_timing_reqs(c->contract);
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;
65 deadline = timing->deadline;
67 if (fosa_rel_time_is_null(min_deadline) ||
68 fosa_rel_time_smaller(deadline, min_deadline)) {
69 min_deadline = deadline;
74 application_params.ack_enable = FALSE;
75 application_params.alpha_data = max_alpha(cum_traffic); /* Find the maximal arrival curve from sensory traffic */
77 output_params.buffer_requirements =
78 (int *) malloc((topology->height+topology->h_sink+2)*sizeof(int));
79 if (output_params.buffer_requirements == NULL)
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)
87 /* Call the real admission test */
88 ret = ct_wsn(*topology, application_params, &output_params);
92 printf("error-code: %d\n", output_params.error_code);
94 /* Compare the deadlines */
95 if (output_params.d_e2e > fosa_rel_time_to_double(min_deadline)) {
102 free((void *)output_params.number_of_time_slots);
103 free((void *)output_params.buffer_requirements);
104 free((void *)application_params.alpha_data);
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,
117 int main(int argc, char *argv[])
122 orb = forb_init(&argc, &argv, "frm_cluster_tree");
123 if (!orb) error(1, errno, "forb_init");
125 fres_block_register_cluster_tree();
127 ret = frm_register_and_run(orb, &frm);
130 error(1, errno, "frm_generic_run failed");