11// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
22/* Copyright Authors of Kmesh */
33
4- #include "../../../config/kmesh_marcos_def.h"
54#include <linux/init.h>
65#include <linux/module.h>
76#include <linux/kmod.h>
2120#include "defer_connect.h"
2221
2322static struct proto * kmesh_defer_proto = NULL ;
24- #define KMESH_DELAY_ERROR -1000
2523
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 ) \
2741 ({ \
2842 int __ret = -1; \
2943 if (t_ctx == NULL) { \
@@ -34,6 +48,11 @@ static struct proto *kmesh_defer_proto = NULL;
3448 __ret; \
3549 })
3650
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+
3756static int defer_connect (struct sock * sk , struct msghdr * msg , size_t size )
3857{
3958 struct bpf_mem_ptr tmpMem = {0 };
@@ -43,6 +62,7 @@ static int defer_connect(struct sock *sk, struct msghdr *msg, size_t size)
4362 const struct iovec * iov ;
4463 struct bpf_sock_addr_kern sock_addr ;
4564 struct sockaddr_in uaddr ;
65+ int uaddrlen = sizeof (struct sockaddr_in );
4666 void __user * ubase ;
4767 int err ;
4868 u32 dport , daddr ;
@@ -54,7 +74,11 @@ static int defer_connect(struct sock *sk, struct msghdr *msg, size_t size)
5474 ubase = iov -> iov_base ;
5575 kbuf_size = iov -> iov_len ;
5676 } else if (iter_is_iovec (& msg -> msg_iter )) {
77+ #ifdef KERNEL_KFUNC
78+ iov = msg -> msg_iter .__iov ;
79+ #else
5780 iov = msg -> msg_iter .iov ;
81+ #endif
5882 ubase = iov -> iov_base ;
5983 kbuf_size = iov -> iov_len ;
6084#if ITER_TYPE_IS_UBUF
@@ -79,31 +103,11 @@ static int defer_connect(struct sock *sk, struct msghdr *msg, size_t size)
79103 tmpMem .size = kbuf_size ;
80104 tmpMem .ptr = kbuf ;
81105
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
102106 uaddr .sin_family = AF_INET ;
103107 uaddr .sin_addr .s_addr = daddr ;
104108 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+
107111connect :
108112 err = sk -> sk_prot -> connect (sk , (struct sockaddr * )& uaddr , sizeof (struct sockaddr_in ));
109113 if (unlikely (err )) {
@@ -113,7 +117,7 @@ static int defer_connect(struct sock *sk, struct msghdr *msg, size_t size)
113117 inet_sk (sk )-> inet_dport = 0 ;
114118 goto out ;
115119 }
116- inet_sk (sk )-> defer_connect = 0 ;
120+ SET_FDEFER_CONNECT_OFF (sk );
117121
118122 if ((((__u32 )1 << sk -> sk_state ) & ~(__u32 )(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT )) && !tcp_passive_fastopen (sk )) {
119123 sk_stream_wait_connect (sk , & timeo );
@@ -128,7 +132,7 @@ static int defer_connect_and_sendmsg(struct sock *sk, struct msghdr *msg, size_t
128132 struct socket * sock ;
129133 int err = 0 ;
130134
131- if (unlikely (inet_sk (sk )-> defer_connect == 1 )) {
135+ if (unlikely (IS_DEFER_CONNECT (sk ))) {
132136 lock_sock (sk );
133137
134138 err = defer_connect (sk , msg , size );
@@ -163,9 +167,9 @@ static int defer_tcp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_l
163167 * of defer_connect should be 1 and the normal connect function
164168 * needs to be used.
165169 */
166- if (inet_sk (sk )-> defer_connect )
170+ if (IS_DEFER_CONNECT (sk ))
167171 return tcp_v4_connect (sk , uaddr , addr_len );
168- inet_sk (sk )-> defer_connect = 1 ;
172+ SET_FDEFER_CONNECT_ON (sk );
169173 sk -> sk_dport = ((struct sockaddr_in * )uaddr )-> sin_port ;
170174 sk_daddr_set (sk , ((struct sockaddr_in * )uaddr )-> sin_addr .s_addr );
171175 sk -> sk_socket -> state = SS_CONNECTING ;
0 commit comments