diff options
author | Martin Schwenke <martin@meltin.net> | 2018-08-16 16:47:21 +1000 |
---|---|---|
committer | Amitay Isaacs <amitay@samba.org> | 2018-08-30 04:48:58 +0200 |
commit | a02cba1c8a716d8e939d9bfb59e038e14f96e69a (patch) | |
tree | 8bf47cba7f322b46f756bc6f20dda45809cc909f /ctdb | |
parent | d7d23e78ed2aa24d1807c2718d44afe3d8c70da6 (diff) | |
download | samba-a02cba1c8a716d8e939d9bfb59e038e14f96e69a.tar.gz |
ctdb-tests: Add tests for TCP packet marshalling
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
Diffstat (limited to 'ctdb')
-rwxr-xr-x | ctdb/tests/cunit/system_socket_test_001.sh | 63 | ||||
-rw-r--r-- | ctdb/tests/src/system_socket_test.c | 69 |
2 files changed, 132 insertions, 0 deletions
diff --git a/ctdb/tests/cunit/system_socket_test_001.sh b/ctdb/tests/cunit/system_socket_test_001.sh index e2badea257a..3fe9db39e13 100755 --- a/ctdb/tests/cunit/system_socket_test_001.sh +++ b/ctdb/tests/cunit/system_socket_test_001.sh @@ -64,3 +64,66 @@ ok <<EOF 000056 EOF arp_test "fe80::6af7:28ff:fefa:d136" "12:34:56:78:9a:bc" + +tcp_run () +{ + $VALGRIND system_socket_test tcp "$@" >"$out_file" || exit $? + od -A x -t x1 "$out_file" +} + +tcp_test () +{ + unit_test_notrace tcp_run "$@" +} + +ok <<EOF +000000 45 00 00 08 00 00 00 00 ff 06 00 00 c0 a8 01 19 +000010 c0 a8 02 4b 01 bd d4 31 00 00 00 00 00 00 00 00 +000020 50 10 04 d2 50 5f 00 00 +000028 +EOF +tcp_test "192.168.1.25:445" "192.168.2.75:54321" 0 0 0 + +ok <<EOF +000000 45 00 00 08 00 00 00 00 ff 06 00 00 c0 a8 01 19 +000010 c0 a8 02 4b 01 bd d4 31 00 00 00 00 00 00 00 00 +000020 50 14 04 d2 50 5b 00 00 +000028 +EOF +tcp_test "192.168.1.25:445" "192.168.2.75:54321" 0 0 1 + +ok <<EOF +000000 45 00 00 08 00 00 00 00 ff 06 00 00 c0 a8 01 19 +000010 c0 a8 02 4b 01 bd d4 31 39 30 00 00 a0 5b 00 00 +000020 50 14 04 d2 76 cf 00 00 +000028 +EOF +tcp_test "192.168.1.25:445" "192.168.2.75:54321" 12345 23456 1 + +ok <<EOF +000000 60 00 00 00 00 14 06 40 fe 80 00 00 00 00 00 00 +000010 6a f7 28 ff fe fa d1 36 fe 80 00 00 00 00 00 00 +000020 6a f7 28 ff fe fb d1 37 01 bd d4 31 00 00 00 00 +000030 00 00 00 00 50 10 04 d2 0f c0 00 00 +00003c +EOF +tcp_test "fe80::6af7:28ff:fefa:d136:445" "fe80::6af7:28ff:fefb:d137:54321" 0 0 0 + +ok <<EOF +000000 60 00 00 00 00 14 06 40 fe 80 00 00 00 00 00 00 +000010 6a f7 28 ff fe fa d1 36 fe 80 00 00 00 00 00 00 +000020 6a f7 28 ff fe fb d1 37 01 bd d4 31 00 00 00 00 +000030 00 00 00 00 50 14 04 d2 0f bc 00 00 +00003c +EOF +tcp_test "fe80::6af7:28ff:fefa:d136:445" "fe80::6af7:28ff:fefb:d137:54321" 0 0 1 + +ok <<EOF +000000 60 00 00 00 00 14 06 40 fe 80 00 00 00 00 00 00 +000010 6a f7 28 ff fe fa d1 36 fe 80 00 00 00 00 00 00 +000020 6a f7 28 ff fe fb d1 37 01 bd d4 31 39 30 00 00 +000030 a0 5b 00 00 50 14 04 d2 36 30 00 00 +00003c +EOF +tcp_test "fe80::6af7:28ff:fefa:d136:445" \ + "fe80::6af7:28ff:fefb:d137:54321" 12345 23456 1 diff --git a/ctdb/tests/src/system_socket_test.c b/ctdb/tests/src/system_socket_test.c index 23a1a3b26c5..285caa34cf4 100644 --- a/ctdb/tests/src/system_socket_test.c +++ b/ctdb/tests/src/system_socket_test.c @@ -92,12 +92,76 @@ static void test_arp(const char *addr_str, const char *hwaddr_str, bool reply) #endif /* HAVE_PACKETSOCKET */ +static void test_tcp(const char *src_str, + const char *dst_str, + const char *seq_str, + const char *ack_str, + const char *rst_str) +{ + ctdb_sock_addr src, dst; + uint32_t seq, ack; + int rst; + uint8_t buf[512]; + struct ether_header *eth; + size_t expected_len, len; + int ret; + + ret = ctdb_sock_addr_from_string(src_str, &src, true); + assert(ret == 0); + + ret = ctdb_sock_addr_from_string(dst_str, &dst, true); + assert(ret == 0); + + seq = atoi(seq_str); + ack = atoi(ack_str); + rst = atoi(rst_str); + + /* Need to fake this up */ + eth = (struct ether_header *) buf; + memset(eth, 0, sizeof(*eth)); + + switch (src.ip.sin_family) { + case AF_INET: + eth->ether_type = htons(ETHERTYPE_IP); + expected_len = 40; + ret = tcp4_build(buf + sizeof(struct ether_header), + sizeof(buf) - sizeof(struct ether_header), + &src.ip, + &dst.ip, + seq, + ack, + rst, + &len); + break; + case AF_INET6: + eth->ether_type = htons(ETHERTYPE_IP6); + expected_len = 60; + ret = tcp6_build(buf + sizeof(struct ether_header), + sizeof(buf) - sizeof(struct ether_header), + &src.ip6, + &dst.ip6, + seq, + ack, + rst, + &len); + break; + default: + abort(); + } + + assert(ret == 0); + assert(len == expected_len); + + write(STDOUT_FILENO, buf + sizeof(struct ether_header), len); +} + static void usage(const char *prog) { fprintf(stderr, "usage: %s <cmd> [<arg> ...]\n", prog); fprintf(stderr, " commands:\n"); fprintf(stderr, " types\n"); fprintf(stderr, " arp <ipaddr> <hwaddr> [reply]\n"); + fprintf(stderr, " tcp <src> <dst> <seq> <ack> <rst>\n"); exit(1); } @@ -120,6 +184,11 @@ int main(int argc, char **argv) usage(argv[0]); } test_arp(argv[2], argv[3], (argc == 5)); + } else if (strcmp(argv[1], "tcp") == 0) { + if (argc != 7) { + usage(argv[0]); + } + test_tcp(argv[2], argv[3], argv[4], argv[5], argv[6]); } else { usage(argv[0]); } |