2 #include <linux/filter.h>
4 #include "maps.h" // page_rand
6 #include "utils.h" // ARRAY_SIZE
8 #define NR_SOL_SOCKET_OPTS ARRAY_SIZE(socket_opts)
9 static const unsigned int socket_opts
[] = { SO_DEBUG
, SO_REUSEADDR
, SO_TYPE
, SO_ERROR
,
10 SO_DONTROUTE
, SO_BROADCAST
, SO_SNDBUF
, SO_RCVBUF
,
11 SO_SNDBUFFORCE
, SO_RCVBUFFORCE
, SO_KEEPALIVE
, SO_OOBINLINE
,
12 SO_NO_CHECK
, SO_PRIORITY
, SO_LINGER
, SO_BSDCOMPAT
,
13 SO_REUSEPORT
, SO_PASSCRED
, SO_PEERCRED
, SO_RCVLOWAT
, SO_SNDLOWAT
,
14 SO_RCVTIMEO
, SO_SNDTIMEO
, SO_SECURITY_AUTHENTICATION
, SO_SECURITY_ENCRYPTION_TRANSPORT
,
15 SO_SECURITY_ENCRYPTION_NETWORK
, SO_BINDTODEVICE
, SO_ATTACH_FILTER
, SO_DETACH_FILTER
,
16 SO_PEERNAME
, SO_TIMESTAMP
, SO_ACCEPTCONN
, SO_PEERSEC
,
17 SO_PASSSEC
, SO_TIMESTAMPNS
, SO_MARK
, SO_TIMESTAMPING
,
18 SO_PROTOCOL
, SO_DOMAIN
, SO_RXQ_OVFL
, SO_WIFI_STATUS
,
19 SO_PEEK_OFF
, SO_NOFCS
, SO_LOCK_FILTER
, SO_SELECT_ERR_QUEUE
,
20 SO_BUSY_POLL
, SO_MAX_PACING_RATE
, SO_BPF_EXTENSIONS
};
22 void socket_setsockopt(struct sockopt
*so
)
26 so
->level
= SOL_SOCKET
;
28 val
= rand() % NR_SOL_SOCKET_OPTS
;
29 so
->optname
= socket_opts
[val
];
31 /* Adjust length according to operation set. */
32 switch (so
->optname
) {
35 so
->optlen
= sizeof(struct linger
);
40 so
->optlen
= sizeof(struct timeval
);
43 case SO_ATTACH_FILTER
: {
44 unsigned long *optval
= NULL
, optlen
= 0;
46 bpf_gen_filter(&optval
, &optlen
);
48 so
->optval
= (unsigned long) optval
;