- 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;
- }
-
- if (the_networks[net].local_node == FRESCAN_NEG_MASTER_NODE) {
- DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
- "I am master, negotiation in local node\n");
-
- DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
- "set FRESCAN_NEGOTIATE type: %d\n", FRESCAN_NEGOTIATE);
-
- ret = frescan_request_set_type(request, FRESCAN_NEGOTIATE);
- 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, negotiation in master node\n");
-
- size = frescan_neg_message_create(msg, request, contract);
-
- DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
- "created a neg 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,
- "negotiation was not accepted, error:%d\n",
- return_info.error);
- } else {
- DEBUG(FRESCAN_BWRES_ENABLE_DEBUG,
- "negotiation finished succesfully ss:%d\n",
- return_info.id);
- }
-
- *id = return_info.id;
-
- ret = frescan_request_free(request);
- if (ret != 0) {
- ERROR("could not free request\n");
- return ret;
- }
-
- 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;