Commit 950b33c8 authored by Andrei Vagin's avatar Andrei Vagin Committed by Pavel Emelyanov

zdtm: add a test for unconnected tcp sockets

Check source and destination addresses for closed tcp sockets.

travis-ci: success for series starting with [01/21] build: install libnet-dev
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 7ce065a1
...@@ -86,6 +86,8 @@ TST_NOFILE := \ ...@@ -86,6 +86,8 @@ TST_NOFILE := \
socket-tcp-closed \ socket-tcp-closed \
socket-tcp-closed-last-ack \ socket-tcp-closed-last-ack \
socket-tcp6-closed \ socket-tcp6-closed \
socket-tcp-unconn \
socket-tcp6-unconn \
sock_opts00 \ sock_opts00 \
sock_opts01 \ sock_opts01 \
sk-unix-unconn \ sk-unix-unconn \
...@@ -444,6 +446,7 @@ socket-tcp6-close-wait: override CFLAGS += -D ZDTM_TCP_CLOSE_WAIT -D ZDTM_IPV6 ...@@ -444,6 +446,7 @@ socket-tcp6-close-wait: override CFLAGS += -D ZDTM_TCP_CLOSE_WAIT -D ZDTM_IPV6
socket-tcp-last-ack: override CFLAGS += -D ZDTM_TCP_LAST_ACK socket-tcp-last-ack: override CFLAGS += -D ZDTM_TCP_LAST_ACK
socket-tcp6-last-ack: override CFLAGS += -D ZDTM_TCP_LAST_ACK -D ZDTM_IPV6 socket-tcp6-last-ack: override CFLAGS += -D ZDTM_TCP_LAST_ACK -D ZDTM_IPV6
socket-tcp6-closing: override CFLAGS += -D ZDTM_IPV6 socket-tcp6-closing: override CFLAGS += -D ZDTM_IPV6
socket-tcp6-unconn: override CFLAGS += -D ZDTM_IPV6
$(LIB): force $(LIB): force
$(Q) $(MAKE) -C $(LIBDIR) $(Q) $(MAKE) -C $(LIBDIR)
......
#include "zdtmtst.h"
#ifdef ZDTM_IPV6
#define ZDTM_FAMILY AF_INET6
#else
#define ZDTM_FAMILY AF_INET
#endif
const char *test_doc = "Check unconnected tcp sockets\n";
const char *test_author = "Andrey Vagin <avagin@openvz.org";
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <signal.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
static int port = 8880;
union sockaddr_inet {
struct sockaddr addr;
struct sockaddr_in v4;
struct sockaddr_in6 v6;
};
int main(int argc, char **argv)
{
int fd, fd_s, sock, sk;
union sockaddr_inet addr, src_addr;
socklen_t aux;
test_init(argc, argv);
sk = socket(ZDTM_FAMILY, SOCK_STREAM, 0);
if (sk < 0) {
pr_perror("socket");
return 1;
}
if ((fd_s = tcp_init_server(ZDTM_FAMILY, &port)) < 0) {
pr_err("initializing server failed\n");
return 1;
}
if ((sock = socket(ZDTM_FAMILY, SOCK_STREAM, IPPROTO_TCP)) < 0) {
pr_perror("can't create socket");
return -1;
}
/* Construct the server address structure */
memset(&addr, 0, sizeof(addr));
if (ZDTM_FAMILY == AF_INET) {
addr.v4.sin_family = AF_INET;
inet_pton(AF_INET, "localhost", &addr.v4.sin_addr);
} else {
addr.v6.sin6_family = AF_INET6;
inet_pton(AF_INET6, "localhost", &addr.v6.sin6_addr);
}
if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
pr_perror("can't connect to server");
return -1;
}
aux = sizeof(src_addr);
memset(&src_addr, 0, sizeof(src_addr));
if (getsockname(sock, &src_addr.addr, &aux)) {
pr_perror("getsockname");
return 1;
}
test_daemon();
test_waitsig();
memset(&addr, 0, sizeof(addr));
if (getsockname(sock, &addr.addr, &aux)) {
pr_perror("getsockname");
return 1;
}
if (memcmp(&addr, &src_addr, aux)) {
pr_err("A source address mismatch");
return 1;
}
/* Construct the server address structure */
memset(&addr, 0, sizeof(addr));
if (ZDTM_FAMILY == AF_INET) {
addr.v4.sin_family = AF_INET;
addr.v4.sin_port = htons(port);
inet_pton(AF_INET, "localhost", &addr.v4.sin_addr);
} else {
addr.v6.sin6_family = AF_INET6;
addr.v6.sin6_port = htons(port);
inet_pton(AF_INET6, "localhost", &addr.v6.sin6_addr);
}
if (connect(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
pr_perror("can't connect to server");
return -1;
}
/*
* parent is server of TCP connection
*/
fd = tcp_accept_server(fd_s);
if (fd < 0) {
pr_err("can't accept client connection\n");
return 1;
}
close(fd_s);
pass();
return 0;
}
{'opts': '--tcp-established', 'flags': 'nouser samens', 'feature' : 'tcp_half_closed'}
socket-tcp-unconn.c
\ No newline at end of file
socket-tcp-unconn.desc
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment