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
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@virtuozzo.com>2016-02-19 16:36:37 +0300
committerPavel Emelyanov <xemul@virtuozzo.com>2016-02-20 13:40:52 +0300
commit2e13f1f0291c8e1ed9a1493d17722ee9f20bee83 (patch)
tree73a10c76404aaae5cf5dcfdaa73310a47e0e30c5 /test/zdtm/static/netns-dev.c
parent02b22eba8bb5aa620fd53b82c8e53d881a00903e (diff)
test: Get rid of live directory
Move static and transition into zdtm top. We can't move all the micro tests themselves, as we need to distinguish static from non static (zdtm.py makes additional checks on static ones). Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
Diffstat (limited to 'test/zdtm/static/netns-dev.c')
-rw-r--r--test/zdtm/static/netns-dev.c220
1 files changed, 220 insertions, 0 deletions
diff --git a/test/zdtm/static/netns-dev.c b/test/zdtm/static/netns-dev.c
new file mode 100644
index 000000000..fa623aaee
--- /dev/null
+++ b/test/zdtm/static/netns-dev.c
@@ -0,0 +1,220 @@
+#include <unistd.h>
+#include <stdlib.h>
+#include <dirent.h>
+
+#include "zdtmtst.h"
+
+#define LO_CONF_DIR_PATH "/proc/sys/net/ipv4/conf/lo"
+#define DEF_CONF_DIR_PATH "/proc/sys/net/ipv4/conf/default"
+
+char *devconfs[] = {
+ "accept_local",
+ "accept_redirects",
+ "accept_source_route",
+ "arp_accept",
+ "arp_announce",
+ "arp_filter",
+ "arp_ignore",
+ "arp_notify",
+ "bootp_relay",
+ "disable_policy",
+ "disable_xfrm",
+ "force_igmp_version",
+ "forwarding",
+ "igmpv2_unsolicited_report_interval",
+ "igmpv3_unsolicited_report_interval",
+ "ignore_routes_with_linkdown",
+ "log_martians",
+ "mc_forwarding",
+ "medium_id",
+ "promote_secondaries",
+ "proxy_arp",
+ "proxy_arp_pvlan",
+ "route_localnet",
+ "rp_filter",
+ "secure_redirects",
+ "send_redirects",
+ "shared_media",
+ "src_valid_mark",
+ "tag",
+ NULL,
+};
+
+int rand_limit[] = {
+ 2, /* accept_local */
+ 2, /* accept_redirects */
+ 2, /* accept_source_route */
+ 2, /* arp_accept */
+ 3, /* arp_announce */
+ 2, /* arp_filter */
+ 9, /* arp_ignore */
+ 2, /* arp_notify */
+ 2, /* bootp_relay */
+ 2, /* disable_policy */
+ 2, /* disable_xfrm */
+ 0, /* force_igmp_version */
+ 2, /* forwarding */
+ 0, /* igmpv2_unsolicited_report_interval */
+ 0, /* igmpv3_unsolicited_report_interval */
+ 2, /* ignore_routes_with_linkdown */
+ 2, /* log_martians */
+ 2, /* mc_forwarding */
+ 0, /* medium_id */
+ 2, /* promote_secondaries */
+ 2, /* proxy_arp */
+ 2, /* proxy_arp_pvlan */
+ 2, /* route_localnet */
+ 3, /* rp_filter */
+ 2, /* secure_redirects */
+ 2, /* send_redirects */
+ 2, /* shared_media */
+ 0, /* src_valid_mark */
+ 0, /* tag */
+};
+
+struct test_conf {
+ int ipv4_conf[ARRAY_SIZE(devconfs)];
+ int ipv4_conf_rand[ARRAY_SIZE(devconfs)];
+ char *dir;
+} lo, def;
+
+static int save_and_set(int opt, FILE *fp, struct test_conf *tc) {
+ int ret;
+ int val;
+
+ /*
+ * Save
+ */
+ ret = fscanf(fp, "%d", &tc->ipv4_conf[opt]);
+ if (ret != 1) {
+ pr_perror("fscanf");
+ return -1;
+ }
+
+ ret = fseek(fp, 0, SEEK_SET);
+ if (ret) {
+ pr_perror("fseek");
+ return -1;
+ }
+
+ /*
+ * Set random value
+ */
+ val = (int)lrand48();
+
+ if (rand_limit[opt] != 0)
+ tc->ipv4_conf_rand[opt] = val % rand_limit[opt];
+ else
+ tc->ipv4_conf_rand[opt] = val;
+
+ ret = fprintf(fp, "%d", tc->ipv4_conf_rand[opt]);
+ if (ret < 0) {
+ pr_perror("fprintf");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int check_and_restore(int opt, FILE *fp, struct test_conf *tc) {
+ int ret;
+ int val;
+
+ /*
+ * Check opt
+ */
+ ret = fscanf(fp, "%d", &val);
+ if (ret != 1) {
+ pr_perror("fscanf");
+ return -1;
+ }
+
+ if (val != tc->ipv4_conf_rand[opt]) {
+ fail("Option \"%s/%s\" changed from %d to %d",
+ tc->dir, devconfs[opt], tc->ipv4_conf_rand[opt], val);
+ return -1;
+ }
+
+ ret = fseek(fp, 0, SEEK_SET);
+ if (ret) {
+ pr_perror("fseek");
+ return -1;
+ }
+
+ /*
+ * Restore opt
+ */
+ ret = fprintf(fp, "%d", tc->ipv4_conf[opt]);
+ if (ret < 0) {
+ pr_perror("fprintf");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int for_each_option_do(int (*f)(int opt, FILE *fp, struct test_conf *tc), struct test_conf *tc) {
+ int ret;
+ int i;
+
+ for (i = 0; devconfs[i]; i++) {
+ FILE *fp;
+ char path[PATH_MAX];
+
+ ret = snprintf(path, sizeof(path), "%s/%s", tc->dir, devconfs[i]);
+ if (ret < 0) {
+ pr_perror("snprintf");
+ return -1;
+ }
+
+ ret = access(path, W_OK);
+ if (ret < 0)
+ continue;
+
+ fp = fopen(path, "r+");
+ if (fp == NULL) {
+ pr_perror("fopen");
+ return -1;
+ }
+
+ ret = (*f)(i, fp, tc);
+ if (ret < 0)
+ return -1;
+
+ fclose(fp);
+ }
+
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ int ret;
+
+ lo.dir = LO_CONF_DIR_PATH;
+ def.dir = DEF_CONF_DIR_PATH;
+
+ test_init(argc, argv);
+
+ ret = for_each_option_do(save_and_set, &lo);
+ if (ret < 0)
+ return -1;
+
+ ret = for_each_option_do(save_and_set, &def);
+ if (ret < 0)
+ return -1;
+
+ test_daemon();
+ test_waitsig();
+
+ ret = for_each_option_do(check_and_restore, &lo);
+ if (ret < 0)
+ return -1;
+
+ ret = for_each_option_do(check_and_restore, &def);
+ if (ret < 0)
+ return -1;
+
+ pass();
+ return 0;
+}