[PATCHv4,2/2] zdtm: sysctl net.unix.max_dgram_qlen value preservation test

Submitted by Alexander Mikhalitsyn on Nov. 1, 2019, 2:33 p.m.

Details

Message ID 20191101143234.4839-1-alexander.mikhalitsyn@virtuozzo.com
State New
Series "Preserve max_dgram_qlen value patch update"
Headers show

Commit Message

Alexander Mikhalitsyn Nov. 1, 2019, 2:33 p.m.
Test checks that if the /proc/sys/net/unix/max_dgram_qlen value has
been changed in process net namespace, then it is saved after c/r.

Based-on-patch-by: Cyrill Gorcunov <gorcunov@gmail.com>
Signed-off-by: Alexander Mikhalitsyn <alexander@mihalicyn.com>
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
---
 test/zdtm/lib/Makefile                 |  2 +-
 test/zdtm/lib/sysctl.c                 | 56 ++++++++++++++++++++++++++
 test/zdtm/lib/sysctl.h                 |  7 ++++
 test/zdtm/static/Makefile              |  1 +
 test/zdtm/static/netns_sub_sysctl.c    | 52 ++++++++++++++++++++++++
 test/zdtm/static/netns_sub_sysctl.desc |  4 ++
 6 files changed, 121 insertions(+), 1 deletion(-)
 create mode 100644 test/zdtm/lib/sysctl.c
 create mode 100644 test/zdtm/lib/sysctl.h
 create mode 100644 test/zdtm/static/netns_sub_sysctl.c
 create mode 100644 test/zdtm/static/netns_sub_sysctl.desc

Patch hide | download patch | download mbox

diff --git a/test/zdtm/lib/Makefile b/test/zdtm/lib/Makefile
index d2d9f1cc..b87f36e8 100644
--- a/test/zdtm/lib/Makefile
+++ b/test/zdtm/lib/Makefile
@@ -4,7 +4,7 @@  CFLAGS	+= $(USERCFLAGS)
 
 LIB	:= libzdtmtst.a
 
-LIBSRC	:= datagen.c msg.c parseargs.c test.c streamutil.c lock.c ns.c tcp.c fs.c
+LIBSRC	:= datagen.c msg.c parseargs.c test.c streamutil.c lock.c ns.c tcp.c fs.c sysctl.c
 LIBOBJ	:= $(LIBSRC:%.c=%.o)
 
 BIN	:= groups
diff --git a/test/zdtm/lib/sysctl.c b/test/zdtm/lib/sysctl.c
new file mode 100644
index 00000000..47dcccb4
--- /dev/null
+++ b/test/zdtm/lib/sysctl.c
@@ -0,0 +1,56 @@ 
+#include <fcntl.h>
+
+#include "zdtmtst.h"
+#include "sysctl.h"
+
+int sysctl_read_int(const char *name, int *data)
+{
+	int fd;
+	int ret;
+	char buf[32];
+
+	fd = open(name, O_RDONLY);
+	if (fd < 0) {
+		pr_perror("Can't open %s", name);
+		return fd;
+	}
+
+	ret = read(fd, buf, sizeof(buf) - 1);
+	if (ret < 0) {
+		pr_perror("Can't read %s", name);
+		ret = -errno;
+		goto err;
+	}
+
+	buf[ret] = '\0';
+
+	*data = (int)strtoul(buf, NULL, 10);
+	ret = 0;
+err:
+	close(fd);
+	return ret;
+}
+
+int sysctl_write_int(const char *name, int val)
+{
+	int fd;
+	int ret;
+	char buf[32];
+
+	fd = open(name, O_WRONLY);
+	if (fd < 0) {
+		pr_perror("Can't open %s", name);
+		return fd;
+	}
+
+	sprintf(buf, "%d\n", val);
+
+	ret = write(fd, buf, strlen(buf));
+	if (ret < 0) {
+		pr_perror("Can't write %d into %s", val, name);
+		return -errno;
+	}
+
+	close(fd);
+	return 0;
+}
diff --git a/test/zdtm/lib/sysctl.h b/test/zdtm/lib/sysctl.h
new file mode 100644
index 00000000..67129102
--- /dev/null
+++ b/test/zdtm/lib/sysctl.h
@@ -0,0 +1,7 @@ 
+#ifndef __ZDTM_SYSCTL__
+#define __ZDTM_SYSCTL__
+
+extern int sysctl_read_int(const char *name, int *data);
+extern int sysctl_write_int(const char *name, int val);
+
+#endif
diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
index a38482f4..887bf4ac 100644
--- a/test/zdtm/static/Makefile
+++ b/test/zdtm/static/Makefile
@@ -207,6 +207,7 @@  TST_NOFILE	:=				\
 		pipe03				\
 		netns_sub			\
 		netns_sub_veth			\
