1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * rdbx_driver.c 3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * driver for the rdbx implementation (replay database with extended range) 5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David A. McGrew 7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Cisco Systems, Inc. 8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Copyright (c) 2001-2006, Cisco Systems, Inc. 13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * All rights reserved. 14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistribution and use in source and binary forms, with or without 16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * modification, are permitted provided that the following conditions 17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * are met: 18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistributions of source code must retain the above copyright 20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * notice, this list of conditions and the following disclaimer. 21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistributions in binary form must reproduce the above 23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * copyright notice, this list of conditions and the following 24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * disclaimer in the documentation and/or other materials provided 25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * with the distribution. 26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Neither the name of the Cisco Systems, Inc. nor the names of its 28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * contributors may be used to endorse or promote products derived 29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * from this software without specific prior written permission. 30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * OF THE POSSIBILITY OF SUCH DAMAGE. 43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include <stdio.h> /* for printf() */ 47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "getopt_s.h" /* for local getopt() */ 48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "rdbx.h" 50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef ROC_TEST 52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#error "rdbx_t won't work with ROC_TEST - bitmask same size as seq_median" 53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif 54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "ut_sim.h" 56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritest_replay_dbx(int num_trials, unsigned long ws); 59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaridouble 61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarirdbx_check_adds_per_second(int num_trials, unsigned long ws); 62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariusage(char *prog_name) { 65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("usage: %s [ -t | -v ]\n", prog_name); 66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(255); 67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint 70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarimain (int argc, char *argv[]) { 71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari double rate; 72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status; 73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari char q; 74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned do_timing_test = 0; 75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari unsigned do_validation = 0; 76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* process input arguments */ 78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari while (1) { 79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari q = getopt_s(argc, argv, "tv"); 80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (q == -1) 81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari switch (q) { 83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case 't': 84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari do_timing_test = 1; 85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case 'v': 87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari do_validation = 1; 88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari default: 90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari usage(argv[0]); 91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("rdbx (replay database w/ extended range) test driver\n" 95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "David A. McGrew\n" 96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "Cisco Systems, Inc.\n"); 97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (!do_validation && !do_timing_test) 99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari usage(argv[0]); 100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (do_validation) { 102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing rdbx_t (ws=128)...\n"); 103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = test_replay_dbx(1 << 12, 128); 105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("testing rdbx_t (ws=1024)...\n"); 112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = test_replay_dbx(1 << 12, 1024); 114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("failed\n"); 116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (do_timing_test) { 122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rate = rdbx_check_adds_per_second(1 << 18, 128); 123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("rdbx_check/replay_adds per second (ws=128): %e\n", rate); 124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rate = rdbx_check_adds_per_second(1 << 18, 1024); 125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("rdbx_check/replay_adds per second (ws=1024): %e\n", rate); 126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return 0; 129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariprint_rdbx(rdbx_t *rdbx) { 133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari char buf[2048]; 134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("rdbx: {%llu, %s}\n", 135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari (unsigned long long)(rdbx->index), 136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari bitvector_bit_string(&rdbx->bitmask, buf, sizeof(buf)) 137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari); 138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * rdbx_check_add(rdbx, idx) checks a known-to-be-good idx against 143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * rdbx, then adds it. if a failure is detected (i.e., the check 144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * indicates that the value is already in rdbx) then 145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * err_status_algo_fail is returned. 146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarirdbx_check_add(rdbx_t *rdbx, uint32_t idx) { 151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int delta; 152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari xtd_seq_num_t est; 153386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 154386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari delta = index_guess(&rdbx->index, &est, idx); 155386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 156386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (rdbx_check(rdbx, delta) != err_status_ok) { 157386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("replay_check failed at index %u\n", idx); 158386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_algo_fail; 159386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 160386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 161386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 162386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * in practice, we'd authenticate the packet containing idx, using 163386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * the estimated value est, at this point 164386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 165386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 166386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (rdbx_add_index(rdbx, delta) != err_status_ok) { 167386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("rdbx_add_index failed at index %u\n", idx); 168386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_algo_fail; 169386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 170386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 171386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 172386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 173386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 174386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 175386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * rdbx_check_expect_failure(rdbx_t *rdbx, uint32_t idx) 176386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 177386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * checks that a sequence number idx is in the replay database 178386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * and thus will be rejected 179386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 180386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 181386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 182386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarirdbx_check_expect_failure(rdbx_t *rdbx, uint32_t idx) { 183386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int delta; 184386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari xtd_seq_num_t est; 185386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status; 186386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 187386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari delta = index_guess(&rdbx->index, &est, idx); 188386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 189386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = rdbx_check(rdbx, delta); 190386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status == err_status_ok) { 191386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("delta: %d ", delta); 192386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("replay_check failed at index %u (false positive)\n", idx); 193386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_algo_fail; 194386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 195386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 196386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 197386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 198386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 199386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 200386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarirdbx_check_unordered(rdbx_t *rdbx, uint32_t idx) { 201386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t rstat; 202386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 203386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rstat = rdbx_check(rdbx, idx); 204386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if ((rstat != err_status_ok) && (rstat != err_status_replay_old)) { 205386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("replay_check_unordered failed at index %u\n", idx); 206386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_algo_fail; 207386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 208386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 209386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 210386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 211386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 212386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritest_replay_dbx(int num_trials, unsigned long ws) { 213386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rdbx_t rdbx; 214386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t idx, ircvd; 215386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ut_connection utc; 216386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari err_status_t status; 217386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int num_fp_trials; 218386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 219386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = rdbx_init(&rdbx, ws); 220386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) { 221386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("replay_init failed with error code %d\n", status); 222386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 223386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 224386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 225386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 226386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * test sequential insertion 227386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 228386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("\ttesting sequential insertion..."); 229386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (idx=0; idx < (uint32_t)num_trials; idx++) { 230386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = rdbx_check_add(&rdbx, idx); 231386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 232386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 233386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 234386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 235386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 236386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 237386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * test for false positives by checking all of the index 238386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * values which we've just added 239386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 240386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * note that we limit the number of trials here, since allowing the 241386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * rollover counter to roll over would defeat this test 242386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 243386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari num_fp_trials = num_trials % 0x10000; 244386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (num_fp_trials == 0) { 245386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("warning: no false positive tests performed\n"); 246386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 247386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("\ttesting for false positives..."); 248386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (idx=0; idx < (uint32_t)num_fp_trials; idx++) { 249386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = rdbx_check_expect_failure(&rdbx, idx); 250386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 251386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 252386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 253386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 254386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 255386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* re-initialize */ 256386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rdbx_uninit(&rdbx); 257386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 258386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (rdbx_init(&rdbx, ws) != err_status_ok) { 259386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("replay_init failed\n"); 260386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_init_fail; 261386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 262386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 263386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 264386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * test non-sequential insertion 265386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 266386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * this test covers only fase negatives, since the values returned 267386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * by ut_next_index(...) are distinct 268386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 269386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ut_init(&utc); 270386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 271386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("\ttesting non-sequential insertion..."); 272386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (idx=0; idx < (uint32_t)num_trials; idx++) { 273386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ircvd = ut_next_index(&utc); 274386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = rdbx_check_unordered(&rdbx, ircvd); 275386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 276386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 277386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 278386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 279386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 280386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 281386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * test a replay condition close to zero. 282386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 283386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rdbx_uninit(&rdbx); 284386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 285386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (rdbx_init(&rdbx, ws) != err_status_ok) { 286386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("replay_init failed\n"); 287386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_init_fail; 288386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 289386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 290386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("\ttesting replay close to zero..."); 291386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = rdbx_check_add(&rdbx, 1); 292386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 293386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 294386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = rdbx_check_expect_failure(&rdbx, 64500); 295386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 296386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 297386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari status = rdbx_check_add(&rdbx, 2); 298386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (status) 299386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return status; 300386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("passed\n"); 301386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 302386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rdbx_uninit(&rdbx); 303386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 304386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return err_status_ok; 305386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 306386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 307386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 308386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 309386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include <time.h> /* for clock() */ 310386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include <stdlib.h> /* for random() */ 311386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 312386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaridouble 313386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarirdbx_check_adds_per_second(int num_trials, unsigned long ws) { 314386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t i; 315386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int delta; 316386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rdbx_t rdbx; 317386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari xtd_seq_num_t est; 318386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari clock_t timer; 319386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int failures; /* count number of failures */ 320386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 321386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (rdbx_init(&rdbx, ws) != err_status_ok) { 322386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("replay_init failed\n"); 323386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari exit(1); 324386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 325386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 326386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari failures = 0; 327386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari timer = clock(); 328386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for(i=0; i < (uint32_t)num_trials; i++) { 329386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 330386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari delta = index_guess(&rdbx.index, &est, i); 331386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 332386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (rdbx_check(&rdbx, delta) != err_status_ok) 333386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ++failures; 334386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari else 335386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (rdbx_add_index(&rdbx, delta) != err_status_ok) 336386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ++failures; 337386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 338386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari timer = clock() - timer; 339386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 340386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari printf("number of failures: %d \n", failures); 341386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 342386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari rdbx_uninit(&rdbx); 343386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 344386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return (double) CLOCKS_PER_SEC * num_trials / timer; 345386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 346