cmake build script fixes, and fixes for selftest's winsock2 calls

This commit is contained in:
Joseph Henry
2018-01-31 17:45:34 -08:00
parent f03f4098c5
commit db34fd5e58
2 changed files with 164 additions and 62 deletions

View File

@@ -54,7 +54,7 @@ if (WIN32)
set (COMMON_DEBUG_FLAGS "-DLIBZT_TRACE=1 -DLIBZT_DEBUG=1 -DNS_TRACE=1 -DNS_DEBUG=1")
else()
set (CMAKE_C_FLAGS "-fvisibility=hidden -fstack-protector -DZT_SDK=1")
set (LWIP_PORT_DIR ${PROJ_DIR}/ext/lwip-contrib/ports/unix)
set (LWIP_PORT_DIR ${PROJ_DIR}/ext/lwip-contrib/ports/unix/port)
set (COMMON_DEBUG_FLAGS "-g -DLIBZT_TRACE=1 -DLIBZT_DEBUG=1 -DNS_TRACE=1 -DNS_DEBUG=1")
endif()
@@ -110,9 +110,11 @@ file (GLOB zto_src_glob
add_library (zto STATIC ${zto_src_glob})
target_link_libraries (zto http)
target_link_libraries (zto zt)
if (WIN32)
target_link_libraries (zto ws2_32)
target_link_libraries (zto ${lshlwapi_LIBRARY_PATH})
target_link_libraries (zto ${liphlpapi_LIBRARY_PATH})
endif()
add_library (zto_pic STATIC ${zto_src_glob})
target_link_libraries (zto_pic http_pic zt)
set_target_properties (zto_pic PROPERTIES POSITION_INDEPENDENT_CODE ON)
@@ -133,9 +135,11 @@ include_directories ("${PROJ_DIR}/include")
file (GLOB libzt_src_glob ${LIBZT_SRC_DIR}/*.cpp)
add_library (zt ${libzt_src_glob})
target_link_libraries (zt lwip zto)
target_link_libraries (zt ws2_32)
target_link_libraries (zt ${lshlwapi_LIBRARY_PATH})
target_link_libraries (zt ${liphlpapi_LIBRARY_PATH})
if (WIN32)
target_link_libraries (zto ws2_32)
target_link_libraries (zto ${lshlwapi_LIBRARY_PATH})
target_link_libraries (zto ${liphlpapi_LIBRARY_PATH})
endif()
set_target_properties (zt PROPERTIES OUTPUT_NAME zt)
# (libzt) Shared Library variant of ZeroTier paired with userspace stack and virtual tap interface
#add_library (ztshared SHARED ${libzt_src_glob})
@@ -159,7 +163,7 @@ endforeach (testsourcefile ${APP_SOURCES})
# selftest
add_executable (selftest ${PROJ_DIR}/test/selftest.cpp)
target_compile_options (selftest PRIVATE -std=c++1 -D__SELFTEST__)
target_compile_options (selftest PRIVATE -D__SELFTEST__)
if (WIN32)
target_link_libraries (selftest lwip zto zt ${ws2_32_LIBRARY_PATH} ${lshlwapi_LIBRARY_PATH} ${liphlpapi_LIBRARY_PATH})
else()

View File

@@ -59,6 +59,18 @@
#include <sys/time.h>
#endif
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
#else
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
#endif
void micro_sleep(unsigned long us)
{
std::this_thread::sleep_for(std::chrono::microseconds(us));
}
#if defined(_WIN32)
#include <WinSock2.h>
#include <WS2tcpip.h>
@@ -72,17 +84,6 @@ void sleep(unsigned long ms)
Sleep(ms);
}
void micro_sleep(unsigned long us)
{
std::this_thread::sleep_for(std::chrono::microseconds(us));
}
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
#else
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
#endif
struct timezone
{
int tz_minuteswest;
@@ -170,18 +171,6 @@ int gettimeofday(struct timeval *tv, struct timezone *tz)
#define DETAILS_STR_LEN 128
/* send/recv calls on Windows require four arguments where as the corresponding
write/read calls on *nix systems only require three */
#if defined(_WIN32)
#if defined(__NATIVETEST__)
#define WIN_RDFLAGS ,0
#define WIN_WRFLAGS ,0
#else
#define WIN_RDFLAGS
#define WIN_WRFLAGS
#endif
#endif
// If running a self test, use libzt calls
#if defined(__SELFTEST__)
#define _SOCKET zts_socket
@@ -237,15 +226,19 @@ inline unsigned int gettid()
#define _IOCTL ioctl
#define _FCNTL fcntl
#define _SELECT select
#if defined(_WIN32)
#define _READ recv
#define _WRITE send
#define _CLOSE closesocket
#else
#define _READ read
#define _WRITE write
#define _RECV recv
#define _SEND send
#if defined(_WIN32)
#define _CLOSE closesocket
#else
#define _CLOSE close
#endif
#define _GETPEERNAME getpeername
#endif
@@ -553,7 +546,11 @@ void tcp_select_server(TCP_UNIT_TEST_SIG_4)
// process incoming messages
if (FD_ISSET(fd_i, &read_set)) {
r = _READ(fd_i, rbuf, len WIN_RDFLAGS);
#if defined(_WIN32)
r = _RECV(fd_i, rbuf, len, 0);
#else
r = _READ(fd_i, rbuf, len);
#endif
if (r == msg.length()) {
rx_num++;
DEBUG_TEST("rx=%d", rx_num);
@@ -561,7 +558,11 @@ void tcp_select_server(TCP_UNIT_TEST_SIG_4)
}
// write a message to the socket if allowed
if (FD_ISSET(fd_i, &write_set)) {
w = _WRITE(fd_i, msg.c_str(), len WIN_WRFLAGS);
#if defined(_WIN32)
w = _SEND(fd_i, msg.c_str(), len, 0);
#else
w = _WRITE(fd_i, msg.c_str(), len);
#endif
if (w == msg.length()) {
tx_num++;
DEBUG_TEST("tx=%d", tx_num);
@@ -631,7 +632,11 @@ void tcp_select_client(TCP_UNIT_TEST_SIG_4)
for (int fd_i=0; fd_i<fd+1; fd_i++) {
// process incoming messages
if (FD_ISSET(fd_i, &read_set)) {
r = _READ(fd_i, rbuf, len WIN_RDFLAGS);
#if defined(_WIN32)
r = _RECV(fd_i, rbuf, len, 0);
#else
r = _READ(fd_i, rbuf, len);
#endif
if (r == msg.length()) {
rx_num++;
DEBUG_TEST("rx=%d", rx_num);
@@ -639,7 +644,11 @@ void tcp_select_client(TCP_UNIT_TEST_SIG_4)
}
// write a message to the socket if allowed
if (FD_ISSET(fd_i, &write_set)) {
w = _WRITE(fd_i, msg.c_str(), len WIN_WRFLAGS);
#if defined(_WIN32)
w = _SEND(fd_i, msg.c_str(), len, 0);
#else
w = _WRITE(fd_i, msg.c_str(), len);
#endif
if (w == msg.length()) {
tx_num++;
DEBUG_TEST("tx=%d", tx_num);
@@ -694,8 +703,16 @@ void tcp_client_4(TCP_UNIT_TEST_SIG_4)
}
DEBUG_TEST("getpeername() => %s : %d", inet_ntoa(in4->sin_addr), ntohs(in4->sin_port));
w = _WRITE(fd, msg.c_str(), len WIN_WRFLAGS);
r = _READ(fd, rbuf, len WIN_RDFLAGS);
#if defined(_WIN32)
w = _SEND(fd, msg.c_str(), len, 0);
#else
w = _WRITE(fd, msg.c_str(), len);
#endif
#if defined(_WIN32)
r = _RECV(fd, rbuf, len, 0);
#else
r = _READ(fd, rbuf, len);
#endif
DEBUG_TEST("Sent : %s", msg.c_str());
DEBUG_TEST("Received : %s", rbuf);
sleep(ARTIFICIAL_SOCKET_LINGER);
@@ -754,8 +771,17 @@ void tcp_server_4(TCP_UNIT_TEST_SIG_4)
return;
}
DEBUG_TEST("getpeername() => %s : %d", inet_ntoa(in4->sin_addr), ntohs(in4->sin_port));
r = _READ(client_fd, rbuf, len WIN_RDFLAGS);
w = _WRITE(client_fd, rbuf, len WIN_WRFLAGS);
#if defined(_WIN32)
r = _RECV(client_fd, rbuf, len, 0);
#else
r = _READ(client_fd, rbuf, len);
#endif
#if defined(_WIN32)
w = _SEND(client_fd, rbuf, len, 0);
#else
w = _WRITE(client_fd, rbuf, len);
#endif
DEBUG_TEST("Received : %s, r=%d, w=%d", rbuf, r, w);
sleep(ARTIFICIAL_SOCKET_LINGER);
err = _CLOSE(fd);
@@ -802,8 +828,16 @@ void tcp_client_6(TCP_UNIT_TEST_SIG_6)
inet_ntop(AF_INET6, &(p6->sin6_addr), peer_addrstr, INET6_ADDRSTRLEN);
DEBUG_TEST("getpeername() => %s : %d", peer_addrstr, ntohs(p6->sin6_port));
w = _WRITE(fd, msg.c_str(), len WIN_WRFLAGS);
r = _READ(fd, rbuf, len WIN_RDFLAGS);
#if defined(_WIN32)
w = _SEND(fd, msg.c_str(), len, 0);
#else
w = _WRITE(fd, msg.c_str(), len);
#endif
#if defined(_WIN32)
r = _RECV(fd, rbuf, len, 0);
#else
r = _READ(fd, rbuf, len);
#endif
sleep(ARTIFICIAL_SOCKET_LINGER);
err = _CLOSE(fd);
sprintf(details, "%s, err=%d, r=%d, w=%d", testname.c_str(), err, r, w);
@@ -864,8 +898,16 @@ void tcp_server_6(TCP_UNIT_TEST_SIG_6)
char peer_addrstr[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, &(p6->sin6_addr), peer_addrstr, INET6_ADDRSTRLEN);
DEBUG_TEST("getpeername() => %s : %d", peer_addrstr, ntohs(p6->sin6_port));
r = _READ(client_fd, rbuf, sizeof rbuf WIN_RDFLAGS);
w = _WRITE(client_fd, rbuf, len WIN_WRFLAGS);
#if defined(_WIN32)
r = _RECV(client_fd, rbuf, sizeof rbuf, 0);
#else
r = _READ(client_fd, rbuf, sizeof rbuf);
#endif
#if defined(_WIN32)
w = _SEND(client_fd, rbuf, len, 0);
#else
w = _WRITE(client_fd, rbuf, len);
#endif
DEBUG_TEST("Received : %s", rbuf);
sleep(ARTIFICIAL_SOCKET_LINGER);
err = _CLOSE(fd);
@@ -1166,7 +1208,11 @@ void tcp_client_sustained_4(TCP_UNIT_TEST_SIG_4)
signal(SIGPIPE, SIG_IGN);
#endif
DEBUG_TEST("writing...");
n = _WRITE(fd, &txbuf[w], next_write WIN_WRFLAGS);
#if defined(_WIN32)
n = _SEND(fd, &txbuf[w], next_write, 0);
#else
n = _WRITE(fd, &txbuf[w], next_write);
#endif
DEBUG_TEST("wrote=%d", n);
if (n > 0) {
w += n;
@@ -1180,7 +1226,11 @@ void tcp_client_sustained_4(TCP_UNIT_TEST_SIG_4)
// RX
long int rx_ti = 0;
while (rrem) {
n = _READ(fd, &rxbuf[r], rrem WIN_RDFLAGS);
#if defined(_WIN32)
n = _RECV(fd, &rxbuf[r], rrem, 0);
#else
n = _READ(fd, &rxbuf[r], rrem);
#endif
if (rx_ti == 0) { // wait for first message
rx_ti = get_now_ts();
}
@@ -1248,7 +1298,11 @@ void tcp_client_sustained_6(TCP_UNIT_TEST_SIG_6)
long int tx_ti = get_now_ts();
while (wrem) {
int next_write = std::min(4096, wrem);
n = _WRITE(fd, &txbuf[w], next_write WIN_WRFLAGS);
#if defined(_WIN32)
n = _SEND(fd, &txbuf[w], next_write, 0);
#else
n = _WRITE(fd, &txbuf[w], next_write);
#endif
if (n > 0) {
w += n;
wrem -= n;
@@ -1260,7 +1314,11 @@ void tcp_client_sustained_6(TCP_UNIT_TEST_SIG_6)
// RX
long int rx_ti = 0;
while (rrem) {
n = _READ(fd, &rxbuf[r], rrem WIN_RDFLAGS);
#if defined(_WIN32)
n = _RECV(fd, &rxbuf[r], rrem, 0);
#else
n = _READ(fd, &rxbuf[r], rrem);
#endif
if (rx_ti == 0) { // wait for first message
rx_ti = get_now_ts();
}
@@ -1339,7 +1397,11 @@ void tcp_server_sustained_4(TCP_UNIT_TEST_SIG_4)
int wrem = cnt, rrem = cnt;
long int rx_ti = 0;
while (rrem) {
n = _READ(client_fd, &rxbuf[r], rrem WIN_RDFLAGS);
#if defined(_WIN32)
n = _RECV(client_fd, &rxbuf[r], rrem, 0);
#else
n = _READ(client_fd, &rxbuf[r], rrem);
#endif
if (n > 0) {
if (rx_ti == 0) { // wait for first message
rx_ti = get_now_ts();
@@ -1355,7 +1417,11 @@ void tcp_server_sustained_4(TCP_UNIT_TEST_SIG_4)
long int tx_ti = get_now_ts();
while (wrem) {
int next_write = std::min(1024, wrem);
n = _WRITE(client_fd, &rxbuf[w], next_write WIN_WRFLAGS);
#if defined(_WIN32)
n = _SEND(client_fd, &rxbuf[w], next_write, 0);
#else
n = _WRITE(client_fd, &rxbuf[w], next_write);
#endif
if (n > 0) {
w += n;
wrem -= n;
@@ -1427,7 +1493,11 @@ void tcp_server_sustained_6(TCP_UNIT_TEST_SIG_6)
int wrem = cnt, rrem = cnt;
long int rx_ti = 0;
while (rrem) {
n = _READ(client_fd, &rxbuf[r], rrem WIN_RDFLAGS);
#if defined(_WIN32)
n = _RECV(client_fd, &rxbuf[r], rrem, 0);
#else
n = _READ(client_fd, &rxbuf[r], rrem);
#endif
if (n > 0) {
if (rx_ti == 0) { // wait for first message
rx_ti = get_now_ts();
@@ -1442,7 +1512,11 @@ void tcp_server_sustained_6(TCP_UNIT_TEST_SIG_6)
long int tx_ti = get_now_ts();
while (wrem) {
int next_write = std::min(1024, wrem);
n = _WRITE(client_fd, &rxbuf[w], next_write WIN_WRFLAGS);
#if defined(_WIN32)
n = _SEND(client_fd, &rxbuf[w], next_write, 0);
#else
n = _WRITE(client_fd, &rxbuf[w], next_write);
#endif
if (n > 0) {
w += n;
wrem -= n;
@@ -1779,7 +1853,11 @@ void tcp_perf_tx_echo_4(TCP_UNIT_TEST_SIG_4)
memcpy(pbuf + sizeof mode, &cnt, sizeof cnt);
DEBUG_TEST("sending test parameters to echotest");
if ((w = _WRITE(fd, pbuf, sizeof pbuf WIN_WRFLAGS)) < 0) {
#if defined(_WIN32)
if ((w = _SEND(fd, pbuf, sizeof pbuf, 0)) < 0) {
#else
if ((w = _WRITE(fd, pbuf, sizeof pbuf)) < 0) {
#endif
DEBUG_ERROR("error while sending test parameters to echotest (err=%d)", w);
return;
}
@@ -1787,7 +1865,11 @@ void tcp_perf_tx_echo_4(TCP_UNIT_TEST_SIG_4)
// begin
DEBUG_TEST("beginning test, sending test byte stream...");
while (tot < cnt) {
if ((w = _WRITE(fd, tbuf, sizeof tbuf WIN_WRFLAGS)) < 0) {
#if defined(_WIN32)
if ((w = _SEND(fd, tbuf, sizeof tbuf, 0)) < 0) {
#else
if ((w = _WRITE(fd, tbuf, sizeof tbuf)) < 0) {
#endif
DEBUG_ERROR("error while sending test byte stream to echotest (err=%d)", w);
return;
}
@@ -1797,7 +1879,11 @@ void tcp_perf_tx_echo_4(TCP_UNIT_TEST_SIG_4)
// read results
memset(pbuf, 0, sizeof pbuf);
DEBUG_TEST("reading test results from echotest");
if ((w = _READ(fd, pbuf, sizeof tbuf WIN_RDFLAGS)) < 0) {
#if defined(_WIN32)
if ((w = _RECV(fd, pbuf, sizeof tbuf, 0)) < 0) {
#else
if ((w = _READ(fd, pbuf, sizeof tbuf)) < 0) {
#endif
DEBUG_ERROR("error while reading results from echotest (err=%d)", w);
return;
}
@@ -1849,14 +1935,22 @@ void tcp_perf_rx_echo_4(TCP_UNIT_TEST_SIG_4)
memcpy(pbuf + sizeof mode, &cnt, sizeof cnt);
DEBUG_TEST("sending test parameters to echotest");
if ((r = _WRITE(fd, pbuf, sizeof pbuf WIN_WRFLAGS)) < 0) {
#if defined(_WIN32)
if ((r = _SEND(fd, pbuf, sizeof pbuf, 0)) < 0) {
#else
if ((r = _WRITE(fd, pbuf, sizeof pbuf)) < 0) {
#endif
DEBUG_ERROR("error while sending test parameters to echotest (err=%d)", r);
return;
}
// begin
DEBUG_TEST("beginning test, as soon as bytes are read we will start keeping time...");
if ((r = _READ(fd, tbuf, sizeof tbuf WIN_RDFLAGS)) < 0) {
#if defined(_WIN32)
if ((r = _RECV(fd, tbuf, sizeof tbuf, 0)) < 0) {
#else
if ((r = _READ(fd, tbuf, sizeof tbuf)) < 0) {
#endif
DEBUG_ERROR("there was an error reading the test stream. aborting (err=%d, errno=%s)", r, strerror(errno));
return;
}
@@ -1867,7 +1961,11 @@ void tcp_perf_rx_echo_4(TCP_UNIT_TEST_SIG_4)
DEBUG_TEST("Received first set of bytes in test stream. now keeping time");
while (tot < cnt) {
if ((r = _READ(fd, tbuf, sizeof tbuf WIN_RDFLAGS)) < 0) {
#if defined(_WIN32)
if ((r = _RECV(fd, tbuf, sizeof tbuf, 0)) < 0) {
#else
if ((r = _READ(fd, tbuf, sizeof tbuf)) < 0) {
#endif
DEBUG_ERROR("there was an error reading the test stream. aborting (err=%d)", r);
return;
}