]> rtime.felk.cvut.cz Git - frescor/fwp.git/blobdiff - fwp/mngr/fwp_mngr.c
Merge branch 'master' of rtime.felk.cvut.cz:frescor/fwp
[frescor/fwp.git] / fwp / mngr / fwp_mngr.c
index 2d0c007056b67ca55770fba1c576e6c1742cf6d7..c94328ae063c82f4907b01f912e9794f2203335e 100644 (file)
-
-#include "fwp_confdefs.h"
-#include "fwp_mngt.h"
-#include "fwp_participant_table.h"
+/**************************************************************************/
+/* ---------------------------------------------------------------------- */
+/* Copyright (C) 2006 - 2008 FRESCOR consortium partners:                */
+/*                                                                       */
+/*   Universidad de Cantabria,              SPAIN                        */
+/*   University of York,                    UK                           */
+/*   Scuola Superiore Sant'Anna,            ITALY                        */
+/*   Kaiserslautern University,             GERMANY                      */
+/*   Univ. Politécnica  Valencia,           SPAIN                       */
+/*   Czech Technical University in Prague,  CZECH REPUBLIC               */
+/*   ENEA                                   SWEDEN                       */
+/*   Thales Communication S.A.              FRANCE                       */
+/*   Visual Tools S.A.                      SPAIN                        */
+/*   Rapita Systems Ltd                     UK                           */
+/*   Evidence                               ITALY                        */
+/*                                                                       */
+/*   See http://www.frescor.org for a link to partners' websites         */
+/*                                                                       */
+/*          FRESCOR project (FP6/2005/IST/5-034026) is funded            */
+/*       in part by the European Union Sixth Framework Programme         */
+/*       The European Union is not liable of any use that may be         */
+/*       made of this code.                                              */
+/*                                                                       */
+/*                                                                       */
+/*  This file is part of FWP (Frescor WLAN Protocol)                     */
+/*                                                                       */
+/* FWP is free software; you can redistribute it and/or modify it        */
+/* under terms of the GNU General Public License as published by the     */
+/* Free Software Foundation; either version 2, or (at your option) any   */
+/* later version.  FWP is distributed in the hope that it will be        */
+/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty   */
+/* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   */
+/* General Public License for more details. You should have received a   */
+/* copy of the GNU General Public License along with FWP; see file       */
+/* COPYING. If not, write to the Free Software Foundation, 675 Mass Ave,  */
+/* Cambridge, MA 02139, USA.                                             */
+/*                                                                       */
+/* As a special exception, including FWP header files in a file,         */
+/* instantiating FWP generics or templates, or linking other files       */
+/* with FWP objects to produce an executable application, does not       */
+/* by itself cause the resulting executable application to be covered    */
+/* by the GNU General Public License. This exception does not            */
+/* however invalidate any other reasons why the executable file might be  */
+/* covered by the GNU Public License.                                    */
+/**************************************************************************/
+#include <frm_generic.h>
+#include <forb.h>
+#include <error.h>
+#include <errno.h>
+#include <getopt.h>
+#include <fres_sa_scenario.h>
+#include <stdbool.h>
+#include <ul_log.h>
+#include <ul_logreg.h>
+#include <fwp_res.h>
+#include <stdio.h>
 #include "fwp_admctrl.h"
 
-#define FWP_MTU        2346  
-#define BUFFSIZE       FWP_MTU 
-
-/* buffer and socket for incomming message */
-static unsigned char   buffer[FWP_MTU];
-
-/* Admission control test */
-fwp_admctrl_test_t fwp_admctrl_test = &fwp_admctrl_stupid;
-
-/**
- * fwp_mngt_input 
- *
- * Function waits for remote or local message 
- * 
- * @msgb  received message 
- * \return 
- * On success, it returns 0 and the pointer to received message in msgb parameter.
- * On error, it returns negative error code
- *
- */
-int fwp_mngr_input(struct fwp_msgb **pmsgb)
+#if 0
+static
+int dummy_admission_test(struct fres_sa_scenario *scenario, void *priv, 
+                               bool *schedulable)
 {
-       struct fwp_msgb *msgb;
-       ssize_t size;
-
-       FWP_DEBUG("Waiting for messages\n");
-       /* TODO: consider to replace with fwp_mngt_recv call */
-       size = fwp_recv(fwp_participant_this->epointd, buffer, BUFFSIZE);
-        
-       /* For future: fwp_socket could be allocated behind data in msgb*/
-       if (!(msgb = fwp_msgb_alloc(size))) {
-               perror("No memory available.\n");
-               return -ENOMEM;
-       }
-       /*memcpy(fwp_msgb_put(msgb, len), buffer, len); */
-       msgb->data = buffer;
-       fwp_msgb_put(msgb, size);
-       
-       *pmsgb = msgb;
-       return (0);
-}
+       struct fres_sa_contract *c;
 
