Fix Windows support

This commit is contained in:
Dmitri Tikhonov 2020-06-03 00:13:30 -04:00
parent 41d574f34c
commit fb3e20e0bc
72 changed files with 912 additions and 475 deletions

View file

@ -30,8 +30,13 @@
#include <fcntl.h>
#include "test_config.h"
#if HAVE_REGEX
#ifndef WIN32
#include <regex.h>
#else
#include <pcreposix.h>
#endif
#endif
#include <event2/event.h>
@ -39,6 +44,7 @@
#include "test_common.h"
#include "lsquic.h"
#include "prog.h"
#include "lsxpack_header.h"
#include "../src/liblsquic/lsquic_logger.h"
@ -49,16 +55,6 @@
#define LSQUIC_USE_POOLS 1
#endif
#ifndef WIN32
# define SOCKET_TYPE int
# define CLOSE_SOCKET close
# define CHAR_CAST
#else
# define SOCKET_TYPE SOCKET
# define CLOSE_SOCKET closesocket
# define CHAR_CAST (char *)
#endif
#if __linux__
# define NDROPPED_SZ CMSG_SPACE(sizeof(uint32_t)) /* SO_RXQ_OVFL */
#else
@ -177,9 +173,10 @@ allocate_packets_in (SOCKET_TYPE fd)
return NULL;
}
n_alloc = (unsigned) recvsz / MAX_PACKET_SZ * 2;
n_alloc = (unsigned) recvsz / 1370;
LSQ_INFO("socket buffer size: %d bytes; max # packets is set to %u",
recvsz, n_alloc);
recvsz += MAX_PACKET_SZ;
packs_in = malloc(sizeof(*packs_in));
packs_in->data_sz = recvsz;
@ -520,7 +517,9 @@ read_one_packet (struct read_iter *iter)
packs_in->vecs[iter->ri_idx].len = MAX_PACKET_SZ;
#endif
#ifndef WIN32
top:
#endif
ctl_buf = packs_in->ctlmsg_data + iter->ri_idx * CTL_SZ;
#ifndef WIN32
@ -799,7 +798,11 @@ sport_init_server (struct service_port *sport, struct lsquic_engine *engine,
struct event_base *eb)
{
const struct sockaddr *sa_local = (struct sockaddr *) &sport->sas;
int sockfd, saved_errno, flags, s, on;
int sockfd, saved_errno, s;
#ifndef WIN32
int flags;
#endif
SOCKOPT_VAL on;
socklen_t socklen;
char addr_str[0x20];
@ -816,6 +819,9 @@ sport_init_server (struct service_port *sport, struct lsquic_engine *engine,
return -1;
}
#if WIN32
getExtensionPtrs();
#endif
sockfd = socket(sa_local->sa_family, SOCK_DGRAM, 0);
if (-1 == sockfd)
return -1;
@ -829,6 +835,7 @@ sport_init_server (struct service_port *sport, struct lsquic_engine *engine,
}
/* Make socket non-blocking */
#ifndef WIN32
flags = fcntl(sockfd, F_GETFL);
if (-1 == flags) {
saved_errno = errno;
@ -843,20 +850,33 @@ sport_init_server (struct service_port *sport, struct lsquic_engine *engine,
errno = saved_errno;
return -1;
}
#else
{
u_long on = 1;
ioctlsocket(sockfd, FIONBIO, &on);
}
#endif
on = 1;
if (AF_INET == sa_local->sa_family)
s = setsockopt(sockfd, IPPROTO_IP,
#if __linux__ && defined(IP_RECVORIGDSTADDR)
IP_RECVORIGDSTADDR,
#elif __linux__ || __APPLE__
#elif __linux__ || __APPLE__ || defined(WIN32)
IP_PKTINFO,
#else
IP_RECVDSTADDR,
#endif
&on, sizeof(on));
CHAR_CAST &on, sizeof(on));
else
{
#ifndef WIN32
s = setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &on, sizeof(on));
#else
s = setsockopt(sockfd, IPPROTO_IPV6, IPV6_PKTINFO, CHAR_CAST &on, sizeof(on));
#endif
}
if (0 != s)
{
saved_errno = errno;
@ -865,12 +885,12 @@ sport_init_server (struct service_port *sport, struct lsquic_engine *engine,
return -1;
}
#if (__linux__ && !defined(IP_RECVORIGDSTADDR)) || __APPLE__
#if (__linux__ && !defined(IP_RECVORIGDSTADDR)) || __APPLE__ || defined(WIN32)
/* Need to set IP_PKTINFO for sending */
if (AF_INET == sa_local->sa_family)
{
on = 1;
s = setsockopt(sockfd, IPPROTO_IP, IP_PKTINFO, &on, sizeof(on));
s = setsockopt(sockfd, IPPROTO_IP, IP_PKTINFO, CHAR_CAST &on, sizeof(on));
if (0 != s)
{
saved_errno = errno;
@ -932,7 +952,7 @@ sport_init_server (struct service_port *sport, struct lsquic_engine *engine,
sizeof(on));
#else
on = 1;
s = setsockopt(sockfd, IPPROTO_IP, IP_DONTFRAG, &on, sizeof(on));
s = setsockopt(sockfd, IPPROTO_IP, IP_DONTFRAG, CHAR_CAST &on, sizeof(on));
#endif
if (0 != s)
{
@ -948,9 +968,9 @@ sport_init_server (struct service_port *sport, struct lsquic_engine *engine,
#if ECN_SUPPORTED
on = 1;
if (AF_INET == sa_local->sa_family)
s = setsockopt(sockfd, IPPROTO_IP, IP_RECVTOS, &on, sizeof(on));
s = setsockopt(sockfd, IPPROTO_IP, IP_RECVTOS, CHAR_CAST &on, sizeof(on));
else
s = setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVTCLASS, &on, sizeof(on));
s = setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVTCLASS, CHAR_CAST &on, sizeof(on));
if (0 != s)
{
saved_errno = errno;
@ -962,7 +982,7 @@ sport_init_server (struct service_port *sport, struct lsquic_engine *engine,
if (sport->sp_flags & SPORT_SET_SNDBUF)
{
s = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sport->sp_sndbuf,
s = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, CHAR_CAST &sport->sp_sndbuf,
sizeof(sport->sp_sndbuf));
if (0 != s)
{
@ -975,7 +995,7 @@ sport_init_server (struct service_port *sport, struct lsquic_engine *engine,
if (sport->sp_flags & SPORT_SET_RCVBUF)
{
s = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &sport->sp_rcvbuf,
s = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, CHAR_CAST &sport->sp_rcvbuf,
sizeof(sport->sp_rcvbuf));
if (0 != s)
{
@ -1121,7 +1141,7 @@ sport_init_client (struct service_port *sport, struct lsquic_engine *engine,
sizeof(on));
#elif WIN32
on = 1;
s = setsockopt(sockfd, IPPROTO_IP, IP_DONTFRAGMENT, (char*)&on, sizeof(on));
s = setsockopt(sockfd, IPPROTO_IP, IP_DONTFRAGMENT, CHAR_CAST &on, sizeof(on));
#else
on = 1;
s = setsockopt(sockfd, IPPROTO_IP, IP_DONTFRAG, &on, sizeof(on));
@ -1141,10 +1161,11 @@ sport_init_client (struct service_port *sport, struct lsquic_engine *engine,
{
int on = 1;
if (AF_INET == sa_local->sa_family)
s = setsockopt(sockfd, IPPROTO_IP, IP_RECVTOS, &on, sizeof(on));
s = setsockopt(sockfd, IPPROTO_IP, IP_RECVTOS,
CHAR_CAST &on, sizeof(on));
else
s = setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVTCLASS, &on,
sizeof(on));
s = setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVTCLASS,
CHAR_CAST &on, sizeof(on));
if (0 != s)
{
saved_errno = errno;
@ -1527,6 +1548,7 @@ send_packets_one_by_one (const struct lsquic_out_spec *specs, unsigned count)
#else
DWORD bytes;
WSAMSG msg;
WSABUF wsaBuf;
#endif
union {
/* cmsg(3) recommends union for proper alignment */
@ -1589,12 +1611,14 @@ send_packets_one_by_one (const struct lsquic_out_spec *specs, unsigned count)
msg.msg_iovlen = specs[n].iovlen;
msg.msg_flags = 0;
#else
wsaBuf.buf = specs[n].iov->iov_base;
wsaBuf.len = specs[n].iov->iov_len;
msg.name = (void *) specs[n].dest_sa;
msg.namelen = (AF_INET == specs[n].dest_sa->sa_family ?
sizeof(struct sockaddr_in) :
sizeof(struct sockaddr_in6)),
msg.lpBuffers = specs[n].iov;
msg.dwBufferCount = specs[n].iovlen;
sizeof(struct sockaddr_in6));
msg.dwBufferCount = 1;
msg.lpBuffers = &wsaBuf;
msg.dwFlags = 0;
#endif
if ((sport->sp_flags & SPORT_SERVER) && specs[n].local_sa->sa_family)
@ -1748,13 +1772,13 @@ set_engine_option (struct lsquic_engine_settings *settings,
settings->es_versions = 0;
}
enum lsquic_version ver = lsquic_str2ver(val, strlen(val));
if (ver < N_LSQVER)
if ((unsigned) ver < N_LSQVER)
{
settings->es_versions |= 1 << ver;
return 0;
}
ver = lsquic_alpn2ver(val, strlen(val));
if (ver < N_LSQVER)
if ((unsigned) ver < N_LSQVER)
{
settings->es_versions |= 1 << ver;
return 0;
@ -2207,3 +2231,22 @@ sport_set_token (struct service_port *sport, const char *token_str)
sport->sp_token_sz = len / 2;
return 0;
}
int
header_set_ptr (struct lsxpack_header *hdr, struct header_buf *header_buf,
const char *name, size_t name_len,
const char *val, size_t val_len)
{
if (header_buf->off + name_len + val_len <= sizeof(header_buf->buf))
{
memcpy(header_buf->buf + header_buf->off, name, name_len);
memcpy(header_buf->buf + header_buf->off + name_len, val, val_len);
lsxpack_header_set_offset2(hdr, header_buf->buf + header_buf->off,
0, name_len, name_len, val_len);
header_buf->off += name_len + val_len;
return 0;
}
else
return -1;
}