merge pipe variants
[trinity.git] / net / proto-socket.c
blobbae5394426ec4a5a4e39c08be28448ee4245af71
1 #include <stdlib.h>
2 #include <linux/filter.h>
3 #include "net.h"
4 #include "maps.h" // page_rand
5 #include "compat.h"
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)
24 unsigned char val;
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) {
34 case SO_LINGER:
35 so->optlen = sizeof(struct linger);
36 break;
38 case SO_RCVTIMEO:
39 case SO_SNDTIMEO:
40 so->optlen = sizeof(struct timeval);
41 break;
43 case SO_ATTACH_FILTER: {
44 unsigned long *optval = NULL, optlen = 0;
46 bpf_gen_filter(&optval, &optlen);
48 so->optval = (unsigned long) optval;
49 so->optlen = optlen;
50 break;
52 default:
53 break;