summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ipcpd/eth/eth.c50
-rw-r--r--src/ipcpd/normal/dht.c1
-rw-r--r--src/ipcpd/normal/dir.c1
-rw-r--r--src/lib/CMakeLists.txt1
-rw-r--r--src/lib/rib.c2
-rw-r--r--src/lib/time_utils.c144
-rw-r--r--src/tools/oping/oping.c1
-rw-r--r--src/tools/time_utils.h75
8 files changed, 89 insertions, 186 deletions
diff --git a/src/ipcpd/eth/eth.c b/src/ipcpd/eth/eth.c
index 0bd1589d..443f3fdb 100644
--- a/src/ipcpd/eth/eth.c
+++ b/src/ipcpd/eth/eth.c
@@ -93,10 +93,9 @@
#include <net/bpf.h>
#endif
-#define MAC_SIZE 6
#ifdef __linux__
#ifndef ETH_MAX_MTU /* In if_ether.h as of Linux 4.10. */
-#define ETH_MAX_MTU 65535
+#define ETH_MAX_MTU 0xFFFFU
#endif /* ETH_MAX_MTU */
#ifdef BUILD_ETH_DIX
#define ETH_MTU eth_data.mtu
@@ -110,6 +109,7 @@
#define ETH_MTU_MAX ETH_MTU
#endif /* __linux__ */
+#define MAC_SIZE 6
#define ETH_TYPE_LENGTH_SIZE sizeof(uint16_t)
#define ETH_HEADER_SIZE (2 * MAC_SIZE + ETH_TYPE_LENGTH_SIZE)
@@ -121,21 +121,22 @@
#define DIX_HEADER_SIZE (DIX_EID_SIZE + DIX_LENGTH_SIZE)
#define ETH_HEADER_TOT_SIZE (ETH_HEADER_SIZE + DIX_HEADER_SIZE)
#define MAX_EIDS (1 << (8 * DIX_EID_SIZE))
-#define ETH_MAX_SDU_SIZE (ETH_MTU_MAX - DIX_HEADER_SIZE)
-#define ETH_FRAME_SIZE (ETH_HEADER_TOT_SIZE + ETH_MAX_SDU_SIZE)
+#define ETH_MAX_SDU_SIZE (ETH_MTU - DIX_HEADER_SIZE)
+#define ETH_FRAME_SIZE (ETH_HEADER_SIZE + ETH_MTU_MAX)
#elif defined(BUILD_ETH_LLC)
#define THIS_TYPE IPCP_ETH_LLC
#define MGMT_SAP 0x01
#define LLC_HEADER_SIZE 3
#define ETH_HEADER_TOT_SIZE (ETH_HEADER_SIZE + LLC_HEADER_SIZE)
#define MAX_SAPS 64
-#define ETH_MAX_SDU_SIZE (ETH_MTU_MAX - LLC_HEADER_SIZE)
-#define ETH_FRAME_SIZE (ETH_HEADER_TOT_SIZE + ETH_MAX_SDU_SIZE)
+#define ETH_MAX_SDU_SIZE (ETH_MTU - LLC_HEADER_SIZE)
+#define ETH_FRAME_SIZE (ETH_HEADER_SIZE + ETH_MTU_MAX)
#endif
#define ALLOC_TIMEO 10 /* ms */
#define NAME_QUERY_TIMEO 2000 /* ms */
#define MGMT_TIMEO 100 /* ms */
+#define MGMT_FRAME_SIZE 512
#define FLOW_REQ 0
#define FLOW_REPLY 1
@@ -184,7 +185,7 @@ struct ef {
struct mgmt_frame {
struct list_head next;
uint8_t r_addr[MAC_SIZE];
- uint8_t buf[ETH_FRAME_SIZE];
+ uint8_t buf[MGMT_FRAME_SIZE];
};
struct {
@@ -375,7 +376,7 @@ static int eth_ipcp_send_frame(const uint8_t * dst_addr,
assert(frame);
- if (len > ETH_MAX_SDU_SIZE)
+ if (len > (size_t) ETH_MAX_SDU_SIZE)
return -1;
e_frame = (struct eth_frame *) frame;
@@ -840,10 +841,16 @@ static void * eth_ipcp_sdu_reader(void * o)
if (select(eth_data.s_fd + 1, &fds, NULL, NULL, NULL) < 0)
continue;
assert(FD_ISSET(eth_data.s_fd, &fds));
- if (ipcp_sdb_reserve(&sdb, eth_data.mtu))
+ if (ipcp_sdb_reserve(&sdb, ETH_MTU))
continue;
- buf = shm_du_buff_head(sdb);
- frame_len = recv(eth_data.s_fd, buf, ETH_FRAME_SIZE, 0);
+ buf = shm_du_buff_head_alloc(sdb, ETH_HEADER_TOT_SIZE);
+ if (buf == NULL) {
+ log_dbg("Failed to allocate header.");
+ ipcp_sdb_release(sdb);
+ continue;
+ }
+ frame_len = recv(eth_data.s_fd, buf,
+ ETH_MTU + ETH_HEADER_TOT_SIZE, 0);
#endif
if (frame_len <= 0) {
ipcp_sdb_release(sdb);
@@ -894,11 +901,8 @@ static void * eth_ipcp_sdu_reader(void * o)
if (ssap == MGMT_SAP && dsap == MGMT_SAP) {
#endif
- pthread_mutex_lock(&eth_data.mgmt_lock);
-
frame = malloc(sizeof(*frame));
if (frame == NULL) {
- pthread_mutex_unlock(&eth_data.mgmt_lock);
#ifndef HAVE_NETMAP
ipcp_sdb_release(sdb);
#endif
@@ -907,6 +911,8 @@ static void * eth_ipcp_sdu_reader(void * o)
memcpy(frame->buf, &e_frame->payload, length);
memcpy(frame->r_addr, e_frame->src_hwaddr, MAC_SIZE);
+ pthread_mutex_unlock(&eth_data.mgmt_lock);
+
list_add(&frame->next, &eth_data.mgmt_frames);
pthread_cond_signal(&eth_data.mgmt_cond);
pthread_mutex_unlock(&eth_data.mgmt_lock);
@@ -979,7 +985,7 @@ static void * eth_ipcp_sdu_writer(void * o)
pthread_rwlock_rdlock(&eth_data.flows_lock);
while ((fd = fqueue_next(eth_data.fq)) >= 0) {
if (ipcp_flow_read(fd, &sdb)) {
- log_err("Bad read from fd %d.", fd);
+ log_dbg("Bad read from fd %d.", fd);
continue;
}
@@ -987,7 +993,7 @@ static void * eth_ipcp_sdu_writer(void * o)
if (shm_du_buff_head_alloc(sdb, ETH_HEADER_TOT_SIZE)
== NULL) {
- log_err("Failed to allocate header.");
+ log_dbg("Failed to allocate header.");
ipcp_sdb_release(sdb);
}
#if defined(BUILD_ETH_DIX)
@@ -1237,12 +1243,6 @@ static int eth_ipcp_bootstrap(const struct ipcp_config * conf)
return -1;
}
- if (ioctl(skfd, SIOCGIFHWADDR, &ifr)) {
- log_err("Failed to get hwaddr.");
- close(skfd);
- return -1;
- }
-
if (ioctl(skfd, SIOCGIFMTU, &ifr)) {
log_err("Failed to get MTU.");
close(skfd);
@@ -1263,6 +1263,12 @@ static int eth_ipcp_bootstrap(const struct ipcp_config * conf)
#endif
log_dbg("Layer MTU is %d.", eth_data.mtu);
+ if (ioctl(skfd, SIOCGIFHWADDR, &ifr)) {
+ log_err("Failed to get hwaddr.");
+ close(skfd);
+ return -1;
+ }
+
close(skfd);
idx = if_nametoindex(conf->dev);
diff --git a/src/ipcpd/normal/dht.c b/src/ipcpd/normal/dht.c
index 069b89d5..a6f1928b 100644
--- a/src/ipcpd/normal/dht.c
+++ b/src/ipcpd/normal/dht.c
@@ -48,6 +48,7 @@
#include <string.h>
#include <assert.h>
#include <inttypes.h>
+#include <limits.h>
#include "kademlia.pb-c.h"
typedef KadMsg kad_msg_t;
diff --git a/src/ipcpd/normal/dir.c b/src/ipcpd/normal/dir.c
index 1c883974..345d220d 100644
--- a/src/ipcpd/normal/dir.c
+++ b/src/ipcpd/normal/dir.c
@@ -37,6 +37,7 @@
#include <string.h>
#include <assert.h>
#include <inttypes.h>
+#include <limits.h>
#define KAD_B (hash_len(ipcpi.dir_hash_algo) * CHAR_BIT)
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 973c2458..e7e07802 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -206,7 +206,6 @@ set(SOURCE_FILES_COMMON
shm_rbuff.c
shm_rdrbuff.c
sockets.c
- time_utils.c
tpm.c
utils.c
)
diff --git a/src/lib/rib.c b/src/lib/rib.c
index 22397e24..685575e5 100644
--- a/src/lib/rib.c
+++ b/src/lib/rib.c
@@ -324,7 +324,7 @@ int rib_init(const char * mountpt)
rmdir(rib.mnt);
return -1;
#else
- (void) prefix;
+ (void) mountpt;
return 0;
#endif
}
diff --git a/src/lib/time_utils.c b/src/lib/time_utils.c
deleted file mode 100644
index 0701e2d3..00000000
--- a/src/lib/time_utils.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Ouroboros - Copyright (C) 2016 - 2018
- *
- * Time utilities
- *
- * Dimitri Staessens <dimitri.staessens@ugent.be>
- * Sander Vrijders <sander.vrijders@ugent.be>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * version 2.1 as published by the Free Software Foundation.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., http://www.fsf.org/about/contact/.
- */
-
-#define _POSIX_C_SOURCE 199309L
-
-#include <ouroboros/time_utils.h>
-#include <stddef.h>
-
-/* functions for timespecs */
-
-/* add intv to t and store it in res*/
-int ts_add(const struct timespec * t,
- const struct timespec * intv,
- struct timespec * res)
-{
- time_t nanos = 0;
-
- if (t == NULL || intv == NULL || res == NULL)
- return -1;
-
- nanos = t->tv_nsec + intv->tv_nsec;
-
- res->tv_sec = t->tv_sec + intv->tv_sec;
- while (nanos >= BILLION) {
- nanos -= BILLION;
- ++(res->tv_sec);
- }
-
- res->tv_nsec = nanos;
-
- return 0;
-}
-
-/* subtract intv from t and stores it in res */
-int ts_diff(const struct timespec * t,
- const struct timespec * intv,
- struct timespec * res)
-{
- time_t nanos = 0;
-
- if (t == NULL || intv == NULL || res == NULL)
- return -1;
-
- nanos = t->tv_nsec - intv->tv_nsec;
-
- res->tv_sec = t->tv_sec - intv->tv_sec;
- while (nanos < 0) {
- nanos += BILLION;
- --(res->tv_sec);
- }
- res->tv_nsec = nanos;
-
- return 0;
-}
-
-/* functions for timevals */
-
-/* add intv to t and store it in res*/
-int tv_add(const struct timeval * t,
- const struct timeval * intv,
- struct timeval * res)
-{
- time_t micros = 0;
-
- if (t == NULL || intv == NULL || res == NULL)
- return -1;
-
- micros = t->tv_usec + intv->tv_usec;
-
- res->tv_sec = t->tv_sec + intv->tv_sec;
- while (micros >= MILLION) {
- micros -= MILLION;
- ++(res->tv_sec);
- }
- res->tv_usec = micros;
-
- return 0;
-}
-
-/* subtract intv from t and stores it in res */
-int tv_diff(const struct timeval * t,
- const struct timeval * intv,
- struct timeval * res)
-{
- time_t micros = 0;
-
- if (t == NULL || intv == NULL || res == NULL)
- return -1;
-
- micros = t->tv_usec - intv->tv_usec;
-
- res->tv_sec = t->tv_sec - intv->tv_sec;
- while (micros < 0) {
- micros += MILLION;
- --(res->tv_sec);
- }
- res->tv_usec = micros;
-
- return 0;
-}
-
-int tv_to_ts(const struct timeval * src,
- struct timespec * dst)
-{
- if (src == NULL || dst == NULL)
- return -1;
-
- dst->tv_sec = src->tv_sec;
- dst->tv_nsec = src->tv_usec * 1000L;
-
- return 0;
-}
-
-/* copying a timespec into a timeval (loss of resolution) */
-int ts_to_tv(const struct timespec * src,
- struct timeval * dst)
-{
- if (src == NULL || dst == NULL)
- return -1;
-
- dst->tv_sec = src->tv_sec;
- dst->tv_usec = src->tv_nsec / 1000L;
-
- return 0;
-}
diff --git a/src/tools/oping/oping.c b/src/tools/oping/oping.c
index e36b3bd5..bc8907e6 100644
--- a/src/tools/oping/oping.c
+++ b/src/tools/oping/oping.c
@@ -46,6 +46,7 @@
#include "time_utils.h"
+#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
diff --git a/src/tools/time_utils.h b/src/tools/time_utils.h
index c9760a8b..f4f561bd 100644
--- a/src/tools/time_utils.h
+++ b/src/tools/time_utils.h
@@ -35,7 +35,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
#ifndef OUROBOROS_TOOLS_TIME_UTILS_H
#define OUROBOROS_TOOLS_TIME_UTILS_H
@@ -52,7 +51,6 @@
#include <time.h>
#include <sys/time.h>
-#include <limits.h> /* LONG_MAX */
/* functions for timespecs */
#define ts_diff_ns(t0, tx) (((tx)->tv_sec - (t0)->tv_sec) * BILLION \
@@ -69,29 +67,70 @@
+ ((tx)->tv_usec - (t0)->tv_usec) / MILLION)
/* functions for timespecs */
-int ts_add(const struct timespec * t,
- const struct timespec * intv,
- struct timespec * res);
-int ts_diff(const struct timespec * t,
- const struct timespec * intv,
- struct timespec * res);
+#define ts_add(t, intv, res) \
+ do { \
+ time_t nanos = 0; \
+ nanos = (t)->tv_nsec + (intv)->tv_nsec; \
+ (res)->tv_sec = (t)->tv_sec + (intv)->tv_sec; \
+ while (nanos >= BILLION) { \
+ nanos -= BILLION; \
+ ++((res)->tv_sec); \
+ } \
+ (res)->tv_nsec = nanos; \
+ } while (0);
+
+#define ts_diff(t, intv, res) \
+ do { \
+ time_t nanos = 0; \
+ nanos = (t)->tv_nsec - (intv)->tv_nsec; \
+ (res)->tv_sec = (t)->tv_sec - (intv)->tv_sec; \
+ while (nanos < 0) { \
+ nanos += BILLION; \
+ --((res)->tv_sec); \
+ } \
+ (res)->tv_nsec = nanos; \
+ } while (0);
/* functions for timevals */
-int tv_add(const struct timeval * t,
- const struct timeval * intv,
- struct timeval * res);
-int tv_diff(const struct timeval * t,
- const struct timeval * intv,
- struct timeval * res);
+#define tv_add(t, intv, res) \
+ do { \
+ time_t micros = 0; \
+ nanos = (t)->tv_usec + (intv)->tv_usec; \
+ (res)->tv_sec = (t)->tv_sec + (intv)->tv_sec; \
+ while (micros >= MILLION) { \
+ micros -= MILLION; \
+ ++((res)->tv_sec); \
+ } \
+ (res)->tv_nsec = nanos; \
+ } while (0);
+
+#define tv_diff(t, intv, res) \
+ do { \
+ time_t micros = 0; \
+ micros = (t)->tv_usec - (intv)->tv_usec; \
+ (res)->tv_sec = (t)->tv_sec - (intv)->tv_sec; \
+ while (micros < 0) { \
+ micros += MILLION; \
+ --((res)->tv_sec); \
+ } \
+ (res)->tv_usec = micros; \
+ } while (0);
+
/* copying a timeval into a timespec */
-int tv_to_ts(const struct timeval * src,
- struct timespec * dst);
+#define tv_to_ts(tv, ts) \
+ do { \
+ (ts)->tv_sec = (tv)->tv_sec; \
+ (ts)->tv_nsec = (tv)->tv_usec * 1000L; \
+ } while (0);
/* copying a timespec into a timeval (loss of resolution) */
-int ts_to_tv(const struct timespec * src,
- struct timeval * dst);
+#define ts_to_tv(ts, tv) \
+ do { \
+ (tv)->tv_sec = (ts)->tv_sec; \
+ (tv)->tv_usec = (ts)->tv_nsec / 1000L; \
+ } while (0);
#endif /* OUROBOROS_TOOLS_TIME_UTILS_H */