|
|
|
|
@ -79,8 +79,12 @@
|
|
|
|
|
#define MIN_PORT 5000 |
|
|
|
|
#define MAX_PORT 50000 |
|
|
|
|
|
|
|
|
|
#define UNIT_TEST_SIG_4 struct sockaddr_in *addr, int operation, int count, int delay, char *details, bool *passed |
|
|
|
|
#define UNIT_TEST_SIG_6 struct sockaddr_in6 *addr, int operation, int count, int delay, char *details, bool *passed |
|
|
|
|
#define TCP_UNIT_TEST_SIG_4 struct sockaddr_in *addr, int operation, int count, int delay, char *details, bool *passed |
|
|
|
|
#define UDP_UNIT_TEST_SIG_4 struct sockaddr_in *local_addr, struct sockaddr_in *remote_addr, int operation, int count, int delay, char *details, bool *passed |
|
|
|
|
|
|
|
|
|
#define TCP_UNIT_TEST_SIG_6 struct sockaddr_in6 *addr, int operation, int count, int delay, char *details, bool *passed |
|
|
|
|
#define UDP_UNIT_TEST_SIG_6 struct sockaddr_in6 *local_addr, struct sockaddr_in6 *remote_addr, int operation, int count, int delay, char *details, bool *passed |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define ECHOTEST_MODE_RX 333 |
|
|
|
|
#define ECHOTEST_MODE_TX 666 |
|
|
|
|
@ -142,8 +146,7 @@ std::map<std::string, std::string> testConf;
|
|
|
|
|
/* Helper Functions */ |
|
|
|
|
/****************************************************************************/ |
|
|
|
|
|
|
|
|
|
void displayResults(int *results, int size) |
|
|
|
|
{ |
|
|
|
|
void displayResults(int *results, int size) { |
|
|
|
|
int success = 0, failure = 0; |
|
|
|
|
for(int i=0; i<size; i++) { |
|
|
|
|
if(results[i] == 0) |
|
|
|
|
@ -156,8 +159,7 @@ void displayResults(int *results, int size)
|
|
|
|
|
std::cout << " - failure = " << (float)failure / (float)size << std::endl; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void loadTestConfigFile(std::string filepath) |
|
|
|
|
{ |
|
|
|
|
void loadTestConfigFile(std::string filepath) { |
|
|
|
|
std::string key, value, prefix; |
|
|
|
|
std::ifstream testFile; |
|
|
|
|
testFile.open(filepath.c_str()); |
|
|
|
|
@ -174,15 +176,13 @@ void loadTestConfigFile(std::string filepath)
|
|
|
|
|
testFile.close(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
long int get_now_ts() |
|
|
|
|
{ |
|
|
|
|
long int get_now_ts() { |
|
|
|
|
struct timeval tp; |
|
|
|
|
gettimeofday(&tp, NULL); |
|
|
|
|
return tp.tv_sec * 1000 + tp.tv_usec / 1000; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void generate_random_data(void *buf, size_t n) |
|
|
|
|
{ |
|
|
|
|
void generate_random_data(void *buf, size_t n) { |
|
|
|
|
char *b = (char*)buf; |
|
|
|
|
int min = 0, max = 9; |
|
|
|
|
srand((unsigned)time(0)); |
|
|
|
|
@ -191,9 +191,7 @@ void generate_random_data(void *buf, size_t n)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void create_addr(std::string ipstr, int port, int ipv, struct sockaddr *saddr) |
|
|
|
|
{ |
|
|
|
|
struct hostent *server; |
|
|
|
|
void create_addr(std::string ipstr, int port, int ipv, struct sockaddr *saddr) { |
|
|
|
|
if(ipv == 4) { |
|
|
|
|
struct sockaddr_in *in4 = (struct sockaddr_in*)saddr; |
|
|
|
|
in4->sin_port = htons(port); |
|
|
|
|
@ -202,11 +200,9 @@ void create_addr(std::string ipstr, int port, int ipv, struct sockaddr *saddr)
|
|
|
|
|
} |
|
|
|
|
if(ipv == 6) { |
|
|
|
|
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)saddr; |
|
|
|
|
server = gethostbyname2(ipstr.c_str(),AF_INET6); |
|
|
|
|
memset((char *) in6, 0, sizeof(struct sockaddr_in6)); |
|
|
|
|
inet_pton(AF_INET6, ipstr.c_str(), &(in6->sin6_addr)); |
|
|
|
|
in6->sin6_flowinfo = 0; |
|
|
|
|
in6->sin6_family = AF_INET6; |
|
|
|
|
memmove((char *) in6->sin6_addr.s6_addr, (char *) server->h_addr, server->h_length); |
|
|
|
|
in6->sin6_port = htons(port); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -244,7 +240,7 @@ void RECORD_RESULTS(int *test_number, bool passed, char *details, std::vector<st
|
|
|
|
|
// TCP
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
void tcp_client_4(UNIT_TEST_SIG_4) |
|
|
|
|
void tcp_client_4(TCP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_client_4\n"); |
|
|
|
|
int r, w, sockfd, err, len = strlen(str); |
|
|
|
|
@ -254,6 +250,13 @@ void tcp_client_4(UNIT_TEST_SIG_4)
|
|
|
|
|
DEBUG_ERROR("error creating ZeroTier socket"); |
|
|
|
|
if((err = zts_connect(sockfd, (const struct sockaddr *)addr, sizeof(addr))) < 0) |
|
|
|
|
DEBUG_ERROR("error connecting to remote host (%d)", err); |
|
|
|
|
|
|
|
|
|
// TODO: Put this test in the general API section
|
|
|
|
|
struct sockaddr_in peer_addr; |
|
|
|
|
socklen_t peer_addrlen; |
|
|
|
|
zts_getpeername(sockfd, (struct sockaddr*)&peer_addr, &peer_addrlen); |
|
|
|
|
DEBUG_INFO("getpeername() => %s : %d", inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port)); |
|
|
|
|
|
|
|
|
|
w = zts_write(sockfd, str, len); |
|
|
|
|
r = zts_read(sockfd, rbuf, len); |
|
|
|
|
DEBUG_TEST("Sent : %s", str); |
|
|
|
|
@ -265,7 +268,7 @@ void tcp_client_4(UNIT_TEST_SIG_4)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
void tcp_server_4(UNIT_TEST_SIG_4) |
|
|
|
|
void tcp_server_4(TCP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_server_4\n"); |
|
|
|
|
int w=0, r=0, sockfd, accfd, err, len = strlen(str); |
|
|
|
|
@ -279,6 +282,13 @@ void tcp_server_4(UNIT_TEST_SIG_4)
|
|
|
|
|
printf("error placing socket in LISTENING state (%d)", err); |
|
|
|
|
if((accfd = zts_accept(sockfd, (struct sockaddr *)&addr, (socklen_t *)sizeof(addr))) < 0) |
|
|
|
|
DEBUG_ERROR("error accepting connection (%d)", err); |
|
|
|
|
|
|
|
|
|
// TODO: Put this test in the general API section
|
|
|
|
|
struct sockaddr_in peer_addr; |
|
|
|
|
socklen_t peer_addrlen; |
|
|
|
|
zts_getpeername(accfd, (struct sockaddr*)&peer_addr, &peer_addrlen); |
|
|
|
|
DEBUG_INFO("getpeername() => %s : %d", inet_ntoa(peer_addr.sin_addr), ntohs(peer_addr.sin_port)); |
|
|
|
|
|
|
|
|
|
r = zts_read(accfd, rbuf, sizeof rbuf); |
|
|
|
|
w = zts_write(accfd, rbuf, len); |
|
|
|
|
DEBUG_TEST("Received : %s", rbuf); |
|
|
|
|
@ -290,7 +300,7 @@ void tcp_server_4(UNIT_TEST_SIG_4)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
void tcp_client_6(UNIT_TEST_SIG_6) |
|
|
|
|
void tcp_client_6(TCP_UNIT_TEST_SIG_6) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_client_6\n"); |
|
|
|
|
int r, w, sockfd, err, len = strlen(str); |
|
|
|
|
@ -300,6 +310,16 @@ void tcp_client_6(UNIT_TEST_SIG_6)
|
|
|
|
|
DEBUG_ERROR("error creating ZeroTier socket"); |
|
|
|
|
if((err = zts_connect(sockfd, (const struct sockaddr *)addr, sizeof(addr))) < 0) |
|
|
|
|
DEBUG_ERROR("error connecting to remote host (%d)", err); |
|
|
|
|
|
|
|
|
|
// TODO: Put this test in the general API section
|
|
|
|
|
struct sockaddr_storage peer_addr; |
|
|
|
|
struct sockaddr_in6 *p6 = (struct sockaddr_in6*)&peer_addr; |
|
|
|
|
socklen_t peer_addrlen; |
|
|
|
|
zts_getpeername(sockfd, (struct sockaddr*)&peer_addr, &peer_addrlen); |
|
|
|
|
char peer_addrstr[INET6_ADDRSTRLEN]; |
|
|
|
|
inet_ntop(AF_INET6, &(p6->sin6_addr), peer_addrstr, INET6_ADDRSTRLEN); |
|
|
|
|
DEBUG_INFO("getpeername() => %s : %d", peer_addrstr, ntohs(p6->sin6_port)); |
|
|
|
|
|
|
|
|
|
w = zts_write(sockfd, str, len); |
|
|
|
|
r = zts_read(sockfd, rbuf, len); |
|
|
|
|
sleep(WAIT_FOR_TRANSMISSION_TO_COMPLETE); |
|
|
|
|
@ -311,7 +331,7 @@ void tcp_client_6(UNIT_TEST_SIG_6)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
void tcp_server_6(UNIT_TEST_SIG_6) |
|
|
|
|
void tcp_server_6(TCP_UNIT_TEST_SIG_6) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_server_6\n"); |
|
|
|
|
int w=0, r=0, sockfd, accfd, err, len = strlen(str); |
|
|
|
|
@ -325,6 +345,16 @@ void tcp_server_6(UNIT_TEST_SIG_6)
|
|
|
|
|
DEBUG_ERROR("error placing socket in LISTENING state (%d)", err); |
|
|
|
|
if((accfd = zts_accept(sockfd, (struct sockaddr *)&addr, (socklen_t *)sizeof(addr))) < 0) |
|
|
|
|
DEBUG_ERROR("error accepting connection (%d)", err); |
|
|
|
|
|
|
|
|
|
// TODO: Put this test in the general API section
|
|
|
|
|
struct sockaddr_storage peer_addr; |
|
|
|
|
struct sockaddr_in6 *p6 = (struct sockaddr_in6*)&peer_addr; |
|
|
|
|
socklen_t peer_addrlen; |
|
|
|
|
zts_getpeername(accfd, (struct sockaddr*)&peer_addr, &peer_addrlen); |
|
|
|
|
char peer_addrstr[INET6_ADDRSTRLEN]; |
|
|
|
|
inet_ntop(AF_INET6, &(p6->sin6_addr), peer_addrstr, INET6_ADDRSTRLEN); |
|
|
|
|
DEBUG_INFO("getpeername() => %s : %d", peer_addrstr, ntohs(p6->sin6_port)); |
|
|
|
|
|
|
|
|
|
r = zts_read(accfd, rbuf, sizeof rbuf); |
|
|
|
|
w = zts_write(accfd, rbuf, len); |
|
|
|
|
DEBUG_TEST("Received : %s", rbuf); |
|
|
|
|
@ -338,88 +368,170 @@ void tcp_server_6(UNIT_TEST_SIG_6)
|
|
|
|
|
// UDP
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
void udp_client_4(UNIT_TEST_SIG_4) |
|
|
|
|
void udp_client_4(UDP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\nudp_client_4\n"); |
|
|
|
|
int r, w, sockfd, err, len = strlen(str); |
|
|
|
|
char rbuf[STR_SIZE]; |
|
|
|
|
memset(rbuf, 0, sizeof rbuf); |
|
|
|
|
|
|
|
|
|
if((sockfd = zts_socket(AF_INET, SOCK_DGRAM, 0)) < 0) |
|
|
|
|
DEBUG_ERROR("error creating ZeroTier socket"); |
|
|
|
|
if((err = zts_fcntl(sockfd, F_SETFL, O_NONBLOCK) < 0)) |
|
|
|
|
std::cout << "error setting O_NONBLOCK (errno=" << strerror(errno) << ")" << std::endl; |
|
|
|
|
fprintf(stderr, "sending UDP packets until I get a single response...\n"); |
|
|
|
|
if((err = zts_bind(sockfd, (struct sockaddr *)local_addr, sizeof(struct sockaddr_in)) < 0)) |
|
|
|
|
DEBUG_ERROR("error binding to interface (%d)", err); |
|
|
|
|
|
|
|
|
|
w = zts_sendto(sockfd, str, strlen(str), 0, (struct sockaddr *)addr, sizeof(addr)); |
|
|
|
|
memset(rbuf, 0, sizeof(rbuf)); |
|
|
|
|
int serverlen = sizeof(addr); |
|
|
|
|
r = zts_recvfrom(sockfd, rbuf, STR_SIZE, 0, (struct sockaddr *)&addr, (socklen_t *)&serverlen); |
|
|
|
|
|
|
|
|
|
sleep(WAIT_FOR_TRANSMISSION_TO_COMPLETE); |
|
|
|
|
err = zts_close(sockfd); |
|
|
|
|
sprintf(details, "udp_client_4, n=%d, err=%d, r=%d, w=%d", count, err, r, w); |
|
|
|
|
DEBUG_TEST("Sent : %s", str); |
|
|
|
|
DEBUG_TEST("Received : %s", rbuf); |
|
|
|
|
*passed = (w == len && r == len && !err) && !strcmp(rbuf, str); |
|
|
|
|
struct sockaddr_in saddr; |
|
|
|
|
while(1) { |
|
|
|
|
// tx
|
|
|
|
|
if((w = zts_sendto(sockfd, str, strlen(str), 0, (struct sockaddr *)remote_addr, sizeof(remote_addr))) < 0) { |
|
|
|
|
DEBUG_ERROR("error sending packet, err=%d", errno); |
|
|
|
|
} |
|
|
|
|
sleep(1); |
|
|
|
|
memset(rbuf, 0, sizeof(rbuf)); |
|
|
|
|
int serverlen = sizeof(remote_addr); |
|
|
|
|
// rx
|
|
|
|
|
r = zts_recvfrom(sockfd, rbuf, STR_SIZE, 0, (struct sockaddr *)&saddr, (socklen_t *)&serverlen); |
|
|
|
|
if(r == strlen(str)) { |
|
|
|
|
sleep(WAIT_FOR_TRANSMISSION_TO_COMPLETE); |
|
|
|
|
err = zts_close(sockfd); |
|
|
|
|
DEBUG_INFO("udp_client_4, n=%d, err=%d, r=%d, w=%d\n", count, err, r, w); |
|
|
|
|
sprintf(details, "udp_client_4, n=%d, err=%d, r=%d, w=%d", count, err, r, w); |
|
|
|
|
DEBUG_TEST("Sent : %s", str); |
|
|
|
|
DEBUG_TEST("Received : %s", rbuf); |
|
|
|
|
*passed = (w == len && r == len && !err) && !strcmp(rbuf, str); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void udp_server_4(UNIT_TEST_SIG_4) |
|
|
|
|
void udp_server_4(UDP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\nudp_server_4\n"); |
|
|
|
|
int r, w, sockfd, err, len = strlen(str); |
|
|
|
|
char rbuf[STR_SIZE]; |
|
|
|
|
memset(rbuf, 0, sizeof rbuf); |
|
|
|
|
|
|
|
|
|
if((sockfd = zts_socket(AF_INET, SOCK_DGRAM, 0)) < 0) |
|
|
|
|
DEBUG_ERROR("error creating ZeroTier socket"); |
|
|
|
|
|
|
|
|
|
if((err = zts_bind(sockfd, (struct sockaddr *)addr, sizeof(struct sockaddr_in)) < 0)) |
|
|
|
|
DEBUG_ERROR("error binding to interface (%d)", err); |
|
|
|
|
|
|
|
|
|
int serverlen = sizeof(addr); |
|
|
|
|
r = zts_recvfrom(sockfd, rbuf, STR_SIZE, 0, (struct sockaddr *)&addr, (socklen_t *)&serverlen); |
|
|
|
|
memset(rbuf, 0, sizeof(rbuf)); |
|
|
|
|
w = zts_sendto(sockfd, str, strlen(str), 0, (struct sockaddr *)addr, sizeof(addr)); |
|
|
|
|
|
|
|
|
|
if((err = zts_bind(sockfd, (struct sockaddr *)local_addr, sizeof(struct sockaddr_in)) < 0)) |
|
|
|
|
DEBUG_ERROR("error binding to interface (%d)", err);
|
|
|
|
|
// rx
|
|
|
|
|
fprintf(stderr, "waiting for UDP packet...\n"); |
|
|
|
|
struct sockaddr_in saddr; |
|
|
|
|
int serverlen = sizeof(saddr); |
|
|
|
|
memset(&saddr, 0, sizeof(saddr)); |
|
|
|
|
r = zts_recvfrom(sockfd, rbuf, STR_SIZE, 0, (struct sockaddr *)&saddr, (socklen_t *)&serverlen); |
|
|
|
|
char addrstr[INET_ADDRSTRLEN]; |
|
|
|
|
inet_ntop(AF_INET, &(saddr.sin_addr), addrstr, INET_ADDRSTRLEN); |
|
|
|
|
// once we receive a UDP packet, spend 10 seconds sending responses in the hopes that the client will see
|
|
|
|
|
DEBUG_INFO("received DGRAM from %s : %d", inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port)); |
|
|
|
|
DEBUG_INFO("sending DGRAM(s) to %s : %d", inet_ntoa(remote_addr->sin_addr), ntohs(remote_addr->sin_port)); |
|
|
|
|
// tx
|
|
|
|
|
long int tx_ti = get_now_ts();
|
|
|
|
|
while(1) { |
|
|
|
|
sleep(1); |
|
|
|
|
DEBUG_INFO("sending UDP packet"); |
|
|
|
|
if((w = zts_sendto(sockfd, str, strlen(str), 0, (struct sockaddr *)remote_addr, sizeof(remote_addr))) < 0) { |
|
|
|
|
DEBUG_ERROR("error sending packet, err=%d", errno); |
|
|
|
|
} |
|
|
|
|
if(get_now_ts() >= tx_ti + 20000) { |
|
|
|
|
//fprintf(stderr, "tx_ti=%d\n", tx_ti);
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
sleep(WAIT_FOR_TRANSMISSION_TO_COMPLETE); |
|
|
|
|
err = zts_close(sockfd); |
|
|
|
|
//err = zts_close(sockfd);
|
|
|
|
|
DEBUG_INFO("udp_server_4, n=%d, err=%d, r=%d, w=%d\n", count, err, r, w); |
|
|
|
|
sprintf(details, "udp_server_4, n=%d, err=%d, r=%d, w=%d", count, err, r, w); |
|
|
|
|
DEBUG_TEST("Sent : %s", str); |
|
|
|
|
DEBUG_TEST("Received : %s", rbuf); |
|
|
|
|
*passed = (w == len && r == len && !err) && !strcmp(rbuf, str); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void udp_client_6(UNIT_TEST_SIG_6) |
|
|
|
|
//
|
|
|
|
|
void udp_client_6(UDP_UNIT_TEST_SIG_6) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_client_6\n"); |
|
|
|
|
fprintf(stderr, "\n\n\nudp_client_6\n"); |
|
|
|
|
int r, w, sockfd, err, len = strlen(str); |
|
|
|
|
char rbuf[STR_SIZE]; |
|
|
|
|
memset(rbuf, 0, sizeof rbuf); |
|
|
|
|
if((sockfd = zts_socket(AF_INET6, SOCK_STREAM, 0)) < 0) |
|
|
|
|
|
|
|
|
|
if((sockfd = zts_socket(AF_INET6, SOCK_DGRAM, 0)) < 0) |
|
|
|
|
DEBUG_ERROR("error creating ZeroTier socket"); |
|
|
|
|
if((err = zts_connect(sockfd, (const struct sockaddr *)addr, sizeof(addr))) < 0) |
|
|
|
|
DEBUG_ERROR("error connecting to remote host (%d)", err); |
|
|
|
|
w = zts_write(sockfd, str, len); |
|
|
|
|
r = zts_read(sockfd, rbuf, len); |
|
|
|
|
sleep(WAIT_FOR_TRANSMISSION_TO_COMPLETE); |
|
|
|
|
err = zts_close(sockfd); |
|
|
|
|
sprintf(details, "tcp_client_6, n=%d, err=%d, r=%d, w=%d", count, err, r, w); |
|
|
|
|
DEBUG_TEST("Sent : %s", str); |
|
|
|
|
DEBUG_TEST("Received : %s", rbuf); |
|
|
|
|
*passed = (w == len && r == len && !err) && !strcmp(rbuf, str); |
|
|
|
|
if((err = zts_fcntl(sockfd, F_SETFL, O_NONBLOCK) < 0)) |
|
|
|
|
std::cout << "error setting O_NONBLOCK (errno=" << strerror(errno) << ")" << std::endl; |
|
|
|
|
fprintf(stderr, "sending UDP packets until I get a single response...\n"); |
|
|
|
|
if((err = zts_bind(sockfd, (struct sockaddr *)local_addr, sizeof(struct sockaddr_in6)) < 0)) |
|
|
|
|
DEBUG_ERROR("error binding to interface (%d)", err); |
|
|
|
|
|
|
|
|
|
struct sockaddr_in saddr; |
|
|
|
|
while(1) { |
|
|
|
|
// tx
|
|
|
|
|
if((w = zts_sendto(sockfd, str, strlen(str), 0, (struct sockaddr *)remote_addr, sizeof(remote_addr))) < 0) { |
|
|
|
|
DEBUG_ERROR("error sending packet, err=%d", errno); |
|
|
|
|
} |
|
|
|
|
sleep(1); |
|
|
|
|
memset(rbuf, 0, sizeof(rbuf)); |
|
|
|
|
int serverlen = sizeof(remote_addr); |
|
|
|
|
// rx
|
|
|
|
|
r = zts_recvfrom(sockfd, rbuf, STR_SIZE, 0, (struct sockaddr *)&saddr, (socklen_t *)&serverlen); |
|
|
|
|
if(r == strlen(str)) { |
|
|
|
|
sleep(WAIT_FOR_TRANSMISSION_TO_COMPLETE); |
|
|
|
|
err = zts_close(sockfd); |
|
|
|
|
DEBUG_INFO("udp_client_6, n=%d, err=%d, r=%d, w=%d\n", count, err, r, w); |
|
|
|
|
sprintf(details, "udp_client_6, n=%d, err=%d, r=%d, w=%d", count, err, r, w); |
|
|
|
|
DEBUG_TEST("Sent : %s", str); |
|
|
|
|
DEBUG_TEST("Received : %s", rbuf); |
|
|
|
|
*passed = (w == len && r == len && !err) && !strcmp(rbuf, str); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void udp_server_6(UNIT_TEST_SIG_6) |
|
|
|
|
void udp_server_6(UDP_UNIT_TEST_SIG_6) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_client_6\n"); |
|
|
|
|
fprintf(stderr, "\n\n\nudp_server_6\n"); |
|
|
|
|
int r, w, sockfd, err, len = strlen(str); |
|
|
|
|
char rbuf[STR_SIZE]; |
|
|
|
|
memset(rbuf, 0, sizeof rbuf); |
|
|
|
|
if((sockfd = zts_socket(AF_INET6, SOCK_STREAM, 0)) < 0) |
|
|
|
|
|
|
|
|
|
if((sockfd = zts_socket(AF_INET6, SOCK_DGRAM, 0)) < 0) |
|
|
|
|
DEBUG_ERROR("error creating ZeroTier socket"); |
|
|
|
|
if((err = zts_connect(sockfd, (const struct sockaddr *)addr, sizeof(addr))) < 0) |
|
|
|
|
DEBUG_ERROR("error connecting to remote host (%d)", err); |
|
|
|
|
w = zts_write(sockfd, str, len); |
|
|
|
|
r = zts_read(sockfd, rbuf, len); |
|
|
|
|
if((err = zts_bind(sockfd, (struct sockaddr *)local_addr, sizeof(struct sockaddr_in6)) < 0)) |
|
|
|
|
DEBUG_ERROR("error binding to interface (%d)", err);
|
|
|
|
|
// rx
|
|
|
|
|
fprintf(stderr, "waiting for UDP packet...\n"); |
|
|
|
|
struct sockaddr_in6 saddr; |
|
|
|
|
int serverlen = sizeof(saddr); |
|
|
|
|
memset(&saddr, 0, sizeof(saddr)); |
|
|
|
|
r = zts_recvfrom(sockfd, rbuf, STR_SIZE, 0, (struct sockaddr *)&saddr, (socklen_t *)&serverlen); |
|
|
|
|
|
|
|
|
|
char addrstr[INET6_ADDRSTRLEN], remote_addrstr[INET6_ADDRSTRLEN]; |
|
|
|
|
inet_ntop(AF_INET6, &(saddr.sin6_addr), addrstr, INET6_ADDRSTRLEN); |
|
|
|
|
inet_ntop(AF_INET6, &(remote_addr->sin6_addr), remote_addrstr, INET6_ADDRSTRLEN); |
|
|
|
|
DEBUG_INFO("received DGRAM from %s : %d", addrstr, ntohs(saddr.sin6_port)); |
|
|
|
|
DEBUG_INFO("sending DGRAM(s) to %s : %d", remote_addrstr, ntohs(remote_addr->sin6_port)); |
|
|
|
|
// once we receive a UDP packet, spend 10 seconds sending responses in the hopes that the client will see
|
|
|
|
|
// tx
|
|
|
|
|
long int tx_ti = get_now_ts(); |
|
|
|
|
while(1) { |
|
|
|
|
sleep(1); |
|
|
|
|
DEBUG_INFO("sending UDP packet"); |
|
|
|
|
if((w = zts_sendto(sockfd, str, strlen(str), 0, (struct sockaddr *)remote_addr, sizeof(remote_addr))) < 0) { |
|
|
|
|
DEBUG_ERROR("error sending packet, err=%d", errno); |
|
|
|
|
} |
|
|
|
|
if(get_now_ts() >= tx_ti + 20000) { |
|
|
|
|
//fprintf(stderr, "tx_ti=%d\n", tx_ti);
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
sleep(WAIT_FOR_TRANSMISSION_TO_COMPLETE); |
|
|
|
|
err = zts_close(sockfd); |
|
|
|
|
sprintf(details, "tcp_client_6, n=%d, err=%d, r=%d, w=%d", count, err, r, w); |
|
|
|
|
//err = zts_close(sockfd);
|
|
|
|
|
DEBUG_INFO("udp_server_6, n=%d, err=%d, r=%d, w=%d\n", count, err, r, w); |
|
|
|
|
sprintf(details, "udp_server_6, n=%d, err=%d, r=%d, w=%d", count, err, r, w); |
|
|
|
|
DEBUG_TEST("Sent : %s", str); |
|
|
|
|
DEBUG_TEST("Received : %s", rbuf); |
|
|
|
|
*passed = (w == len && r == len && !err) && !strcmp(rbuf, str); |
|
|
|
|
@ -432,7 +544,7 @@ void udp_server_6(UNIT_TEST_SIG_6)
|
|
|
|
|
/****************************************************************************/ |
|
|
|
|
|
|
|
|
|
// Maintain transfer for count OR count
|
|
|
|
|
void tcp_client_sustained_4(UNIT_TEST_SIG_4) |
|
|
|
|
void tcp_client_sustained_4(TCP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_client_sustained_4\n"); |
|
|
|
|
int n=0, w=0, r=0, sockfd, err;
|
|
|
|
|
@ -508,7 +620,7 @@ void tcp_client_sustained_4(UNIT_TEST_SIG_4)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Maintain transfer for count OR count
|
|
|
|
|
void tcp_client_sustained_6(UNIT_TEST_SIG_6) |
|
|
|
|
void tcp_client_sustained_6(TCP_UNIT_TEST_SIG_6) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_client_sustained_6\n"); |
|
|
|
|
int n=0, w=0, r=0, sockfd, err;
|
|
|
|
|
@ -584,7 +696,7 @@ void tcp_client_sustained_6(UNIT_TEST_SIG_6)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Maintain transfer for count OR count
|
|
|
|
|
void tcp_server_sustained_4(UNIT_TEST_SIG_4) |
|
|
|
|
void tcp_server_sustained_4(TCP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_server_sustained_4\n"); |
|
|
|
|
int n=0, w=0, r=0, sockfd, accfd, err; |
|
|
|
|
@ -650,7 +762,7 @@ void tcp_server_sustained_4(UNIT_TEST_SIG_4)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Maintain transfer for count OR count
|
|
|
|
|
void tcp_server_sustained_6(UNIT_TEST_SIG_6) |
|
|
|
|
void tcp_server_sustained_6(TCP_UNIT_TEST_SIG_6) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_server_sustained_6\n"); |
|
|
|
|
int n=0, w=0, r=0, sockfd, accfd, err; |
|
|
|
|
@ -712,13 +824,65 @@ void tcp_server_sustained_6(UNIT_TEST_SIG_6)
|
|
|
|
|
free(rxbuf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void udp_client_sustained_4(TCP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\nudp_client_sustained_4\n"); |
|
|
|
|
int r, w, sockfd, err, len = strlen(str); |
|
|
|
|
char rbuf[STR_SIZE]; |
|
|
|
|
memset(rbuf, 0, sizeof rbuf); |
|
|
|
|
if((sockfd = zts_socket(AF_INET, SOCK_DGRAM, 0)) < 0) |
|
|
|
|
DEBUG_ERROR("error creating ZeroTier socket"); |
|
|
|
|
|
|
|
|
|
for(int i=0; i<1000; i++) {
|
|
|
|
|
w = zts_sendto(sockfd, str, strlen(str), 0, (struct sockaddr *)addr, sizeof(addr)); |
|
|
|
|
} |
|
|
|
|
memset(rbuf, 0, sizeof(rbuf)); |
|
|
|
|
int serverlen = sizeof(addr); |
|
|
|
|
r = zts_recvfrom(sockfd, rbuf, STR_SIZE, 0, (struct sockaddr *)&addr, (socklen_t *)&serverlen); |
|
|
|
|
|
|
|
|
|
sleep(WAIT_FOR_TRANSMISSION_TO_COMPLETE); |
|
|
|
|
err = zts_close(sockfd); |
|
|
|
|
sprintf(details, "udp_client_4, n=%d, err=%d, r=%d, w=%d", count, err, r, w); |
|
|
|
|
DEBUG_TEST("Sent : %s", str); |
|
|
|
|
DEBUG_TEST("Received : %s", rbuf); |
|
|
|
|
*passed = (w == len && r == len && !err) && !strcmp(rbuf, str); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void udp_server_sustained_4(TCP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\nudp_server_sustained_4\n"); |
|
|
|
|
int r, w, sockfd, err, len = strlen(str); |
|
|
|
|
char rbuf[STR_SIZE]; |
|
|
|
|
memset(rbuf, 0, sizeof rbuf); |
|
|
|
|
if((sockfd = zts_socket(AF_INET, SOCK_DGRAM, 0)) < 0) |
|
|
|
|
DEBUG_ERROR("error creating ZeroTier socket"); |
|
|
|
|
|
|
|
|
|
if((err = zts_bind(sockfd, (struct sockaddr *)addr, sizeof(struct sockaddr_in)) < 0)) |
|
|
|
|
DEBUG_ERROR("error binding to interface (%d)", err); |
|
|
|
|
|
|
|
|
|
int serverlen = sizeof(addr); |
|
|
|
|
for(int i=0; i<100; i++) { |
|
|
|
|
memset(rbuf, 0, sizeof(rbuf)); |
|
|
|
|
r = zts_recvfrom(sockfd, rbuf, STR_SIZE, 0, (struct sockaddr *)&addr, (socklen_t *)&serverlen); |
|
|
|
|
DEBUG_TEST("Received : %s", rbuf); |
|
|
|
|
} |
|
|
|
|
//memset(rbuf, 0, sizeof(rbuf));
|
|
|
|
|
//w = zts_sendto(sockfd, str, strlen(str), 0, (struct sockaddr *)addr, sizeof(addr));
|
|
|
|
|
w = r; |
|
|
|
|
//sleep(WAIT_FOR_TRANSMISSION_TO_COMPLETE);
|
|
|
|
|
//err = zts_close(sockfd);
|
|
|
|
|
sprintf(details, "udp_server_4, n=%d, err=%d, r=%d, w=%d", count, err, r, w); |
|
|
|
|
DEBUG_TEST("Sent : %s", str); |
|
|
|
|
DEBUG_TEST("Received : %s", rbuf); |
|
|
|
|
*passed = (w == len && r == len && !err) && !strcmp(rbuf, str); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/****************************************************************************/ |
|
|
|
|
/* PERFORMANCE (between library instances) */ |
|
|
|
|
/****************************************************************************/ |
|
|
|
|
|
|
|
|
|
// Maintain transfer for count OR count
|
|
|
|
|
void tcp_client_perf_4(UNIT_TEST_SIG_4) |
|
|
|
|
void tcp_client_perf_4(TCP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_client_perf_4\n"); |
|
|
|
|
/*
|
|
|
|
|
@ -757,7 +921,7 @@ void tcp_client_perf_4(UNIT_TEST_SIG_4)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Maintain transfer for count OR count
|
|
|
|
|
void tcp_server_perf_4(UNIT_TEST_SIG_4) |
|
|
|
|
void tcp_server_perf_4(TCP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_server_perf_4\n"); |
|
|
|
|
/*
|
|
|
|
|
@ -811,7 +975,7 @@ void tcp_server_perf_4(UNIT_TEST_SIG_4)
|
|
|
|
|
/* PERFORMANCE (between library and native) */ |
|
|
|
|
/****************************************************************************/ |
|
|
|
|
|
|
|
|
|
void tcp_perf_tx_echo_4(UNIT_TEST_SIG_4) |
|
|
|
|
void tcp_perf_tx_echo_4(TCP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_perf_tx_echo_4\n"); |
|
|
|
|
|
|
|
|
|
@ -879,7 +1043,7 @@ void tcp_perf_tx_echo_4(UNIT_TEST_SIG_4)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void tcp_perf_rx_echo_4(UNIT_TEST_SIG_4) |
|
|
|
|
void tcp_perf_rx_echo_4(TCP_UNIT_TEST_SIG_4) |
|
|
|
|
{ |
|
|
|
|
fprintf(stderr, "\n\n\ntcp_perf_rx_echo_4\n"); |
|
|
|
|
|
|
|
|
|
@ -1335,14 +1499,29 @@ void test_bad_args()
|
|
|
|
|
DEBUG_TEST("min_protocol_value=%d",min_protocol_value); |
|
|
|
|
DEBUG_TEST("max_protocol_value=%d",max_protocol_value); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEBUG_TEST("AF_INET = %d", AF_INET); |
|
|
|
|
DEBUG_TEST("AF_INET6 = %d", AF_INET6); |
|
|
|
|
DEBUG_TEST("SOCK_STREAM = %d", SOCK_STREAM); |
|
|
|
|
DEBUG_TEST("SOCK_DGRAM = %d", SOCK_DGRAM); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Tests rapid opening and closure of sockets
|
|
|
|
|
void close_test(struct sockaddr *bind_addr) |
|
|
|
|
{ |
|
|
|
|
int err = 0; |
|
|
|
|
for(int i=0; i<64; i++) |
|
|
|
|
{ |
|
|
|
|
int fd = zts_socket(AF_INET, SOCK_STREAM, 0); |
|
|
|
|
if((err = zts_bind(fd, (struct sockaddr *)&bind_addr, sizeof(struct sockaddr_in)) < 0)) |
|
|
|
|
DEBUG_ERROR("error binding to interface (%d)", err); |
|
|
|
|
if((err = zts_close(fd)) < 0) { |
|
|
|
|
DEBUG_ERROR("error closing socket (%d)", err); |
|
|
|
|
} |
|
|
|
|
DEBUG_INFO("i=%d, close() = %d", i, err); |
|
|
|
|
usleep(100000); |
|
|
|
|
((struct sockaddr_in *)bind_addr)->sin_port++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/****************************************************************************/ |
|
|
|
|
/* main(), calls test_driver(...) */ |
|
|
|
|
@ -1443,147 +1622,214 @@ int main(int argc , char *argv[])
|
|
|
|
|
/****************************************************************************/ |
|
|
|
|
|
|
|
|
|
int test_number = 0, ipv; |
|
|
|
|
struct sockaddr addr; |
|
|
|
|
char details[128]; |
|
|
|
|
memset(&details, 0, sizeof details); |
|
|
|
|
bool passed = 0;
|
|
|
|
|
|
|
|
|
|
struct sockaddr local_addr; |
|
|
|
|
struct sockaddr remote_addr; |
|
|
|
|
|
|
|
|
|
// closure test
|
|
|
|
|
|
|
|
|
|
port = 1000; |
|
|
|
|
struct sockaddr_in in4; |
|
|
|
|
create_addr(local_ipstr, port, 4, (struct sockaddr *)&in4); |
|
|
|
|
close_test((struct sockaddr*)&in4); |
|
|
|
|
|
|
|
|
|
// Transmission Tests
|
|
|
|
|
|
|
|
|
|
port = start_port; |
|
|
|
|
delay = 0; |
|
|
|
|
count = 1024*128; |
|
|
|
|
operation = TEST_OP_N_BYTES; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ipv4 client/server
|
|
|
|
|
|
|
|
|
|
// ipv4 client/server (UDP)
|
|
|
|
|
ipv = 4; |
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_server_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_server_4
|
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
udp_server_4((struct sockaddr_in *)&local_addr, (struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_client_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_client_4
|
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
udp_client_4((struct sockaddr_in *)&local_addr, (struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
mode = mode == TEST_MODE_SERVER ? TEST_MODE_CLIENT : TEST_MODE_SERVER; // switch roles
|
|
|
|
|
port++; // move up one port
|
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_server_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_server_4
|
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
udp_server_4((struct sockaddr_in *)&local_addr, (struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_client_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_client_4
|
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
udp_client_4((struct sockaddr_in *)&local_addr, (struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
port++; |
|
|
|
|
|
|
|
|
|
// UDP
|
|
|
|
|
/*
|
|
|
|
|
// ipv6 client/server (UDP)
|
|
|
|
|
ipv = 6; |
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
udp_server_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_server_4
|
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
udp_server_6((struct sockaddr_in6 *)&local_addr, (struct sockaddr_in6 *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
udp_client_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_client_4
|
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
udp_client_6((struct sockaddr_in6 *)&local_addr, (struct sockaddr_in6 *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
mode = mode == TEST_MODE_SERVER ? TEST_MODE_CLIENT : TEST_MODE_SERVER; // switch roles
|
|
|
|
|
port++; // move up one port
|
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
udp_server_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_server_4
|
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
udp_server_6((struct sockaddr_in6 *)&local_addr, (struct sockaddr_in6 *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
udp_client_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_client_4
|
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
udp_client_6((struct sockaddr_in6 *)&local_addr, (struct sockaddr_in6 *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
port++; |
|
|
|
|
*/ |
|
|
|
|
// ipv4 sustained transfer
|
|
|
|
|
|
|
|
|
|
// ipv4 sustained transfer (UDP)
|
|
|
|
|
ipv = 4;
|
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
tcp_server_sustained_4((struct sockaddr_in *)&local_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_client_sustained_4((struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
mode = mode == TEST_MODE_SERVER ? TEST_MODE_CLIENT : TEST_MODE_SERVER; // switch roles
|
|
|
|
|
port++; |
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
tcp_server_sustained_4((struct sockaddr_in *)&local_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_client_sustained_4((struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
port++; |
|
|
|
|
|
|
|
|
|
// ipv4 client/server
|
|
|
|
|
ipv = 4; |
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
tcp_server_4((struct sockaddr_in *)&local_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_client_4((struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
mode = mode == TEST_MODE_SERVER ? TEST_MODE_CLIENT : TEST_MODE_SERVER; // switch roles
|
|
|
|
|
port++; // move up one port
|
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
tcp_server_4((struct sockaddr_in *)&local_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_client_4((struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
port++; |
|
|
|
|
|
|
|
|
|
// ipv4 sustained transfer (TCP)
|
|
|
|
|
ipv = 4;
|
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_server_sustained_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_server_sustained_4
|
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
tcp_server_sustained_4((struct sockaddr_in *)&local_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_client_sustained_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_client_sustained_4
|
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_client_sustained_4((struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); // swtich roles
|
|
|
|
|
mode = mode == TEST_MODE_SERVER ? TEST_MODE_CLIENT : TEST_MODE_SERVER; // switch roles
|
|
|
|
|
port++; |
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_server_sustained_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_server_sustained_4
|
|
|
|
|
create_addr(local_ipstr, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
tcp_server_sustained_4((struct sockaddr_in *)&local_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_client_sustained_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_client_sustained_4
|
|
|
|
|
create_addr(remote_ipstr, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_client_sustained_4((struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
port++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ipv6 client/server
|
|
|
|
|
// ipv6 client/server (TCP)
|
|
|
|
|
ipv = 6; |
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_server_6((struct sockaddr_in6 *)&addr, operation, count, delay, details, &passed); // tcp_server_6
|
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
tcp_server_6((struct sockaddr_in6 *)&local_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
DEBUG_TEST("waiting (15s) for other selftest to complete before continuing..."); |
|
|
|
|
sleep(WAIT_FOR_TEST_TO_CONCLUDE); |
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_client_6((struct sockaddr_in6 *)&addr, operation, count, delay, details, &passed); // tcp_client_6
|
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_client_6((struct sockaddr_in6 *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
mode = mode == TEST_MODE_SERVER ? TEST_MODE_CLIENT : TEST_MODE_SERVER; // switch roles
|
|
|
|
|
port++; // move up one port
|
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_server_6((struct sockaddr_in6 *)&addr, operation, count, delay, details, &passed); // tcp_server_6
|
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
tcp_server_6((struct sockaddr_in6 *)&local_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_client_6((struct sockaddr_in6 *)&addr, operation, count, delay, details, &passed); // tcp_client_6
|
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_client_6((struct sockaddr_in6 *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
port++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ipv6 sustained transfer
|
|
|
|
|
// ipv6 sustained transfer (TCP)
|
|
|
|
|
ipv = 6;
|
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_server_sustained_6((struct sockaddr_in6 *)&addr, operation, count, delay, details, &passed); // tcp_server_sustained_4
|
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
tcp_server_sustained_6((struct sockaddr_in6 *)&local_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_client_sustained_6((struct sockaddr_in6 *)&addr, operation, count, delay, details, &passed); // tcp_client_sustained_4
|
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_client_sustained_6((struct sockaddr_in6 *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); // swtich roles
|
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
mode = mode == TEST_MODE_SERVER ? TEST_MODE_CLIENT : TEST_MODE_SERVER; // switch roles
|
|
|
|
|
port++; |
|
|
|
|
if(mode == TEST_MODE_SERVER) { |
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_server_sustained_6((struct sockaddr_in6 *)&addr, operation, count, delay, details, &passed); // tcp_server_sustained_4
|
|
|
|
|
create_addr(local_ipstr6, port, ipv, (struct sockaddr *)&local_addr); |
|
|
|
|
tcp_server_sustained_6((struct sockaddr_in6 *)&local_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
else if(mode == TEST_MODE_CLIENT) { |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_client_sustained_6((struct sockaddr_in6 *)&addr, operation, count, delay, details, &passed); // tcp_client_sustained_4
|
|
|
|
|
create_addr(remote_ipstr6, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_client_sustained_6((struct sockaddr_in6 *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
} |
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
port++; |
|
|
|
|
@ -1591,28 +1837,30 @@ int main(int argc , char *argv[])
|
|
|
|
|
// PERFORMANCE (between this library instance and a native non library instance (echo) )
|
|
|
|
|
// Client/Server mode isn't being tested here, so it isn't important, we'll just set it to client
|
|
|
|
|
|
|
|
|
|
// ipv4 echo test
|
|
|
|
|
// ipv4 echo test (TCP)
|
|
|
|
|
/*
|
|
|
|
|
ipv = 4;
|
|
|
|
|
if(me == "alice" || me == "ted") { |
|
|
|
|
port=start_port+100; // e.g. 7100
|
|
|
|
|
create_addr(remote_echo_ipv4, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_perf_tx_echo_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_perf_tx_echo_4
|
|
|
|
|
create_addr(remote_echo_ipv4, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_perf_tx_echo_4((struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
tcp_perf_rx_echo_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_perf_rx_echo_4
|
|
|
|
|
tcp_perf_rx_echo_4((struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
} |
|
|
|
|
if(me == "bob" || me == "carol") { |
|
|
|
|
DEBUG_TEST("waiting (15s) for other selftest to complete before continuing..."); |
|
|
|
|
sleep(WAIT_FOR_TEST_TO_CONCLUDE);
|
|
|
|
|
port=start_port+101; // e.g. 7101
|
|
|
|
|
create_addr(remote_echo_ipv4, port, ipv, (struct sockaddr *)&addr); |
|
|
|
|
tcp_perf_rx_echo_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_perf_tx_echo_4
|
|
|
|
|
create_addr(remote_echo_ipv4, port, ipv, (struct sockaddr *)&remote_addr); |
|
|
|
|
tcp_perf_rx_echo_4((struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
sleep(WAIT_FOR_SERVER_TO_COME_ONLINE); |
|
|
|
|
tcp_perf_tx_echo_4((struct sockaddr_in *)&addr, operation, count, delay, details, &passed); // tcp_perf_rx_echo_4
|
|
|
|
|
tcp_perf_tx_echo_4((struct sockaddr_in *)&remote_addr, operation, count, delay, details, &passed);
|
|
|
|
|
RECORD_RESULTS(&test_number, passed, details, &results); |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
// RANDOM API TEST
|
|
|
|
|
//random_api_test();
|
|
|
|
|
|