|
7 | 7 | * 3. call listen() for 1 server socket. (migration target) |
8 | 8 | * 4. update a map to migrate all child sockets |
9 | 9 | * to the last server socket (migrate_map[cookie] = 4) |
10 | | - * 5. call shutdown() for first 4 server sockets |
| 10 | + * 5. for TCP_ESTABLISHED and TCP_SYN_RECV cases, verify via epoll |
| 11 | + * that the last server socket is not ready before migration. |
| 12 | + * 6. call shutdown() for first 4 server sockets |
11 | 13 | * and migrate the requests in the accept queue |
12 | 14 | * to the last server socket. |
13 | | - * 6. call listen() for the second server socket. |
14 | | - * 7. call shutdown() for the last server |
| 15 | + * 7. for TCP_ESTABLISHED and TCP_SYN_RECV cases, verify via epoll |
| 16 | + * that the last server socket is ready after migration. |
| 17 | + * 8. call listen() for the second server socket. |
| 18 | + * 9. call shutdown() for the last server |
15 | 19 | * and migrate the requests in the accept queue |
16 | 20 | * to the second server socket. |
17 | | - * 8. call listen() for the last server. |
18 | | - * 9. call shutdown() for the second server |
| 21 | + * 10. call listen() for the last server. |
| 22 | + * 11. call shutdown() for the second server |
19 | 23 | * and migrate the requests in the accept queue |
20 | 24 | * to the last server socket. |
21 | | - * 10. call accept() for the last server socket. |
| 25 | + * 12. call accept() for the last server socket. |
22 | 26 | * |
23 | 27 | * Author: Kuniyuki Iwashima <kuniyu@amazon.co.jp> |
24 | 28 | */ |
25 | 29 |
|
26 | 30 | #include <bpf/bpf.h> |
27 | 31 | #include <bpf/libbpf.h> |
| 32 | +#include <sys/epoll.h> |
28 | 33 |
|
29 | 34 | #include "test_progs.h" |
30 | 35 | #include "test_migrate_reuseport.skel.h" |
@@ -350,21 +355,51 @@ static int update_maps(struct migrate_reuseport_test_case *test_case, |
350 | 355 |
|
351 | 356 | static int migrate_dance(struct migrate_reuseport_test_case *test_case) |
352 | 357 | { |
| 358 | + struct epoll_event ev = { |
| 359 | + .events = EPOLLIN, |
| 360 | + }; |
| 361 | + int epoll = -1, nfds; |
353 | 362 | int i, err; |
354 | 363 |
|
| 364 | + if (test_case->state != BPF_TCP_NEW_SYN_RECV) { |
| 365 | + epoll = epoll_create1(0); |
| 366 | + if (!ASSERT_NEQ(epoll, -1, "epoll_create1")) |
| 367 | + return -1; |
| 368 | + |
| 369 | + ev.data.fd = test_case->servers[MIGRATED_TO]; |
| 370 | + if (!ASSERT_OK(epoll_ctl(epoll, EPOLL_CTL_ADD, |
| 371 | + test_case->servers[MIGRATED_TO], &ev), |
| 372 | + "epoll_ctl")) |
| 373 | + goto close_epoll; |
| 374 | + |
| 375 | + nfds = epoll_wait(epoll, &ev, 1, 0); |
| 376 | + if (!ASSERT_EQ(nfds, 0, "epoll_wait 1")) |
| 377 | + goto close_epoll; |
| 378 | + } |
| 379 | + |
355 | 380 | /* Migrate TCP_ESTABLISHED and TCP_SYN_RECV requests |
356 | 381 | * to the last listener based on eBPF. |
357 | 382 | */ |
358 | 383 | for (i = 0; i < MIGRATED_TO; i++) { |
359 | 384 | err = shutdown(test_case->servers[i], SHUT_RDWR); |
360 | 385 | if (!ASSERT_OK(err, "shutdown")) |
361 | | - return -1; |
| 386 | + goto close_epoll; |
362 | 387 | } |
363 | 388 |
|
364 | 389 | /* No dance for TCP_NEW_SYN_RECV to migrate based on eBPF */ |
365 | 390 | if (test_case->state == BPF_TCP_NEW_SYN_RECV) |
366 | 391 | return 0; |
367 | 392 |
|
| 393 | + nfds = epoll_wait(epoll, &ev, 1, 0); |
| 394 | + if (!ASSERT_EQ(nfds, 1, "epoll_wait 2")) { |
| 395 | +close_epoll: |
| 396 | + if (epoll >= 0) |
| 397 | + close(epoll); |
| 398 | + return -1; |
| 399 | + } |
| 400 | + |
| 401 | + close(epoll); |
| 402 | + |
368 | 403 | /* Note that we use the second listener instead of the |
369 | 404 | * first one here. |
370 | 405 | * |
|
0 commit comments