#include "tests.h" #include #include #include 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; }