diff options
author | Renato Botelho <renato@netgate.com> | 2017-02-23 06:28:41 -0300 |
---|---|---|
committer | Renato Botelho <renato@netgate.com> | 2017-02-23 06:28:41 -0300 |
commit | 82ceeb2ea625cd9bff60f2863b9a0830f55b7905 (patch) | |
tree | 263ca9347bf664a4489743f9302e699ce14de1df /contrib/netbsd-tests/net/in_cksum | |
parent | 4a05f5440acda223e6a0ec5157bc32ecc0f09ff9 (diff) | |
parent | d20dd8b36e7a565be7bfbb22aade51c8ffd753e9 (diff) | |
download | FreeBSD-src-devel.zip FreeBSD-src-devel.tar.gz |
Merge remote-tracking branch 'origin/stable/10' into develdevel
Diffstat (limited to 'contrib/netbsd-tests/net/in_cksum')
-rw-r--r-- | contrib/netbsd-tests/net/in_cksum/assym.h | 10 | ||||
-rw-r--r-- | contrib/netbsd-tests/net/in_cksum/in_cksum.c | 270 | ||||
-rwxr-xr-x | contrib/netbsd-tests/net/in_cksum/t_in_cksum.sh | 78 |
3 files changed, 358 insertions, 0 deletions
diff --git a/contrib/netbsd-tests/net/in_cksum/assym.h b/contrib/netbsd-tests/net/in_cksum/assym.h new file mode 100644 index 0000000..60aa41f --- /dev/null +++ b/contrib/netbsd-tests/net/in_cksum/assym.h @@ -0,0 +1,10 @@ +/* XXX: Depends on m_hdr */ +#ifdef _LP64 +#define M_NEXT 0 +#define M_DATA 16 +#define M_LEN 32 +#else +#define M_NEXT 0 +#define M_DATA 8 +#define M_LEN 16 +#endif diff --git a/contrib/netbsd-tests/net/in_cksum/in_cksum.c b/contrib/netbsd-tests/net/in_cksum/in_cksum.c new file mode 100644 index 0000000..4bdaf5b --- /dev/null +++ b/contrib/netbsd-tests/net/in_cksum/in_cksum.c @@ -0,0 +1,270 @@ +/* $NetBSD: in_cksum.c,v 1.5 2015/10/18 18:27:25 christos Exp $ */ +/*- + * Copyright (c) 2008 Joerg Sonnenberger <joerg@NetBSD.org>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: in_cksum.c,v 1.5 2015/10/18 18:27:25 christos Exp $"); + +#include <sys/param.h> +#include <sys/mbuf.h> +#include <sys/resource.h> +#include <err.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdarg.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> + +#define cpu_in_cksum portable_cpu_in_cksum +#include "cpu_in_cksum.c" + +#ifdef HAVE_CPU_IN_CKSUM +#undef cpu_in_cksum +int cpu_in_cksum(struct mbuf*, int, int, uint32_t); +#endif + +static bool random_aligned; + +void panic(const char *, ...) __printflike(1, 2); +void +panic(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + verrx(1, fmt, ap); + va_end(ap); +} + +static void +free_mbuf_chain(struct mbuf *m) +{ + struct mbuf *next; + + if (m == NULL) + return; + + next = m->m_next; + free(m); + free_mbuf_chain(next); +} + +static struct mbuf * +allocate_mbuf_chain(char **lens) +{ + int len, off; + struct mbuf *m; + + if (*lens == NULL) + return NULL; + + len = atoi(*lens); + off = random_aligned ? rand() % 64 : 0; + + m = malloc(sizeof(struct m_hdr) + len + off); + if (m == NULL) + err(EXIT_FAILURE, "malloc failed"); + + m->m_data = (char *)m + sizeof(struct m_hdr) + off; + m->m_len = len; + + m->m_next = allocate_mbuf_chain(lens + 1); + + return m; +} + +#ifdef MBUFDUMP +static void +dump_mbuf(const struct mbuf *m, int len, int off) +{ + int x = 0; + if (len <= 0) + return; + + printf("Starting len=%d off=%d:\n", len, off); + if (off > 0) { + for (; m; m = m->m_next) + if (off > m->m_len) + off -= m->m_len; + else + break; + if (m == NULL || off > m->m_len) + errx(1, "out of data"); + } + + unsigned char *ptr = mtod(m, unsigned char *) + off; + unsigned char *eptr = ptr + m->m_len; + printf("["); + for (;;) { + if (ptr == eptr) { + m = m->m_next; + if (m == NULL) + errx(1, "out of data"); + ptr = mtod(m, unsigned char *); + eptr = ptr + m->m_len; + printf("]\n["); + x = 0; + } + printf("%.2x ", *ptr++); + if (++x % 16 == 0) + printf("\n"); + if (--len == 0) + break; + } + printf("]\n"); + fflush(stdout); +} +#endif + +static void +randomise_mbuf_chain(struct mbuf *m) +{ + int i, data, len; + + for (i = 0; i < m->m_len; i += sizeof(int)) { + data = rand(); + if (i + sizeof(int) < (size_t)m->m_len) + len = sizeof(int); + else + len = m->m_len - i; + memcpy(m->m_data + i, &data, len); + } + if (m->m_next) + randomise_mbuf_chain(m->m_next); +} + +static int +mbuf_len(struct mbuf *m) +{ + return m == NULL ? 0 : m->m_len + mbuf_len(m->m_next); +} + +int in_cksum_portable(struct mbuf *, int); +int in_cksum(struct mbuf *, int); + +int +main(int argc, char **argv) +{ + struct rusage res; + struct timeval tv, old_tv; + int loops, old_sum, off, len; +#ifdef HAVE_CPU_IN_CKSUM + int new_sum; +#endif + long i, iterations; + uint32_t init_sum; + struct mbuf *m; + bool verbose; + int c; + + loops = 16; + verbose = false; + random_aligned = 0; + iterations = 100000; + + while ((c = getopt(argc, argv, "i:l:u:v")) != -1) { + switch (c) { + case 'i': + iterations = atoi(optarg); + break; + case 'l': + loops = atoi(optarg); + break; + case 'u': + random_aligned = atoi(optarg); + break; + case 'v': + verbose = true; + break; + default: + errx(1, "%s [-l <loops>] [-u <unalign> [-i <iterations> " + "[<mbuf-size> ...]", getprogname()); + } + } + + for (; loops; --loops) { + if ((m = allocate_mbuf_chain(argv + 4)) == NULL) + continue; + randomise_mbuf_chain(m); + init_sum = rand(); + len = mbuf_len(m); + + /* force one loop over all data */ + if (loops == 1) + off = 0; + else + off = len ? rand() % len : 0; + + len -= off; + old_sum = portable_cpu_in_cksum(m, len, off, init_sum); +#ifdef HAVE_CPU_IN_CKSUM +#ifdef MBUFDUMP + printf("m->m_len=%d len=%d off=%d\n", m->m_len, len, off); + dump_mbuf(m, len, off); +#endif + new_sum = cpu_in_cksum(m, len, off, init_sum); + if (old_sum != new_sum) + errx(1, "comparison failed: %x %x", old_sum, new_sum); +#else + __USE(old_sum); +#endif + + if (iterations == 0) + continue; + + getrusage(RUSAGE_SELF, &res); + tv = res.ru_utime; + for (i = iterations; i; --i) + (void)portable_cpu_in_cksum(m, len, off, init_sum); + getrusage(RUSAGE_SELF, &res); + timersub(&res.ru_utime, &tv, &old_tv); + if (verbose) + printf("portable version: %jd.%06jd\n", + (intmax_t)old_tv.tv_sec, (intmax_t)old_tv.tv_usec); + +#ifdef HAVE_CPU_IN_CKSUM + getrusage(RUSAGE_SELF, &res); + tv = res.ru_utime; + for (i = iterations; i; --i) + (void)cpu_in_cksum(m, len, off, init_sum); + getrusage(RUSAGE_SELF, &res); + timersub(&res.ru_utime, &tv, &tv); + if (verbose) { + printf("test version: %jd.%06jd\n", + (intmax_t)tv.tv_sec, (intmax_t)tv.tv_usec); + printf("relative time: %3.g%%\n", + 100 * ((double)tv.tv_sec * 1e6 + tv.tv_usec) / + ((double)old_tv.tv_sec * 1e6 + old_tv.tv_usec + 1)); + } +#endif + free_mbuf_chain(m); + } + + return 0; +} diff --git a/contrib/netbsd-tests/net/in_cksum/t_in_cksum.sh b/contrib/netbsd-tests/net/in_cksum/t_in_cksum.sh new file mode 100755 index 0000000..a342403 --- /dev/null +++ b/contrib/netbsd-tests/net/in_cksum/t_in_cksum.sh @@ -0,0 +1,78 @@ +#! /usr/bin/atf-sh +# $NetBSD: t_in_cksum.sh,v 1.2 2015/01/06 15:13:16 martin Exp $ +# + +TIMING_LOOPS=10000 +incksum="$(atf_get_srcdir)/in_cksum" + +fail() { + atf_fail "see output for details" +} + +mbufs() { + ${incksum} -l 16 -u $0 -i ${TIMING_LOOPS} \ + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 \ + || fail + ${incksum} -l 16 -u $0 -i ${TIMING_LOOPS} \ + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 \ + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 \ + || fail + ${incksum} -l 64 -u $0 -i ${TIMING_LOOPS} \ + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 \ + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 \ + || fail + ${incksum} -l 16 -u $0 -i ${TIMING_LOOPS} \ + 1 3 1 3 1 3 1 \ + || fail +} + +sizes() { + ${incksum} -l 16 -u $1 -i ${TIMING_LOOPS} 2048 || fail + ${incksum} -l 16 -u $1 -i ${TIMING_LOOPS} 40 || fail + ${incksum} -l 16 -u $1 -i ${TIMING_LOOPS} 1536 || fail + ${incksum} -l 16 -u $1 -i ${TIMING_LOOPS} 576 || fail + ${incksum} -l 16 -u $1 -i ${TIMING_LOOPS} 1536 1536 1536 1536 1536 640 \ + || fail +} + +atf_test_case mbufs_aligned + +mbufs_aligned_head() { + atf_set "descr" "Test in_cksum mbuf chains aligned" +} + +mbufs_aligned_body() { + mbufs 0 +} + +mbufs_unaligned_head() { + atf_set "descr" "Test in_cksum mbuf chains unaligned" +} + +mbufs_unaligned_body() { + mbufs 1 +} + +sizes_aligned_head() { + atf_set "descr" "Test in_cksum sizes aligned" +} + +sizes_aligned_body() { + sizes 0 +} + +sizes_unaligned_head() { + atf_set "descr" "Test in_cksum sizes unaligned" +} + +sizes_unaligned_body() { + sizes 1 +} + +atf_init_test_cases() +{ + atf_add_test_case mbufs_aligned + atf_add_test_case mbufs_unaligned + atf_add_test_case sizes_aligned + atf_add_test_case sizes_unaligned +} |