Commit 044a29af authored by Pavel Emelyanov's avatar Pavel Emelyanov

tcp: Move window checking code into cr-check.c

travis-ci: success for series starting with [1/2] tcp: Move window checking code into cr-check.c
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 67d548e9
......@@ -24,6 +24,8 @@
#include <linux/aio_abi.h>
#include <sys/mount.h>
#include "../soccr/soccr.h"
#include "types.h"
#include "fdinfo.h"
#include "sockets.h"
......@@ -937,6 +939,46 @@ static int check_tcp_halt_closed(void)
return 0;
}
static int kerndat_tcp_repair_window(void)
{
struct tcp_repair_window opt;
socklen_t optlen = sizeof(opt);
int sk, val = 1;
sk = socket(AF_INET, SOCK_STREAM, 0);
if (sk < 0) {
pr_perror("Unable to create inet socket");
goto errn;
}
if (setsockopt(sk, SOL_TCP, TCP_REPAIR, &val, sizeof(val))) {
if (errno == EPERM) {
pr_warn("TCP_REPAIR isn't available to unprivileged users\n");
goto now;
}
pr_perror("Unable to set TCP_REPAIR");
goto err;
}
if (getsockopt(sk, SOL_TCP, TCP_REPAIR_WINDOW, &opt, &optlen)) {
if (errno != ENOPROTOOPT) {
pr_perror("Unable to set TCP_REPAIR_WINDOW");
goto err;
}
now:
val = 0;
} else
val = 1;
close(sk);
return val;
err:
close(sk);
errn:
return -1;
}
static int check_tcp_window(void)
{
int ret;
......@@ -945,7 +987,7 @@ static int check_tcp_window(void)
if (ret < 0)
return -1;
if (!kdat.has_tcp_window) {
if (ret == 0) {
pr_err("The TCP_REPAIR_WINDOW option isn't supported.\n");
return -1;
}
......
......@@ -29,7 +29,6 @@ struct kerndat_s {
bool has_dirty_track;
bool has_memfd;
bool has_fdinfo_lock;
bool has_tcp_window;
unsigned long task_size;
bool ipv6;
bool has_loginuid;
......@@ -57,7 +56,6 @@ enum {
*/
extern int kerndat_fs_virtualized(unsigned int which, u32 kdev);
extern int kerndat_tcp_repair_window();
extern int kerndat_tcp_repair();
#endif /* __CR_KERNDAT_H__ */
......@@ -580,8 +580,6 @@ int kerndat_init(void)
ret = kerndat_loginuid(true);
if (!ret)
ret = kerndat_iptables_has_xtlocks();
if (!ret)
ret = kerndat_tcp_repair_window();
if (!ret)
ret = kerndat_tcp_repair();
......@@ -614,8 +612,6 @@ int kerndat_init_rst(void)
ret = kerndat_loginuid(false);
if (!ret)
ret = kerndat_iptables_has_xtlocks();
if (!ret)
ret = kerndat_tcp_repair_window();
if (!ret)
ret = kerndat_tcp_repair();
......
......@@ -474,41 +474,3 @@ out:
return ret;
}
int kerndat_tcp_repair_window()
{
struct tcp_repair_window opt;
socklen_t optlen = sizeof(opt);
int sk, val = 1;
sk = socket(AF_INET, SOCK_STREAM, 0);
if (sk < 0) {
pr_perror("Unable to create inet socket");
return -1;
}
if (setsockopt(sk, SOL_TCP, TCP_REPAIR, &val, sizeof(val))) {
if (errno == EPERM) {
kdat.has_tcp_window = false;
pr_warn("TCP_REPAIR isn't available to unprivileged users\n");
close(sk);
return 0;
}
pr_perror("Unable to set TCP_REPAIR");
close(sk);
return -1;
}
if (getsockopt(sk, SOL_TCP, TCP_REPAIR_WINDOW, &opt, &optlen)) {
if (errno != ENOPROTOOPT) {
pr_perror("Unable to set TCP_REPAIR_WINDOW");
close(sk);
return -1;
}
kdat.has_tcp_window = false;
} else
kdat.has_tcp_window = true;
close(sk);
return 0;
}
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