diff options
Diffstat (limited to 'src/ipcpd/normal')
| -rw-r--r-- | src/ipcpd/normal/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/connmgr.c | 4 | ||||
| -rw-r--r-- | src/ipcpd/normal/dht.c | 52 | ||||
| -rw-r--r-- | src/ipcpd/normal/dir.c | 4 | ||||
| -rw-r--r-- | src/ipcpd/normal/dt.c | 158 | ||||
| -rw-r--r-- | src/ipcpd/normal/dt.h | 11 | ||||
| -rw-r--r-- | src/ipcpd/normal/dt_const.h | 39 | ||||
| -rw-r--r-- | src/ipcpd/normal/dt_pci.c | 112 | ||||
| -rw-r--r-- | src/ipcpd/normal/dt_pci.h | 67 | ||||
| -rw-r--r-- | src/ipcpd/normal/enroll.c | 4 | ||||
| -rw-r--r-- | src/ipcpd/normal/fa.c | 96 | ||||
| -rw-r--r-- | src/ipcpd/normal/fa.h | 4 | ||||
| -rw-r--r-- | src/ipcpd/normal/main.c | 4 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/flat.c | 4 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/graph.c | 131 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/graph.h | 10 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/link_state.c | 41 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/tests/graph_test.c | 8 | ||||
| -rw-r--r-- | src/ipcpd/normal/psched.c (renamed from src/ipcpd/normal/sdu_sched.c) | 104 | ||||
| -rw-r--r-- | src/ipcpd/normal/psched.h (renamed from src/ipcpd/normal/sdu_sched.h) | 26 | 
20 files changed, 404 insertions, 478 deletions
| diff --git a/src/ipcpd/normal/CMakeLists.txt b/src/ipcpd/normal/CMakeLists.txt index 6dd68385..d1585395 100644 --- a/src/ipcpd/normal/CMakeLists.txt +++ b/src/ipcpd/normal/CMakeLists.txt @@ -37,13 +37,12 @@ set(SOURCE_FILES    dht.c    dir.c    dt.c -  dt_pci.c    enroll.c    fa.c    main.c    pff.c    routing.c -  sdu_sched.c +  psched.c    # Add policies last    pol/alternate_pff.c    pol/flat.c diff --git a/src/ipcpd/normal/connmgr.c b/src/ipcpd/normal/connmgr.c index bf07ebc4..7b71761f 100644 --- a/src/ipcpd/normal/connmgr.c +++ b/src/ipcpd/normal/connmgr.c @@ -20,7 +20,11 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#if defined(__linux__) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE +#else  #define _POSIX_C_SOURCE 200112L +#endif  #define OUROBOROS_PREFIX "connection-manager" diff --git a/src/ipcpd/normal/dht.c b/src/ipcpd/normal/dht.c index a6f1928b..4064bf5c 100644 --- a/src/ipcpd/normal/dht.c +++ b/src/ipcpd/normal/dht.c @@ -20,7 +20,11 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#if defined(__linux__) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE +#else  #define _POSIX_C_SOURCE 200112L +#endif  #include "config.h" @@ -58,21 +62,21 @@ typedef KadContactMsg kad_contact_msg_t;  #define CLOCK_REALTIME_COARSE CLOCK_REALTIME  #endif -#define DHT_MAX_REQS  2048 /* KAD recommends rnd(), bmp can be changed.  */ -#define KAD_ALPHA     3    /* Parallel factor, proven optimal value.     */ -#define KAD_K         8    /* Replication factor, MDHT value.            */ -#define KAD_T_REPL    900  /* Replication time, tied to k. MDHT value.   */ -#define KAD_T_REFR    900  /* Refresh time stale bucket, MDHT value.     */ -#define KAD_T_JOIN    8    /* Response time to wait for a join.          */ -#define KAD_T_RESP    5    /* Response time to wait for a response.      */ -#define KAD_R_PING    2    /* Ping retries before declaring peer dead.   */ -#define KAD_QUEER     15   /* Time to declare peer questionable.         */ -#define KAD_BETA      8    /* Bucket split factor, must be 1, 2, 4 or 8. */ -#define KAD_RESP_RETR 6    /* Number of retries on sending a response.   */ -#define KAD_JOIN_RETR 8    /* Number of retries sending a join.          */ -#define KAD_JOIN_INTV 1    /* Time (seconds) between join retries.       */ -#define HANDLE_TIMEO  1000 /* Timeout for dht_handle_sdu tpm check (ms)  */ -#define DHT_RETR_ADDR 1    /* Number of addresses to return on retrieve  */ +#define DHT_MAX_REQS  2048 /* KAD recommends rnd(), bmp can be changed.    */ +#define KAD_ALPHA     3    /* Parallel factor, proven optimal value.       */ +#define KAD_K         8    /* Replication factor, MDHT value.              */ +#define KAD_T_REPL    900  /* Replication time, tied to k. MDHT value.     */ +#define KAD_T_REFR    900  /* Refresh time stale bucket, MDHT value.       */ +#define KAD_T_JOIN    8    /* Response time to wait for a join.            */ +#define KAD_T_RESP    5    /* Response time to wait for a response.        */ +#define KAD_R_PING    2    /* Ping retries before declaring peer dead.     */ +#define KAD_QUEER     15   /* Time to declare peer questionable.           */ +#define KAD_BETA      8    /* Bucket split factor, must be 1, 2, 4 or 8.   */ +#define KAD_RESP_RETR 6    /* Number of retries on sending a response.     */ +#define KAD_JOIN_RETR 8    /* Number of retries sending a join.            */ +#define KAD_JOIN_INTV 1    /* Time (seconds) between join retries.         */ +#define HANDLE_TIMEO  1000 /* Timeout for dht_handle_packet tpm check (ms) */ +#define DHT_RETR_ADDR 1    /* Number of addresses to return on retrieve    */  enum dht_state {          DHT_INIT = 0, @@ -247,7 +251,7 @@ struct join_info {          uint64_t     addr;  }; -struct sdu_info { +struct packet_info {          struct dht *         dht;          struct shm_du_buff * sdb;  }; @@ -1485,7 +1489,7 @@ static int send_msg(struct dht * dht,                  kad_msg__pack(msg, shm_du_buff_head(sdb)); -                if (dt_write_sdu(addr, QOS_CUBE_BE, dht->fd, sdb) == 0) +                if (dt_write_packet(addr, QOS_CUBE_BE, dht->fd, sdb) == 0)                          break;                  ipcp_sdb_release(sdb); @@ -2396,7 +2400,7 @@ uint64_t dht_query(struct dht *    dht,          return 0;  } -static void * dht_handle_sdu(void * o) +static void * dht_handle_packet(void * o)  {          struct dht * dht = (struct dht *) o; @@ -2580,8 +2584,8 @@ static void * dht_handle_sdu(void * o)          return (void *) 0;  } -static void dht_post_sdu(void *               comp, -                         struct shm_du_buff * sdb) +static void dht_post_packet(void *               comp, +                            struct shm_du_buff * sdb)  {          struct cmd * cmd;          struct dht * dht = (struct dht *) comp; @@ -2796,19 +2800,19 @@ struct dht * dht_create(uint64_t addr)          dht->addr = addr;          dht->id   = NULL;  #ifndef __DHT_TEST__ -        dht->tpm = tpm_create(2, 1, dht_handle_sdu, dht); +        dht->tpm = tpm_create(2, 1, dht_handle_packet, dht);          if (dht->tpm == NULL)                  goto fail_tpm_create;          if (tpm_start(dht->tpm))                  goto fail_tpm_start; -        dht->fd   = dt_reg_comp(dht, &dht_post_sdu, DHT); +        dht->fd   = dt_reg_comp(dht, &dht_post_packet, DHT);          notifier_reg(handle_event, dht);  #else          (void) handle_event; -        (void) dht_handle_sdu; -        (void) dht_post_sdu; +        (void) dht_handle_packet; +        (void) dht_post_packet;  #endif          dht->state = DHT_INIT; diff --git a/src/ipcpd/normal/dir.c b/src/ipcpd/normal/dir.c index 345d220d..a195f016 100644 --- a/src/ipcpd/normal/dir.c +++ b/src/ipcpd/normal/dir.c @@ -20,7 +20,11 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#if defined(__linux__) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE +#else  #define _POSIX_C_SOURCE 200112L +#endif  #define OUROBOROS_PREFIX "directory" diff --git a/src/ipcpd/normal/dt.c b/src/ipcpd/normal/dt.c index b9d8934e..dc7343f1 100644 --- a/src/ipcpd/normal/dt.c +++ b/src/ipcpd/normal/dt.c @@ -20,15 +20,17 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#if defined(__linux__) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE +#else  #define _POSIX_C_SOURCE 200112L +#endif  #include "config.h"  #define DT               "dt"  #define OUROBOROS_PREFIX DT -/* FIXME: fix #defines and remove endian.h include. */ -#include <ouroboros/endian.h>  #include <ouroboros/bitmap.h>  #include <ouroboros/errno.h>  #include <ouroboros/logs.h> @@ -42,10 +44,9 @@  #include "connmgr.h"  #include "ipcp.h"  #include "dt.h" -#include "dt_pci.h"  #include "pff.h"  #include "routing.h" -#include "sdu_sched.h" +#include "psched.h"  #include "comp.h"  #include "fa.h" @@ -64,13 +65,96 @@  #endif  struct comp_info { -        void   (* post_sdu)(void * comp, struct shm_du_buff * sdb); +        void (* post_packet)(void * comp, struct shm_du_buff * sdb);          void * comp;          char * name;  }; +/* Abstract syntax */ +enum dtp_fields { +        DTP_DST = 0,   /* DST ADDRESS      */ +        DTP_QOS,       /* QOS ID           */ +        DTP_DEID,      /* DST Endpoint ID  */ +        DTP_TTL,       /* TTL FIELD        */ +        DTP_NUM_FIELDS /* Number of fields */ +}; + +/* Fixed field lengths */ +#define TTL_LEN 1 +#define QOS_LEN 1 + +struct dt_pci { +        uint64_t  dst_addr; +        qoscube_t qc; +        uint8_t   ttl; +        uint32_t  eid; +}; + +struct { +        uint8_t         addr_size; +        uint8_t         eid_size; +        size_t          head_size; + +        /* Offsets */ +        size_t          qc_o; +        size_t          ttl_o; +        size_t          eid_o; + +        /* Initial TTL value */ +        uint8_t         max_ttl; +} dt_pci_info; + +static int dt_pci_ser(struct shm_du_buff * sdb, +                      struct dt_pci *      dt_pci) +{ +        uint8_t * head; +        uint8_t   ttl = dt_pci_info.max_ttl; + +        assert(sdb); +        assert(dt_pci); + +        head = shm_du_buff_head_alloc(sdb, dt_pci_info.head_size); +        if (head == NULL) +                return -EPERM; + +        /* FIXME: Add check and operations for Big Endian machines. */ +        memcpy(head, &dt_pci->dst_addr, dt_pci_info.addr_size); +        memcpy(head + dt_pci_info.qc_o, &dt_pci->qc, QOS_LEN); +        memcpy(head + dt_pci_info.ttl_o, &ttl, TTL_LEN); +        memcpy(head + dt_pci_info.eid_o, &dt_pci->eid, dt_pci_info.eid_size); + +        return 0; +} + +static void dt_pci_des(struct shm_du_buff * sdb, +                       struct dt_pci *      dt_pci) +{ +        uint8_t * head; + +        assert(sdb); +        assert(dt_pci); + +        head = shm_du_buff_head(sdb); + +        /* Decrease TTL */ +        --*(head + dt_pci_info.ttl_o); + +        /* FIXME: Add check and operations for Big Endian machines. */ +        memcpy(&dt_pci->dst_addr, head, dt_pci_info.addr_size); +        memcpy(&dt_pci->qc, head + dt_pci_info.qc_o, QOS_LEN); +        memcpy(&dt_pci->ttl, head + dt_pci_info.ttl_o, TTL_LEN); +        memcpy(&dt_pci->eid, head + dt_pci_info.eid_o, dt_pci_info.eid_size); +} + +static void dt_pci_shrink(struct shm_du_buff * sdb) +{ +        assert(sdb); + +        shm_du_buff_head_release(sdb, dt_pci_info.head_size); +} +  struct { -        struct sdu_sched * sdu_sched; +        struct psched *    psched;          struct pff *       pff[QOS_CUBE_MAX];          struct routing_i * routing[QOS_CUBE_MAX]; @@ -337,24 +421,25 @@ static void handle_event(void *       self,  #ifdef IPCP_FLOW_STATS                  stat_used(c->flow_info.fd, c->conn_info.addr);  #endif -                sdu_sched_add(dt.sdu_sched, c->flow_info.fd); -                log_dbg("Added fd %d to SDU scheduler.", c->flow_info.fd); +                psched_add(dt.psched, c->flow_info.fd); +                log_dbg("Added fd %d to packet scheduler.", c->flow_info.fd);                  break;          case NOTIFY_DT_CONN_DEL:  #ifdef IPCP_FLOW_STATS                  stat_used(c->flow_info.fd, INVALID_ADDR);  #endif -                sdu_sched_del(dt.sdu_sched, c->flow_info.fd); -                log_dbg("Removed fd %d from SDU scheduler.", c->flow_info.fd); +                psched_del(dt.psched, c->flow_info.fd); +                log_dbg("Removed fd %d from " +                        "packet scheduler.", c->flow_info.fd);                  break;          default:                  break;          }  } -static void sdu_handler(int                  fd, -                        qoscube_t            qc, -                        struct shm_du_buff * sdb) +static void packet_handler(int                  fd, +                           qoscube_t            qc, +                           struct shm_du_buff * sdb)  {          struct dt_pci dt_pci;          int           ret; @@ -407,7 +492,7 @@ static void sdu_handler(int                  fd,                  ret = ipcp_flow_write(ofd, sdb);                  if (ret < 0) { -                        log_dbg("Failed to write SDU to fd %d.", ofd); +                        log_dbg("Failed to write packet to fd %d.", ofd);                          if (ret == -EFLOWDOWN)                                  notifier_event(NOTIFY_DT_FLOW_DOWN, &ofd);                          ipcp_sdb_release(sdb); @@ -476,7 +561,7 @@ static void sdu_handler(int                  fd,                          return;                  } -                if (dt.comps[dt_pci.eid].post_sdu == NULL) { +                if (dt.comps[dt_pci.eid].post_packet == NULL) {                          log_err("No registered component on eid %d.",                                  dt_pci.eid);                          ipcp_sdb_release(sdb); @@ -512,7 +597,8 @@ static void sdu_handler(int                  fd,                  pthread_mutex_unlock(&dt.stat[dt_pci.eid].lock);  #endif -                dt.comps[dt_pci.eid].post_sdu(dt.comps[dt_pci.eid].comp, sdb); +                dt.comps[dt_pci.eid].post_packet(dt.comps[dt_pci.eid].comp, +                                                 sdb);          }  } @@ -555,10 +641,14 @@ int dt_init(enum pol_routing pr,          info.pref_syntax  = PROTO_FIXED;          info.addr         = ipcpi.dt_addr; -        if (dt_pci_init(addr_size, eid_size, max_ttl)) { -                log_err("Failed to init shm dt_pci."); -                goto fail_pci_init; -        } +        dt_pci_info.addr_size = addr_size; +        dt_pci_info.eid_size  = eid_size; +        dt_pci_info.max_ttl   = max_ttl; + +        dt_pci_info.qc_o      = dt_pci_info.addr_size; +        dt_pci_info.ttl_o     = dt_pci_info.qc_o + QOS_LEN; +        dt_pci_info.eid_o     = dt_pci_info.ttl_o + TTL_LEN; +        dt_pci_info.head_size = dt_pci_info.eid_o + dt_pci_info.eid_size;          if (notifier_reg(handle_event, NULL)) {                  log_err("Failed to register with notifier."); @@ -642,8 +732,6 @@ int dt_init(enum pol_routing pr,   fail_connmgr_comp_init:          notifier_unreg(&handle_event);   fail_notifier_reg: -        dt_pci_fini(); - fail_pci_init:          return -1;  } @@ -671,21 +759,19 @@ void dt_fini(void)          connmgr_comp_fini(COMPID_DT);          notifier_unreg(&handle_event); - -        dt_pci_fini();  }  int dt_start(void)  { -        dt.sdu_sched = sdu_sched_create(sdu_handler); -        if (dt.sdu_sched == NULL) { -                log_err("Failed to create N-1 SDU scheduler."); +        dt.psched = psched_create(packet_handler); +        if (dt.psched == NULL) { +                log_err("Failed to create N-1 packet scheduler.");                  return -1;          }          if (pthread_create(&dt.listener, NULL, dt_conn_handle, NULL)) {                  log_err("Failed to create listener thread."); -                sdu_sched_destroy(dt.sdu_sched); +                psched_destroy(dt.psched);                  return -1;          } @@ -696,7 +782,7 @@ void dt_stop(void)  {          pthread_cancel(dt.listener);          pthread_join(dt.listener, NULL); -        sdu_sched_destroy(dt.sdu_sched); +        psched_destroy(dt.psched);  }  int dt_reg_comp(void * comp, @@ -716,11 +802,11 @@ int dt_reg_comp(void * comp,                  return -EBADF;          } -        assert(dt.comps[res_fd].post_sdu == NULL); +        assert(dt.comps[res_fd].post_packet == NULL);          assert(dt.comps[res_fd].comp == NULL);          assert(dt.comps[res_fd].name == NULL); -        dt.comps[res_fd].post_sdu = func; +        dt.comps[res_fd].post_packet = func;          dt.comps[res_fd].comp     = comp;          dt.comps[res_fd].name     = name; @@ -731,10 +817,10 @@ int dt_reg_comp(void * comp,          return res_fd;  } -int dt_write_sdu(uint64_t             dst_addr, -                 qoscube_t            qc, -                 int                  np1_fd, -                 struct shm_du_buff * sdb) +int dt_write_packet(uint64_t             dst_addr, +                    qoscube_t            qc, +                    int                  np1_fd, +                    struct shm_du_buff * sdb)  {          int           fd;          struct dt_pci dt_pci; @@ -779,7 +865,7 @@ int dt_write_sdu(uint64_t             dst_addr,  #endif          ret = ipcp_flow_write(fd, sdb);          if (ret < 0) { -                log_dbg("Failed to write SDU to fd %d.", fd); +                log_dbg("Failed to write packet to fd %d.", fd);                  if (ret == -EFLOWDOWN)                          notifier_event(NOTIFY_DT_FLOW_DOWN, &fd);                  goto fail_write; diff --git a/src/ipcpd/normal/dt.h b/src/ipcpd/normal/dt.h index e0bbe3f3..b74e84b0 100644 --- a/src/ipcpd/normal/dt.h +++ b/src/ipcpd/normal/dt.h @@ -24,10 +24,9 @@  #define OUROBOROS_IPCPD_NORMAL_DT_H  #include <ouroboros/ipcp.h> +#include <ouroboros/qoscube.h>  #include <ouroboros/shm_rdrbuff.h> -#include "dt_pci.h" -  #define DT_COMP      "Data Transfer"  #define DT_PROTO     "dtp"  #define INVALID_ADDR 0 @@ -49,9 +48,9 @@ int  dt_reg_comp(void * comp,                   void (* func)(void * comp, struct shm_du_buff * sdb),                   char * name); -int  dt_write_sdu(uint64_t             dst_addr, -                  qoscube_t            qc, -                  int                  res_fd, -                  struct shm_du_buff * sdb); +int  dt_write_packet(uint64_t             dst_addr, +                     qoscube_t            qc, +                     int                  res_fd, +                     struct shm_du_buff * sdb);  #endif /* OUROBOROS_IPCPD_NORMAL_DT_H */ diff --git a/src/ipcpd/normal/dt_const.h b/src/ipcpd/normal/dt_const.h deleted file mode 100644 index fb005f06..00000000 --- a/src/ipcpd/normal/dt_const.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - 2018 - * - * Data Transfer Constants for the IPCP - * - *    Dimitri Staessens <dimitri.staessens@ugent.be> - *    Sander Vrijders   <sander.vrijders@ugent.be> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., http://www.fsf.org/about/contact/. - */ - -#ifndef OUROBOROS_IPCPD_NORMAL_DT_CONST_H -#define OUROBOROS_IPCPD_NORMAL_DT_CONST_H - -#include <stdint.h> -#include <stdbool.h> - -struct dt_const { -        uint8_t  addr_size; -        uint8_t  cep_id_size; -        uint8_t  seqno_size; -        bool     has_ttl; -        bool     has_chk; -        uint32_t min_pdu_size; -        uint32_t max_pdu_size; -}; - -#endif /* OUROBOROS_IPCPD_NORMAL_DT_CONST_H */ diff --git a/src/ipcpd/normal/dt_pci.c b/src/ipcpd/normal/dt_pci.c deleted file mode 100644 index 76304668..00000000 --- a/src/ipcpd/normal/dt_pci.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - 2018 - * - * Protocol Control Information of Data Transfer Component - * - *    Dimitri Staessens <dimitri.staessens@ugent.be> - *    Sander Vrijders   <sander.vrijders@ugent.be> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., http://www.fsf.org/about/contact/. - */ - -#include <ouroboros/errno.h> - -#include "dt_pci.h" - -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -struct { -        uint8_t         addr_size; -        uint8_t         eid_size; -        size_t          head_size; - -        /* Offsets */ -        size_t          qc_o; -        size_t          ttl_o; -        size_t          eid_o; - -        /* Initial TTL value */ -        uint8_t         max_ttl; -} dt_pci_info; - -int dt_pci_init(uint8_t addr_size, -                uint8_t eid_size, -                uint8_t max_ttl) -{ -        dt_pci_info.addr_size = addr_size; -        dt_pci_info.eid_size  = eid_size; -        dt_pci_info.max_ttl   = max_ttl; - -        dt_pci_info.qc_o      = dt_pci_info.addr_size; -        dt_pci_info.ttl_o     = dt_pci_info.qc_o + QOS_LEN; -        dt_pci_info.eid_o     = dt_pci_info.ttl_o + TTL_LEN; -        dt_pci_info.head_size = dt_pci_info.eid_o + dt_pci_info.eid_size; - -        return 0; -} - -void dt_pci_fini(void) { -        return; -} - -int dt_pci_ser(struct shm_du_buff * sdb, -               struct dt_pci *      dt_pci) -{ -        uint8_t * head; -        uint8_t   ttl = dt_pci_info.max_ttl; - -        assert(sdb); -        assert(dt_pci); - -        head = shm_du_buff_head_alloc(sdb, dt_pci_info.head_size); -        if (head == NULL) -                return -EPERM; - -        /* FIXME: Add check and operations for Big Endian machines. */ -        memcpy(head, &dt_pci->dst_addr, dt_pci_info.addr_size); -        memcpy(head + dt_pci_info.qc_o, &dt_pci->qc, QOS_LEN); -        memcpy(head + dt_pci_info.ttl_o, &ttl, TTL_LEN); -        memcpy(head + dt_pci_info.eid_o, &dt_pci->eid, dt_pci_info.eid_size); - -        return 0; -} - -void dt_pci_des(struct shm_du_buff * sdb, -                struct dt_pci *      dt_pci) -{ -        uint8_t * head; - -        assert(sdb); -        assert(dt_pci); - -        head = shm_du_buff_head(sdb); - -        /* Decrease TTL */ -        --*(head + dt_pci_info.ttl_o); - -        /* FIXME: Add check and operations for Big Endian machines. */ -        memcpy(&dt_pci->dst_addr, head, dt_pci_info.addr_size); -        memcpy(&dt_pci->qc, head + dt_pci_info.qc_o, QOS_LEN); -        memcpy(&dt_pci->ttl, head + dt_pci_info.ttl_o, TTL_LEN); -        memcpy(&dt_pci->eid, head + dt_pci_info.eid_o, dt_pci_info.eid_size); -} - -void dt_pci_shrink(struct shm_du_buff * sdb) -{ -        assert(sdb); - -        shm_du_buff_head_release(sdb, dt_pci_info.head_size); -} diff --git a/src/ipcpd/normal/dt_pci.h b/src/ipcpd/normal/dt_pci.h deleted file mode 100644 index 8022f84a..00000000 --- a/src/ipcpd/normal/dt_pci.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Ouroboros - Copyright (C) 2016 - 2018 - * - * Protocol Control Information of Data Transfer Component - * - *    Dimitri Staessens <dimitri.staessens@ugent.be> - *    Sander Vrijders   <sander.vrijders@ugent.be> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., http://www.fsf.org/about/contact/. - */ - -#ifndef OUROBOROS_IPCPD_NORMAL_DT_PCI_H -#define OUROBOROS_IPCPD_NORMAL_DT_PCI_H - -#include <ouroboros/shm_du_buff.h> -#include <ouroboros/proto.h> -#include <ouroboros/qoscube.h> - -#include <stdint.h> -#include <stdbool.h> - -/* Abstract syntax */ -enum dtp_fields { -        DTP_DST = 0,   /* DST ADDRESS      */ -        DTP_QOS,       /* QOS ID           */ -        DTP_DEID,      /* DST Endpoint ID  */ -        DTP_TTL,       /* TTL FIELD        */ -        DTP_NUM_FIELDS /* Number of fields */ -}; - -/* Fixed field lengths */ -#define TTL_LEN 1 -#define QOS_LEN 1 - -struct dt_pci { -        uint64_t  dst_addr; -        qoscube_t qc; -        uint8_t   ttl; -        uint32_t  eid; -}; - -int   dt_pci_init(uint8_t addr_size, -                  uint8_t eid_size, -                  uint8_t max_ttl); - -void  dt_pci_fini(void); - -int   dt_pci_ser(struct shm_du_buff * sdb, -                 struct dt_pci *      dt_pci); - -void  dt_pci_des(struct shm_du_buff * sdb, -                 struct dt_pci *      dt_pci); - -void  dt_pci_shrink(struct shm_du_buff * sdb); - -#endif /* OUROBOROS_IPCPD_NORMAL_DT_PCI_H */ diff --git a/src/ipcpd/normal/enroll.c b/src/ipcpd/normal/enroll.c index a321db2b..78305ff0 100644 --- a/src/ipcpd/normal/enroll.c +++ b/src/ipcpd/normal/enroll.c @@ -20,7 +20,11 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#if defined(__linux__) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE +#else  #define _POSIX_C_SOURCE 199309L +#endif  #define OUROBOROS_PREFIX "enrollment" diff --git a/src/ipcpd/normal/fa.c b/src/ipcpd/normal/fa.c index 067a6e73..027223b7 100644 --- a/src/ipcpd/normal/fa.c +++ b/src/ipcpd/normal/fa.c @@ -20,7 +20,11 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#if defined(__linux__) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE +#else  #define _POSIX_C_SOURCE 200112L +#endif  #include "config.h" @@ -34,9 +38,8 @@  #include <ouroboros/ipcp-dev.h>  #include "dir.h" -#include "dt_pci.h"  #include "fa.h" -#include "sdu_sched.h" +#include "psched.h"  #include "ipcp.h"  #include "dt.h" @@ -54,8 +57,15 @@ struct fa_msg {          uint32_t r_eid;          uint32_t s_eid;          uint8_t  code; -        uint8_t  qc;          int8_t   response; +        /* QoS parameters from spec, aligned */ +        uint8_t  availability; +        uint8_t  in_order; +        uint32_t delay; +        uint64_t bandwidth; +        uint32_t loss; +        uint32_t ber; +        uint32_t max_gap;  } __attribute__((packed));  struct { @@ -64,19 +74,19 @@ struct {          uint64_t           r_addr[PROG_MAX_FLOWS];          int                fd; -        struct sdu_sched * sdu_sched; +        struct psched *    psched;  } fa; -static void sdu_handler(int                  fd, -                        qoscube_t            qc, -                        struct shm_du_buff * sdb) +static void packet_handler(int                  fd, +                           qoscube_t            qc, +                           struct shm_du_buff * sdb)  {          pthread_rwlock_rdlock(&fa.flows_lock); -        if (dt_write_sdu(fa.r_addr[fd], qc, fa.r_eid[fd], sdb)) { +        if (dt_write_packet(fa.r_addr[fd], qc, fa.r_eid[fd], sdb)) {                  pthread_rwlock_unlock(&fa.flows_lock);                  ipcp_sdb_release(sdb); -                log_warn("Failed to forward SDU."); +                log_warn("Failed to forward packet.");                  return;          } @@ -89,7 +99,7 @@ static void destroy_conn(int fd)          fa.r_addr[fd] = INVALID_ADDR;  } -static void fa_post_sdu(void *               comp, +static void fa_post_packet(void *               comp,                          struct shm_du_buff * sdb)  {          struct timespec ts  = {0, TIMEOUT * 1000}; @@ -97,6 +107,7 @@ static void fa_post_sdu(void *               comp,          int             fd;          uint8_t *       buf;          struct fa_msg * msg; +        qosspec_t       qs;          (void) comp; @@ -139,10 +150,18 @@ static void fa_post_sdu(void *               comp,                  assert(ipcpi.alloc_id == -1); +                qs.delay        = ntoh32(msg->delay); +                qs.bandwidth    = ntoh64(msg->bandwidth); +                qs.availability = msg->availability; +                qs.loss         = ntoh32(msg->loss); +                qs.ber          = ntoh32(msg->ber); +                qs.in_order     = msg->in_order; +                qs.max_gap      = ntoh32(msg->max_gap); +                  fd = ipcp_flow_req_arr(getpid(),                                         (uint8_t *) (msg + 1),                                         ipcp_dir_hash_len(), -                                       msg->qc); +                                       qs);                  if (fd < 0) {                          pthread_mutex_unlock(&ipcpi.alloc_lock);                          log_err("Failed to get fd for flow."); @@ -152,8 +171,8 @@ static void fa_post_sdu(void *               comp,                  pthread_rwlock_wrlock(&fa.flows_lock); -                fa.r_eid[fd]  = msg->s_eid; -                fa.r_addr[fd] = msg->s_addr; +                fa.r_eid[fd]  = ntoh32(msg->s_eid); +                fa.r_addr[fd] = ntoh64(msg->s_addr);                  pthread_rwlock_unlock(&fa.flows_lock); @@ -166,14 +185,14 @@ static void fa_post_sdu(void *               comp,          case FLOW_REPLY:                  pthread_rwlock_wrlock(&fa.flows_lock); -                fa.r_eid[msg->r_eid] = msg->s_eid; +                fa.r_eid[ntoh32(msg->r_eid)] = ntoh32(msg->s_eid); -                ipcp_flow_alloc_reply(msg->r_eid, msg->response); +                ipcp_flow_alloc_reply(ntoh32(msg->r_eid), msg->response);                  if (msg->response < 0) -                        destroy_conn(msg->r_eid); +                        destroy_conn(ntoh32(msg->r_eid));                  else -                        sdu_sched_add(fa.sdu_sched, msg->r_eid); +                        psched_add(fa.psched, ntoh32(msg->r_eid));                  pthread_rwlock_unlock(&fa.flows_lock); @@ -196,7 +215,7 @@ int fa_init(void)          if (pthread_rwlock_init(&fa.flows_lock, NULL))                  return -1; -        fa.fd = dt_reg_comp(&fa, &fa_post_sdu, FA); +        fa.fd = dt_reg_comp(&fa, &fa_post_packet, FA);          return 0;  } @@ -208,9 +227,9 @@ void fa_fini(void)  int fa_start(void)  { -        fa.sdu_sched = sdu_sched_create(sdu_handler); -        if (fa.sdu_sched == NULL) { -                log_err("Failed to create SDU scheduler."); +        fa.psched = psched_create(packet_handler); +        if (fa.psched == NULL) { +                log_err("Failed to create packet scheduler.");                  return -1;          } @@ -219,16 +238,17 @@ int fa_start(void)  void fa_stop(void)  { -        sdu_sched_destroy(fa.sdu_sched); +        psched_destroy(fa.psched);  }  int fa_alloc(int             fd,               const uint8_t * dst, -             qoscube_t       qc) +             qosspec_t       qs)  {          struct fa_msg *      msg;          uint64_t             addr;          struct shm_du_buff * sdb; +        qoscube_t            qc;          addr = dir_query(dst);          if (addr == 0) @@ -237,15 +257,23 @@ int fa_alloc(int             fd,          if (ipcp_sdb_reserve(&sdb, sizeof(*msg) + ipcp_dir_hash_len()))                  return -1; -        msg         = (struct fa_msg *) shm_du_buff_head(sdb); -        msg->code   = FLOW_REQ; -        msg->qc     = qc; -        msg->s_eid  = fd; -        msg->s_addr = ipcpi.dt_addr; +        msg               = (struct fa_msg *) shm_du_buff_head(sdb); +        msg->code         = FLOW_REQ; +        msg->s_eid        = hton32(fd); +        msg->s_addr       = hton64(ipcpi.dt_addr); +        msg->delay        = hton32(qs.delay); +        msg->bandwidth    = hton64(qs.bandwidth); +        msg->availability = qs.availability; +        msg->loss         = hton32(qs.loss); +        msg->ber          = hton32(qs.ber); +        msg->in_order     = qs.in_order; +        msg->max_gap      = hton32(qs.max_gap);          memcpy(msg + 1, dst, ipcp_dir_hash_len()); -        if (dt_write_sdu(addr, qc, fa.fd, sdb)) { +        qc = qos_spec_to_cube(qs); + +        if (dt_write_packet(addr, qc, fa.fd, sdb)) {                  ipcp_sdb_release(sdb);                  return -1;          } @@ -299,22 +327,22 @@ int fa_alloc_resp(int fd,          msg           = (struct fa_msg *) shm_du_buff_head(sdb);          msg->code     = FLOW_REPLY; -        msg->r_eid    = fa.r_eid[fd]; -        msg->s_eid    = fd; +        msg->r_eid    = hton32(fa.r_eid[fd]); +        msg->s_eid    = hton32(fd);          msg->response = response;          if (response < 0) {                  destroy_conn(fd);                  ipcp_sdb_release(sdb);          } else { -                sdu_sched_add(fa.sdu_sched, fd); +                psched_add(fa.psched, fd);          }          ipcp_flow_get_qoscube(fd, &qc);          assert(qc >= 0 && qc < QOS_CUBE_MAX); -        if (dt_write_sdu(fa.r_addr[fd], qc, fa.fd, sdb)) { +        if (dt_write_packet(fa.r_addr[fd], qc, fa.fd, sdb)) {                  destroy_conn(fd);                  pthread_rwlock_unlock(&fa.flows_lock);                  ipcp_sdb_release(sdb); @@ -332,7 +360,7 @@ int fa_dealloc(int fd)          pthread_rwlock_wrlock(&fa.flows_lock); -        sdu_sched_del(fa.sdu_sched, fd); +        psched_del(fa.psched, fd);          destroy_conn(fd); diff --git a/src/ipcpd/normal/fa.h b/src/ipcpd/normal/fa.h index 87819d6f..6a836e17 100644 --- a/src/ipcpd/normal/fa.h +++ b/src/ipcpd/normal/fa.h @@ -23,7 +23,7 @@  #ifndef OUROBOROS_IPCPD_NORMAL_FA_H  #define OUROBOROS_IPCPD_NORMAL_FA_H -#include <ouroboros/qoscube.h> +#include <ouroboros/qos.h>  #include <ouroboros/utils.h>  int  fa_init(void); @@ -36,7 +36,7 @@ void fa_stop(void);  int  fa_alloc(int             fd,                const uint8_t * dst, -              qoscube_t       qos); +              qosspec_t       qs);  int  fa_alloc_resp(int fd,                     int response); diff --git a/src/ipcpd/normal/main.c b/src/ipcpd/normal/main.c index b131bbb6..3f05f421 100644 --- a/src/ipcpd/normal/main.c +++ b/src/ipcpd/normal/main.c @@ -20,7 +20,11 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#if defined(__linux__) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE +#else  #define _POSIX_C_SOURCE 200809L +#endif  #include "config.h" diff --git a/src/ipcpd/normal/pol/flat.c b/src/ipcpd/normal/pol/flat.c index cab74159..89b7fff6 100644 --- a/src/ipcpd/normal/pol/flat.c +++ b/src/ipcpd/normal/pol/flat.c @@ -20,7 +20,11 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#if defined(__linux__) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE +#else  #define _POSIX_C_SOURCE 200112L +#endif  #define OUROBOROS_PREFIX "flat-addr-auth" diff --git a/src/ipcpd/normal/pol/graph.c b/src/ipcpd/normal/pol/graph.c index f3c053ab..ec0917c5 100644 --- a/src/ipcpd/normal/pol/graph.c +++ b/src/ipcpd/normal/pol/graph.c @@ -20,7 +20,11 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#if defined(__linux__) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE +#else  #define _POSIX_C_SOURCE 200112L +#endif  #define OUROBOROS_PREFIX "graph" @@ -547,27 +551,6 @@ static int graph_routing_table_simple(struct graph *     graph,          return -1;  } -int graph_routing_table(struct graph *     graph, -                        uint64_t           s_addr, -                        struct list_head * table) -{ -        int   ret = 0; -        int * dist; - -        assert(graph); -        assert(table); - -        pthread_mutex_lock(&graph->lock); - -        ret = graph_routing_table_simple(graph, s_addr, table, &dist); - -        free(dist); - -        pthread_mutex_unlock(&graph->lock); - -        return ret; -} -  static int add_lfa_to_table(struct list_head * table,                              uint64_t           addr,                              uint64_t           lfa) @@ -595,9 +578,10 @@ static int add_lfa_to_table(struct list_head * table,          return -1;  } -int graph_routing_table_lfa(struct graph *     graph, -                            uint64_t           s_addr, -                            struct list_head * table) +int graph_routing_table(struct graph *     graph, +                        enum routing_algo  algo, +                        uint64_t           s_addr, +                        struct list_head * table)  {          int *              s_dist;          int *              n_dist[PROG_MAX_FLOWS]; @@ -617,66 +601,82 @@ int graph_routing_table_lfa(struct graph *     graph,          pthread_mutex_lock(&graph->lock); -        for (j = 0; j < PROG_MAX_FLOWS; j++) { -                n_dist[j] = NULL; -                n_index[j] = -1; -                addrs[j] = -1; -        } -          /* Get the normal next hops routing table. */          if (graph_routing_table_simple(graph, s_addr, table, &s_dist))                  goto fail_table_simple; -        list_for_each(p, &graph->vertices) { -                v = list_entry(p, struct vertex, next); +        /* Possibly augment the routing table. */ +        switch (algo) { +        case ROUTING_SIMPLE: +                break; +        case ROUTING_LFA: +                for (j = 0; j < PROG_MAX_FLOWS; j++) { +                        n_dist[j] = NULL; +                        n_index[j] = -1; +                        addrs[j] = -1; +                } -                if (v->addr != s_addr) -                        continue; +                list_for_each(p, &graph->vertices) { +                        v = list_entry(p, struct vertex, next); -                /* Get the distances for every neighbor of the source. */ -                list_for_each(q, &v->edges) { -                        e = list_entry(q, struct edge, next); +                        if (v->addr != s_addr) +                                continue; -                        addrs[i] = e->nb->addr; -                        n_index[i] = e->nb->index; -                        if (dijkstra(graph, e->nb->addr, -                                     &nhops, &(n_dist[i++]))) -                                goto fail_dijkstra; +                        /* +                         * Get the distances for every neighbor +                         * of the source. +                         */ +                        list_for_each(q, &v->edges) { +                                e = list_entry(q, struct edge, next); -                        free(nhops); -                } +                                addrs[i] = e->nb->addr; +                                n_index[i] = e->nb->index; +                                if (dijkstra(graph, e->nb->addr, +                                             &nhops, &(n_dist[i++]))) +                                        goto fail_dijkstra; -                break; -        } +                                free(nhops); +                        } -        /* Loop though all nodes to see if we have a LFA for them. */ -        list_for_each(p, &graph->vertices) { -                v = list_entry(p, struct vertex, next); +                        break; +                } -                if (v->addr == s_addr) -                        continue; +                /* Loop though all nodes to see if we have a LFA for them. */ +                list_for_each(p, &graph->vertices) { +                        v = list_entry(p, struct vertex, next); -                /* -                 * Check for every neighbor if dist(neighbor, destination) < -                 * dist(neighbor, source) + dist(source, destination). -                 */ -                for (j = 0; j < i; j++) { -                        /* Exclude ourselves. */ -                        if (addrs[j] == v->addr) +                        if (v->addr == s_addr)                                  continue; -                        if (n_dist[j][v->index] < -                            s_dist[n_index[j]] + s_dist[v->index]) -                                if (add_lfa_to_table(table, v->addr, addrs[j])) -                                        goto fail_add_lfa; +                        /* +                         * Check for every neighbor if +                         * dist(neighbor, destination) < +                         * dist(neighbor, source) + dist(source, destination). +                         */ +                        for (j = 0; j < i; j++) { +                                /* Exclude ourselves. */ +                                if (addrs[j] == v->addr) +                                        continue; + +                                if (n_dist[j][v->index] < +                                    s_dist[n_index[j]] + s_dist[v->index]) +                                        if (add_lfa_to_table(table, v->addr, +                                                             addrs[j])) +                                                goto fail_add_lfa; +                        }                  } + +                for (j = 0; j < i; j++) +                        free(n_dist[j]); + +                break; +        default: +                log_err("Unsupported algorithm."); +                goto fail_algo;          }          pthread_mutex_unlock(&graph->lock); -        for (j = 0; j < i; j++) -                free(n_dist[j]); -          free(s_dist);          return 0; @@ -686,6 +686,7 @@ int graph_routing_table_lfa(struct graph *     graph,                  free(n_dist[k]);   fail_dijkstra:          free_routing_table(table); + fail_algo:          free(s_dist);   fail_table_simple:          pthread_mutex_unlock(&graph->lock); diff --git a/src/ipcpd/normal/pol/graph.h b/src/ipcpd/normal/pol/graph.h index 13657fd0..7cd14ad6 100644 --- a/src/ipcpd/normal/pol/graph.h +++ b/src/ipcpd/normal/pol/graph.h @@ -28,6 +28,11 @@  #include <inttypes.h> +enum routing_algo { +         ROUTING_SIMPLE = 0, +         ROUTING_LFA +}; +  struct nhop {          struct list_head next;          uint64_t         nhop; @@ -53,13 +58,10 @@ int            graph_del_edge(struct graph * graph,                                uint64_t       d_addr);  int            graph_routing_table(struct graph *     graph, +                                   enum routing_algo  algo,                                     uint64_t           s_addr,                                     struct list_head * table); -int            graph_routing_table_lfa(struct graph *     graph, -                                       uint64_t           s_addr, -                                       struct list_head * table); -  void           graph_free_routing_table(struct graph *     graph,                                          struct list_head * table); diff --git a/src/ipcpd/normal/pol/link_state.c b/src/ipcpd/normal/pol/link_state.c index 1c418ffc..e2e9eab5 100644 --- a/src/ipcpd/normal/pol/link_state.c +++ b/src/ipcpd/normal/pol/link_state.c @@ -20,7 +20,11 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#if defined(__linux__) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE +#else  #define _POSIX_C_SOURCE 200112L +#endif  #include "config.h" @@ -101,30 +105,26 @@ struct nb {          enum nb_type     type;  }; -typedef int (* rtable_fn_t)(struct graph *     graph, -                            uint64_t           s_addr, -                            struct list_head * table); -  struct { -        struct list_head nbs; -        size_t           nbs_len; -        fset_t *         mgmt_set; +        struct list_head  nbs; +        size_t            nbs_len; +        fset_t *          mgmt_set; -        struct list_head db; -        size_t           db_len; +        struct list_head  db; +        size_t            db_len; -        pthread_rwlock_t db_lock; +        pthread_rwlock_t  db_lock; -        struct graph *   graph; +        struct graph *    graph; -        pthread_t        lsupdate; -        pthread_t        lsreader; -        pthread_t        listener; +        pthread_t         lsupdate; +        pthread_t         lsreader; +        pthread_t         listener; -        struct list_head routing_instances; -        pthread_mutex_t  routing_i_lock; +        struct list_head  routing_instances; +        pthread_mutex_t   routing_i_lock; -        rtable_fn_t      rtable; +        enum routing_algo routing_algo;  } ls;  struct pol_routing_ops link_state_ops = { @@ -500,7 +500,8 @@ static void calculate_pff(struct routing_i * instance)          struct list_head * q;          int                fds[PROG_MAX_FLOWS]; -        if (ls.rtable(ls.graph, ipcpi.dt_addr, &table)) +        if (graph_routing_table(ls.graph, ls.routing_algo, +                                ipcpi.dt_addr, &table))                  return;          pff_lock(instance->pff); @@ -902,11 +903,11 @@ int link_state_init(enum pol_routing pr)          switch (pr) {          case ROUTING_LINK_STATE:                  log_dbg("Using link state routing policy."); -                ls.rtable = graph_routing_table; +                ls.routing_algo = ROUTING_SIMPLE;                  break;          case ROUTING_LINK_STATE_LFA:                  log_dbg("Using Loop-Free Alternates policy."); -                ls.rtable = graph_routing_table_lfa; +                ls.routing_algo = ROUTING_LFA;                  break;          default:                  goto fail_graph; diff --git a/src/ipcpd/normal/pol/tests/graph_test.c b/src/ipcpd/normal/pol/tests/graph_test.c index d226398c..8050f73a 100644 --- a/src/ipcpd/normal/pol/tests/graph_test.c +++ b/src/ipcpd/normal/pol/tests/graph_test.c @@ -39,7 +39,7 @@ int graph_test_entries(int entries)          struct list_head * p;          int                i = 0; -        if (graph_routing_table(graph, 1, &table)) { +        if (graph_routing_table(graph, ROUTING_SIMPLE, 1, &table)) {                  printf("Failed to get routing table.\n");                  return -1;          } @@ -63,7 +63,7 @@ int graph_test_double_link(void)          struct list_head * p;          int                i = 0; -        if (graph_routing_table(graph, 1, &table)) { +        if (graph_routing_table(graph, ROUTING_SIMPLE, 1, &table)) {                  printf("Failed to get routing table.\n");                  return -1;          } @@ -101,7 +101,7 @@ int graph_test_single_link(void)          struct list_head * p;          int                i = 0; -        if (graph_routing_table(graph, 1, &table)) { +        if (graph_routing_table(graph, ROUTING_SIMPLE, 1, &table)) {                  printf("Failed to get routing table.\n");                  return -1;          } @@ -243,7 +243,7 @@ int graph_test(int     argc,                  return -1;          } -        if (graph_routing_table(graph, 1, &table)) { +        if (graph_routing_table(graph, ROUTING_SIMPLE, 1, &table)) {                  printf("Failed to get routing table.\n");                  return -1;          } diff --git a/src/ipcpd/normal/sdu_sched.c b/src/ipcpd/normal/psched.c index 6ce18ed5..27e5f1de 100644 --- a/src/ipcpd/normal/sdu_sched.c +++ b/src/ipcpd/normal/psched.c @@ -1,7 +1,7 @@  /*   * Ouroboros - Copyright (C) 2016 - 2018   * - * SDU scheduler component + * Packet scheduler component   *   *    Dimitri Staessens <dimitri.staessens@ugent.be>   *    Sander Vrijders   <sander.vrijders@ugent.be> @@ -20,7 +20,11 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ +#if defined(__linux__) || defined(__CYGWIN__) +#define _DEFAULT_SOURCE +#else  #define _POSIX_C_SOURCE 200112L +#endif  #include "config.h" @@ -28,7 +32,7 @@  #include <ouroboros/notifier.h>  #include "ipcp.h" -#include "sdu_sched.h" +#include "psched.h"  #include "connmgr.h"  #include <assert.h> @@ -45,15 +49,15 @@ static int qos_prio [] = {          QOS_PRIO_DATA  }; -struct sdu_sched { -        fset_t *      set[QOS_CUBE_MAX]; -        next_sdu_fn_t callback; -        pthread_t     readers[QOS_CUBE_MAX * IPCP_SCHED_THR_MUL]; +struct psched { +        fset_t *         set[QOS_CUBE_MAX]; +        next_packet_fn_t callback; +        pthread_t        readers[QOS_CUBE_MAX * IPCP_SCHED_THR_MUL];  };  struct sched_info { -        struct sdu_sched * sch; -        qoscube_t          qc; +        struct psched * sch; +        qoscube_t       qc;  };  static void cleanup_reader(void * o) @@ -61,13 +65,13 @@ static void cleanup_reader(void * o)          fqueue_destroy((fqueue_t *) o);  } -static void * sdu_reader(void * o) +static void * packet_reader(void * o)  { -        struct sdu_sched *   sched; -        struct shm_du_buff * sdb; -        int                  fd; -        fqueue_t *           fq; -        qoscube_t            qc; +        struct psched *       sched; +        struct shm_du_buff *  sdb; +        int                   fd; +        fqueue_t *            fq; +        qoscube_t             qc;          sched = ((struct sched_info *) o)->sch;          qc    = ((struct sched_info *) o)->qc; @@ -115,26 +119,26 @@ static void * sdu_reader(void * o)          return (void *) 0;  } -struct sdu_sched * sdu_sched_create(next_sdu_fn_t callback) +struct psched * psched_create(next_packet_fn_t callback)  { -        struct sdu_sched *  sdu_sched; -        struct sched_info * infos[QOS_CUBE_MAX * IPCP_SCHED_THR_MUL]; -        int                 i; -        int                 j; +        struct psched *       psched; +        struct sched_info *   infos[QOS_CUBE_MAX * IPCP_SCHED_THR_MUL]; +        int                   i; +        int                   j;          assert(callback); -        sdu_sched = malloc(sizeof(*sdu_sched)); -        if (sdu_sched == NULL) +        psched = malloc(sizeof(*psched)); +        if (psched == NULL)                  goto fail_malloc; -        sdu_sched->callback = callback; +        psched->callback = callback;          for (i = 0; i < QOS_CUBE_MAX; ++i) { -                sdu_sched->set[i] = fset_create(); -                if (sdu_sched->set[i] == NULL) { +                psched->set[i] = fset_create(); +                if (psched->set[i] == NULL) {                          for (j = 0; j < i; ++j) -                                fset_destroy(sdu_sched->set[j]); +                                fset_destroy(psched->set[j]);                          goto fail_flow_set;                  }          } @@ -146,17 +150,17 @@ struct sdu_sched * sdu_sched_create(next_sdu_fn_t callback)                                  free(infos[j]);                          goto fail_infos;                  } -                infos[i]->sch = sdu_sched; +                infos[i]->sch = psched;                  infos[i]->qc  = i % QOS_CUBE_MAX;          }          for (i = 0; i < QOS_CUBE_MAX * IPCP_SCHED_THR_MUL; ++i) { -                if (pthread_create(&sdu_sched->readers[i], NULL, -                                   sdu_reader, infos[i])) { +                if (pthread_create(&psched->readers[i], NULL, +                                   packet_reader, infos[i])) {                          for (j = 0; j < i; ++j) -                                pthread_cancel(sdu_sched->readers[j]); +                                pthread_cancel(psched->readers[j]);                          for (j = 0; j < i; ++j) -                                pthread_join(sdu_sched->readers[j], NULL); +                                pthread_join(psched->readers[j], NULL);                          for (j = i; j < QOS_CUBE_MAX * IPCP_SCHED_THR_MUL; ++j)                                  free(infos[i]);                          goto fail_infos; @@ -177,61 +181,61 @@ struct sdu_sched * sdu_sched_create(next_sdu_fn_t callback)                  par.sched_priority = min +                          (qos_prio[i % QOS_CUBE_MAX] * (max - min) / 99); -                if (pthread_setschedparam(sdu_sched->readers[i], pol, &par)) +                if (pthread_setschedparam(psched->readers[i], pol, &par))                          goto fail_sched;          } -        return sdu_sched; +        return psched;   fail_sched:          for (j = 0; j < QOS_CUBE_MAX * IPCP_SCHED_THR_MUL; ++j) -                pthread_cancel(sdu_sched->readers[j]); +                pthread_cancel(psched->readers[j]);          for (j = 0; j < QOS_CUBE_MAX * IPCP_SCHED_THR_MUL; ++j) -                pthread_join(sdu_sched->readers[j], NULL); +                pthread_join(psched->readers[j], NULL);   fail_infos:          for (j = 0; j < QOS_CUBE_MAX; ++j) -                fset_destroy(sdu_sched->set[j]); +                fset_destroy(psched->set[j]);   fail_flow_set: -        free(sdu_sched); +        free(psched);   fail_malloc:          return NULL;  } -void sdu_sched_destroy(struct sdu_sched * sdu_sched) +void psched_destroy(struct psched * psched)  {          int i; -        assert(sdu_sched); +        assert(psched);          for (i = 0; i < QOS_CUBE_MAX * IPCP_SCHED_THR_MUL; ++i) { -                pthread_cancel(sdu_sched->readers[i]); -                pthread_join(sdu_sched->readers[i], NULL); +                pthread_cancel(psched->readers[i]); +                pthread_join(psched->readers[i], NULL);          }          for (i = 0; i < QOS_CUBE_MAX; ++i) -                fset_destroy(sdu_sched->set[i]); +                fset_destroy(psched->set[i]); -        free(sdu_sched); +        free(psched);  } -void sdu_sched_add(struct sdu_sched * sdu_sched, -                   int                fd) +void psched_add(struct psched * psched, +                      int       fd)  {          qoscube_t qc; -        assert(sdu_sched); +        assert(psched);          ipcp_flow_get_qoscube(fd, &qc); -        fset_add(sdu_sched->set[qc], fd); +        fset_add(psched->set[qc], fd);  } -void sdu_sched_del(struct sdu_sched * sdu_sched, -                   int                fd) +void psched_del(struct psched * psched, +                      int       fd)  {          qoscube_t qc; -        assert(sdu_sched); +        assert(psched);          ipcp_flow_get_qoscube(fd, &qc); -        fset_del(sdu_sched->set[qc], fd); +        fset_del(psched->set[qc], fd);  } diff --git a/src/ipcpd/normal/sdu_sched.h b/src/ipcpd/normal/psched.h index cdbda272..137c8fd1 100644 --- a/src/ipcpd/normal/sdu_sched.h +++ b/src/ipcpd/normal/psched.h @@ -1,7 +1,7 @@  /*   * Ouroboros - Copyright (C) 2016 - 2018   * - * SDU scheduler component + * Packet scheduler component   *   *    Dimitri Staessens <dimitri.staessens@ugent.be>   *    Sander Vrijders   <sander.vrijders@ugent.be> @@ -20,24 +20,24 @@   * Foundation, Inc., http://www.fsf.org/about/contact/.   */ -#ifndef OUROBOROS_IPCPD_NORMAL_SDU_SCHED_H -#define OUROBOROS_IPCPD_NORMAL_SDU_SCHED_H +#ifndef OUROBOROS_IPCPD_NORMAL_PSCHED_H +#define OUROBOROS_IPCPD_NORMAL_PSCHED_H  #include <ouroboros/ipcp-dev.h>  #include <ouroboros/fqueue.h> -typedef void (* next_sdu_fn_t)(int                  fd, -                               qoscube_t            qc, -                               struct shm_du_buff * sdb); +typedef void (* next_packet_fn_t)(int                  fd, +                                  qoscube_t            qc, +                                  struct shm_du_buff * sdb); -struct sdu_sched * sdu_sched_create(next_sdu_fn_t callback); +struct psched * psched_create(next_packet_fn_t callback); -void               sdu_sched_destroy(struct sdu_sched * sdu_sched); +void            psched_destroy(struct psched * psched); -void               sdu_sched_add(struct sdu_sched * sdu_sched, -                                 int                fd); +void            psched_add(struct psched * psched, +                           int             fd); -void               sdu_sched_del(struct sdu_sched * sdu_sched, -                                 int                fd); +void            psched_del(struct psched * psched, +                           int             fd); -#endif /* OUROBOROS_IPCPD_NORMAL_SDU_SCHED_H */ +#endif /* OUROBOROS_IPCPD_NORMAL_PSCHED_H */ | 
