| #include "tests.h" |
| #include <stdio.h> |
| #include <sys/socket.h> |
| #include <linux/if_packet.h> |
| |
| static const char *errstr; |
| |
| static long |
| set_tpacket_req(int optname, void *optval, socklen_t len) |
| { |
| long rc = setsockopt(-1, SOL_PACKET, optname, optval, len); |
| errstr = sprintrc(rc); |
| return rc; |
| } |
| |
| static void |
| test_tpacket_req(const int optname, const char *const optname_str) |
| { |
| TAIL_ALLOC_OBJECT_CONST_PTR(struct tpacket_req, tpreq); |
| socklen_t len; |
| |
| /* setsockopt with optname unknown */ |
| set_tpacket_req(-1, NULL, 0); |
| printf("setsockopt(-1, SOL_PACKET, %#x /* PACKET_??? */, NULL, 0) = %s\n", |
| -1, errstr); |
| |
| /* classic setsockopt */ |
| len = sizeof(struct tpacket_req); |
| set_tpacket_req(optname, tpreq, len); |
| printf("setsockopt(-1, SOL_PACKET, %s, {tp_block_size=%u," |
| " tp_block_nr=%u, tp_frame_size=%u, tp_frame_nr=%u}, %d) = %s\n", |
| optname_str, tpreq->tp_block_size, tpreq->tp_block_nr, |
| tpreq->tp_frame_size, tpreq->tp_frame_nr, len, errstr); |
| |
| /* setsockopt with optlen larger than usual */ |
| len = len + 1; |
| set_tpacket_req(optname, tpreq, len); |
| printf("setsockopt(-1, SOL_PACKET, %s, %p," |
| " %d) = %s\n", optname_str, tpreq, len, errstr); |
| } |
| |
| int |
| main(void) |
| { |
| test_tpacket_req(ARG_STR(PACKET_RX_RING)); |
| #ifdef PACKET_TX_RING |
| test_tpacket_req(ARG_STR(PACKET_TX_RING)); |
| #endif |
| |
| puts("+++ exited with 0 +++"); |
| return 0; |
| } |