X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/fna.git/blobdiff_plain/83c2831f0c597f350c4bfa7350ccba55005e4ac6..113fb5b90ebd5be03997740e0ab92d40d06ee4dd:/src_frescan/frescan_bandwidth_reservation.c diff --git a/src_frescan/frescan_bandwidth_reservation.c b/src_frescan/frescan_bandwidth_reservation.c index b77f8c5..d112202 100644 --- a/src_frescan/frescan_bandwidth_reservation.c +++ b/src_frescan/frescan_bandwidth_reservation.c @@ -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(¶ms, 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; +}