2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-29 05:18:00 +00:00
criu/test/zdtm/static/socket-tcp-keepalive.c
Radostin Stoyanov 8b467dd944 zdtm: Add test for SO_KEEPALIVE
Signed-off-by: Radostin Stoyanov <rstoyanov1@gmail.com>
2020-02-04 12:39:05 -08:00

97 lines
2.0 KiB
C

#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;
}