diff --git a/net-misc/packetdrill/packetdrill-20160707.recipe b/net-misc/packetdrill/packetdrill-20160707.recipe new file mode 100644 index 000000000..050b1cb55 --- /dev/null +++ b/net-misc/packetdrill/packetdrill-20160707.recipe @@ -0,0 +1,55 @@ +SUMMARY="A network testing scripting tool" +DESCRIPTION="The packetdrill scripting tool enables quick, precise tests for \ +entire TCP/UDP/IPv4/IPv6 network stacks, from the system call layer down to \ +the NIC hardware. packetdrill currently works on Linux, FreeBSD, OpenBSD, \ +and NetBSD. It can test network stack behavior over physical NICs on a LAN, \ +or on a single machine using a tun virtual network device." +HOMEPAGE="https://github.com/google/packetdrill" +COPYRIGHT="2013-2016 Google Inc." +LICENSE="GNU GPL v2" +REVISION="1" +srcGitRev="a3d4338d16a03b32e12559d34a8064978bbaa717" +SOURCE_URI="https://github.com/google/packetdrill/archive/$srcGitRev.tar.gz" +CHECKSUM_SHA256="5b184075673299c08c7772a2a552e97758f3c2ec46c4bdacb37336452ba8562b" +SOURCE_DIR="packetdrill-$srcGitRev" +PATCHES="packetdrill-$portVersion.patchset" + +ARCHITECTURES="?x86_gcc2 ?x86 ?x86_64" +SECONDARY_ARCHITECTURES="?x86 ?x86_gcc2" + +PROVIDES=" + packetdrill$secondaryArchSuffix = $portVersion + cmd:checksum_test + cmd:packet_parser_test + cmd:packet_to_string_test + cmd:packetdrill + " +REQUIRES=" + haiku$secondaryArchSuffix + lib:libpcap + " + +BUILD_REQUIRES=" + haiku${secondaryArchSuffix}_devel + devel:libpcap + " +BUILD_PREREQUIRES=" + cmd:gcc$secondaryArchSuffix + cmd:make + " + +BUILD() +{ + cd gtests/net/packetdrill + ./configure + CFLAGS=-D_BSD_SOURCE make +} + +INSTALL() +{ + cd gtests/net/packetdrill + mkdir -p $binDir $dataDir/packetdrill + cp packetdrill packet_to_string_test \ + packet_parser_test checksum_test $binDir + cp -R tests $dataDir/packetdrill +} diff --git a/net-misc/packetdrill/patches/packetdrill-20160707.patchset b/net-misc/packetdrill/patches/packetdrill-20160707.patchset new file mode 100644 index 000000000..f4f99be6e --- /dev/null +++ b/net-misc/packetdrill/patches/packetdrill-20160707.patchset @@ -0,0 +1,489 @@ +From 8a62d1b05b74792d16f9448e24881af5319a6866 Mon Sep 17 00:00:00 2001 +From: Jerome Duval +Date: Sat, 8 Oct 2016 14:45:19 +0000 +Subject: Haiku patch + + +diff --git a/gtests/net/packetdrill/Makefile.Haiku b/gtests/net/packetdrill/Makefile.Haiku +new file mode 100644 +index 0000000..7d332d0 +--- /dev/null ++++ b/gtests/net/packetdrill/Makefile.Haiku +@@ -0,0 +1,2 @@ ++packetdrill-ext-libs := -lnetwork -lpcap ++include Makefile.common +diff --git a/gtests/net/packetdrill/Makefile.common b/gtests/net/packetdrill/Makefile.common +index 0ec741f..a98ffa8 100644 +--- a/gtests/net/packetdrill/Makefile.common ++++ b/gtests/net/packetdrill/Makefile.common +@@ -1,6 +1,6 @@ + all: binaries + +-CFLAGS = -g -Wall -Werror ++CFLAGS += -g -Wall -Werror + + parser.o: parser.y + bison --output=parser.c --defines=parser.h --report=state parser.y +@@ -19,6 +19,7 @@ packetdrill-lib := \ + symbols_freebsd.o \ + symbols_openbsd.o \ + symbols_netbsd.o \ ++ symbols_haiku.o \ + gre_packet.o icmp_packet.o ip_packet.o tcp_packet.o udp_packet.o \ + mpls_packet.o \ + run.o run_command.o run_packet.o run_system_call.o \ +diff --git a/gtests/net/packetdrill/link_layer.c b/gtests/net/packetdrill/link_layer.c +index 45f5b66..db38bbf 100644 +--- a/gtests/net/packetdrill/link_layer.c ++++ b/gtests/net/packetdrill/link_layer.c +@@ -66,7 +66,7 @@ void get_hw_address(const char *name, struct ether_addr *hw_address) + + #else + +-#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) ++#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) + #include + #include + #include +diff --git a/gtests/net/packetdrill/netdev.c b/gtests/net/packetdrill/netdev.c +index aeca2da..393c23d 100644 +--- a/gtests/net/packetdrill/netdev.c ++++ b/gtests/net/packetdrill/netdev.c +@@ -307,7 +307,7 @@ static void local_netdev_free(struct netdev *a_netdev) + free(netdev); + } + +-#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) ++#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) + /* According to `man 4 tun` on OpenBSD: "Each packet read or written + * is prefixed with a tunnel header consisting of a 4-byte network + * byte order integer containing the address family in the case of +@@ -352,7 +352,7 @@ static int local_netdev_send(struct netdev *a_netdev, + + DEBUGP("local_netdev_send\n"); + +-#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) ++#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) + bsd_tun_write(netdev, packet); + #endif /* defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) */ + +diff --git a/gtests/net/packetdrill/packet_socket_pcap.c b/gtests/net/packetdrill/packet_socket_pcap.c +index 9b22101..1f9b629 100644 +--- a/gtests/net/packetdrill/packet_socket_pcap.c ++++ b/gtests/net/packetdrill/packet_socket_pcap.c +@@ -37,7 +37,7 @@ + + #if defined(__FreeBSD__) + #include +-#elif defined(__OpenBSD__) || defined(__NetBSD__) ++#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) + #include + #endif + +@@ -71,8 +71,11 @@ extern void die_pcap_perror(pcap_t *pcap, char *message) + + static void packet_socket_setup(struct packet_socket *psock) + { ++#ifndef __HAIKU__ + int data_link = -1, bpf_fd = -1, val = -1; +- ++#else ++ int data_link = -1, bpf_fd = -1; ++#endif + DEBUGP("calling pcap_create() with %s\n", psock->name); + psock->pcap = pcap_create(psock->name, psock->pcap_error); + if (psock->pcap == NULL) +@@ -96,9 +99,11 @@ static void packet_socket_setup(struct packet_socket *psock) + * force the BPF device to return the first packet + * immediately. + */ ++#ifndef __HAIKU__ + val = 1; + if (ioctl(bpf_fd, BIOCIMMEDIATE, &val) < 0) + die_perror("ioctl BIOCIMMEDIATE on bpf fd"); ++#endif + + /* Find data link type. */ + data_link = pcap_datalink(psock->pcap); +@@ -252,7 +257,7 @@ int packet_socket_receive(struct packet_socket *psock, + (u32)pkt_header->ts.tv_sec, + (u32)pkt_header->ts.tv_usec); + +-#if defined(__FreeBSD__) || defined(__NetBSD__) ++#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__HAIKU__) + packet->time_usecs = timeval_to_usecs(&pkt_header->ts); + #elif defined(__OpenBSD__) + packet->time_usecs = bpf_timeval_to_usecs(&pkt_header->ts); +diff --git a/gtests/net/packetdrill/platforms.h b/gtests/net/packetdrill/platforms.h +index 5fdda2c..b322dff 100644 +--- a/gtests/net/packetdrill/platforms.h ++++ b/gtests/net/packetdrill/platforms.h +@@ -92,5 +92,26 @@ + + #endif /* __NetBSD__ */ + ++/* ------------------------- Haiku --------------------- */ ++ ++#if defined(__HAIKU__) ++ ++#include ++#include ++#define USE_LIBPCAP 1 ++#define TUN_PATH "/dev/tun0" ++#define TUN_DEV "tun0" ++#define IFF_RUNNING 0 ++#define IPPROTO_IPIP 4 ++#define IPPROTO_GRE 47 ++ ++#define HAVE_FMEMOPEN 1 ++#define HAVE_OPEN_MEMSTREAM 1 ++#include "fmemopen.h" ++ ++#define __always_inline ++ ++#endif /* __HAIKU__ */ ++ + + #endif /* __PLATFORMS_H__ */ +diff --git a/gtests/net/packetdrill/run.c b/gtests/net/packetdrill/run.c +index a326019..e5a6b99 100644 +--- a/gtests/net/packetdrill/run.c ++++ b/gtests/net/packetdrill/run.c +@@ -407,7 +407,7 @@ void set_scheduling_priority(void) + if (num_cpus <= 1) + return; + +-#if !defined(__OpenBSD__) ++#if !defined(__OpenBSD__) && !defined(__HAIKU__) + /* Chose a real-time policy, but use SCHED_RR instead of + * SCHED_FIFO, so that we round-robin among real-time threads + * of the same priority. In practice this shouldn't matter, +@@ -434,8 +434,10 @@ void set_scheduling_priority(void) + */ + void lock_memory(void) + { ++#ifndef __HAIKU__ + if (mlockall(MCL_CURRENT | MCL_FUTURE)) + die_perror("lockall(MCL_CURRENT | MCL_FUTURE)"); ++#endif + } + + /* Wait for and return the wall time at which we should start the +diff --git a/gtests/net/packetdrill/run_system_call.c b/gtests/net/packetdrill/run_system_call.c +index dcc57c3..535afe8 100644 +--- a/gtests/net/packetdrill/run_system_call.c ++++ b/gtests/net/packetdrill/run_system_call.c +@@ -37,10 +37,14 @@ + #include + #include + #include ++#ifndef __HAIKU__ + #include ++#endif + #include + #include ++#ifndef __HAIKU__ + #include ++#endif + #include + #include + #include "logging.h" +@@ -56,7 +60,7 @@ static pid_t gettid(void) + #ifdef linux + return syscall(__NR_gettid); + #endif +-#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) ++#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) + /* TODO(ncardwell): Implement me. XXX */ + return 0; + #endif /* defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)*/ +@@ -1740,8 +1744,12 @@ static int syscall_sendfile(struct state *state, struct syscall_spec *syscall, + int live_outfd, script_outfd; + int live_infd, script_infd; + int script_offset = 0; ++#ifndef __HAIKU__ + off_t live_offset; + int count, result; ++#else ++ int count; ++#endif + int status = STATUS_ERR; + + if (check_arg_count(args, 4, error)) +@@ -1759,6 +1767,7 @@ static int syscall_sendfile(struct state *state, struct syscall_spec *syscall, + if (s32_arg(args, 3, &count, error)) + return STATUS_ERR; + ++#ifndef __HAIKU__ + live_offset = script_offset; + + begin_syscall(state, syscall); +@@ -1766,6 +1775,7 @@ static int syscall_sendfile(struct state *state, struct syscall_spec *syscall, + result = sendfile(live_outfd, live_infd, &live_offset, count); + + status = end_syscall(state, syscall, CHECK_EXACT, result, error); ++#endif + + return status; + } +@@ -1885,7 +1895,7 @@ static int yield(void) + #elif defined(__FreeBSD__) || defined(__OpenBSD__) + pthread_yield(); + return 0; +-#elif defined(__NetBSD__) ++#elif defined(__NetBSD__) || defined(__HAIKU__) + return sched_yield(); + #endif /* defined(__NetBSD__) */ + } +diff --git a/gtests/net/packetdrill/symbols_haiku.c b/gtests/net/packetdrill/symbols_haiku.c +new file mode 100644 +index 0000000..e3d8768 +--- /dev/null ++++ b/gtests/net/packetdrill/symbols_haiku.c +@@ -0,0 +1,230 @@ ++/* ++ * Copyright 2013 Google Inc. ++ * ++ * 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., 51 Franklin Street, Fifth Floor, Boston, MA ++ * 02110-1301, USA. ++ */ ++/* ++ * Definitions of strace-style symbols for HAIKU. ++ * Allows us to map from symbolic strings to integers for system call inputs. ++ */ ++ ++#if defined(__HAIKU__) ++ ++#include "symbols.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "tcp.h" ++ ++/* A table of platform-specific string->int mappings. */ ++struct int_symbol platform_symbols_table[] = { ++ ++ /* /usr/include/sys/socket.h */ ++ { SO_DEBUG, "SO_DEBUG" }, ++ { SO_ACCEPTCONN, "SO_ACCEPTCONN" }, ++ { SO_REUSEADDR, "SO_REUSEADDR" }, ++ { SO_KEEPALIVE, "SO_KEEPALIVE" }, ++ { SO_DONTROUTE, "SO_DONTROUTE" }, ++ { SO_BROADCAST, "SO_BROADCAST" }, ++ { SO_USELOOPBACK, "SO_USELOOPBACK" }, ++ { SO_LINGER, "SO_LINGER" }, ++ { SO_OOBINLINE, "SO_OOBINLINE" }, ++ { SO_REUSEPORT, "SO_REUSEPORT" }, ++ { SO_SNDBUF, "SO_SNDBUF" }, ++ { SO_RCVBUF, "SO_RCVBUF" }, ++ { SO_SNDLOWAT, "SO_SNDLOWAT" }, ++ { SO_RCVLOWAT, "SO_RCVLOWAT" }, ++ { SO_SNDTIMEO, "SO_SNDTIMEO" }, ++ { SO_RCVTIMEO, "SO_RCVTIMEO" }, ++ { SO_ERROR, "SO_ERROR" }, ++ { SO_TYPE, "SO_TYPE" }, ++ ++ /* /usr/include/netinet/tcp.h */ ++ { TCP_NODELAY, "TCP_NODELAY" }, ++ { TCP_MAXSEG, "TCP_MAXSEG" }, ++ { TCP_NOPUSH, "TCP_NOPUSH" }, ++ { TCP_NOOPT, "TCP_NOOPT" }, ++ ++ /* /usr/include/sys/fcntl.h */ ++ { O_RDONLY, "O_RDONLY" }, ++ { O_WRONLY, "O_WRONLY" }, ++ { O_RDWR, "O_RDWR" }, ++ { O_ACCMODE, "O_ACCMODE" }, ++ { O_NONBLOCK, "O_NONBLOCK" }, ++ { O_APPEND, "O_APPEND" }, ++ { O_SYNC, "O_SYNC" }, ++ { O_NOFOLLOW, "O_NOFOLLOW" }, ++ { O_CREAT, "O_CREAT" }, ++ { O_TRUNC, "O_TRUNC" }, ++ { O_EXCL, "O_EXCL" }, ++ { O_NOCTTY, "O_NOCTTY" }, ++ { O_DIRECT, "O_DIRECT" }, ++ { O_DIRECTORY, "O_DIRECTORY" }, ++ { O_CLOEXEC, "O_CLOEXEC" }, ++ { O_NDELAY, "O_NDELAY" }, ++ { AT_FDCWD, "AT_FDCWD" }, ++ { AT_EACCESS, "AT_EACCESS" }, ++ { AT_SYMLINK_NOFOLLOW, "AT_SYMLINK_NOFOLLOW" }, ++ { AT_SYMLINK_FOLLOW, "AT_SYMLINK_FOLLOW" }, ++ { AT_REMOVEDIR, "AT_REMOVEDIR" }, ++ { F_DUPFD, "F_DUPFD" }, ++ { F_GETFD, "F_GETFD" }, ++ { F_SETFD, "F_SETFD" }, ++ { F_GETFL, "F_GETFL" }, ++ { F_SETFL, "F_SETFL" }, ++ { F_GETLK, "F_GETLK" }, ++ { F_SETLK, "F_SETLK" }, ++ { F_SETLKW, "F_SETLKW" }, ++ { FD_CLOEXEC, "FD_CLOEXEC" }, ++ { F_RDLCK, "F_RDLCK" }, ++ { F_UNLCK, "F_UNLCK" }, ++ { F_WRLCK, "F_WRLCK" }, ++ ++ /* /usr/include/sys/unistd.h */ ++ { SEEK_SET, "SEEK_SET" }, ++ { SEEK_CUR, "SEEK_CUR" }, ++ { SEEK_END, "SEEK_END" }, ++ ++ /* /usr/include/sys/socket.h */ ++ { MSG_OOB, "MSG_OOB" }, ++ { MSG_PEEK, "MSG_PEEK" }, ++ { MSG_DONTROUTE, "MSG_DONTROUTE" }, ++ { MSG_EOR, "MSG_EOR" }, ++ { MSG_TRUNC, "MSG_TRUNC" }, ++ { MSG_CTRUNC, "MSG_CTRUNC" }, ++ { MSG_WAITALL, "MSG_WAITALL" }, ++ { MSG_DONTWAIT, "MSG_DONTWAIT" }, ++ { MSG_EOF, "MSG_EOF" }, ++ { MSG_NOSIGNAL, "MSG_NOSIGNAL" }, ++ ++ /* /usr/include/sys/filio.h */ ++ { FIONREAD, "FIONREAD" }, ++ { FIONBIO, "FIONBIO" }, ++ ++ /* /usr/include/sys/poll.h */ ++ { POLLIN, "POLLIN" }, ++ { POLLPRI, "POLLPRI" }, ++ { POLLOUT, "POLLOUT" }, ++ { POLLRDNORM, "POLLRDNORM" }, ++ { POLLWRNORM, "POLLWRNORM" }, ++ { POLLRDBAND, "POLLRDBAND" }, ++ { POLLWRBAND, "POLLWRBAND" }, ++ { POLLERR, "POLLERR" }, ++ { POLLHUP, "POLLHUP" }, ++ { POLLNVAL, "POLLNVAL" }, ++ ++ /* /usr/include/sys/errno.h */ ++ { EPERM, "EPERM" }, ++ { ENOENT, "ENOENT" }, ++ { ESRCH, "ESRCH" }, ++ { EINTR, "EINTR" }, ++ { EIO, "EIO" }, ++ { ENXIO, "ENXIO" }, ++ { E2BIG, "E2BIG" }, ++ { ENOEXEC, "ENOEXEC" }, ++ { EBADF, "EBADF" }, ++ { ECHILD, "ECHILD" }, ++ { EDEADLK, "EDEADLK" }, ++ { ENOMEM, "ENOMEM" }, ++ { EACCES, "EACCES" }, ++ { EFAULT, "EFAULT" }, ++ { EBUSY, "EBUSY" }, ++ { EEXIST, "EEXIST" }, ++ { EXDEV, "EXDEV" }, ++ { ENODEV, "ENODEV" }, ++ { ENOTDIR, "ENOTDIR" }, ++ { EISDIR, "EISDIR" }, ++ { EINVAL, "EINVAL" }, ++ { ENFILE, "ENFILE" }, ++ { EMFILE, "EMFILE" }, ++ { ENOTTY, "ENOTTY" }, ++ { ETXTBSY, "ETXTBSY" }, ++ { EFBIG, "EFBIG" }, ++ { ENOSPC, "ENOSPC" }, ++ { ESPIPE, "ESPIPE" }, ++ { EROFS, "EROFS" }, ++ { EMLINK, "EMLINK" }, ++ { EPIPE, "EPIPE" }, ++ { EDOM, "EDOM" }, ++ { ERANGE, "ERANGE" }, ++ { EAGAIN, "EAGAIN" }, ++ { EWOULDBLOCK, "EWOULDBLOCK" }, ++ { EINPROGRESS, "EINPROGRESS" }, ++ { EALREADY, "EALREADY" }, ++ { ENOTSOCK, "ENOTSOCK" }, ++ { EDESTADDRREQ, "EDESTADDRREQ" }, ++ { EMSGSIZE, "EMSGSIZE" }, ++ { EPROTOTYPE, "EPROTOTYPE" }, ++ { ENOPROTOOPT, "ENOPROTOOPT" }, ++ { EPROTONOSUPPORT, "EPROTONOSUPPORT" }, ++ { EOPNOTSUPP, "EOPNOTSUPP" }, ++ { ENOTSUP, "ENOTSUP" }, ++ { EPFNOSUPPORT, "EPFNOSUPPORT" }, ++ { EAFNOSUPPORT, "EAFNOSUPPORT" }, ++ { EADDRINUSE, "EADDRINUSE" }, ++ { EADDRNOTAVAIL, "EADDRNOTAVAIL" }, ++ { ENETDOWN, "ENETDOWN" }, ++ { ENETUNREACH, "ENETUNREACH" }, ++ { ENETRESET, "ENETRESET" }, ++ { ECONNABORTED, "ECONNABORTED" }, ++ { ECONNRESET, "ECONNRESET" }, ++ { ENOBUFS, "ENOBUFS" }, ++ { EISCONN, "EISCONN" }, ++ { ENOTCONN, "ENOTCONN" }, ++ { ESHUTDOWN, "ESHUTDOWN" }, ++ { ETIMEDOUT, "ETIMEDOUT" }, ++ { ECONNREFUSED, "ECONNREFUSED" }, ++ { ELOOP, "ELOOP" }, ++ { ENAMETOOLONG, "ENAMETOOLONG" }, ++ { EHOSTDOWN, "EHOSTDOWN" }, ++ { EHOSTUNREACH, "EHOSTUNREACH" }, ++ { ENOTEMPTY, "ENOTEMPTY" }, ++ { EDQUOT, "EDQUOT" }, ++ { ESTALE, "ESTALE" }, ++ { ENOLCK, "ENOLCK" }, ++ { ENOSYS, "ENOSYS" }, ++ { EIDRM, "EIDRM" }, ++ { ENOMSG, "ENOMSG" }, ++ { EOVERFLOW, "EOVERFLOW" }, ++ { ECANCELED, "ECANCELED" }, ++ { EILSEQ, "EILSEQ" }, ++ { ENOATTR, "ENOATTR" }, ++ { EBADMSG, "EBADMSG" }, ++ { EMULTIHOP, "EMULTIHOP" }, ++ { ENOLINK, "ENOLINK" }, ++ { EPROTO, "EPROTO" }, ++ ++ /* Sentinel marking the end of the table. */ ++ { 0, NULL }, ++}; ++ ++struct int_symbol *platform_symbols(void) ++{ ++ return platform_symbols_table; ++} ++ ++#endif /* __HAIKU__ */ +diff --git a/gtests/net/packetdrill/tcp.h b/gtests/net/packetdrill/tcp.h +index b29bfb6..a4f81e5 100644 +--- a/gtests/net/packetdrill/tcp.h ++++ b/gtests/net/packetdrill/tcp.h +@@ -35,7 +35,7 @@ + + #include + +-#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) ++#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) + #define SOL_TCP IPPROTO_TCP + #endif /* defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) */ + +-- +2.2.2 +