]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres_fna.c
debugging messages
[frescor/fna.git] / src_frescan / frescan_bwres_fna.c
index 995e436c5fb1f4b0074e476f5b880afd0b65ffe5..ff62a4f97c4d2641e0736db7b06d822ad5fab0c1 100644 (file)
 #include "frsh.h" /* frsh_resource_id_t, .. */
 #include "frescan.h" /* frescan_init, ... */
 #include "frescan_bwres.h" /* frescan_bwres_init, ... */
+#include "frescan_types.h"
 #include "fna.h" /* fna_vres_id_t, fna_endpoint_data_t */
 #include "frescan_debug.h" /* DEBUG, FRESCAN_ERROR */
+#include "frescan_servers.h"
 
 //////////////////////////////////////////////////////////////////////
 //           INITIALIZATION
@@ -99,18 +101,19 @@ int frescan_fna_init(const frsh_resource_id_t resource_id)
 
         // TODO: resource_id must be relative or sth
         // TODO: init_params must be configurable
-        init_params.net = (frescan_network_t)resource_id;
+        init_params.net = 0; // (frescan_network_t)resource_id;
         init_params.node = (frescan_node_t)FRSH_CPU_ID_DEFAULT;
         init_params.tx_fp_max_prio = 10;
         init_params.rx_num_of_channels = 10;
         init_params.rx_channel_max_prio = NULL;
 
-        DEBUG(FRESCAN_FNA_ENABLE_DEBUG, "Initializing FRESCAN\n");
+        DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG,
+              "Initializing FRESCAN FNA node%u\n", FRSH_CPU_ID_DEFAULT);
 
         ret = frescan_init(&init_params);
         if (ret != 0) FRESCAN_ERROR ("could not init FRESCAN");
 
-        DEBUG(FRESCAN_FNA_ENABLE_DEBUG, "Initializing BWRES\n");
+        DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG, "Initializing BWRES\n");
 
         ret = frescan_bwres_init(init_params.net);
         if (ret != 0) FRESCAN_ERROR ("could not init BWRES");
@@ -122,6 +125,89 @@ int frescan_fna_init(const frsh_resource_id_t resource_id)
 //           VIRTUAL RESOURCES
 ///////////////////////////////////////////////////////////////////
 
