summaryrefslogtreecommitdiff
path: root/src/ipcpd/normal
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipcpd/normal')
-rw-r--r--src/ipcpd/normal/CMakeLists.txt3
-rw-r--r--src/ipcpd/normal/connmgr.c4
-rw-r--r--src/ipcpd/normal/dht.c52
-rw-r--r--src/ipcpd/normal/dir.c4
-rw-r--r--src/ipcpd/normal/dt.c158
-rw-r--r--src/ipcpd/normal/dt.h11
-rw-r--r--src/ipcpd/normal/dt_const.h39
-rw-r--r--src/ipcpd/normal/dt_pci.c112
-rw-r--r--src/ipcpd/normal/dt_pci.h67
-rw-r--r--src/ipcpd/normal/enroll.c4
-rw-r--r--src/ipcpd/normal/fa.c96
-rw-r--r--src/ipcpd/normal/fa.h4
-rw-r--r--src/ipcpd/normal/main.c4
-rw-r--r--src/ipcpd/normal/pol/flat.c4
-rw-r--r--src/ipcpd/normal/pol/graph.c131
-rw-r--r--src/ipcpd/normal/pol/graph.h10
-rw-r--r--src/ipcpd/normal/pol/link_state.c41
-rw-r--r--src/ipcpd/normal/pol/tests/graph_test.c8
-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 <[email protected]>
- * Sander Vrijders <[email protected]>
- *
- * 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 <[email protected]>
- * Sander Vrijders <[email protected]>
- *
- * 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 <[email protected]>
- * Sander Vrijders <[email protected]>
- *
- * 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 <[email protected]>
* Sander Vrijders <[email protected]>
@@ -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 <[email protected]>
* Sander Vrijders <[email protected]>
@@ -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 */