(root)/
strace-6.5/
tests-m32/
net-tpacket_req.c
       1  /*
       2   * Copyright (c) 2018 The strace developers.
       3   * All rights reserved.
       4   *
       5   * SPDX-License-Identifier: GPL-2.0-or-later
       6   */
       7  
       8  #include "tests.h"
       9  #include <stdio.h>
      10  #include <sys/socket.h>
      11  #include <linux/if_packet.h>
      12  
      13  static const char *errstr;
      14  
      15  static long
      16  set_tpacket_req(int optname, void *optval, socklen_t len)
      17  {
      18  	long rc = setsockopt(-1, SOL_PACKET, optname, optval, len);
      19  	errstr = sprintrc(rc);
      20  	return rc;
      21  }
      22  
      23  static void
      24  test_tpacket_req(const int optname, const char *const optname_str)
      25  {
      26  	TAIL_ALLOC_OBJECT_CONST_PTR(struct tpacket_req, tpreq);
      27  	socklen_t len;
      28  
      29  	/* setsockopt with optname unknown */
      30  	set_tpacket_req(-1, NULL, 0);
      31  	printf("setsockopt(-1, SOL_PACKET, %#x /* PACKET_??? */, NULL, 0) = %s\n",
      32  	       -1, errstr);
      33  
      34  	/* classic setsockopt */
      35  	len = sizeof(struct tpacket_req);
      36  	set_tpacket_req(optname, tpreq, len);
      37  	printf("setsockopt(-1, SOL_PACKET, %s, {tp_block_size=%u,"
      38  	       " tp_block_nr=%u, tp_frame_size=%u, tp_frame_nr=%u}, %d) = %s\n",
      39  	       optname_str, tpreq->tp_block_size, tpreq->tp_block_nr,
      40  	       tpreq->tp_frame_size, tpreq->tp_frame_nr, len, errstr);
      41  
      42  	/* setsockopt with optlen larger than usual */
      43  	len = len + 1;
      44  	set_tpacket_req(optname, tpreq, len);
      45  	printf("setsockopt(-1, SOL_PACKET, %s, %p,"
      46  	       " %d) = %s\n", optname_str, tpreq, len, errstr);
      47  }
      48  
      49  int
      50  main(void)
      51  {
      52  	test_tpacket_req(ARG_STR(PACKET_RX_RING));
      53  #ifdef PACKET_TX_RING
      54  	test_tpacket_req(ARG_STR(PACKET_TX_RING));
      55  #endif
      56  
      57  	puts("+++ exited with 0 +++");
      58  	return 0;
      59  }