+int frescan_fna_group_change_mode_sync
+                (const frsh_resource_id_t     resource_id,
+                 const frsh_contracts_group_t *contracts_to_neg,
+                 const frsh_contracts_group_t *contracts_to_reneg,
+                 const fna_vres_group_t       *vres_to_reneg,
+                 const fna_vres_group_t       *vres_to_cancel,
+                 fna_vres_group_t             *new_vres)
+{
+        int ret, i;
+        bool accepted;
+        frescan_ss_group_t ss_to_reneg, ss_to_cancel, ss_new;
+
+        // convert fna_vres to ss
+        if (vres_to_reneg == NULL) {
+                ss_to_reneg.size = 0;
+        } else {
+                ss_to_reneg.size = vres_to_reneg->size;
+                if (ss_to_reneg.size > FRESCAN_BWRES_MAX_GROUP_OPS) {
+                        FRESCAN_ERROR("FRESCAN_BWRES_MAX_GROUP_OPS small\n");
+                        return -1;
+                }
+
+                for(i=0; i<ss_to_reneg.size; i++) {
+                        ss_to_reneg.ss[i] =
+                                        (frescan_ss_t)vres_to_reneg->vres[i];
+                }
+        }
+
+        if (vres_to_cancel == NULL) {
+                ss_to_cancel.size = 0;
+        } else {
+                ss_to_cancel.size = vres_to_cancel->size;
+                if (ss_to_cancel.size > FRESCAN_BWRES_MAX_GROUP_OPS) {
+                        FRESCAN_ERROR("FRESCAN_BWRES_MAX_GROUP_OPS small\n");
+                        return -1;
+                }
+
+                for(i=0; i<ss_to_cancel.size; i++) {
+                        ss_to_cancel.ss[i] =
+                                        (frescan_ss_t)vres_to_cancel->vres[i];
+                }
+        }
+
+        if ((contracts_to_neg != NULL) && (new_vres == NULL)) {
+                FRESCAN_ERROR("new_vres is NULL\n");
+                return -1;
+        }
+
+        // negotiate
+        DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG,
+              "calling frescan_bwres_group_change_mode_sync\n");
+
+        ret = frescan_bwres_group_change_mode_sync
+                                        ((frescan_network_t)resource_id,
+                                         contracts_to_neg,
+                                         contracts_to_reneg,
+                                         &ss_to_reneg,
+                                         &ss_to_cancel,
+                                         &ss_new,
+                                         &accepted);
+        if (ret != 0) return -1;
+
+        if (accepted == false) {
+                DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG, "negotiation not accepted\n");
+                return -1; // TODO: change to constant FNA_REJECTED
+        }
+
+        DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG, "negotiation accepted\n");
+        // convert new ss to fna_vres
+        if (contracts_to_neg != NULL) {
+                new_vres->size = ss_new.size;
+                DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG,
+                      "new_vres->size:%d\n", new_vres->size);
+                for(i=0; i<new_vres->size; i++) {
+                        new_vres->vres[i] = (fna_vres_id_t)ss_new.ss[i];
+                        DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG,
+                              "new_vres->vres[%d]:%u\n", i, new_vres->vres[i]);
+                }
+        }
+
+        return 0;
+}
+
 /**
  * frescan_fna_contract_negotiate()
  *
@@ -161,24 +247,18 @@ int frescan_fna_contract_negotiate
                  fna_vres_id_t *vres)
 {
         int ret;
-        bool accepted;
-        frescan_ss_t ss;
+        frsh_contracts_group_t contracts_to_neg;
+        fna_vres_group_t       new_vres;
 
-        DEBUG(FRESCAN_FNA_ENABLE_DEBUG, "calling frescan_bwres_negotiate\n");
-        ret = frescan_bwres_negotiate((frescan_network_t)resource_id,
-                                       contract,
-                                       &ss,
-                                       &accepted);
-        if (ret != 0) return -1;
+        contracts_to_neg.size = 1;
+        contracts_to_neg.contracts[0] = *contract;
 
-        if (accepted == true) {
-                DEBUG(FRESCAN_FNA_ENABLE_DEBUG, "contract accepted\n");
-                *vres = (fna_vres_id_t)ss;
-                return 0;
-        } else {
-                DEBUG(FRESCAN_FNA_ENABLE_DEBUG, "contract not accepted\n");
-                return -1; // TODO: change to constant FNA_REJECTED
-        }
+        ret = frescan_fna_group_change_mode_sync
+                (resource_id, &contracts_to_neg, NULL, NULL, NULL, &new_vres);
+        if (ret != 0) return ret;
+
+        *vres = new_vres.vres[0];
+        return 0;
 }
 
 /**
@@ -216,8 +296,17 @@ int frescan_fna_contract_renegotiate_sync
                  const fna_vres_id_t vres,
                  const frsh_contract_t *new_contract)
 {
-        FRESCAN_ERROR("not implemented\n");
-        return -1;
+        frsh_contracts_group_t contracts_to_reneg;
+        fna_vres_group_t       vres_to_reneg;
+
+        contracts_to_reneg.size = 1;
+        contracts_to_reneg.contracts[0] = *new_contract;
+        vres_to_reneg.size = 1;
+        vres_to_reneg.vres[0] = vres;
+
+        return frescan_fna_group_change_mode_sync
+                                (resource_id, NULL, &contracts_to_reneg,
+                                 &vres_to_reneg, NULL, NULL);
 }
 
 /**
@@ -334,8 +423,13 @@ int frescan_fna_vres_destroy
                 (const frsh_resource_id_t resource_id,
                  const fna_vres_id_t vres)
 {
-        FRESCAN_ERROR("not implemented\n");
-        return -1;
+        fna_vres_group_t  vres_to_cancel;
+
+        vres_to_cancel.size = 1;
+        vres_to_cancel.vres[0] = vres;
+
+        return frescan_fna_group_change_mode_sync
+                       (resource_id, NULL, NULL, NULL, &vres_to_cancel, NULL);
 }
 
 /**
@@ -455,8 +549,24 @@ int frescan_fna_vres_get_budget_and_period
                  struct timespec *budget,
                  struct timespec *period)
 {
-        FRESCAN_ERROR("not implemented\n");
-        return -1;
+        int ret;
+        frescan_server_params_t server_params;
+
+        ret =  frescan_servers_get_data((frescan_network_t)resource_id,
+                                         &server_params,
+                                         (frescan_ss_t)vres);
+        if (ret != 0) return ret;
+
+        *budget = frsh_usec_to_rel_time((long)FRESCAN_FRAME_TX_TIME_US *
+                                        server_params.budget);
+
+        *period = server_params.period;
+
+        DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG,
+              "budget(%d packets %ld us\n",
+              server_params.budget, frsh_rel_time_to_usec(*budget));
+
+        return 0;
 }
 
 /*@}*/
