mirror of
https://gitea.invidious.io/iv-org/litespeed-quic.git
synced 2024-08-15 00:53:43 +00:00
Fix Windows support
This commit is contained in:
parent
41d574f34c
commit
fb3e20e0bc
72 changed files with 912 additions and 475 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue