sk = accept(lsk, NULL, NULL); if (sk < 0)
test_error("accept()");
synchronize_threads(); /* 2: connection accept()ed, another queued */ if (test_get_tcp_counters(lsk, &cnt2))
test_error("test_get_tcp_counters()");
synchronize_threads(); /* 3: close listen socket */
close(lsk);
bytes = test_server_run(sk, quota, 0); if (bytes != quota)
test_error("servered only %zd bytes", bytes); else
test_ok("servered %zd bytes", bytes);
synchronize_threads(); /* 4: finishing up */
close_forced(sk);
synchronize_threads(); /* 5: closed active sk */
synchronize_threads(); /* 6: counters checks */ if (test_assert_counters("active RST server", &cnt1, &cnt2, TEST_CNT_GOOD))
test_fail("MKT counters (server) have not only good packets"); else
test_ok("MKT counters are good on server");
}
errno = 0;
ret = select(nfd + 1, NULL, &fds, &efds, ptv); if (ret < 0) return -errno; if (!ret) return -ETIMEDOUT; for (i = 0; i < nr; i++) { if (FD_ISSET(sk[i], &fds)) { if (is_writable)
is_writable[i] = true;
FD_CLR(sk[i], &left);
wait_for--; continue;
} if (FD_ISSET(sk[i], &efds)) {
FD_CLR(sk[i], &left);
wait_for--;
}
}
} while (wait_for > 0);
return0;
}
staticvoid test_client_active_rst(unsignedint port)
{ int i, sk[3], err; bool is_writable[ARRAY_SIZE(sk)] = {false}; unsignedint last = ARRAY_SIZE(sk) - 1;
for (i = 0; i < ARRAY_SIZE(sk); i++) {
sk[i] = socket(test_family, SOCK_STREAM, IPPROTO_TCP); if (sk[i] < 0)
test_error("socket()"); if (test_add_key(sk[i], DEFAULT_TEST_PASSWORD,
this_ip_dest, -1, 100, 100))
test_error("setsockopt(TCP_AO_ADD_KEY)");
}
synchronize_threads(); /* 1: MKT added */ for (i = 0; i < last; i++) {
err = _test_connect_socket(sk[i], this_ip_dest, port, i != 0); if (err < 0)
test_error("failed to connect()");
}
synchronize_threads(); /* 2: two connections: one accept()ed, another queued */
err = test_wait_fds(sk, last, is_writable, last, TEST_TIMEOUT_SEC); if (err < 0)
test_error("test_wait_fds(): %d", err);
/* async connect() with third sk to get into request_sock_queue */
err = _test_connect_socket(sk[last], this_ip_dest, port, 1); if (err < 0)
test_error("failed to connect()");
synchronize_threads(); /* 3: close listen socket */ if (test_client_verify(sk[0], packet_sz, quota / packet_sz))
test_fail("Failed to send data on connected socket"); else
test_ok("Verified established tcp connection");
synchronize_threads(); /* 4: finishing up */
synchronize_threads(); /* 5: closed active sk */ /* *Waitfor2connections:oneaccepted,anotherintheacceptqueue, *theoneinrequest_sock_queuewon'tgetfullyestablished,so *doesn'treceiveanactiveRST,seeinet_csk_listen_stop().
*/
err = test_wait_fds(sk, last, NULL, last, TEST_TIMEOUT_SEC); if (err < 0)
test_error("select(): %d", err);
for (i = 0; i < ARRAY_SIZE(sk); i++) {
socklen_t slen = sizeof(err);
sk = socket(test_family, SOCK_STREAM, IPPROTO_TCP); if (sk < 0)
test_error("socket()");
if (test_add_key(sk, DEFAULT_TEST_PASSWORD, this_ip_dest, -1, 100, 100))
test_error("setsockopt(TCP_AO_ADD_KEY)");
synchronize_threads(); /* 1: MKT added => connect() */ if (test_connect_socket(sk, this_ip_dest, port) <= 0)
test_error("failed to connect()");
synchronize_threads(); /* 2: accepted => send data */ if (test_client_verify(sk, packet_sz, quota / packet_sz))
test_fail("Failed to send data on connected socket"); else
test_ok("Verified established tcp connection");
synchronize_threads(); /* 4: close the server, creating twsk */
/* *The"corruption"inSEQhastobesmallenoughtofitintoTCP *window,seetcp_timewait_state_process()forout-of-window *segments.
*/
img.out.seq += 5; /* 5 is more noticeable in tcpdump than 1 */
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.