9 #include "meshlink-tiny.h"
11 #include "netns_utils.h"
14 static struct sync_flag peer_reachable;
15 static struct sync_flag peer_unreachable;
17 static void nut_status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
20 if(!strcmp(node->name, "peer")) {
21 set_sync_flag(reachable ? &peer_reachable : &peer_unreachable, true);
26 meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
28 init_sync_flag(&peer_reachable);
29 init_sync_flag(&peer_unreachable);
31 // Set up relay, peer and NUT
32 peer_config_t *peers = setup_relay_peer_nut("metaconn");
34 // Wait for peer to connect to NUT
35 devtool_set_meta_status_cb(peers[2].mesh, nut_status_cb);
37 for(int i = 0; i < 3; i++) {
38 assert(meshlink_start(peers[i].mesh));
41 assert(wait_sync_flag(&peer_reachable, 5));
43 // Test case #1: re-connection to peer after disconnection when connected to the relay node
45 // Stop the peer and wait for it to become unreachable
46 reset_sync_flag(&peer_unreachable);
47 meshlink_stop(peers[1].mesh);
48 assert(wait_sync_flag(&peer_unreachable, 5));
50 // Restart the peer and wait for it to become reachable
51 reset_sync_flag(&peer_reachable);
52 assert(meshlink_start(peers[1].mesh));
53 assert(wait_sync_flag(&peer_reachable, 5));
55 // Test case #2: re-connection to peer after changing peer and NUT's IP address simultaneously,
56 // while connected to the relay
58 reset_sync_flag(&peer_reachable);
59 reset_sync_flag(&peer_unreachable);
61 for(int i = 1; i < 3; i++) {
62 change_peer_ip(&peers[i]);
65 for(int i = 1; i < 3; i++) {
66 meshlink_reset_timers(peers[i].mesh);
69 assert(wait_sync_flag(&peer_unreachable, 75));
70 assert(wait_sync_flag(&peer_reachable, 15));
72 // Test case #3: re-connect to peer after stopping NUT and changing peer's IP address, no relay
73 reset_sync_flag(&peer_unreachable);
75 for(int i = 0; i < 2; i++) {
76 meshlink_stop(peers[i].mesh);
79 change_peer_ip(&peers[1]);
80 assert(wait_sync_flag(&peer_unreachable, 15));
82 reset_sync_flag(&peer_reachable);
83 assert(meshlink_start(peers[1].mesh));
84 assert(wait_sync_flag(&peer_reachable, 60));
88 close_relay_peer_nut(peers);