+		netns_sub_sysctl	\
 		unlink_multiple_largefiles	\
 		config_inotify_irmap		\
 		thp_disable			\
diff --git a/test/zdtm/static/netns_sub_sysctl.c b/test/zdtm/static/netns_sub_sysctl.c
new file mode 100644
index 00000000..bc6a1914
--- /dev/null
+++ b/test/zdtm/static/netns_sub_sysctl.c
@@ -0,0 +1,52 @@ 
+#include <sched.h>
+
+#include "zdtmtst.h"
+#include "sysctl.h"
+
+const char *test_doc	= "Check dump and restore a net.unix.max_dgram_qlen sysctl parameter in subns";
+
+typedef struct {
+	const char *path;
+	int old;
+	int new;
+} sysctl_opt_t;
+
+#define CONF_UNIX_BASE	"/proc/sys/net/unix"
+
+static sysctl_opt_t net_unix_params[] = {
+	{CONF_UNIX_BASE"/max_dgram_qlen", 0, 0},
+	{NULL, 0, 0}
+};
+
+int main(int argc, char **argv)
+{
+	sysctl_opt_t *p;
+	test_init(argc, argv);
+
+	if (unshare(CLONE_NEWNET)) {
+		perror("unshare");
+		return 1;
+	}
+
+	for (p = net_unix_params; p->path != NULL; p++) {
+		p->old = (((unsigned)lrand48()) % 1023) + 1;
+		if (sysctl_write_int(p->path, p->old)) {
+			pr_perror("Can't change %s", p->path);
+			return -1;
+		}
+	}
+
+	test_daemon();
+	test_waitsig();
+
+	for (p = net_unix_params; p->path != NULL; p++) {
+		sysctl_read_int(p->path, &p->new);
+		if (p->old != p->new) {
+			fail();
+			return 1;
+		}
+	}
+
+	pass();
+	return 0;
+}
diff --git a/test/zdtm/static/netns_sub_sysctl.desc b/test/zdtm/static/netns_sub_sysctl.desc
new file mode 100644
index 00000000..53584266
--- /dev/null
+++ b/test/zdtm/static/netns_sub_sysctl.desc
@@ -0,0 +1,4 @@ 
+{
+    'flavor': 'ns',
+    'flags': 'suid'
+}

Comments

