9
9
10
10
#define MAX_TEST_NAME 80
11
11
#define TCP_ULP 31
12
+ #define SOCKMAP_VERDICT_PROG "test_sockmap_skb_verdict_attach.bpf.o"
12
13
13
14
static int tcp_server (int family )
14
15
{
@@ -132,6 +133,73 @@ static void test_sockmap_ktls_update_fails_when_sock_has_ulp(int family, int map
132
133
close (s );
133
134
}
134
135
136
+ /* close a kTLS socket after removing it from sockmap. */
137
+ static void test_sockmap_ktls_close_after_delete (int family , int map )
138
+ {
139
+ struct sockaddr_storage addr = {0 };
140
+ socklen_t len = sizeof (addr );
141
+ int err , cli , srv , zero = 0 ;
142
+ struct bpf_program * prog ;
143
+ struct bpf_object * obj ;
144
+ int verdict ;
145
+
146
+ obj = bpf_object__open_file (SOCKMAP_VERDICT_PROG , NULL );
147
+ if (!ASSERT_OK (libbpf_get_error (obj ), "bpf_object__open_file" ))
148
+ return ;
149
+
150
+ err = bpf_object__load (obj );
151
+ if (!ASSERT_OK (err , "bpf_object__load" ))
152
+ goto close_obj ;
153
+
154
+ prog = bpf_object__next_program (obj , NULL );
155
+ verdict = bpf_program__fd (prog );
156
+ if (!ASSERT_GE (verdict , 0 , "bpf_program__fd" ))
157
+ goto close_obj ;
158
+
159
+ err = bpf_prog_attach (verdict , map , BPF_SK_SKB_STREAM_VERDICT , 0 );
160
+ if (!ASSERT_OK (err , "bpf_prog_attach" ))
161
+ goto close_verdict ;
162
+
163
+ srv = tcp_server (family );
164
+ if (srv == -1 )
165
+ goto detach ;
166
+
167
+ err = getsockname (srv , (struct sockaddr * )& addr , & len );
168
+ if (!ASSERT_OK (err , "getsockopt" ))
169
+ goto close_srv ;
170
+
171
+ cli = socket (family , SOCK_STREAM , 0 );
172
+ if (!ASSERT_GE (cli , 0 , "socket" ))
173
+ goto close_srv ;
174
+
175
+ err = connect (cli , (struct sockaddr * )& addr , len );
176
+ if (!ASSERT_OK (err , "connect" ))
177
+ goto close_cli ;
178
+
179
+ err = bpf_map_update_elem (map , & zero , & cli , 0 );
180
+ if (!ASSERT_OK (err , "bpf_map_update_elem" ))
181
+ goto close_cli ;
182
+
183
+ err = setsockopt (cli , IPPROTO_TCP , TCP_ULP , "tls" , strlen ("tls" ));
184
+ if (!ASSERT_OK (err , "setsockopt(TCP_ULP)" ))
185
+ goto close_cli ;
186
+
187
+ err = bpf_map_delete_elem (map , & zero );
188
+ if (!ASSERT_OK (err , "bpf_map_delete_elem" ))
189
+ goto close_cli ;
190
+
191
+ close_cli :
192
+ close (cli );
193
+ close_srv :
194
+ close (srv );
195
+ detach :
196
+ bpf_prog_detach2 (verdict , map , BPF_SK_SKB_STREAM_VERDICT );
197
+ close_verdict :
198
+ close (verdict );
199
+ close_obj :
200
+ bpf_object__close (obj );
201
+ }
202
+
135
203
static const char * fmt_test_name (const char * subtest_name , int family ,
136
204
enum bpf_map_type map_type )
137
205
{
@@ -158,6 +226,8 @@ static void run_tests(int family, enum bpf_map_type map_type)
158
226
test_sockmap_ktls_disconnect_after_delete (family , map );
159
227
if (test__start_subtest (fmt_test_name ("update_fails_when_sock_has_ulp" , family , map_type )))
160
228
test_sockmap_ktls_update_fails_when_sock_has_ulp (family , map );
229
+ if (test__start_subtest (fmt_test_name ("close_after_delete" , family , map_type )))
230
+ test_sockmap_ktls_close_after_delete (family , map );
161
231
162
232
close (map );
163
233
}
0 commit comments