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;
38 frsh_rel_time_t min_deadline = fosa_msec_to_rel_time(0);
40 cum_traffic.length = 0;
41 cum_traffic.p_nodes = NULL;
43 fres_sa_scenario_for_each_contract(scenario, c) {
44 fres_block_cluster_tree_traffic *contract_traffic;
45 frsh_rel_time_t deadline;
47 /* Extract the cumulative traffic through all contracts */
48 contract_traffic = fres_contract_get_cluster_tree_traffic(c->contract);
49 if(traffic_fill(&contract_traffic->nodes, &cum_traffic) == -1) {
51 goto err_free_traffic;
54 /* Find the most restricting deadline */
55 if (fres_contract_get_deadline(&c->contract, &deadline)) {
56 if (fosa_rel_time_is_null(min_deadline) ||
57 fosa_rel_time_smaller(deadline, min_deadline)) {
58 min_deadline = deadline;
63 application_params.ack_enable = FALSE;
64 application_params.alpha_data = max_alpha(cum_traffic); /* Find the maximal arrival curve from sensory traffic */
66 output_params.p_buffer_requirements =
67 (int *) malloc((topology->height+topology->h_sink+2)*sizeof(int));
68 if (output_params.p_buffer_requirements == NULL) {
70 goto err_free_traffic;
73 output_params.p_number_of_time_slots =
74 (unsigned short *) malloc((topology->height+topology->h_sink)*sizeof(int));
75 if(output_params.p_number_of_time_slots == NULL) {
80 /* Call the real admission test */
81 ret = ct_wsn(*topology, application_params, &output_params);
85 printf("error-code: %d\n", output_params.error_code);
87 /* Compare the deadlines */
88 if (output_params.d_e2e > fosa_rel_time_to_double(min_deadline)) {
97 free((void *)output_params.p_number_of_time_slots);
99 free((void *)output_params.p_buffer_requirements);
101 free(cum_traffic.p_nodes);
105 static const struct fres_res_manager frm = {
106 .res_type = FRSH_RT_NETWORK,
107 .res_id = FRSH_NETPF_CLUSTER_TREE,
108 .admission_test = admission_test,
109 .priv = &configuration,
113 int main(int argc, char *argv[])
118 orb = forb_init(&argc, &argv, "frm_cluster_tree");
119 if (!orb) error(1, errno, "forb_init");
121 fres_block_register_cluster_tree();
123 ret = frm_register_and_run(orb, &frm);
126 error(1, errno, "frm_generic_run failed");