Commit 7a6b96ae authored by Gleb Valin's avatar Gleb Valin Committed by Pavel Emelyanov

zdtm: Add test for SOCK_PACKET sockets

This one covers the following cases:
* socket is bound to an interface
* socket isn't bound to an interface

https://github.com/xemul/criu/issues/73
travis-ci: success for series starting with [1/2] socket: Add support for SOCK_PACKET sockets
Signed-off-by: 's avatarGleb Valin <the7winds@yandex.ru>
Signed-off-by: 's avatarEugene Batalov <eabatalov89@gmail.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 6d86d8d0
......@@ -41,6 +41,7 @@ TST_NOFILE := \
socket_dgram_data \
packet_sock \
packet_sock_mmap \
packet_sock_spkt \
sock_filter \
msgque \
inotify_system \
......
#include "zdtmtst.h"
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <linux/if_ether.h>
#include <unistd.h>
#include <fcntl.h>
const char *test_doc = "Check bound and not bound SOCK_PACKET sockets";
const char *test_author = "Gleb Valin <the7winds@yandex.ru>";
struct ethframe {
struct ethhdr header;
char data[ETH_DATA_LEN];
};
static int do_bind(int sk)
{
struct sockaddr addr = {};
addr.sa_family = AF_PACKET;
strcpy(addr.sa_data, "lo");
return bind(sk, &addr, sizeof(addr));
}
static int check_socket_binding(int sk, char *dev)
{
struct sockaddr addr = {};
socklen_t l = sizeof(addr);
if (getsockname(sk, &addr, &l) < 0)
return -1;
if (addr.sa_family != AF_PACKET)
return -1;
if (strcmp(addr.sa_data, dev) != 0)
return -1;
return 0;
}
int main(int argc, char **argv)
{
int sk1;
int sk2;
test_init(argc, argv);
sk1 = socket(AF_PACKET, SOCK_PACKET, htons(ETH_P_ALL));
if (sk1 < 0) {
pr_perror("Can't create socket 1");
return 1;
}
if (do_bind(sk1) < 0) {
pr_perror("Can't bind sosket 1");
return 1;
}
sk2 = socket(AF_PACKET, SOCK_PACKET, htons(ETH_P_ALL));
if (sk2 < 0) {
pr_perror("Can't create socket 2");
return 1;
}
test_daemon();
test_waitsig();
if (check_socket_binding(sk1, "lo") < 0) {
fail("Socket 1 has wrong binding");
return 1;
}
if (check_socket_binding(sk2, "") < 0) {
fail("Socket 2 has wrong binding");
return 1;
}
pass();
return 0;
}
{'flavor':'h', 'flags' : 'suid'}
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