Commit f43c1c2a authored by Pavel Emelyanov's avatar Pavel Emelyanov

sk: Rework bound-dev dump/restore according to new API

The SO_BINDTODEVICE getter is changed in the kernel (before
official release) to report not index, but name to be in
harmony with setter.

Fix crtools accordingly.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 9df1786a
......@@ -16,7 +16,7 @@ message sk_opts_entry {
optional bool so_dontroute = 13;
optional bool so_no_check = 14;
optional uint32 so_bound_dev = 15;
optional string so_bound_dev = 15;
repeated fixed64 so_filter = 16;
}
......
......@@ -6,6 +6,7 @@
#include <errno.h>
#include <linux/if.h>
#include <linux/filter.h>
#include <string.h>
#include "libnetlink.h"
#include "sockets.h"
......@@ -39,39 +40,39 @@
static int dump_bound_dev(int sk, SkOptsEntry *soe)
{
int dev = 0, ret;
int ret;
char dev[IFNAMSIZ];
socklen_t len = sizeof(dev);
ret = getsockopt(sk, SOL_SOCKET, SO_BINDTODEVICE, &dev, &len);
if (ret && errno != ENOPROTOOPT) {
if (ret) {
if (errno == ENOPROTOOPT) {
pr_warn("Bound device may be missing for socket\n");
return 0;
}
pr_perror("Can't get bound dev");
return ret;
}
if (dev == 0)
if (len == 0)
return 0;
pr_debug("\tDumping %d bound dev for sk\n", dev);
soe->has_so_bound_dev = true;
soe->so_bound_dev = dev;
pr_debug("\tDumping %s bound dev for sk\n", dev);
soe->so_bound_dev = xmalloc(len);
strcpy(soe->so_bound_dev, dev);
return 0;
}
static int restore_bound_dev(int sk, SkOptsEntry *soe)
{
char *n;
char *n = soe->so_bound_dev;
if (!soe->has_so_bound_dev || !soe->so_bound_dev)
if (!n)
return 0;
pr_debug("\tBinding socket to %d dev\n", soe->so_bound_dev);
n = resolve_dev_name(soe->so_bound_dev);
if (!n) {
pr_err("Can't resolve netdev name for %d\n", soe->so_bound_dev);
return -1;
}
return do_restore_opt(sk, SOL_SOCKET, SO_BINDTODEVICE, n, IFNAMSIZ);
pr_debug("\tBinding socket to %s dev\n", n);
return do_restore_opt(sk, SOL_SOCKET, SO_BINDTODEVICE, n, strlen(n));
}
/*
......@@ -362,6 +363,7 @@ int dump_socket_opts(int sk, SkOptsEntry *soe)
void release_skopts(SkOptsEntry *soe)
{
xfree(soe->so_filter);
xfree(soe->so_bound_dev);
}
int dump_socket(struct fd_parms *p, int lfd, const struct cr_fdset *cr_fdset)
......
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
......@@ -12,8 +13,9 @@ const char *test_author = "Pavel Emelyanov <xemul@parallels.com>";
int main(int argc, char ** argv)
{
int sock, ret, dev, dev2;
socklen_t len = sizeof(dev);
int sock, ret;
char dev[IFNAMSIZ], dev2[IFNAMSIZ];
socklen_t len, len2;
test_init(argc, argv);
......@@ -31,6 +33,7 @@ int main(int argc, char ** argv)
return 1;
}
len = sizeof(dev);
ret = getsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &dev, &len);
if (ret < 0) {
err("can't get dev binding");
......@@ -40,15 +43,14 @@ int main(int argc, char ** argv)
test_daemon();
test_waitsig();
ret = getsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &dev2, &len);
len2 = sizeof(dev);
ret = getsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &dev2, &len2);
if (ret < 0) {
fail("can't get dev binding2");
return 1;
}
if (!dev2)
fail("unbound sock restored");
else if (dev != dev2)
if ((len != len2) || strncmp(dev, dev2, len))
fail("wrong bound device");
else
pass();
......
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