From 743c2f69744fe3f0dac11e467a92ff5e4d80280b Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Tue, 22 Aug 2017 17:38:44 +0200 Subject: lib: Fix CRC check and add frct_clear This adds the CRC check by default on outgoing SDUs. It fixes some errors in the serialization and deserialization of the SDU. frct_clear was added to avoid bad initialization of the array of FRCT instances. --- src/lib/CMakeLists.txt | 2 +- src/lib/dev.c | 43 ++++++++++++++++++++++++++++++------------- src/lib/frct_pci.c | 12 ++++++++++-- 3 files changed, 41 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 4522613b..9d8fbf9c 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -123,7 +123,7 @@ set(AP_MAX_FQUEUES 32 CACHE STRING "Maximum number of flow sets per application") set(DU_BUFF_HEADSPACE 128 CACHE STRING "Bytes of headspace to reserve for future headers") -set(DU_BUFF_TAILSPACE 0 CACHE STRING +set(DU_BUFF_TAILSPACE 16 CACHE STRING "Bytes of tailspace to reserve for future tails") if (NOT APPLE) set(PTHREAD_COND_CLOCK "CLOCK_MONOTONIC" CACHE STRING diff --git a/src/lib/dev.c b/src/lib/dev.c index 52a56097..a5caad3c 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -247,26 +247,41 @@ static int finalize_write(int fd, static int frcti_init(int fd) { - ai.frcti[fd].used = true; + struct frcti * frcti; + + frcti = &(ai.frcti[fd]); - ai.frcti[fd].snd_drf = true; - ai.frcti[fd].snd_lwe = 0; - ai.frcti[fd].snd_rwe = 0; + frcti->used = true; - ai.frcti[fd].rcv_drf = true; - ai.frcti[fd].rcv_lwe = 0; - ai.frcti[fd].rcv_rwe = 0; + frcti->snd_drf = true; + frcti->snd_lwe = 0; + frcti->snd_rwe = 0; + + frcti->rcv_drf = true; + frcti->rcv_lwe = 0; + frcti->rcv_rwe = 0; + + frcti->conf_flags = CONF_ERROR_CHECK; return 0; } -static void frcti_fini(int fd) +static void frcti_clear(int fd) { struct frcti * frcti; frcti = &(ai.frcti[fd]); frcti->used = false; + frcti->snd_inact = NULL; + frcti->rcv_inact = NULL; +} + +static void frcti_fini(int fd) +{ + struct frcti * frcti; + + frcti = &(ai.frcti[fd]); /* FIXME: We actually need to wait until these timers become NULL. */ if (frcti->snd_inact != NULL) @@ -274,6 +289,8 @@ static void frcti_fini(int fd) if (frcti->rcv_inact != NULL) timerwheel_stop(ai.tw, frcti->rcv_inact); + + frcti_clear(fd); } static int frcti_configure(int fd, @@ -405,14 +422,14 @@ static ssize_t frcti_read(int fd) if (frct_pci_des(sdb, &pci, frcti->conf_flags & CONF_ERROR_CHECK)) { pthread_rwlock_unlock(&ai.lock); shm_rdrbuff_remove(ai.rdrb, idx); - return -1; + return -EAGAIN; } /* We don't accept packets when there is no inactivity timer. */ if (frcti->rcv_drf && !(pci.flags & FLAG_DATA_RUN)) { pthread_rwlock_unlock(&ai.lock); shm_rdrbuff_remove(ai.rdrb, idx); - return -1; + return -EAGAIN; } /* @@ -436,7 +453,7 @@ static ssize_t frcti_read(int fd) if (frcti->rcv_inact == NULL) { pthread_rwlock_unlock(&ai.lock); shm_rdrbuff_remove(ai.rdrb, idx); - return -1; + return -EAGAIN; } frcti->rcv_drf = false; @@ -444,7 +461,7 @@ static ssize_t frcti_read(int fd) if (timerwheel_restart(ai.tw, frcti->rcv_inact, 3 * MPL)) { pthread_rwlock_unlock(&ai.lock); shm_rdrbuff_remove(ai.rdrb, idx); - return -1; + return -EAGAIN; } } @@ -507,7 +524,7 @@ static void flow_fini(int fd) shm_flow_set_close(ai.flows[fd].set); if (ai.frcti[fd].used) - frcti_fini(fd); + frcti_clear(fd); flow_clear(fd); } diff --git a/src/lib/frct_pci.c b/src/lib/frct_pci.c index 392e11c6..5ee14829 100644 --- a/src/lib/frct_pci.c +++ b/src/lib/frct_pci.c @@ -24,6 +24,9 @@ #include #include +#define OUROBOROS_PREFIX "frct-pci" +#include + #include #include @@ -73,6 +76,7 @@ int frct_pci_des(struct shm_du_buff * sdb, uint8_t * head; uint8_t * tail; uint32_t crc; + uint32_t crc2; assert(sdb); assert(pci); @@ -89,10 +93,14 @@ int frct_pci_des(struct shm_du_buff * sdb, if (tail == NULL) return -EPERM; - mem_hash(HASH_CRC32, &crc, head, tail - head); + mem_hash(HASH_CRC32, &crc, head, + tail - head - hash_len(HASH_CRC32)); + + memcpy(&crc2, tail - hash_len(HASH_CRC32), + hash_len(HASH_CRC32)); /* Corrupted SDU */ - if (crc != 0) + if (crc != crc2) return -1; shm_du_buff_tail_release(sdb, hash_len(HASH_CRC32)); -- cgit v1.2.3