]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - include/fna.h
add group negotiations to FNA interface
[frescor/fna.git] / include / fna.h
index 242af53317914bfa5b55b45226ded8811b44ba58..7660afa1ff2867d547a1bc7528046f0c8e8d7f48 100644 (file)
 #ifndef _FNA_H_
 #define _FNA_H_
 
-/* for frsh_resource_id_t, frsh_contract_t, etc */
-#include "frsh_core_types.h"
-/* for frsh_network_address_t, frsh_stream_id_t */
-#include "frsh_distributed_types.h"
+/* for frsh_resource_id_t, frsh_contract_t, for frsh_network_address_t,
+   frsh_stream_id_t, ... */
+#include "frsh.h"
 /* for timespec */
 #include <time.h>
 /* for ERROR constants */
@@ -138,6 +137,7 @@ typedef int fna_init_t(const frsh_resource_id_t resource_id);
  * @{
  **/
 
+#ifndef FRSH_FORB
 /**
  * fna_vres_id_t
  *
@@ -147,6 +147,73 @@ typedef int fna_init_t(const frsh_resource_id_t resource_id);
  *
  **/
 typedef uint16_t fna_vres_id_t;
+#else
+/**
+ * In FRSH_FORB implementation, we do not distinguish between vreses
+ * of different resources.
+ */
+typedef frsh_vres_id_t fna_vres_id_t;
+#endif
+
+typedef  struct {
+        int            size;
+        fna_vres_id_t  vres[FRSH_MAX_GROUP_OPS];
+} fna_vres_group_t;
+
+/**
+ * frsh_group_change_mode_sync()
+ *
+ * This function performs a set of negotiation operations which can
+ * include: adding new contracts (neg), modifying existing vres (reneg)
+ * or cancelling existing vres (cancel).
+ *
+ * If one of the group operations has a NULL value, unless it causes an
+ * inconsistency the system will suppose that no operation of that
+ * type (neg, reneg or cancel) should be done.
+ *
+ * The virtual resources resulting from negotiations of new contracts are
+ * returned in the parameter 'new_vres' which must be provided by the user.
+ *
+ * If the on-line admission test is enabled, FRSH analizes the
+ * schedulability of the context that would  result in the new
+ * contract situation with removed, changed and added contracts.
+ *
+ * A successful return code will mean that all contracts have been
+ * accepted  and all required operations (creation, cancellation or
+ * update of vres) have been carried out to reach the new running
+ * context.
+ *
+ * If any of the contracts is not accepted a corresponding error shall be
+ * returned and no changes will be made to the previously running context.
+ *
+ * This call is a synchronous, potentially blocking operation.  It
+ * returns when the system has rejected the contracts or accepted
+ * and made them effective.
+ *
+ * @param[in] contracts_to_neg    List of new contracts to negotiate
+ * @param[in] contracts_to_reneg  List of contracts to renegotiate
+ * @param[in] vres_to_reneg       List of vres to renegotiate
+ * @param[in] vres_to_cancel      List of vres to cancel
+ * @param[out] new_vres           List of vres of new contracts.
+ *
+ * @return 0 if no error \n
+ *   0 if there are no errors (in this case it also means contract accepted) \n
+ *   FNA_ERR_INTERNAL_ERROR: protocol dependent internal errors \n
+ *   FNA_ERR_TOO_MANY_VRES: if there is no space for more vres \n
+ *   FNA_ERR_CONTRACT_ID_ALREADY_EXISTS: contract_id is not unique \n
+ *   FNA_ERR_CONTRACT_REJECTED: if the contract is not accepted \n
+ *   FNA_ERR_NOT_INITIALIZED: if the protocol is not initialized \n
+ *   FNA_ERR_RESOURCE_ID_INVALID: if we are not in charge of resource_id \n
+ *   FNA_ERR_BAD_ARGUMENT: if pointers are NULL \n
+ *
+ **/
+typedef int fna_group_change_mode_sync_t
+                (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);
 
 /**
  * fna_contract_negotiate()
@@ -551,7 +618,7 @@ typedef enum {
     FRSH_RECEIVE_ENDPOINT_TYPE
 } frsh_endpoint_type_t;
 
-typedef struct {
+typedef struct fna_endpoint_data {
     frsh_endpoint_type_t endpoint_type; // send_endpoint or receive_endpoint
     fna_vres_id_t vres;                 // only for send_endpoints
     bool is_bound;                      // only for send_endpoints
@@ -725,6 +792,60 @@ typedef int fna_send_endpoint_get_status_t
     frsh_endpoint_network_status_t *network_status,
     frsh_protocol_status_t *protocol_status);
 
+/**
+ * fna_send_endpoint_bind_t()
+ *
+ * This operation is a called from frsh_send_endpoint_bind and binds send
+ * edpoint to vres.
+ *
+ * @param[in] endpoint the endpoint object.
+ * @param[in] vres The internal virtual resource id
+ *
+ * @return
+ *   0 if there are no errors \n
+ *   FNA_ERR_INTERNAL_ERROR: protocol dependent internal errors \n
+ *   FNA_ERR_NOT_INITIALIZED: if the protocol is not initialized \n
+ *   FNA_ERR_RESOURCE_ID_INVALID: if we are not in charge of resource_id \n
+ *   FNA_ERR_BAD_ARGUMENT: if pointers are NULL \n
+ **/
+typedef
+int fna_send_endpoint_bind_t(fna_endpoint_data_t *endpoint, fna_vres_id_t vres);
+
+/**
+ * fna_send_endpoint_unbind_t()
+ *
+ * This operation is a called from frsh_send_endpoint_bind.
+ *
+ * @param[in] endpoint the endpoint object.
+ *
+ * @return
+ *   0 if there are no errors \n
+ *   FNA_ERR_INTERNAL_ERROR: protocol dependent internal errors \n
+ *   FNA_ERR_NOT_INITIALIZED: if the protocol is not initialized \n
+ *   FNA_ERR_RESOURCE_ID_INVALID: if we are not in charge of resource_id \n
+ *   FNA_ERR_BAD_ARGUMENT: if pointers are NULL \n
+ **/
+typedef
+int fna_send_endpoint_unbind_t(fna_endpoint_data_t *endpoint);
+
+/**
+ * fna_send_endpoint_create_callback()
+ *
+ * This operation is a called from frsh_send_endpoint_create with a
+ * send_endpoint structure already filled.
+ *
+ * @param[in] endpoint the endpoint object.
+ *
+ * @return
+ *   0 if there are no errors \n
+ *   FNA_ERR_INTERNAL_ERROR: protocol dependent internal errors \n
+ *   FNA_ERR_NOT_INITIALIZED: if the protocol is not initialized \n
+ *   FNA_ERR_RESOURCE_ID_INVALID: if we are not in charge of resource_id \n
+ *   FNA_ERR_BAD_ARGUMENT: if pointers are NULL \n
+ **/
+typedef int fna_send_endpoint_create_callback_t
+   (fna_endpoint_data_t *endpoint);
+
 /**
  * fna_receive_endpoint_create_callback()
  *
@@ -744,7 +865,24 @@ typedef int fna_send_endpoint_get_status_t
  *   FNA_ERR_BAD_ARGUMENT: if pointers are NULL \n
  **/
 typedef int fna_receive_endpoint_create_callback_t
-   (const fna_endpoint_data_t *endpoint);
+   (fna_endpoint_data_t *endpoint);
+
+/**
+ * fna_endpoint_destroy()
+ *
+ * This operation is a called from frsh_send(receive)_endpoint_destroy.
+ *
+ * @param[in] endpoint the endpoint object.
+ *
+ * @return
+ *   0 if there are no errors \n
+ *   FNA_ERR_INTERNAL_ERROR: protocol dependent internal errors \n
+ *   FNA_ERR_NOT_INITIALIZED: if the protocol is not initialized \n
+ *   FNA_ERR_RESOURCE_ID_INVALID: if we are not in charge of resource_id \n
+ *   FNA_ERR_BAD_ARGUMENT: if pointers are NULL \n
+ **/
+typedef int fna_endpoint_destroy_t
+   (fna_endpoint_data_t *endpoint);
 
 /**
  * fna_receive_endpoint_get_pending_messages
@@ -843,7 +981,7 @@ typedef int fna_network_get_max_message_size_t
 typedef int fna_network_bytes_to_budget_t
    (const frsh_resource_id_t resource_id,
     const size_t nbytes,
-    struct timespec *budget);
+    frsh_rel_time_t *budget);
 
 /**
  * fna_network_budget_to_bytes()
@@ -867,7 +1005,7 @@ typedef int fna_network_bytes_to_budget_t
  **/
 typedef int fna_network_budget_to_bytes_t
    (const frsh_resource_id_t resource_id,
-    const struct timespec *budget,
+    const frsh_rel_time_t *budget,
     size_t *nbytes);
 
 /**
@@ -900,12 +1038,13 @@ typedef int fna_network_budget_to_bytes_t
  **/
 typedef int fna_network_get_min_effective_budget_t
    (const frsh_resource_id_t resource_id,
-    struct timespec *budget);
+    frsh_rel_time_t *budget);
 
 /*@}*/
 
 typedef struct {
     fna_init_t *fna_init;
+    fna_group_change_mode_sync_t *fna_group_change_mode_sync;
     fna_contract_negotiate_t *fna_contract_negotiate;
     fna_contract_renegotiate_sync_t *fna_contract_renegotiate_sync;
     fna_contract_renegotiate_async_t *fna_contract_renegotiate_async;
@@ -923,6 +1062,10 @@ typedef struct {
     fna_receive_sync_t *fna_receive_sync;
     fna_receive_async_t *fna_receive_async;
     fna_send_endpoint_get_status_t *fna_send_endpoint_get_status;
+    fna_send_endpoint_bind_t *fna_send_endpoint_bind;
+    fna_send_endpoint_unbind_t *fna_send_endpoint_unbind;
+    fna_endpoint_destroy_t *fna_endpoint_destroy;
+    fna_send_endpoint_create_callback_t *fna_send_endpoint_created;
     fna_receive_endpoint_create_callback_t *fna_receive_endpoint_created;
     fna_receive_endpoint_get_status_t *fna_receive_endpoint_get_status;
     fna_network_get_max_message_size_t *fna_network_get_max_message_size;