(root)/
strace-6.5/
tests-mx32/
net-icmp_filter.c
       1  /*
       2   * Check decoding of ICMP_FILTER.
       3   *
       4   * Copyright (c) 2016 Dmitry V. Levin <ldv@strace.io>
       5   * Copyright (c) 2016-2022 The strace developers.
       6   * All rights reserved.
       7   *
       8   * SPDX-License-Identifier: GPL-2.0-or-later
       9   */
      10  
      11  #include "tests.h"
      12  #include <stdio.h>
      13  #include <sys/socket.h>
      14  #include <linux/icmp.h>
      15  
      16  int
      17  main(void)
      18  {
      19  	getsockopt(-1, SOL_RAW, ICMP_FILTER, 0, 0);
      20  	printf("getsockopt(-1, SOL_RAW, ICMP_FILTER, NULL, NULL) = %s\n",
      21  	       sprintrc(-1));
      22  
      23  	setsockopt(-1, SOL_RAW, ICMP_FILTER, NULL, 0);
      24  	printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, NULL, 0) = %s\n",
      25  	       sprintrc(-1));
      26  
      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);
      30  
      31  	getsockopt(-1, SOL_RAW, ICMP_FILTER, f, plen);
      32  	printf("getsockopt(-1, SOL_RAW, ICMP_FILTER, %p, [%d]) = %s\n",
      33  	       f, *plen, sprintrc(-1));
      34  
      35  	setsockopt(-1, SOL_RAW, ICMP_FILTER, efault, sizeof(*f));
      36  	printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, %p, %u) = %s\n",
      37  	       efault, (unsigned) sizeof(*f), sprintrc(-1));
      38  
      39  	setsockopt(-1, SOL_RAW, ICMP_FILTER, f, -2);
      40  	printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, %p, -2) = %s\n",
      41  	       f, sprintrc(-1));
      42  
      43  	setsockopt(-1, SOL_RAW, ICMP_FILTER, f, sizeof(*f));
      44  	printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, ~[], %u) = %s\n",
      45  	       (unsigned) sizeof(*f), sprintrc(-1));
      46  
      47  	f->data = 0;
      48  
      49  	setsockopt(-1, SOL_RAW, ICMP_FILTER, f, sizeof(*f));
      50  	printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, [], %u) = %s\n",
      51  	       (unsigned) sizeof(*f), sprintrc(-1));
      52  
      53  	f->data = 1<<ICMP_ECHOREPLY |
      54  		  1<<ICMP_DEST_UNREACH |
      55  		  1<<ICMP_SOURCE_QUENCH |
      56  		  1<<ICMP_REDIRECT |
      57  		  1<<ICMP_TIME_EXCEEDED |
      58  		  1<<ICMP_PARAMETERPROB;
      59  	static const char data_str[] =
      60  		"[ICMP_ECHOREPLY"
      61  		" ICMP_DEST_UNREACH"
      62  		" ICMP_SOURCE_QUENCH"
      63  		" ICMP_REDIRECT"
      64  		" ICMP_TIME_EXCEEDED"
      65  		" ICMP_PARAMETERPROB]";
      66  
      67  	setsockopt(-1, SOL_RAW, ICMP_FILTER, f, sizeof(*f));
      68  	printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, %s, %u) = %s\n",
      69  	       data_str, (unsigned) sizeof(*f), sprintrc(-1));
      70  
      71  	f->data = ~f->data;
      72  
      73  	setsockopt(-1, SOL_RAW, ICMP_FILTER, f, sizeof(*f) * 2);
      74  	printf("setsockopt(-1, SOL_RAW, ICMP_FILTER, ~%s, %u) = %s\n",
      75  	       data_str, (unsigned) sizeof(*f) * 2, sprintrc(-1));
      76  
      77  	puts("+++ exited with 0 +++");
      78  	return 0;
      79  }