]> rtime.felk.cvut.cz Git - frescor/fna.git/commitdiff
i break the svn for one day to change the name of files, redo the negotiation message...
authorsangorrin <sangorrin@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Wed, 16 Apr 2008 15:27:03 +0000 (15:27 +0000)
committersangorrin <sangorrin@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Wed, 16 Apr 2008 15:27:03 +0000 (15:27 +0000)
git-svn-id: http://www.frescor.org/private/svn/frescor/fna/trunk@1116 35b4ef3e-fd22-0410-ab77-dab3279adceb

src_frescan/frescan_bandwidth_reservation.c
src_frescan/frescan_data.h
src_frescan/frescan_negotiation_messages.c
src_frescan/frescan_negotiation_messages.h
src_frescan/frescan_queues.c
src_frescan/frescan_requests_queue.c
src_frescan/frescan_requests_queue.h

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;
+}
index dbae6cceb94f2e9ea2f612fcdf0ea79a95d6caf5..a6e150aa5fd6e13d1fe9f590fc8bbf603f5643bb 100644 (file)
@@ -134,6 +134,7 @@ typedef struct {
  * synchronization is done using a semaphore. This is because the queues
  * are accesed concurrently from user threads and the IRQ handler.
  *
+ * @net: the network this priority queue belongs to (mainly for locking)
  * @fifo_queues: an array of packets for each priority where each packet
  *               is just the head of a fifo_list. The array is allocated
  *               from the heap, using malloc, at initialization with range
@@ -143,6 +144,7 @@ typedef struct {
  */
 
 typedef struct {
+        frescan_network_t net;
         frescan_packet_t *fifo_queues;
         uint32_t max_prio;
         sem_t sem;
index 1bc8a00ea9b68342e981d60fe6974967719a377d..5d22a33f4f3f23ffad448f0888d0300eb9e8093a 100644 (file)
@@ -147,6 +147,44 @@ int frescan_repneg_message_create(uint8_t *msg,
         return (int)bytes_written;
 }
 
+int frescan_reneg_message_create(uint8_t *msg,
+                                 frescan_request_id_t id,
+                                 const frescan_contract_t *contract)
+{
+        size_t num, bytes_written;
+        uint8_t *tmp = msg;
+
+        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
+              "creating a renegotiation request message\n");
+
+        *tmp = (uint8_t)FRESCAN_MSG_TYPE_RENEG;
+        tmp++;
+        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
+              "type: %d (1 byte)\n", FRESCAN_MSG_TYPE_RENEG);
+
+        num = 2;
+        memcpy(tmp, &id, num);
+        tmp = tmp + num;
+        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
+              "request id: %d (2 bytes)\n", id);
+
+        num = sizeof(frescan_contract_t);
+        memcpy(tmp, contract, num);
+        tmp = tmp + num;
+
+        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
+              "contract (%d bytes)\n", num);
+
+        // TODO: ADD server id? or look up the label??
+
+        bytes_written = tmp - msg;
+
+        DEBUG(FRESCAN_NEG_MESSAGES_ENABLE_DEBUG,
+              "total bytes_written: %d\n", bytes_written);
+
+        return (int)bytes_written;
+}
+
 int frescan_message_parse(frescan_network_t net,
                           const uint8_t *msg,
                           size_t size,
index 886da0da0f0783be54cfd3c2fbc4d5df78286e59..d869f6884a89e7e912d0055c0f36cc3834d6967d 100644 (file)
 #include "frescan_requests_queue.h"
 #include "frescan_data.h"
 
-extern int frescan_neg_message_create(uint8_t *msg,
+extern int frescan_request_to_message(uint8_t *msg,
                                       frescan_request_id_t id,
                                       const frescan_contract_t *contract);
 
-extern int frescan_repneg_message_create(uint8_t *msg,
-                                         frescan_request_id_t id,
-                                         int accepted,
-                                         frescan_server_params_t *params);
-
-extern int frescan_message_parse(frescan_network_t net,
-                                 const uint8_t *msg,
-                                 size_t size,
-                                 frescan_node_t from);
+extern int frescan_message_to_request(frescan_network_t net,
+                                      const uint8_t *msg,
+                                      size_t size,
+                                      frescan_node_t from);
 
 #endif // _FRESCAN_NEGOTIATION_MESSAGES_H_
index 6d1d1501430c93ffd0a2c74950f6a6567f7b4ff8..e00fd833eef0c23b42ae448a7e5b7a735ecfb5eb 100644 (file)
@@ -34,7 +34,8 @@
  * frescan_pqueue_create() - creates a priority queue
  */
 
-static inline frescan_prio_queue_t *frescan_pqueue_create(uint32_t max_prio)
+static inline frescan_prio_queue_t *frescan_pqueue_create(uint32_t max_prio,
+                                                          frescan_network_t net)
 {
         int ret, prio;
         frescan_prio_queue_t *pq; // priority queue
@@ -46,6 +47,7 @@ static inline frescan_prio_queue_t *frescan_pqueue_create(uint32_t max_prio)
         }
 
         pq->max_prio = max_prio;
+        pq->net      = net;
 
         ret = sem_init (&pq->sem, 0, 0);
         if (ret != 0) {
@@ -80,7 +82,8 @@ int frescan_queues_init(frescan_queues_t *queues,
         uint32_t max_prio;
 
         // create transmission fixed priority queue
-        queues->tx_fp_queue = frescan_pqueue_create(params->tx_fp_max_prio);
+        queues->tx_fp_queue = frescan_pqueue_create(params->tx_fp_max_prio,
+                                                    params->net);
 
         if (queues->tx_fp_queue == NULL)  {
                 ERROR("could not allocate memory for tx fp queue\n");
@@ -108,7 +111,8 @@ int frescan_queues_init(frescan_queues_t *queues,
                         max_prio = params->rx_channel_max_prio[i];
                 }
 
-                queues->rx_channel_queues[i] = frescan_pqueue_create(max_prio);
+                queues->rx_channel_queues[i] = frescan_pqueue_create
+                                                       (max_prio, params->net);
 
                 if (queues->rx_channel_queues[i] == NULL)  {
                         ERROR("could not allocate memory for rx pq %d\n", i);
@@ -203,8 +207,11 @@ int frescan_pqueue_dequeue(frescan_prio_queue_t *pqueue,
         DEBUG(FRESCAN_QUEUES_ENABLE_DEBUG,
               "check priority fifo queues (max_prio=%u)\n", pqueue->max_prio);
 
-        // TODO: the lock is currently hardwired to network 0!!!
-        FRESCAN_ACQUIRE_LOCK(&the_networks[0].lock);
+        // NOTE: we only acquire the lock if we block because non-blocking
+        // calls are made from a context with no interrupts (when updating
+        // the buffer at 'frescan_hw_buffer_update' which is always called
+        // with interrupts disabled)
+        if (blocking) FRESCAN_ACQUIRE_LOCK(&the_networks[pqueue->net].lock);
 
         for(prio=pqueue->max_prio-1; prio >= 0; prio--) {
                 if (!list_empty(&pqueue->fifo_queues[prio].fifo_list)) {
@@ -220,7 +227,7 @@ int frescan_pqueue_dequeue(frescan_prio_queue_t *pqueue,
                 }
         }
 
-        FRESCAN_RELEASE_LOCK(&the_networks[0].lock);
+        if (blocking) FRESCAN_RELEASE_LOCK(&the_networks[pqueue->net].lock);
 
         DEBUG(FRESCAN_QUEUES_ENABLE_DEBUG, "dequeued prio %u\n", prio);
         *packet_prio = prio;
index 0d61ad5273560ddc7ace42a195bcc9b70edc3a11..d17bb6966a177f1d36aeaab4cdd2a95151368c25 100644 (file)
@@ -36,6 +36,7 @@ struct request_t {
         frescan_req_type_t  type;
         frescan_robj_id_t   reply;
         frescan_contract_t  *contract;
+        frescan_ss_t        ss;
         frescan_node_t      src;
         void                *return_info;
         struct list_head    request_list;
@@ -171,6 +172,18 @@ int frescan_request_set_contract(frescan_request_id_t id,
         return 0;
 }
 
+/**
+ * frescan_request_set_ss()
+ *
+ **/
+
+int frescan_request_set_ss(frescan_request_id_t id,
+                           frescan_ss_t         ss)
+{
+        the_requests_pool[id].ss = ss;
+        return 0;
+}
+
 /**
  * frescan_request_set_src()
  *
index 80970a4c23691a470d1d040fd866316af2b6b2b7..3571201c8bad5fe1d0ffa8ce26c2ddc6a7ed8764 100644 (file)
@@ -45,6 +45,9 @@ extern int frescan_request_set_reply(frescan_request_id_t id,
 extern int frescan_request_set_contract(frescan_request_id_t id,
                                         const frescan_contract_t *contract);
 
+extern int frescan_request_set_ss(frescan_request_id_t id,
+                                  frescan_ss_t         ss);
+
 extern int frescan_request_set_src(frescan_request_id_t id,
                                    frescan_node_t src);