[CRIU] [PATCH] zdtm: test for packet socket mappings

Andrew Vagin avagin at parallels.com
Mon Dec 22 00:53:10 PST 2014


On Fri, Dec 19, 2014 at 03:56:30PM +0300, Pavel Emelyanov wrote:
> It turned out we didn't have one, though recent 3.19-merge-window
> kernel would crash on that test.
>

Acked-by: Andrew Vagin <avagin at parallels.com>

> Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
> ---
>  test/zdtm.sh                             |   3 +
>  test/zdtm/live/static/Makefile           |   1 +
>  test/zdtm/live/static/packet_sock_mmap.c | 103 +++++++++++++++++++++++++++++++
>  3 files changed, 107 insertions(+)
>  create mode 100644 test/zdtm/live/static/packet_sock_mmap.c
> 
> diff --git a/test/zdtm.sh b/test/zdtm.sh
> index aacdc71..2734054 100755
> --- a/test/zdtm.sh
> +++ b/test/zdtm.sh
> @@ -69,6 +69,7 @@ static/cmdlinenv00
>  static/socket_listen
>  static/socket_listen6
>  static/packet_sock
> +static/packet_sock_mmap
>  static/socket_udp
>  static/sock_filter
>  static/socket6_udp
> @@ -221,6 +222,7 @@ ns/static/sk-unix-unconn
>  ns/static/socket_listen
>  ns/static/socket_listen6
>  ns/static/packet_sock
> +ns/static/packet_sock_mmap
>  ns/static/socket_udp
>  ns/static/sock_filter
>  ns/static/socket6_udp
> @@ -283,6 +285,7 @@ sock_opts00
>  sock_opts01
>  cmdlinenv00
>  packet_sock
> +packet_sock_mmap
>  fanotify00
>  sk-netlink
>  tun
> diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile
> index e2431f5..3c78491 100644
> --- a/test/zdtm/live/static/Makefile
> +++ b/test/zdtm/live/static/Makefile
> @@ -34,6 +34,7 @@ TST_NOFILE	=				\
>  		socket_udplite			\
>  		socket_aio			\
>  		packet_sock			\
> +		packet_sock_mmap		\
>  		sock_filter			\
>  		msgque				\
>  		inotify_system			\
> diff --git a/test/zdtm/live/static/packet_sock_mmap.c b/test/zdtm/live/static/packet_sock_mmap.c
> new file mode 100644
> index 0000000..265d613
> --- /dev/null
> +++ b/test/zdtm/live/static/packet_sock_mmap.c
> @@ -0,0 +1,103 @@
> +#include "zdtmtst.h"
> +
> +const char *test_doc = "static test for packet sockets mmaps";
> +const char *test_author = "Pavel Emelyanov <xemul at parallels.com>";
> +
> +#include <stdio.h>
> +#include <sys/types.h>
> +#include <unistd.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +#include <string.h>
> +#include <errno.h>
> +#include <stdlib.h>
> +#include <arpa/inet.h>
> +#include <sys/socket.h>
> +#include <linux/version.h>
> +#include <linux/if_packet.h>
> +#include <net/ethernet.h>
> +#include <sys/mman.h>
> +
> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)
> +
> +struct tpacket_req3 {
> +	unsigned int tp_block_size;
> +	unsigned int tp_block_nr;
> +	unsigned int tp_frame_size;
> +	unsigned int tp_frame_nr;
> +	unsigned int tp_retire_blk_tov;
> +	unsigned int tp_sizeof_priv;
> +	unsigned int tp_feature_req_word;
> +};
> +
> +#endif
> +
> +static void check_map_is_there(unsigned long addr, int sk)
> +{
> +	char name[128];
> +	struct stat sk_s, link_s;
> +
> +	sprintf(name, "/proc/self/map_files/%lx-%lx",
> +			addr, addr + 2 * 4096);
> +
> +	if (stat(name, &link_s) < 0) {
> +		fail("No socket mapping\n");
> +		return;
> +	}
> +
> +	fstat(sk, &sk_s);
> +	if ((sk_s.st_dev != link_s.st_dev) || (sk_s.st_ino != link_s.st_ino)) {
> +		fail("Non-socket mapping restored\n");
> +		return;
> +	}
> +
> +	pass();
> +}
> +
> +int main(int argc, char **argv)
> +{
> +	int sk;
> +	struct tpacket_req3 ring;
> +	void *mem;
> +
> +	test_init(argc, argv);
> +
> +	sk = socket(PF_PACKET, SOCK_RAW, 0);
> +	if (sk < 0) {
> +		err("Can't create socket 1");
> +		return 1;
> +	}
> +
> +	memset(&ring, 0, sizeof(ring));
> +	ring.tp_block_size = 4096;
> +	ring.tp_block_nr = 1;
> +	ring.tp_frame_size = 1024;
> +	ring.tp_frame_nr = 4;
> +	if (setsockopt(sk, SOL_PACKET, PACKET_RX_RING, &ring, sizeof(ring)) < 0) {
> +		err("Can't set rx ring %m");
> +		return 1;
> +	}
> +
> +	memset(&ring, 0, sizeof(ring));
> +	ring.tp_block_size = 4096;
> +	ring.tp_block_nr = 1;
> +	ring.tp_frame_size = 1024;
> +	ring.tp_frame_nr = 4;
> +	if (setsockopt(sk, SOL_PACKET, PACKET_TX_RING, &ring, sizeof(ring)) < 0) {
> +		err("Can't set tx ring %m");
> +		return 1;
> +	}
> +
> +	mem = mmap(NULL, 2 * 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FILE, sk, 0);
> +	if (mem == MAP_FAILED) {
> +		err("Can't mmap socket %m");
> +		return 1;
> +	}
> +
> +	test_daemon();
> +	test_waitsig();
> +
> +	check_map_is_there((unsigned long)mem, sk);
> +
> +	return 0;
> +}
> -- 
> 1.8.4.2
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list