2 * Check decoding of ICMP_FILTER.
4 * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
5 * Copyright (c) 2016-2017 The strace developers.
8 * SPDX-License-Identifier: GPL-2.0-or-later
13 #include <sys/socket.h>
14 #include <linux/icmp.h>
19 getsockopt(-1, SOL_RAW, ICMP_FILTER, 0, 0);
20 printf("getsockopt(-1, SOL_RAW, ICMP_FILTER, NULL, NULL) = -1 %s (%m)\n",
23 setsockopt(-1, SOL_RAW, ICMP_FILTER, NULL, 0);
24 printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, NULL, 0) = -1 %s (%m)\n",
27 TAIL_ALLOC_OBJECT_CONST_PTR(socklen_t, plen);
28 void *const efault = plen + 1;
29 TAIL_ALLOC_OBJECT_CONST_PTR(struct icmp_filter, f);
31 getsockopt(-1, SOL_RAW, ICMP_FILTER, f, plen);
32 printf("getsockopt(-1, SOL_RAW, ICMP_FILTER, %p, [%d]) = -1 %s (%m)\n",
33 f, *plen, errno2name());
35 setsockopt(-1, SOL_RAW, ICMP_FILTER, efault, sizeof(*f));
36 printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, %p, %u) = -1 %s (%m)\n",
37 efault, (unsigned) sizeof(*f), errno2name());
41 1<<ICMP_DEST_UNREACH |
42 1<<ICMP_SOURCE_QUENCH |
44 1<<ICMP_TIME_EXCEEDED |
45 1<<ICMP_PARAMETERPROB);
47 setsockopt(-1, SOL_RAW, ICMP_FILTER, f, -2);
48 printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, %p, -2) = -1 %s (%m)\n",
51 setsockopt(-1, SOL_RAW, ICMP_FILTER, f, sizeof(*f));
52 printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, %s, %u) = -1 %s (%m)\n",
53 "~(1<<ICMP_ECHOREPLY|1<<ICMP_DEST_UNREACH|1<<ICMP_SOURCE_QUENCH"
54 "|1<<ICMP_REDIRECT|1<<ICMP_TIME_EXCEEDED|1<<ICMP_PARAMETERPROB)",
55 (unsigned) sizeof(*f), errno2name());
57 setsockopt(-1, SOL_RAW, ICMP_FILTER, f, sizeof(*f) * 2);
58 printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, %s, %u) = -1 %s (%m)\n",
59 "~(1<<ICMP_ECHOREPLY|1<<ICMP_DEST_UNREACH|1<<ICMP_SOURCE_QUENCH"
60 "|1<<ICMP_REDIRECT|1<<ICMP_TIME_EXCEEDED|1<<ICMP_PARAMETERPROB)",
61 (unsigned) sizeof(*f) * 2, errno2name());
63 puts("+++ exited with 0 +++");