3
3
#include <linux/kthread.h>
4
4
#include <linux/sched/signal.h>
5
5
#include <linux/tcp.h>
6
+ #include <linux/version.h>
6
7
#include <net/sock.h>
7
8
8
9
#include "http_server.h"
@@ -19,6 +20,67 @@ static struct socket *listen_socket;
19
20
static struct http_server_param param ;
20
21
static struct task_struct * http_server ;
21
22
23
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION (5 , 8 , 0 )
24
+ static int set_sock_opt (struct socket * sock ,
25
+ int level ,
26
+ int optname ,
27
+ char * optval ,
28
+ unsigned int optlen )
29
+ {
30
+ int ret = 0 ;
31
+
32
+ if (optlen < sizeof (int ))
33
+ return - EINVAL ;
34
+
35
+ switch (optname ) {
36
+ case SO_REUSEADDR :
37
+ sock_set_reuseaddr (sock -> sk );
38
+ break ;
39
+ case SO_RCVBUF :
40
+ sock_set_rcvbuf (sock -> sk , * (int * ) optval );
41
+ break ;
42
+ }
43
+
44
+ return ret ;
45
+ }
46
+
47
+ static int set_tcp_opt (struct socket * sock ,
48
+ int level ,
49
+ int optname ,
50
+ char * optval ,
51
+ unsigned int optlen )
52
+ {
53
+ int ret = 0 ;
54
+
55
+ if (optlen < sizeof (int ))
56
+ return - EINVAL ;
57
+
58
+ switch (optname ) {
59
+ case TCP_NODELAY :
60
+ tcp_sock_set_nodelay (sock -> sk );
61
+ break ;
62
+ case TCP_CORK :
63
+ tcp_sock_set_cork (sock -> sk , * (bool * ) optval );
64
+ break ;
65
+ }
66
+
67
+ return ret ;
68
+ }
69
+
70
+ static int kernel_setsockopt (struct socket * sock ,
71
+ int level ,
72
+ int optname ,
73
+ char * optval ,
74
+ unsigned int optlen )
75
+ {
76
+ if (level == SOL_SOCKET )
77
+ return set_sock_opt (sock , level , optname , optval , optlen );
78
+ else if (level == SOL_TCP )
79
+ return set_tcp_opt (sock , level , optname , optval , optlen );
80
+ return - EINVAL ;
81
+ }
82
+ #endif
83
+
22
84
static inline int setsockopt (struct socket * sock ,
23
85
int level ,
24
86
int optname ,
0 commit comments