@@ -638,7 +748,7 @@ int frescan_fna_send_async
         int ret;
         frescan_send_params_t params;
 
-        DEBUG(FRESCAN_FNA_ENABLE_DEBUG,
+        DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG,
               "net:%u dest:%u chan:%u size:%u ss:%u\n",
               endpoint->resource_id, endpoint->destination,
               endpoint->stream_id, size, endpoint->vres);
@@ -711,7 +821,7 @@ int frescan_fna_receive_sync
         params.channel  = (frescan_channel_t)endpoint->stream_id;
         params.flags    = FRESCAN_SYNC;
 
-        DEBUG(FRESCAN_FNA_ENABLE_DEBUG,
+        DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG,
               "net:%u chan:%u size:%u\n",
               endpoint->resource_id, endpoint->stream_id, buffer_size);
 
@@ -725,7 +835,7 @@ int frescan_fna_receive_sync
 
         *from = (frsh_network_address_t)frescan_from;
 
-        DEBUG(FRESCAN_FNA_ENABLE_DEBUG,
+        DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG,
               "msg received, from:%u bytes:%u prio:%u\n",
               *from, *received_bytes, prio);
 
@@ -819,7 +929,7 @@ int frescan_fna_send_endpoint_get_status
 int frescan_fna_receive_endpoint_created
                 (fna_endpoint_data_t *endpoint)
 {
-        DEBUG(FRESCAN_FNA_ENABLE_DEBUG, "receive endpoint created\n");
+        DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG, "receive endpoint created\n");
         return 0;
 }
 
@@ -930,7 +1040,7 @@ int frescan_fna_network_bytes_to_budget
         *budget = frsh_usec_to_rel_time((long)FRESCAN_FRAME_TX_TIME_US *
                                               number_of_packets);
 
-        DEBUG(FRESCAN_FNA_ENABLE_DEBUG,
+        DEBUG(FRESCAN_BWRES_FNA_ENABLE_DEBUG,
               "bytes: %d -> budget: %ld us\n",
                nbytes, frsh_rel_time_to_usec(*budget));
 
@@ -1021,6 +1131,7 @@ int frescan_fna_network_get_min_eff_budget
 
 fna_operations_t frescan_fna_operations = {
         .fna_init = frescan_fna_init,
+        .fna_group_change_mode_sync = frescan_fna_group_change_mode_sync,
         .fna_contract_negotiate = frescan_fna_contract_negotiate,
         .fna_contract_renegotiate_sync = frescan_fna_contract_renegotiate_sync,
         .fna_contract_renegotiate_async = frescan_fna_contract_renegotiate_async,