From 87088af6e49e9ce973cfe77d36cfbf42f9101854 Mon Sep 17 00:00:00 2001 From: Martin Schwenke Date: Thu, 16 Aug 2018 15:15:55 +1000 Subject: ctdb-tests: Add tests for ARP and IPv6 NA marshalling Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs --- ctdb/tests/src/system_socket_test.c | 65 +++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'ctdb/tests/src') diff --git a/ctdb/tests/src/system_socket_test.c b/ctdb/tests/src/system_socket_test.c index 61dfa3970c1..23a1a3b26c5 100644 --- a/ctdb/tests/src/system_socket_test.c +++ b/ctdb/tests/src/system_socket_test.c @@ -17,8 +17,21 @@ along with this program; if not, see . */ +#include "replace.h" + #include +/* For ether_aton() */ +#ifdef _AIX +#include +#endif +#ifdef __FreeBSD__ +#include +#endif +#ifdef linux +#include +#endif + #include "common/system_socket.c" #include "protocol/protocol_util.h" @@ -37,11 +50,54 @@ static void test_types(void) assert(sizeof(ip4pkt) == sizeof(struct ip) + sizeof(struct tcphdr)); } +#ifdef HAVE_PACKETSOCKET + +static void test_arp(const char *addr_str, const char *hwaddr_str, bool reply) +{ + ctdb_sock_addr addr; + struct ether_addr *hw, *dhw; + uint8_t buf[512]; + size_t buflen = sizeof(buf); + size_t len; + int ret; + + ret = ctdb_sock_addr_from_string(addr_str, &addr, false); + assert(ret == 0); + + hw = ether_aton(hwaddr_str); + assert(hw != NULL); + + switch (addr.ip.sin_family) { + case AF_INET: + ret = arp_build(buf, buflen, &addr.ip, hw, reply, &dhw, &len); + break; + case AF_INET6: + ret = ip6_na_build(buf, buflen, &addr.ip6, hw, &dhw, &len); + break; + default: + abort(); + } + + assert(ret == 0); + + write(STDOUT_FILENO, buf, len); +} + +#else /* HAVE_PACKETSOCKET */ + +static void test_arp(const char *addr_str, const char *hwaddr_str, bool reply) +{ + fprintf(stderr, "PACKETSOCKET not supported\n"); +} + +#endif /* HAVE_PACKETSOCKET */ + static void usage(const char *prog) { fprintf(stderr, "usage: %s [ ...]\n", prog); fprintf(stderr, " commands:\n"); fprintf(stderr, " types\n"); + fprintf(stderr, " arp [reply]\n"); exit(1); } @@ -55,6 +111,15 @@ int main(int argc, char **argv) if (strcmp(argv[1], "types") == 0) { test_types(); + } else if (strcmp(argv[1], "arp") == 0) { + /* + * Extra arg indicates that a reply should be + * constructed for IPv4 - value is ignored + */ + if (argc != 4 && argc != 5) { + usage(argv[0]); + } + test_arp(argv[2], argv[3], (argc == 5)); } else { usage(argv[0]); } -- cgit v1.2.1