1
1
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2
2
/* Copyright Authors of Kmesh */
3
3
4
- #include "../../../config/kmesh_marcos_def.h"
5
4
#include <linux/init.h>
6
5
#include <linux/module.h>
7
6
#include <linux/kmod.h>
21
20
#include "defer_connect.h"
22
21
23
22
static struct proto * kmesh_defer_proto = NULL ;
24
- #define KMESH_DELAY_ERROR -1000
25
23
26
- #define BPF_CGROUP_RUN_PROG_INET4_CONNECT_KMESH (sk , uaddr , t_ctx ) \
24
+ #ifdef KERNEL_KFUNC
25
+ #define BPF_CGROUP_RUN_PROG_INET4_CONNECT_KMESH (sk , uaddr , uaddrlen , t_ctx ) \
26
+ ({ \
27
+ int __ret = -1; \
28
+ if (t_ctx == NULL) { \
29
+ __ret = -EINVAL; \
30
+ } else { \
31
+ __ret = __cgroup_bpf_run_filter_sock_addr(sk, uaddr, uaddrlen, CGROUP_INET4_CONNECT, t_ctx, NULL); \
32
+ } \
33
+ __ret; \
34
+ })
35
+
36
+ #define SET_FDEFER_CONNECT_ON (sk ) (inet_set_bit(DEFER_CONNECT, sk))
37
+ #define SET_FDEFER_CONNECT_OFF (sk ) (inet_clear_bit(DEFER_CONNECT, sk))
38
+ #define IS_DEFER_CONNECT (sk ) (inet_test_bit(DEFER_CONNECT, sk))
39
+ #else
40
+ #define BPF_CGROUP_RUN_PROG_INET4_CONNECT_KMESH (sk , uaddr , uaddrlen , t_ctx ) \
27
41
({ \
28
42
int __ret = -1; \
29
43
if (t_ctx == NULL) { \
@@ -34,6 +48,11 @@ static struct proto *kmesh_defer_proto = NULL;
34
48
__ret; \
35
49
})
36
50
51
+ #define SET_FDEFER_CONNECT_ON (sk ) (inet_sk(sk)->defer_connect = 1)
52
+ #define SET_FDEFER_CONNECT_OFF (sk ) (inet_sk(sk)->defer_connect = 0)
53
+ #define IS_DEFER_CONNECT (sk ) (inet_sk(sk)->defer_connect == 1)
54
+ #endif
55
+
37
56
static int defer_connect (struct sock * sk , struct msghdr * msg , size_t size )
38
57
{
39
58
struct bpf_mem_ptr tmpMem = {0 };
@@ -43,6 +62,7 @@ static int defer_connect(struct sock *sk, struct msghdr *msg, size_t size)
43
62
const struct iovec * iov ;
44
63
struct bpf_sock_addr_kern sock_addr ;
45
64
struct sockaddr_in uaddr ;
65
+ int uaddrlen = sizeof (struct sockaddr_in );
46
66
void __user * ubase ;
47
67
int err ;
48
68
u32 dport , daddr ;
@@ -54,7 +74,11 @@ static int defer_connect(struct sock *sk, struct msghdr *msg, size_t size)
54
74
ubase = iov -> iov_base ;
55
75
kbuf_size = iov -> iov_len ;
56
76
} else if (iter_is_iovec (& msg -> msg_iter )) {
77
+ #ifdef KERNEL_KFUNC
78
+ iov = msg -> msg_iter .__iov ;
79
+ #else
57
80
iov = msg -> msg_iter .iov ;
81
+ #endif
58
82
ubase = iov -> iov_base ;
59
83
kbuf_size = iov -> iov_len ;
60
84
#if ITER_TYPE_IS_UBUF
@@ -79,31 +103,11 @@ static int defer_connect(struct sock *sk, struct msghdr *msg, size_t size)
79
103
tmpMem .size = kbuf_size ;
80
104
tmpMem .ptr = kbuf ;
81
105
82
- #if OE_23_03
83
- tcp_call_bpf_3arg (
84
- sk ,
85
- BPF_SOCK_OPS_TCP_DEFER_CONNECT_CB ,
86
- ((u64 )(& tmpMem ) & U32_MAX ),
87
- (((u64 )(& tmpMem ) >> 32 ) & U32_MAX ),
88
- kbuf_size );
89
- daddr = sk -> sk_daddr ;
90
- dport = sk -> sk_dport ;
91
-
92
- // daddr == 0 && dport == 0 are special flags meaning the circuit breaker is open
93
- // Should reject connection here
94
- if (daddr == 0 && dport == 0 ) {
95
- tcp_set_state (sk , TCP_CLOSE );
96
- sk -> sk_route_caps = 0 ;
97
- inet_sk (sk )-> inet_dport = 0 ;
98
- err = -1 ;
99
- goto out ;
100
- }
101
- #else
102
106
uaddr .sin_family = AF_INET ;
103
107
uaddr .sin_addr .s_addr = daddr ;
104
108
uaddr .sin_port = dport ;
105
- err = BPF_CGROUP_RUN_PROG_INET4_CONNECT_KMESH (sk , (struct sockaddr * )& uaddr , & tmpMem );
106
- #endif
109
+ err = BPF_CGROUP_RUN_PROG_INET4_CONNECT_KMESH (sk , (struct sockaddr * )& uaddr , & uaddrlen , & tmpMem );
110
+
107
111
connect :
108
112
err = sk -> sk_prot -> connect (sk , (struct sockaddr * )& uaddr , sizeof (struct sockaddr_in ));
109
113
if (unlikely (err )) {
@@ -113,7 +117,7 @@ static int defer_connect(struct sock *sk, struct msghdr *msg, size_t size)
113
117
inet_sk (sk )-> inet_dport = 0 ;
114
118
goto out ;
115
119
}
116
- inet_sk (sk )-> defer_connect = 0 ;
120
+ SET_FDEFER_CONNECT_OFF (sk );
117
121
118
122
if ((((__u32 )1 << sk -> sk_state ) & ~(__u32 )(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT )) && !tcp_passive_fastopen (sk )) {
119
123
sk_stream_wait_connect (sk , & timeo );
@@ -128,7 +132,7 @@ static int defer_connect_and_sendmsg(struct sock *sk, struct msghdr *msg, size_t
128
132
struct socket * sock ;
129
133
int err = 0 ;
130
134
131
- if (unlikely (inet_sk (sk )-> defer_connect == 1 )) {
135
+ if (unlikely (IS_DEFER_CONNECT (sk ))) {
132
136
lock_sock (sk );
133
137
134
138
err = defer_connect (sk , msg , size );
@@ -163,9 +167,9 @@ static int defer_tcp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_l
163
167
* of defer_connect should be 1 and the normal connect function
164
168
* needs to be used.
165
169
*/
166
- if (inet_sk (sk )-> defer_connect )
170
+ if (IS_DEFER_CONNECT (sk ))
167
171
return tcp_v4_connect (sk , uaddr , addr_len );
168
- inet_sk (sk )-> defer_connect = 1 ;
172
+ SET_FDEFER_CONNECT_ON (sk );
169
173
sk -> sk_dport = ((struct sockaddr_in * )uaddr )-> sin_port ;
170
174
sk_daddr_set (sk , ((struct sockaddr_in * )uaddr )-> sin_addr .s_addr );
171
175
sk -> sk_socket -> state = SS_CONNECTING ;
0 commit comments