summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSander Vrijders <sander.vrijders@intec.ugent.be>2016-06-29 16:08:00 +0200
committerSander Vrijders <sander.vrijders@intec.ugent.be>2016-06-29 16:08:00 +0200
commitcd4d09aae14afe7b0aa0890c61b0ad43e4f23b28 (patch)
tree49db3603147bab26ba4d7a17efcf2839e381f71d
parent278abed7b636f3368dcfd3b54200d31517e7142b (diff)
parentd85f211d53a0cb35a756d0c44a2b28807eff4e5d (diff)
downloadouroboros-cd4d09aae14afe7b0aa0890c61b0ad43e4f23b28.tar.gz
ouroboros-cd4d09aae14afe7b0aa0890c61b0ad43e4f23b28.zip
Merged in dstaesse/ouroboros/remove-du-buff (pull request #146)
lib, ipcpd: removed du_buff and pci
-rw-r--r--include/ouroboros/du_buff.h50
-rw-r--r--src/ipcpd/normal/CMakeLists.txt1
-rw-r--r--src/ipcpd/normal/pci.c146
-rw-r--r--src/ipcpd/normal/pci.h42
-rw-r--r--src/lib/CMakeLists.txt1
-rw-r--r--src/lib/du_buff.c380
-rw-r--r--src/lib/tests/CMakeLists.txt1
-rw-r--r--src/lib/tests/du_buff_test.c70
8 files changed, 0 insertions, 691 deletions
diff --git a/include/ouroboros/du_buff.h b/include/ouroboros/du_buff.h
deleted file mode 100644
index 5c97731e..00000000
--- a/include/ouroboros/du_buff.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Ouroboros - Copyright (C) 2016
- *
- * Data Unit Buffer
- *
- * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
- * Sander Vrijders <sander.vrijders@intec.ugent.be>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef OUROBOROS_DU_BUFF_H
-#define OUROBOROS_DU_BUFF_H
-
-#include "common.h"
-
-#ifndef DU_BUFF_BLOCK_SIZE
-#define DU_BUFF_BLOCK_SIZE sysconf(_SC_PAGESIZE)
-#endif
-
-struct du_buff;
-
-typedef struct du_buff du_buff_t;
-
-du_buff_t * du_buff_create(size_t size);
-void du_buff_destroy(du_buff_t * dub);
-
-int du_buff_init(du_buff_t * dub,
- size_t start,
- uint8_t * data,
- size_t len);
-
-uint8_t * du_buff_head_alloc(du_buff_t * dub, size_t size);
-uint8_t * du_buff_tail_alloc(du_buff_t * dub, size_t size);
-int du_buff_head_release(du_buff_t * dub, size_t size);
-int du_buff_tail_release(du_buff_t * dub, size_t size);
-
-#endif /* OUROBOROS_DU_BUFF_H */
diff --git a/src/ipcpd/normal/CMakeLists.txt b/src/ipcpd/normal/CMakeLists.txt
index 74bd19ec..5aefeabb 100644
--- a/src/ipcpd/normal/CMakeLists.txt
+++ b/src/ipcpd/normal/CMakeLists.txt
@@ -17,7 +17,6 @@ SET(IPCP_NORMAL_TARGET ipcpd-normal CACHE STRING "IPCP_NORMAL_TARGET")
set(SOURCE_FILES
# Add source files here
main.c
- pci.c
)
add_executable (ipcpd-normal ${SOURCE_FILES} ${IPCP_SOURCES})
diff --git a/src/ipcpd/normal/pci.c b/src/ipcpd/normal/pci.c
deleted file mode 100644
index d7df52b6..00000000
--- a/src/ipcpd/normal/pci.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Ouroboros - Copyright (C) 2016
- *
- * Protocol Control Information
- *
- * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
- * Sander Vrijders <sander.vrijders@intec.ugent.be>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "pci.h"
-#include <stdlib.h>
-#include <errno.h>
-
-#define OUROBOROS_PREFIX "ipcp/pci"
-
-#include <ouroboros/logs.h>
-
-#define PCI_HEAD_SIZE(a, b) a.addr_size * 2 + \
- a.cep_id_size * 2 + \
- a.pdu_length_size + \
- b.ttl_size + \
- a.seqno_size + \
- a.qos_id_size
-#define PCI_TAIL_SIZE(b) b.chk_size
-
-
-struct pci {
- /* head */
- uint8_t * dst_addr;
- uint8_t * src_addr;
- uint8_t * dst_cep_id;
- uint8_t * src_cep_id;
- uint8_t * pdu_length;
- uint8_t * ttl;
- uint8_t * seqno;
- uint8_t * qos_id;
-
- uint8_t * chk;
-
- du_buff_t * dub;
-
- struct ipcp_dtp_const dtpc;
- struct ipcp_dup_const dupc;
-
-};
-
-pci_t * pci_create(du_buff_t * dub,
- const struct ipcp_dtp_const * dtpc,
- const struct ipcp_dup_const * dupc)
-{
- struct pci * p;
-
- if (dub == NULL) {
- LOG_DBGF("Bogus input. Bugging out.");
- return NULL;
- }
-
- p = malloc(sizeof *p);
-
- if (p == NULL)
- return NULL;
-
- p->dub = dub;
-
- p->dtpc = *dtpc;
- p->dupc = *dupc;
-
- p->dst_addr = NULL;
- p->src_addr = NULL;
- p->dst_cep_id = NULL;
- p->src_cep_id = NULL;
- p->pdu_length = NULL;
- p->ttl = NULL;
- p->seqno = NULL;
- p->qos_id = NULL;
- p->chk = NULL;
-
- return p;
-}
-
-void pci_destroy(pci_t * pci)
-{
- free(pci);
-}
-
-int pci_init(pci_t * pci)
-{
- if (pci == NULL) {
- LOG_DBGF("Bogus input. Bugging out.");
- return -EINVAL;
- }
-
- uint8_t * pci_head = du_buff_head_alloc(pci->dub, PCI_HEAD_SIZE(
- pci->dtpc,pci->dupc));
- uint8_t * pci_tail = du_buff_tail_alloc(pci->dub, PCI_TAIL_SIZE(
- pci->dupc));
-
- if (pci_head == NULL) {
- LOG_DBG("Failed to allocate space for PCI at head.");
- return -ENOBUFS;
- }
-
- if (pci_tail == NULL) {
- LOG_DBG("Failed to allocate space for PCI at tail.");
- return -ENOBUFS;
- }
-
- pci->dst_addr = pci_head;
- pci->src_addr = (pci_head += pci->dtpc.addr_size);
- pci->dst_cep_id = (pci_head += pci->dtpc.addr_size);
- pci->src_cep_id = (pci_head += pci->dtpc.cep_id_size);
- pci->pdu_length = (pci_head += pci->dtpc.cep_id_size);
- pci->ttl = (pci_head += pci->dtpc.pdu_length_size);
- pci->seqno = (pci_head += pci->dupc.ttl_size);
- pci->qos_id = (pci_head += pci->dtpc.seqno_size);
-
- pci->chk = (pci_tail);
-
- return 0;
-}
-
-void pci_release(pci_t * pci)
-{
- if (pci == NULL)
- return;
-
- if (pci->dub == NULL)
- return;
-
- du_buff_head_release(pci->dub, PCI_HEAD_SIZE(pci->dtpc, pci->dupc));
- du_buff_tail_release(pci->dub, PCI_TAIL_SIZE(pci->dupc));
-}
diff --git a/src/ipcpd/normal/pci.h b/src/ipcpd/normal/pci.h
deleted file mode 100644
index 3c011723..00000000
--- a/src/ipcpd/normal/pci.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Ouroboros - Copyright (C) 2016
- *
- * Protocol Control Information
- *
- * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
- * Sander Vrijders <sander.vrijders@intec.ugent.be>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef OUROBOROS_IPCP_PCI_H
-#define OUROBOROS_IPCP_PCI_H
-
-#include "ouroboros/du_buff.h"
-#include "dt_const.h"
-
-struct pci;
-
-typedef struct pci pci_t;
-
-pci_t * pci_create(du_buff_t * dub,
- const struct ipcp_dtp_const * dtpc,
- const struct ipcp_dup_const * dupc);
-void pci_destroy(pci_t * pci);
-
-int pci_init(pci_t * pci);
-void pci_release(pci_t * pci);
-
-#endif /* OUROBOROS_IPCP_PCI_H */
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 410be6fe..ae46f5bc 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -26,7 +26,6 @@ set(SOURCE_FILES
bitmap.c
cdap.c
dev.c
- du_buff.c
ipcp.c
irm.c
list.c
diff --git a/src/lib/du_buff.c b/src/lib/du_buff.c
deleted file mode 100644
index 5f9d6f28..00000000
--- a/src/lib/du_buff.c
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * Ouroboros - Copyright (C) 2016
- *
- * Data Unit Buffer
- *
- * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
- * Sander Vrijders <sander.vrijders@intec.ugent.be>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include <ouroboros/du_buff.h>
-#include <ouroboros/list.h>
-
-#define OUROBOROS_PREFIX "du_buff"
-
-#include "ouroboros/logs.h"
-
-#define DU_BLOCK_DATA_SIZE (DU_BUFF_BLOCK_SIZE - sizeof (struct buffer))
-
-struct buffer {
- uint8_t * data;
- size_t size;
- struct list_head list;
-};
-
-struct du_buff {
- struct buffer * buffer;
- size_t size;
- size_t du_head;
- size_t du_tail;
-};
-
-static void buffer_destroy(struct buffer * buf)
-{
- if (buf == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return;
- }
-
- free (buf->data);
- free (buf);
-}
-
-static void buffer_destroy_list(struct buffer * head)
-{
- struct list_head * ptr;
- struct list_head * n;
-
- if (head == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return;
- }
-
- list_for_each_safe(ptr, n, &(head->list)) {
- struct buffer * tmp = list_entry(ptr, struct buffer, list);
- list_del(ptr);
- buffer_destroy(tmp);
- }
- free(head);
-}
-
-static struct buffer * buffer_create (size_t size, size_t headspace, size_t len)
-{
- struct buffer * head = NULL;
- size_t remaining = size;
- size_t ts = size - (headspace + len);
-
- if (headspace > DU_BLOCK_DATA_SIZE || ts > DU_BLOCK_DATA_SIZE) {
- LOG_ERR("Illegal du_buff: Cannot fit PCI in DU_BUFF_BLOCK.");
- return NULL;
- }
-
- head = malloc(sizeof *head);
- if (head == NULL)
- return NULL;
-
- head->size = 0;
- head->data = NULL;
-
- INIT_LIST_HEAD(&(head->list));
-
- while (remaining > 0) {
- struct buffer * buf;
-
- size_t sz;
-
- if (size > DU_BLOCK_DATA_SIZE
- && remaining - ts <= DU_BLOCK_DATA_SIZE
- && remaining != ts) {
- sz = remaining - ts;
- } else if (size > DU_BLOCK_DATA_SIZE && remaining == ts) {
- sz = ts;
- } else {
- sz = remaining < DU_BLOCK_DATA_SIZE ?
- remaining : DU_BLOCK_DATA_SIZE;
- }
-
- buf = malloc(sizeof *buf);
- if (buf == NULL) {
- LOG_WARN("Could not allocate struct.");
- free(head);
- return NULL;
- }
-
- if (sz > 0) {
- buf->data = malloc(sz);
- if (buf->data == NULL) {
- LOG_WARN("Could not allocate memory block.");
- buffer_destroy_list(head);
- free(head);
- free(buf);
- return NULL;
- }
- } else {
- buf->data = NULL;
- }
-
- buf->size = sz;
-
- list_add_tail(&(buf->list), &(head->list));
-
- remaining -= buf->size;
- }
-
- return head;
-}
-
-static struct buffer * buffer_seek(const struct buffer * head, size_t pos)
-{
- struct list_head * ptr = NULL;
- size_t cur_buf_start = 0;
- size_t cur_buf_end = 0;
-
- if (head == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return NULL;
- }
-
- list_for_each(ptr, &(head->list)) {
- struct buffer * tmp = list_entry(ptr, struct buffer, list);
-
- cur_buf_end = cur_buf_start + tmp->size;
- if (cur_buf_end > pos)
- return tmp;
-
- cur_buf_start = cur_buf_end;
- }
-
- return NULL;
-}
-
-static uint8_t * buffer_seek_pos(const struct buffer * head, size_t pos)
-{
- struct list_head * ptr = NULL;
- size_t cur_buf_start = 0;
- size_t cur_buf_end = 0;
-
- if (head == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return NULL;
- }
-
- list_for_each(ptr, &(head->list)) {
- struct buffer * tmp = list_entry(ptr, struct buffer, list);
-
- cur_buf_end = cur_buf_start + tmp->size;
-
- if (cur_buf_end > pos)
- return tmp->data + (pos - cur_buf_start);
-
- cur_buf_start = cur_buf_end;
- }
-
- return NULL;
-}
-
-static int buffer_copy_data(struct buffer * head,
- size_t pos,
- const void * src,
- size_t len)
-{
- struct list_head * ptr = NULL;
- struct buffer * buf_start = NULL;
- struct buffer * buf_end = NULL;
- uint8_t * ptr_start = NULL;
- size_t space_in_buf;
- size_t bytes_remaining;
- uint8_t * copy_pos = NULL;
-
- if (head == NULL || src == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return -EINVAL;
- }
-
- if (len == 0) {
- LOG_DBGF("Nothing to copy.");
- return 0;
- }
-
- buf_start = buffer_seek(head, pos);
- buf_end = buffer_seek(head, pos + len - 1);
-
- if (buf_start == NULL || buf_end == NULL) {
- LOG_DBGF("Index out of bounds %lu, %lu", pos, pos + len);
- return -EINVAL;
- }
-
- ptr_start = buffer_seek_pos(head, pos);
-
- if (buf_start == buf_end) {
- memcpy(ptr_start, src, len);
- return 0;
- }
-
- copy_pos = (uint8_t *)src;
- bytes_remaining = len;
- list_for_each(ptr, &(head->list)) {
- struct buffer * tmp = list_entry(ptr, struct buffer, list);
- if (tmp != buf_start)
- continue;
-
- space_in_buf = (tmp->data + tmp->size) - ptr_start;
- if (space_in_buf >= bytes_remaining) {
- memcpy(ptr_start, copy_pos, bytes_remaining);
- return 0;
- }
- else
- memcpy(ptr_start, copy_pos, space_in_buf);
- bytes_remaining -= space_in_buf;
- copy_pos += space_in_buf;
- }
-
- return 0;
-}
-
-du_buff_t * du_buff_create(size_t size)
-{
- du_buff_t * dub = malloc(sizeof *dub);
-
- if (dub == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return NULL;
- }
-
- dub->buffer = NULL;
- dub->size = size;
- dub->du_head = 0;
- dub->du_tail = 0;
-
- return dub;
-}
-
-void du_buff_destroy(du_buff_t * dub)
-{
- if (dub == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return;
- }
- buffer_destroy_list(dub->buffer);
- free (dub);
-}
-
-int du_buff_init(du_buff_t * dub,
- size_t start,
- uint8_t * data,
- size_t len)
-{
- if (dub == NULL || data == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return -EINVAL;
- }
-
- if (start >= dub->size) {
- LOG_DBGF("Index out of bounds %lu.", start);
- return -EINVAL;
- }
-
- if (start + len > dub->size) {
- LOG_DBGF("Buffer too small for data.");
- return -EINVAL;
- }
-
- dub->buffer = buffer_create(dub->size, start, len);
- if (dub->buffer == NULL)
- return -ENOMEM;
-
- dub->du_head = start;
- dub->du_tail = start + len;
-
- return buffer_copy_data(dub->buffer, start, data, len);
-}
-
-uint8_t * du_buff_head_alloc(du_buff_t * dub, size_t size)
-{
- if (dub == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return NULL;
- }
-
- if ((long) (dub->du_head - size) < 0) {
- LOG_WARN("Failed to allocate PCI headspace.");
- return NULL;
- }
-
- dub->du_head -= size;
-
- return (buffer_seek_pos(dub->buffer, dub->du_head));
-}
-
-uint8_t * du_buff_tail_alloc(du_buff_t * dub, size_t size)
-{
- if (dub == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return NULL;
- }
-
- if (dub->du_tail + size >= dub->size) {
- LOG_WARN("Failed to allocate PCI tailspace.");
- return NULL;
- }
-
- dub->du_tail += size;
-
- return (buffer_seek_pos(dub->buffer, dub->du_tail));
-}
-
-int du_buff_head_release(du_buff_t * dub, size_t size)
-{
- if (dub == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return -EINVAL;
- }
-
- if (size > dub->du_tail - dub->du_head) {
- LOG_WARN("Tried to release beyond sdu boundary.");
- return -EOVERFLOW;
- }
-
- dub->du_head += size;
-
- /* FIXME: copy some random crap to the buffer for security */
-
- return 0;
-}
-
-int du_buff_tail_release(du_buff_t * dub, size_t size)
-{
- if (dub == NULL) {
- LOG_DBGF("Bogus input, bugging out.");
- return -EINVAL;
- }
-
- if (size > dub->du_tail - dub->du_head) {
- LOG_WARN("Tried to release beyond sdu boundary.");
- return -EOVERFLOW;
- }
-
- dub->du_tail -= size;
-
- /* FIXME: copy some random crap to the buffer for security */
-
- return 0;
-}
diff --git a/src/lib/tests/CMakeLists.txt b/src/lib/tests/CMakeLists.txt
index e905c389..2135cb95 100644
--- a/src/lib/tests/CMakeLists.txt
+++ b/src/lib/tests/CMakeLists.txt
@@ -4,7 +4,6 @@ get_filename_component(PARENT_DIR ${PARENT_PATH} NAME)
create_test_sourcelist(${PARENT_DIR}_tests test_suite.c
# Add new tests here
bitmap_test.c
- du_buff_test.c
)
add_executable(${PARENT_DIR}_test EXCLUDE_FROM_ALL ${${PARENT_DIR}_tests})
diff --git a/src/lib/tests/du_buff_test.c b/src/lib/tests/du_buff_test.c
deleted file mode 100644
index bda1ca43..00000000
--- a/src/lib/tests/du_buff_test.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Ouroboros - Copyright (C) 2016
- *
- * Test of the du_buff
- *
- * Dimitri Staessens <dimitri.staessens@intec.ugent.be>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <ouroboros/du_buff.h>
-#include "du_buff.c"
-
-#define TEST_BUFF_SIZE 16 * DU_BLOCK_DATA_SIZE
-#define MAX(a,b) (a > b ? a : b)
-#define MIN(a,b) (a < b ? a : b)
-
-int du_buff_test(int argc, char ** argv)
-{
- int i, j, k;
- int i_inc, j_inc, k_inc;
-
- uint8_t bits[TEST_BUFF_SIZE];
-
- for (i = 0; i < TEST_BUFF_SIZE; i++)
- bits[i] = 170;
-
- i_inc = MAX(1, DU_BLOCK_DATA_SIZE / 4);
- j_inc = MAX(1, DU_BLOCK_DATA_SIZE / 8);
- k_inc = MAX(1, DU_BLOCK_DATA_SIZE / 16);
-
- for (i = DU_BUFF_BLOCK_SIZE / 4; i <= TEST_BUFF_SIZE; i += i_inc) {
- for (j = 0; j < i; j += j_inc) {
- for (k = 0; k < i - j; k += k_inc) {
- du_buff_t * dub = du_buff_create(i);
- if (dub == NULL)
- return -1;
-
- if (k > DU_BLOCK_DATA_SIZE) {
- du_buff_destroy (dub);
- continue;
- }
-
- if (i - (j + k) > DU_BLOCK_DATA_SIZE) {
- du_buff_destroy (dub);
- continue;
- }
-
- if (du_buff_init(dub, k, bits, j) < 0) {
- du_buff_destroy (dub);
- return -1;
- }
- du_buff_destroy (dub);
- }
- }
- }
- return 0; /* tests succeeded */
-}