Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/checkpoint-restore/criu.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorRadostin Stoyanov <rstoyanov1@gmail.com>2019-12-13 07:01:36 +0300
committerAndrei Vagin <avagin@gmail.com>2020-02-04 23:39:05 +0300
commit8b467dd944f6b3bed0a468800b041efdb218d6e8 (patch)
tree46f898af3c1644b9130d84427d2b683c776721a1 /test
parentd4e6fc2a0dcff62ff246544d3d9a78d6961f253a (diff)
zdtm: Add test for SO_KEEPALIVE
Signed-off-by: Radostin Stoyanov <rstoyanov1@gmail.com>
Diffstat (limited to 'test')
-rw-r--r--test/zdtm/static/Makefile3
-rw-r--r--test/zdtm/static/socket-tcp-keepalive.c97
2 files changed, 99 insertions, 1 deletions
diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
index f9d2efe74..ea5d3c42e 100644
--- a/test/zdtm/static/Makefile
+++ b/test/zdtm/static/Makefile
@@ -105,7 +105,8 @@ TST_NOFILE := \
socket-tcp-unconn \
socket-tcp6-unconn \
socket-tcp-syn-sent \
- socket-tcp-skip-in-flight \
+ socket-tcp-skip-in-flight \
+ socket-tcp-keepalive \
sock_opts00 \
sock_opts01 \
sk-unix-unconn \
diff --git a/test/zdtm/static/socket-tcp-keepalive.c b/test/zdtm/static/socket-tcp-keepalive.c
new file mode 100644
index 000000000..a977a03b5
--- /dev/null
+++ b/test/zdtm/static/socket-tcp-keepalive.c
@@ -0,0 +1,97 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+
+#include "zdtmtst.h"
+
+const char *test_doc = "test checkpoint/restore of SO_KEEPALIVE\n";
+const char *test_author = "Radostin Stoyanov <rstoyanov1@gmail.com>\n";
+
+int main(int argc, char **argv)
+{
+ int sk;
+ int alive = 1;
+ int cnt = 5;
+ int idle = 10;
+ int intvl = 15;
+ int optval;
+ socklen_t optlen;
+
+ test_init(argc, argv);
+
+ sk = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (sk < 0) {
+ pr_perror("Can't create socket");
+ return 1;
+ }
+
+ /* Set the option active */
+ if (setsockopt(sk, SOL_SOCKET, SO_KEEPALIVE, &alive, sizeof(alive)) < 0) {
+ pr_perror("setsockopt SO_KEEPALIVE");
+ return 1;
+ }
+
+ if (setsockopt(sk, SOL_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt)) < 0) {
+ pr_perror("setsockopt TCP_KEEPCNT");
+ return 1;
+ }
+
+ if (setsockopt(sk, SOL_TCP, TCP_KEEPIDLE, &idle, sizeof(idle)) < 0) {
+ pr_perror("setsockopt TCP_KEEPIDLE");
+ return 1;
+ }
+
+ optval = 5;
+ optlen = sizeof(optval);
+ if (setsockopt(sk, SOL_TCP, TCP_KEEPINTVL, &intvl, sizeof(intvl)) < 0) {
+ pr_perror("setsockopt TCP_KEEPINTVL");
+ return 1;
+ }
+
+ test_daemon();
+ test_waitsig();
+
+ if (getsockopt(sk, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen)) {
+ pr_perror("getsockopt SO_KEEPALIVE");
+ return 1;
+ }
+
+ if (optlen != sizeof(optval) || optval != alive) {
+ fail("SO_KEEPALIVE not set");
+ return 1;
+ }
+
+ if (getsockopt(sk, SOL_TCP, TCP_KEEPCNT, &optval, &optlen) < 0) {
+ pr_perror("getsockopt TCP_KEEPCNT");
+ return 1;
+ }
+
+ if (optval != cnt) {
+ fail("TCP_KEEPCNT has incorrect value (%d != %d)", cnt, optval);
+ return 1;
+ }
+
+ if (getsockopt(sk, SOL_TCP, TCP_KEEPIDLE, &optval, &optlen) < 0) {
+ pr_perror("getsockopt TCP_KEEPIDLE");
+ return 1;
+ }
+
+ if (optval != idle) {
+ fail("TCP_KEEPIDLE has incorrect value (%d != %d)", idle, optval);
+ return 1;
+ }
+
+ if (getsockopt(sk, SOL_TCP, TCP_KEEPINTVL, &optval, &optlen) < 0) {
+ pr_perror("getsockopt TCP_KEEPINTVL");
+ return 1;
+ }
+
+ if (optval != intvl) {
+ fail("TCP_KEEPINTVL has incorrect value (%d != %d)", intvl, optval);
+ return 1;
+ }
+
+ pass();
+ return 0;
+} \ No newline at end of file