Pavel Tikhomirov Nov. 1, 2019, 3:07 p.m.
On 11/1/19 5:33 PM, Alexander Mikhalitsyn wrote:
> Test checks that if the /proc/sys/net/unix/max_dgram_qlen value has
> been changed in process net namespace, then it is saved after c/r.
> 
> Based-on-patch-by: Cyrill Gorcunov <gorcunov@gmail.com>
> Signed-off-by: Alexander Mikhalitsyn <alexander@mihalicyn.com>
> Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
> ---
>   test/zdtm/lib/Makefile                 |  2 +-
>   test/zdtm/lib/sysctl.c                 | 56 ++++++++++++++++++++++++++
>   test/zdtm/lib/sysctl.h                 |  7 ++++
>   test/zdtm/static/Makefile              |  1 +
>   test/zdtm/static/netns_sub_sysctl.c    | 52 ++++++++++++++++++++++++
>   test/zdtm/static/netns_sub_sysctl.desc |  4 ++
>   6 files changed, 121 insertions(+), 1 deletion(-)
>   create mode 100644 test/zdtm/lib/sysctl.c
>   create mode 100644 test/zdtm/lib/sysctl.h
>   create mode 100644 test/zdtm/static/netns_sub_sysctl.c
>   create mode 100644 test/zdtm/static/netns_sub_sysctl.desc
> 
> diff --git a/test/zdtm/lib/Makefile b/test/zdtm/lib/Makefile
> index d2d9f1cc..b87f36e8 100644
> --- a/test/zdtm/lib/Makefile
> +++ b/test/zdtm/lib/Makefile
> @@ -4,7 +4,7 @@ CFLAGS	+= $(USERCFLAGS)
>   
>   LIB	:= libzdtmtst.a
>   
> -LIBSRC	:= datagen.c msg.c parseargs.c test.c streamutil.c lock.c ns.c tcp.c fs.c
> +LIBSRC	:= datagen.c msg.c parseargs.c test.c streamutil.c lock.c ns.c tcp.c fs.c sysctl.c
>   LIBOBJ	:= $(LIBSRC:%.c=%.o)
>   
>   BIN	:= groups
> diff --git a/test/zdtm/lib/sysctl.c b/test/zdtm/lib/sysctl.c
> new file mode 100644
> index 00000000..47dcccb4
> --- /dev/null
> +++ b/test/zdtm/lib/sysctl.c
> @@ -0,0 +1,56 @@
> +#include <fcntl.h>
> +
> +#include "zdtmtst.h"
> +#include "sysctl.h"
> +
> +int sysctl_read_int(const char *name, int *data)
> +{
> +	int fd;
> +	int ret;
> +	char buf[32];
> +
> +	fd = open(name, O_RDONLY);
> +	if (fd < 0) {
> +		pr_perror("Can't open %s", name);
> +		return fd;
> +	}
> +
> +	ret = read(fd, buf, sizeof(buf) - 1);
> +	if (ret < 0) {
> +		pr_perror("Can't read %s", name);
> +		ret = -errno;
> +		goto err;
> +	}
> +
> +	buf[ret] = '\0';
> +
> +	*data = (int)strtoul(buf, NULL, 10);
> +	ret = 0;
> +err:
> +	close(fd);
> +	return ret;
> +}
> +
> +int sysctl_write_int(const char *name, int val)
> +{
> +	int fd;
> +	int ret;
> +	char buf[32];
> +
> +	fd = open(name, O_WRONLY);
> +	if (fd < 0) {
> +		pr_perror("Can't open %s", name);
> +		return fd;
> +	}
> +
> +	sprintf(buf, "%d\n", val);
> +
> +	ret = write(fd, buf, strlen(buf));
> +	if (ret < 0) {
> +		pr_perror("Can't write %d into %s", val, name);
> +		return -errno;

Need to close the fd here on error path, except for these:

Reviewed-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>

> +	}
> +
> +	close(fd);
> +	return 0;
> +}
> diff --git a/test/zdtm/lib/sysctl.h b/test/zdtm/lib/sysctl.h
> new file mode 100644
> index 00000000..67129102
> --- /dev/null
> +++ b/test/zdtm/lib/sysctl.h
> @@ -0,0 +1,7 @@
> +#ifndef __ZDTM_SYSCTL__
> +#define __ZDTM_SYSCTL__
> +
> +extern int sysctl_read_int(const char *name, int *data);
> +extern int sysctl_write_int(const char *name, int val);
> +
> +#endif
> diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
> index a38482f4..887bf4ac 100644
> --- a/test/zdtm/static/Makefile
> +++ b/test/zdtm/static/Makefile
> @@ -207,6 +207,7 @@ TST_NOFILE	:=				\
>   		pipe03				\
>   		netns_sub			\
>   		netns_sub_veth			\
> +		netns_sub_sysctl	\
>   		unlink_multiple_largefiles	\
>   		config_inotify_irmap		\
>   		thp_disable			\
> diff --git a/test/zdtm/static/netns_sub_sysctl.c b/test/zdtm/static/netns_sub_sysctl.c
> new file mode 100644
> index 00000000..bc6a1914
> --- /dev/null
> +++ b/test/zdtm/static/netns_sub_sysctl.c
> @@ -0,0 +1,52 @@
> +#include <sched.h>
> +
> +#include "zdtmtst.h"
> +#include "sysctl.h"
> +
> +const char *test_doc	= "Check dump and restore a net.unix.max_dgram_qlen sysctl parameter in subns";
> +
> +typedef struct {
> +	const char *path;
> +	int old;
> +	int new;
> +} sysctl_opt_t;
> +
> +#define CONF_UNIX_BASE	"/proc/sys/net/unix"
> +
> +static sysctl_opt_t net_unix_params[] = {
> +	{CONF_UNIX_BASE"/max_dgram_qlen", 0, 0},
> +	{NULL, 0, 0}
> +};
> +
> +int main(int argc, char **argv)
> +{
> +	sysctl_opt_t *p;
> +	test_init(argc, argv);
> +
> +	if (unshare(CLONE_NEWNET)) {
> +		perror("unshare");
> +		return 1;
> +	}
> +
> +	for (p = net_unix_params; p->path != NULL; p++) {
> +		p->old = (((unsigned)lrand48()) % 1023) + 1;
> +		if (sysctl_write_int(p->path, p->old)) {
> +			pr_perror("Can't change %s", p->path);
> +			return -1;
> +		}
> +	}
> +
> +	test_daemon();
> +	test_waitsig();
> +
> +	for (p = net_unix_params; p->path != NULL; p++) {
> +		sysctl_read_int(p->path, &p->new);
> +		if (p->old != p->new) {
> +			fail();
> +			return 1;
> +		}
> +	}
> +
> +	pass();
> +	return 0;
> +}
> diff --git a/test/zdtm/static/netns_sub_sysctl.desc b/test/zdtm/static/netns_sub_sysctl.desc
> new file mode 100644
> index 00000000..53584266
> --- /dev/null
> +++ b/test/zdtm/static/netns_sub_sysctl.desc
> @@ -0,0 +1,4 @@
> +{
> +    'flavor': 'ns',
> +    'flags': 'suid'
> +}
>