]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bandwidth_reservation.c
i break the svn for one day to change the name of files, redo the negotiation message...
[frescor/fna.git] / src_frescan / frescan_bandwidth_reservation.c
index b77f8c535f2feea65dbdfb48c0bf03ff5be84f61..d112202811b80665310f2327723c696307ea1243 100644 (file)
@@ -79,8 +79,8 @@ int frescan_bwres_init(frescan_network_t net)
  * frescan_bwres_negotiate()
  *
  * negotiate a contract. For that we allocate a reply object and then
- * we enqueue our request in the master's requests queue (which can be
- * local or require a network message)
+ * we enqueue our request in the master's requests queue (if we are in
+ * the master node) or send it to the master through the network.
  */
 
 int frescan_bwres_negotiate(frescan_network_t net,
@@ -163,8 +163,10 @@ int frescan_bwres_negotiate(frescan_network_t net,
                 params.to  = FRESCAN_NEG_MASTER_NODE;
                 params.channel = FRESCAN_NEG_CHANNEL;
 
-//                 params.flags = FRESCAN_FP | FRESCAN_ASYNC;
-//                 params.prio = 8;
+                // NOTE: if we sent the negotiation msgs with fp:
+                // params.flags = FRESCAN_FP | FRESCAN_ASYNC;
+                // params.prio = 8;
+
                 params.flags = FRESCAN_SS | FRESCAN_ASYNC;
                 params.ss = the_networks[net].neg_messages_ss_id;
 
@@ -213,3 +215,149 @@ int frescan_bwres_negotiate(frescan_network_t net,
 
         return return_info.error;
 }
+
+/**
+ * frescan_bwres_renegotiate()
+ *
+ * renegotiate a contract. For that we allocate a reply object and then
+ * we enqueue our request in the master's requests queue (if we are in
+ * the master node) or send it to the master through the network.
+ */
+
+int frescan_bwres_renegotiate(frescan_network_t net,
+                              const frescan_contract_t *contract,
+                              frescan_ss_t id)
+{
+        int ret;
+        frescan_robj_id_t reply;
+        frescan_request_id_t request;
+        frescan_neg_return_info_t return_info;
+        uint8_t msg[200];
+        int size;
+        frescan_send_params_t params;
+
+        ret = frescan_replyobject_alloc(&reply, FRESCAN_BWRES_MX_PRIO);
+        if (ret != 0) {
+                ERROR("could not allocate reply object\n");
+                return ret;
+        }
+
+        ret = frescan_request_alloc(&request);
+        if (ret != 0) {
+                ERROR("could not allocate request\n");
+                return ret;
+        }
+
+        ret = frescan_request_set_return_info(request,
+                                              (void *) &return_info);
+        if (ret != 0) {
+                ERROR("could not set return_info pointer\n");
+                return ret;
+        }
+
+        ret = frescan_request_set_reply(request, reply);
+        if (ret != 0) {
+                ERROR("could not set reply\n");
+                return ret;
+        }
+
+        ret = frescan_request_set_ss(request, id);
+        if (ret != 0) {
+                ERROR("could not set server id\n");
+                return ret;
+        }
+
+        if (the_networks[net].local_node == FRESCAN_NEG_MASTER_NODE) {
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
+                      "I am master, renegotiation in local node\n");
+
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
+                      "set FRESCAN_RENEGOTIATE type: %d\n",
+                      FRESCAN_RENEGOTIATE);
+
+                ret = frescan_request_set_type(request, FRESCAN_RENEGOTIATE);
+                if (ret != 0) {
+                        ERROR("could not set type\n");
+                        return ret;
+                }
+
+                ret = frescan_request_set_contract(request, contract);
+                if (ret != 0) {
+                        ERROR("could not set contract\n");
+                        return ret;
+                }
+
+                ret = frescan_request_set_src(request, FRESCAN_NEG_MASTER_NODE);
+                if (ret != 0) {
+                        ERROR("could not set src\n");
+                        return ret;
+                }
+
+                ret = frescan_requestqueue_enqueue(request);
+                if (ret != 0) {
+                        ERROR("could not enqueue the request\n");
+                        return ret;
+                }
+        } else {
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
+                      "I am slave, renegotiation in master node\n");
+
+                size = frescan_reneg_message_create(msg, request, contract);
+
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
+                      "created a reneg message, size: %d\n", size);
+
+                params.net = net;
+                params.to  = FRESCAN_NEG_MASTER_NODE;
+                params.channel = FRESCAN_NEG_CHANNEL;
+
+                // NOTE: if we sent the negotiation msgs with fp:
+                // params.flags = FRESCAN_FP | FRESCAN_ASYNC;
+                // params.prio = 8;
+
+                params.flags = FRESCAN_SS | FRESCAN_ASYNC;
+                params.ss = the_networks[net].neg_messages_ss_id;
+
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
+                      "send msg to master, net:%u to:%u ss:%u\n",
+                      params.net, params.to, params.ss);
+
+                ret = frescan_send(&params, msg, size);
+                if (ret != 0) {
+                        ERROR("error while sending neg request to master\n");
+                        return ret;
+                }
+        }
+
+        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait on reply object\n");
+
+        ret = frescan_replyobject_wait(reply);
+        if (ret != 0) {
+                ERROR("error while waiting on the reply object\n");
+                return ret;
+        }
+
+        ret = frescan_replyobject_free(reply);
+        if (ret != 0) {
+                ERROR("could not free reply object\n");
+                return ret;
+        }
+
+        if (return_info.error) {
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
+                      "renegotiation was not accepted, error:%d\n",
+                      return_info.error);
+        } else {
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
+                      "renegotiation finished succesfully for ss:%d\n",
+                      id);
+        }
+
+        ret = frescan_request_free(request);
+        if (ret != 0) {
+                ERROR("could not free request\n");
+                return ret;
+        }
+
+        return return_info.error;
+}