-void fwp_mngr_hello(fwp_msgb_t *msgb, fwp_participant_id_t participant_id)
-{
-       fwp_participant_info_t participant_info, my_info;
-       fwp_participant_t *participant;
-
-       FWP_DEBUG("Received HELLO msg from nodeid= %d appid= %d\n", 
-                       participant_id.node_id, participant_id.app_id);
-
-       /* Create a new participant */
-       fwp_msg_hello_out(msgb->data, &participant_info);
-       participant = fwp_participant_create(&participant_info);
-       fwp_mngt_service_vres_create(&participant->vresd);
-       fwp_send_endpoint_create(participant->id.node_id, participant->stream_id,
-                                       0, &participant->epointd);
-       fwp_send_endpoint_bind(participant->epointd, participant->vresd);
-       fwp_contract_table_init(&participant->contract_table);
-
-       /* Insert participant into table */
-       fwp_participant_table_insert(participant);
-
-       /* Send back hello msg with mngr`s info */
-       /* prepare hello message */
-       fwp_msgb_reset_data(msgb);
-       fwp_msgb_reserve(msgb, sizeof(struct fwp_msg_header));
-       
-       my_info.id = fwp_participant_this->id;
-       my_info.stream_id = fwp_participant_this->stream_id;
-
-       fwp_msg_hello_in(msgb->tail, &my_info);
-       fwp_msgb_put(msgb, sizeof(struct fwp_msg_hello));
+       printf("Dummy admission test:\n");
 
-       /* Send hello to manager */
-       fwp_mngt_send(FWP_MSG_HELLO, msgb, 
-                       fwp_participant_this, participant);
-
-       FWP_DEBUG("Sent HELLO msg from nodeid= %d appid= %d\n", 
-                       participant_id.node_id, participant_id.app_id);
-}
+       fres_sa_scenario_for_each_no_cancel_contract(scenario, c) {
+               fres_block_basic *basic;
+               char id[40];
+               fres_contract_id_to_string(id, &c->contract->id, sizeof(id));
+               basic = fres_contract_get_basic(c->contract);
 
-int 
-fwp_mngr_contract_reserve(fwp_msgb_t *msgb, fwp_participant_id_t participant_id)
-{
-       fwp_participant_t *participant;
-       fwp_contract_data_t *contdata;
+               printf("  processing: id=%s, period=%ld ms, budget=%ld ms\n",
+                      id,
+                      fosa_rel_time_to_msec(basic->period),
+                      fosa_rel_time_to_msec(basic->budget));
 
-       /* Find participant */
-       if (!(participant = fwp_participant_table_find(&participant_id))){
-               return -EPERM;
        }
-
-       contdata = fwp_contract_data_new();
-       
-       /* Extract contract header */
-       fwp_msg_contracthdr_out(msgb->data, &contdata->id, &contdata->status);
-       fwp_msgb_pull(msgb, sizeof(struct fwp_msg_contracthdr));
-       /* Extract contract params */
-       fwp_msg_contract_out(msgb->data, &contdata->contract);
-       fwp_msgb_pull(msgb, sizeof(struct fwp_msg_contract));
-
-       /*launch admission test */
-       fwp_admctrl_test(contdata);             
-       
-       free(msgb);
-       msgb = fwp_msgb_alloc(sizeof(struct fwp_msg_header) +
-                                       sizeof(struct fwp_msg_contract) +
-                                       sizeof(struct fwp_msg_vres_params));
-       fwp_msgb_reserve(msgb,sizeof(struct fwp_msg_header));
-       
-       /*Add contract header*/
-       fwp_msg_contracthdr_in(msgb->tail, contdata->id, contdata->status);
-       fwp_msgb_put(msgb, sizeof(struct fwp_msg_contracthdr));
-       /* Add contract params */
-       /* No needed to send back if spare capacity is not considered
-        * fwp_msg_contract_in(msgb->tail, &contdata->contract);
-        * fwp_msgb_put(msgb, sizeof(struct fwp_msg_contract));
-        * */
-       
-       /*Send back contract reservation */
-       if (contdata->status == FWP_CONT_RESERVED) {
-               fwp_msg_vres_params_in(msgb->tail, &contdata->vres_params);
-               FWP_DEBUG("Sent vres params budget=%d period=%d ac=%d\n", 
-                               contdata->vres_params.budget,
-                               contdata->vres_params.period_usec,
-                               contdata->vres_params.ac_id);
-               fwp_msgb_put(msgb, sizeof(struct fwp_msg_vres_params));
-               /* Add contract to contract table */
-               fwp_contract_table_insert(&participant->contract_table,contdata);
-               FWP_DEBUG("Contract id=%d stored in table\n", contdata->id);
-
-       } else {
-               free(contdata);
-       }       
-       
-       fwp_mngt_send(FWP_MSG_RESERVE, msgb, 
-                       fwp_participant_this, participant);
+       *schedulable = scenario->num_contracts <= 3;
+       printf("=> %s\n", schedulable?"schedulable":"not schedulable");
+               
        return 0;
 }
-
-int 
-fwp_mngr_contract_commit(fwp_msgb_t *msgb, fwp_participant_id_t participant_id)
-{
-       fwp_participant_t *participant;
-       fwp_contract_data_t *contdata;
-       fwp_contract_id_t  id;
-       fwp_contract_status_t  status;
-
-       /* Find participant */
-       if (!(participant = fwp_participant_table_find(&participant_id))){
-               return -EPERM;
-       }
-
-       fwp_msg_contracthdr_out(msgb->data, &id, &status);
-       fwp_msgb_pull(msgb, sizeof(struct fwp_msg_contracthdr));
-       FWP_DEBUG("Contract id=%d to commit\n", contdata->id);
-       
-       contdata = fwp_contract_table_find(&participant->contract_table, id);
-       contdata->status = FWP_CONT_NEGOTIATED; 
-       
-       return 0;       
-}
-
-void fwp_mngr_msg_handler(fwp_msgb_t *msgb)
+#endif
+
+struct frm_fwp_priv priv = {
+       .rate_mbps = 1,
+       .erp_ofdm = false,
+       .short_preamble = false,
+};
+
+static const struct fres_res_manager frm = {
+       .res_type = FRSH_RT_NETWORK,
+       .res_id = FRSH_NETPF_FWP,
+       //.admission_test = dummy_admission_test,
+       .name = "WLAN",
+       .admission_test = fwp_admctrl_utilization,
+       .priv = &priv,
+};
+
+static struct option long_opts[] = {
+    { "loglevel",         required_argument, 0, 'l' },
+    { "bitrate",         required_argument, 0, 'b' },
+    { "ofdm",                    no_argument,       0, 'o' },
+    { "short-preamble",  no_argument,       0, 's' },
+    { 0, 0, 0, 0}
+};
+
+static void
+usage(void)
 {
-       fwp_msg_type_t msg_type;
-       fwp_participant_id_t    participant_id;
-
-       fwp_msg_header_out(msgb->data, &msg_type, &participant_id);
-       fwp_msgb_pull(msgb, sizeof(struct fwp_msg_header));
-       
-       switch (msg_type) {
-               case  FWP_MSG_HELLO:
-                       FWP_DEBUG("Message HELLO received from nodeid = %d "
-                                 "appid = %d\n", participant_id.node_id, 
-                                       participant_id.app_id);
-                       fwp_mngr_hello(msgb, participant_id);
-                       break;
-
-               case  FWP_MSG_RESERVE: 
-                       FWP_DEBUG("Message RESERVE received from nodeid = %d " 
-                                 "appid = %d\n", participant_id.node_id, 
-                                       participant_id.app_id);
-                       fwp_mngr_contract_reserve(msgb, participant_id);
-                       break;
-
-               case  FWP_MSG_COMMIT: 
-                       FWP_DEBUG("Message COMMIT received from nodeid = %d "
-                                 "appid = %d\n", participant_id.node_id, 
-                                       participant_id.app_id);
-                       fwp_mngr_contract_commit(msgb, participant_id);
-                       break;  
-               default:
-                       printf("Invalid message\n.");
-                       fwp_msgb_free(msgb);
-       }
+       printf("usage: fwpmngr [ options ]\n");
+       printf("  -l, --loglevel <number>|<domain>=<number>,...\n");
+       printf("  -b, --bitrate <mbits/s>\n");
+       printf("  -o, --ofdm\n");
+       printf("  -s, --short-preamble\n");
+       printf("  -h, --help\n");
 }
 
-void fwp_mngr_main_loop()
+int main(int argc, char *argv[])
 {
-       struct fwp_msgb *msgb;
-
-       /* start admission control thread */
-       while (1 /*exit_flag*/){
-               fwp_mngr_input(&msgb);
-               if (msgb)
-                       fwp_mngr_msg_handler(msgb);
-               FWP_DEBUG("Mngr waiting for next msg.\n");
+       forb_orb orb;
+       int ret;
+       forb_init_attr_t attr = { .orb_id = "org.frescor.frm.fwp" };
+       int  opt;
+       bool opt_daemon = false;
+       char *opt_pidfile = NULL;
+
+       if (getenv("FWP_BYPASS"))
+               priv.bypass = true;
+
+
+       while ((opt = getopt_long(argc, argv, "b:d:hl:os", &long_opts[0], NULL)) != EOF) {
+               switch (opt) {
+                       case 'd':
+                               opt_daemon = true;
+                               opt_pidfile = optarg;
+                               break;
+                       case 'l':
+                               ul_log_domain_arg2levels(optarg);
+                               break;
+                       case 'b':
+                               priv.rate_mbps = atol(optarg);
+                               break;
+                       case 's':
+                               priv.short_preamble = true;
+                               break;
+                       case 'o':
+                               priv.erp_ofdm = true;
+                               break;
+                       case 'h':
+                       /*default:*/
+                               usage();
+                               exit(opt == 'h' ? 0 : 1);
+               }
        }
-}
 
-int fwp_mngr_init()
-{
-       fwp_participant_info_t  my_info;
-       int rv;
+       if (opt_daemon)
+               forb_daemon_prepare(opt_pidfile);
 
-       if ((rv = fwp_endpoint_table_init(fwp_configuration.max_endpoints)) ||
-           (rv = fwp_vres_table_init(fwp_configuration.max_vres))) {
+       orb = forb_init(&argc, &argv, &attr);
+       if (!orb) error(1, errno, "forb_init");
+       
+       fres_block_register_fwp();
+       ret = frm_register_and_run(orb, &frm);
 
-               return rv;
+       if (ret != 0) {
+               error(1, errno, "frm_generic_run");
        }
        
-       /* Create fwp_participant_this */
-       my_info.id.node_id = inet_addr("127.0.0.1");
-       my_info.id.app_id = getpid();
-       my_info.stream_id = FWP_MNGR_STREAM_ID;
-
-       fwp_participant_this = fwp_participant_create(&my_info);
-       fwp_participant_mngr = fwp_participant_this;
-       fwp_receive_endpoint_create(my_info.stream_id, 0,
-                                       &fwp_participant_this->epointd);
-       FWP_DEBUG("Participant_this created node_id id= %d stream id= %d\n",
-                               fwp_participant_this->id.node_id,
-                              fwp_participant_this->stream_id);
        return 0;
-
 }
-
-int main()
-{
-       if (fwp_mngr_init()) {
-               fprintf(stderr,"FWP manager initialization failed.\n");
-               exit(1);
-       }
-
-       fwp_mngr_main_loop();
-       
-       return 0;       
-}