/*
 * Ouroboros - Copyright (C) 2016 - 2021
 *
 * Ouroboros library configuration
 *
 *    Dimitri Staessens <dimitri@ouroboros.rocks>
 *    Sander Vrijders   <sander@ouroboros.rocks>
 *
 * 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/.
 */

#cmakedefine HAVE_SYS_RANDOM
#cmakedefine HAVE_LIBGCRYPT
#cmakedefine HAVE_OPENSSL

#ifdef HAVE_OPENSSL
#define HAVE_ENCRYPTION
#endif

#define SYS_MAX_FLOWS       @SYS_MAX_FLOWS@

#cmakedefine                SHM_RBUFF_LOCKLESS
#cmakedefine                SHM_RDRB_MULTI_BLOCK
#cmakedefine                QOS_DISABLE_CRC
#cmakedefine                HAVE_OPENSSL_RNG

#define SHM_RBUFF_PREFIX    "@SHM_RBUFF_PREFIX@"
#define SHM_LOCKFILE_NAME   "@SHM_LOCKFILE_NAME@"
#define SHM_FLOW_SET_PREFIX "@SHM_FLOW_SET_PREFIX@"
#define SHM_RDRB_NAME       "@SHM_RDRB_NAME@"
#define SHM_RDRB_BLOCK_SIZE @SHM_RDRB_BLOCK_SIZE@
#define SHM_BUFFER_SIZE     @SHM_BUFFER_SIZE@
#define SHM_RBUFF_SIZE      @SHM_RBUFF_SIZE@

#if defined(__linux__) || (defined(__MACH__) && !defined(__APPLE__))
/* Avoid a bug in robust mutex implementation of glibc 2.25 */
    #include <features.h>
    #if !defined(__GLIBC__) || !(__GLIBC__ == 2 && __GLIBC_MINOR__ == 25)
    #cmakedefine HAVE_ROBUST_MUTEX
    #endif
#else
#cmakedefine HAVE_ROBUST_MUTEX
#endif

#cmakedefine HAVE_FUSE
#ifdef HAVE_FUSE
#define FUSE_PREFIX         "@FUSE_PREFIX@"
#endif

#define PTHREAD_COND_CLOCK  @PTHREAD_COND_CLOCK@

#define PROG_MAX_FLOWS      @PROG_MAX_FLOWS@
#define PROG_RES_FDS        @PROG_RES_FDS@
#define PROG_MAX_FQUEUES    @PROG_MAX_FQUEUES@

#define DU_BUFF_HEADSPACE   @DU_BUFF_HEADSPACE@
#define DU_BUFF_TAILSPACE   @DU_BUFF_TAILSPACE@

/* Default Delta-t parameters */
#define DELT_MPL            (@DELTA_T_MPL@ * BILLION)        /* ns */
#define DELT_A              (@DELTA_T_ACK@ * BILLION)        /* ns */
#define DELT_R              (@DELTA_T_RTX@ * BILLION)        /* ns */

#define DELT_ACK            (@DELTA_T_ACK_DELAY@ * MILLION)  /* ns */

#define RQ_SIZE             (@FRCT_REORDER_QUEUE_SIZE@)
#define START_WINDOW        (@FRCT_START_WINDOW@)
#define RTO_MIN             (@FRCT_RTO_MIN@ * 1000)

#define TICTIME             (@FRCT_TICK_TIME@ * 1000)        /* ns */

/* Retransmission tuning */
#cmakedefine                RXM_BUFFER_ON_HEAP
#cmakedefine                RXM_BLOCKING

#define RXMQ_RES            (@RXM_MIN_RESOLUTION@)           /* 2^N ns */
#define RXMQ_BUMP           (@RXM_WHEEL_MULTIPLIER@)
#define RXMQ_LVLS           (@RXM_WHEEL_LEVELS@)
#define RXMQ_SLOTS          (@RXM_WHEEL_SLOTS_PER_LEVEL@)

#define ACKQ_SLOTS          (@ACK_WHEEL_SLOTS@)
#define ACKQ_RES            (@ACK_WHEEL_RESOLUTION@)         /* 2^N ns */
